re PR tree-optimization/59014 (wrong code at -Os and above on x86_64-linux-gnu)
authorJakub Jelinek <jakub@redhat.com>
Tue, 26 Nov 2013 21:29:30 +0000 (22:29 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 26 Nov 2013 21:29:30 +0000 (22:29 +0100)
PR tree-optimization/59014
* tree-vrp.c (register_edge_assert_for_1): Don't look
through conversions from non-integral types or through
narrowing conversions.

* gcc.c-torture/execute/pr59014.c: New test.

From-SVN: r205417

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

index 7510537f3de84078820586f8b415f4c4d5a7527e..b50232b79ea77c7584c8e8c5a7e5a82070f8fbc4 100644 (file)
@@ -1,5 +1,10 @@
 2013-11-26  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/59014
+       * tree-vrp.c (register_edge_assert_for_1): Don't look
+       through conversions from non-integral types or through
+       narrowing conversions.
+
        PR target/59229
        * config/i386/i386.c (device_alg): Fix up formatting.
        (ix86_expand_set_or_movmem): Handle max_size < epilogue_size_needed
index b92f97e2b716929dce81e0cd103f44ac7a120eea..a2a81170166ec5137d7d8e2f5af2465dbcf7f1ff 100644 (file)
@@ -1,5 +1,8 @@
 2013-11-26  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/59014
+       * gcc.c-torture/execute/pr59014.c: New test.
+
        PR target/59229
        * gcc.c-torture/execute/pr59229.c: New test.
 
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr59014.c b/gcc/testsuite/gcc.c-torture/execute/pr59014.c
new file mode 100644 (file)
index 0000000..10bf81a
--- /dev/null
@@ -0,0 +1,25 @@
+/* PR tree-optimization/59014 */
+
+int a = 2, b, c, d;
+
+int
+foo ()
+{
+  for (;; c++)
+    if ((b > 0) | (a & 1))
+      ;
+    else
+      {
+       d = a;
+       return 0;
+      }
+}
+
+int
+main ()
+{
+  foo ();
+  if (d != 2)
+    __builtin_abort ();
+  return 0;
+}
index 171a0f56255e698454bca1247f1eece6e11dab09..1ec9c163911bdbedfb3d45b6d5d30a55a8f6df73 100644 (file)
@@ -5438,9 +5438,13 @@ register_edge_assert_for_1 (tree op, enum tree_code code,
     }
   else if (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (op_def)))
     {
-      /* Recurse through the type conversion.  */
-      retval |= register_edge_assert_for_1 (gimple_assign_rhs1 (op_def),
-                                           code, e, bsi);
+      /* Recurse through the type conversion, unless it is a narrowing
+        conversion or conversion from non-integral type.  */
+      tree rhs = gimple_assign_rhs1 (op_def);
+      if (INTEGRAL_TYPE_P (TREE_TYPE (rhs))
+         && (TYPE_PRECISION (TREE_TYPE (rhs))
+             <= TYPE_PRECISION (TREE_TYPE (op))))
+       retval |= register_edge_assert_for_1 (rhs, code, e, bsi);
     }
 
   return retval;