]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
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:26:07 +0000 (10:26 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 1 Feb 2013 10:26:07 +0000 (10:26 +0000)
* fold-const.c (make_range_step) <TRUTH_NOT_EXPR>: Bail out if the
range isn't testing for zero.

From-SVN: r195644

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

index b9cbffc5cd0f46e1416f04bc46dea0d6dee6d13c..45e913cf2475cea507be0b6b1dcb935f47d7403c 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-27  Uros Bizjak  <ubizjak@gmail.com>
 
        Backport from mainline
index f11ddf14b75f88e125c6ded367de7c1eb298c7e5..49f5e34c1b2345c49a114179ba9d3fcf67a4621e 100644 (file)
@@ -3873,6 +3873,10 @@ make_range (tree exp, int *pin_p, tree *plow, tree *phigh,
       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))
+           break;
          in_p = ! in_p, exp = arg0;
          continue;
 
index 3b56128e1461865918aff270fc1f9da3cf715a00..8c32bae9cf490ca032cd9b95e714ecdbde03ee84 100644 (file)
@@ -1,3 +1,7 @@
+2013-02-01  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/opt26.adb: New test.
+
 2013-01-24  Martin Jambor  <mjambor@suse.cz>
 
        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;