OSDN Git Service

* fold-const.c (make_range_step) <TRUTH_NOT_EXPR>: Bail out if the
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 Feb 2013 10:23:36 +0000 (10:23 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 Feb 2013 10:23:36 +0000 (10:23 +0000)
range isn't testing for zero.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@195643 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/opt26.adb [new file with mode: 0644]

index 122aa0b..eba6dfb 100644 (file)
@@ -1,3 +1,8 @@
+2013-02-01  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * fold-const.c (make_range_step) <TRUTH_NOT_EXPR>: Bail out if the
+       range isn't testing for zero.
+
 2013-01-29  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/56113
index d5fd2a4..3ef531b 100644 (file)
@@ -3832,6 +3832,10 @@ make_range_step (location_t loc, enum tree_code code, tree arg0, tree arg1,
   switch (code)
     {
     case TRUTH_NOT_EXPR:
+      /* We can only do something if the range is testing for zero.  */
+      if (low == NULL_TREE || high == NULL_TREE
+         || ! integer_zerop (low) || ! integer_zerop (high))
+       return NULL_TREE;
       *p_in_p = ! in_p;
       return arg0;
 
index e80b580..baf30d7 100644 (file)
@@ -1,3 +1,7 @@
+2013-02-01  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/opt26.adb: New test.
+
 2013-01-27  Uros Bizjak  <ubizjak@gmail.com>
 
        Backport from mainline
diff --git a/gcc/testsuite/gnat.dg/opt26.adb b/gcc/testsuite/gnat.dg/opt26.adb
new file mode 100644 (file)
index 0000000..61f8b5b
--- /dev/null
@@ -0,0 +1,37 @@
+-- { dg-do run }
+-- { dg-options "-gnato -O" }
+
+with Interfaces; use Interfaces;
+
+procedure Opt26 is
+
+   procedure Shift_Left_Bool
+     (Bool : in Boolean;
+      U8 : out Interfaces.Unsigned_8)
+   is
+   begin
+      U8 := Shift_Left (Boolean'Pos (Bool), 6);
+   end Shift_Left_Bool;
+
+   procedure Shift_Left_Not_Bool
+     (Bool : in Boolean;
+      U8 : out Interfaces.Unsigned_8)
+   is
+   begin
+      U8 := Shift_Left (Boolean'Pos (not Bool), 6);
+   end Shift_Left_Not_Bool;
+
+   Bool         : constant Boolean := True;
+   Byte1, Byte2 : Interfaces.Unsigned_8;
+
+begin
+
+   Shift_Left_Bool (Bool, Byte1);
+
+   Shift_Left_Not_Bool (Bool, Byte2);
+
+   if Byte1 + Byte2 /= 64 then
+     raise Program_Error;
+   end if;
+
+end;