PR tree-optimization/57083
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 29 Apr 2013 07:55:09 +0000 (07:55 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 29 Apr 2013 07:55:09 +0000 (07:55 +0000)
* tree-vrp.c (extract_range_from_binary_expr_1): For LSHIFT_EXPR with
non-singleton shift count range, zero extend low_bound for uns case.

* gcc.dg/torture/pr57083.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@198388 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr57083.c [new file with mode: 0644]
gcc/tree-vrp.c

index 85dfc35..262dbdf 100644 (file)
@@ -1,5 +1,9 @@
 2013-04-29  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/57083
+       * tree-vrp.c (extract_range_from_binary_expr_1): For LSHIFT_EXPR with
+       non-singleton shift count range, zero extend low_bound for uns case.
+
        * config/i386/predicates.md (general_vector_operand): New predicate.
        * config/i386/i386.c (const_vector_equal_evenodd_p): New function.
        (ix86_expand_mul_widen_evenodd): Force op1 resp. op2 into register
index 7e0975d..ddb11ec 100644 (file)
@@ -1,3 +1,8 @@
+2013-04-29  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/57083
+       * gcc.dg/torture/pr57083.c: New test.
+
 2013-04-28  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/56450
diff --git a/gcc/testsuite/gcc.dg/torture/pr57083.c b/gcc/testsuite/gcc.dg/torture/pr57083.c
new file mode 100644 (file)
index 0000000..070a53d
--- /dev/null
@@ -0,0 +1,15 @@
+/* PR tree-optimization/57083 */
+/* { dg-do run { target int32plus } } */
+
+extern void abort (void);
+short x = 1;
+int y = 0;
+
+int
+main ()
+{
+  unsigned t = (0x7fff8001U - x) << (y == 0);
+  if (t != 0xffff0000U)
+    abort ();
+  return 0;
+}
index cb4a09a..a740907 100644 (file)
@@ -2837,7 +2837,7 @@ extract_range_from_binary_expr_1 (value_range_t *vr,
 
              if (uns)
                {
-                 low_bound = bound;
+                 low_bound = bound.zext (prec);
                  high_bound = complement.zext (prec);
                  if (tree_to_double_int (vr0.max).ult (low_bound))
                    {