diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b8b116a1a0f834ec44789cd7a15bbd4442063b32..aa966f9390638e09a45064b46cbd2c9385a96ddd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 855f08fdf75c40779378ee1a197978d39bda697b..93f38cbbf2161d3c4e18541ccb66fa98cfe57265 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -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;
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 867a037b57697027f16b7d7dd02c72649b8bd2f9..151edde20df7b5caa9aaebda86920ecc575cf75e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000000000000000000000000000000000000..61f8b5b1eb99223c52cd81172098d6e38c4fd764
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/opt26.adb
@@ -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;