fold-const.c (make_range_step): Bail out if the range isn't testing for zero.
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 1 Feb 2013 10:19:57 +0000 (10:19 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 1 Feb 2013 10:19:57 +0000 (10:19 +0000)
* fold-const.c (make_range_step) <TRUTH_NOT_EXPR>: Bail out if the
range isn't testing for zero.

From-SVN: r195642

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

index b8b116a1a0f834ec44789cd7a15bbd4442063b32..aa966f9390638e09a45064b46cbd2c9385a96ddd 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-31  Steven Bosscher  <steven@gcc.gnu.org>
 
        PR middle-end/56113
index 855f08fdf75c40779378ee1a197978d39bda697b..93f38cbbf2161d3c4e18541ccb66fa98cfe57265 100644 (file)
@@ -3813,6 +3813,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 867a037b57697027f16b7d7dd02c72649b8bd2f9..151edde20df7b5caa9aaebda86920ecc575cf75e 100644 (file)
@@ -1,3 +1,7 @@
+2013-02-01  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/opt26.adb: New test.
+
 2013-01-31  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
        Revert.
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;