re PR tree-optimization/81555 (Wrong code at -O1)
authorJakub Jelinek <jakub@redhat.com>
Thu, 27 Jul 2017 08:49:16 +0000 (10:49 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 27 Jul 2017 08:49:16 +0000 (10:49 +0200)
PR tree-optimization/81555
PR tree-optimization/81556
* tree-ssa-reassoc.c (rewrite_expr_tree): Add NEXT_CHANGED argument,
if true, force CHANGED for the recursive invocation.
(reassociate_bb): Remember original length of ops array, pass
len != orig_len as NEXT_CHANGED in rewrite_expr_tree call.

* gcc.c-torture/execute/pr81555.c: New test.
* gcc.c-torture/execute/pr81556.c: New test.

From-SVN: r250609

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr81555.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/execute/pr81556.c [new file with mode: 0644]
gcc/tree-ssa-reassoc.c

index 89180b7d9c22ba1e391aa521a65c2ff040eeceaf..345034d1e1b3c8a77e5f11b52b4058a8f22ecf22 100644 (file)
@@ -1,5 +1,12 @@
 2017-07-27  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/81555
+       PR tree-optimization/81556
+       * tree-ssa-reassoc.c (rewrite_expr_tree): Add NEXT_CHANGED argument,
+       if true, force CHANGED for the recursive invocation.
+       (reassociate_bb): Remember original length of ops array, pass
+       len != orig_len as NEXT_CHANGED in rewrite_expr_tree call.
+
        * attribs.c (decl_attributes): Imply noinline, noclone and no_icf
        attributes for noipa attribute.  For naked attribute use
        lookup_attribute first before lookup_attribute_spec.
index 532870c90a89e8c00a6e45c0986c8587c1e0d191..fd606e03c529eaad73408575c1fa60b27494ad1d 100644 (file)
@@ -1,5 +1,10 @@
 2017-07-27  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/81555
+       PR tree-optimization/81556
+       * gcc.c-torture/execute/pr81555.c: New test.
+       * gcc.c-torture/execute/pr81556.c: New test.
+
        * gcc.dg/attr-noipa.c: New test.
        * gcc.dg/ipa/ipa-pta-18.c: New test.
        * gcc.dg/ipa/ipa-sra-11.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr81555.c b/gcc/testsuite/gcc.c-torture/execute/pr81555.c
new file mode 100644 (file)
index 0000000..d546368
--- /dev/null
@@ -0,0 +1,24 @@
+/* PR tree-optimization/81555 */
+
+unsigned int a = 1, d = 0xfaeU, e = 0xe376U;
+_Bool b = 0, f = 1;
+unsigned char g = 1;
+
+void
+foo (void)
+{
+  _Bool c = a != b;
+  if (c)
+    f = 0;
+  if (e & c & (unsigned char)d & c)
+    g = 0;
+}
+
+int
+main ()
+{
+  foo ();
+  if (f || g != 1)
+    __builtin_abort ();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr81556.c b/gcc/testsuite/gcc.c-torture/execute/pr81556.c
new file mode 100644 (file)
index 0000000..cfbc75f
--- /dev/null
@@ -0,0 +1,23 @@
+/* PR tree-optimization/81556 */
+
+unsigned long long int b = 0xb82ff73c5c020599ULL;
+unsigned long long int c = 0xd4e8188733a29d8eULL;
+unsigned long long int d = 2, f = 1, g = 0, h = 0;
+unsigned long long int e = 0xf27771784749f32bULL;
+
+__attribute__((noinline, noclone)) void
+foo (void)
+{
+  _Bool a = d > 1;
+  g = f % ((d > 1) << 9);
+  h = a & (e & (a & b & c));
+}
+
+int
+main ()
+{
+  foo ();
+  if (g != 1 || h != 0)
+    __builtin_abort ();
+  return 0;
+}
index 2f49ba135539af0c06722f46e9edbde918949553..7c3007f853a154100934f6e6ff26398358568dc3 100644 (file)
@@ -4205,11 +4205,15 @@ insert_stmt_before_use (gimple *stmt, gimple *stmt_to_insert)
 
 /* Recursively rewrite our linearized statements so that the operators
    match those in OPS[OPINDEX], putting the computation in rank
-   order.  Return new lhs.  */
+   order.  Return new lhs.
+   CHANGED is true if we shouldn't reuse the lhs SSA_NAME both in
+   the current stmt and during recursive invocations.
+   NEXT_CHANGED is true if we shouldn't reuse the lhs SSA_NAME in
+   recursive invocations.  */
 
 static tree
 rewrite_expr_tree (gimple *stmt, unsigned int opindex,
-                  vec<operand_entry *> ops, bool changed)
+                  vec<operand_entry *> ops, bool changed, bool next_changed)
 {
   tree rhs1 = gimple_assign_rhs1 (stmt);
   tree rhs2 = gimple_assign_rhs2 (stmt);
@@ -4300,7 +4304,8 @@ rewrite_expr_tree (gimple *stmt, unsigned int opindex,
      be the non-leaf side.  */
   tree new_rhs1
     = rewrite_expr_tree (SSA_NAME_DEF_STMT (rhs1), opindex + 1, ops,
-                        changed || oe->op != rhs2);
+                        changed || oe->op != rhs2 || next_changed,
+                        false);
 
   if (oe->op != rhs2 || new_rhs1 != rhs1)
     {
@@ -5654,6 +5659,7 @@ reassociate_bb (basic_block bb)
              gimple_set_visited (stmt, true);
              linearize_expr_tree (&ops, stmt, true, true);
              ops.qsort (sort_by_operand_rank);
+             int orig_len = ops.length ();
              optimize_ops_list (rhs_code, &ops);
              if (undistribute_ops_list (rhs_code, &ops,
                                         loop_containing_stmt (stmt)))
@@ -5744,7 +5750,8 @@ reassociate_bb (basic_block bb)
 
                      new_lhs = rewrite_expr_tree (stmt, 0, ops,
                                                   powi_result != NULL
-                                                  || negate_result);
+                                                  || negate_result,
+                                                  len != orig_len);
                     }
 
                  /* If we combined some repeated factors into a