re PR tree-optimization/71631 (Wrong constant folding)
authorJakub Jelinek <jakub@redhat.com>
Sat, 25 Jun 2016 17:20:15 +0000 (19:20 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 25 Jun 2016 17:20:15 +0000 (19:20 +0200)
PR tree-optimization/71631
* tree-ssa-reassoc.c (reassociate_bb): Pass true as last argument
to rewrite_expr_tree even if negate_result, move new_lhs var
declaration and initialization earlier, for powi_result set afterwards
new_lhs to lhs.  For negate_result, use new_lhs instead of tmp
if new_lhs != lhs, and don't shadow gsi var.

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

From-SVN: r237782

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

index 48a2291889d88fd87395bd1968475ee2279bb969..b4d4b0b5f5b9c33c839019af5b7fc7e236a01253 100644 (file)
@@ -1,3 +1,12 @@
+2016-06-25  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/71631
+       * tree-ssa-reassoc.c (reassociate_bb): Pass true as last argument
+       to rewrite_expr_tree even if negate_result, move new_lhs var
+       declaration and initialization earlier, for powi_result set afterwards
+       new_lhs to lhs.  For negate_result, use new_lhs instead of tmp
+       if new_lhs != lhs, and don't shadow gsi var.
+
 2016-06-24  Jan Hubicka  <hubicka@ucw.cz>
 
        * predict.c (predict_paths_leading_to, predict_paths_leading_to_edge):
index 4a10bf410092bca7cf0db5b89fa5e4c017e623c3..105f81fbd226de396f5fb30971d28d3a3dba04c4 100644 (file)
@@ -1,3 +1,8 @@
+2016-06-25  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/71631
+       * gcc.c-torture/execute/pr71631.c: New test.
+
 2016-06-24  Jan Hubicka  <hubicka@ucw.cz>
 
        * gcc.dg/predict-11.c: New testcase.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr71631.c b/gcc/testsuite/gcc.c-torture/execute/pr71631.c
new file mode 100644 (file)
index 0000000..f27c03e
--- /dev/null
@@ -0,0 +1,32 @@
+/* PR tree-optimization/71631 */
+
+volatile char v;
+int a = 1, b = 1, c = 1;
+
+void
+foo (const char *s)
+{
+  while (*s++)
+    v = *s;
+}
+
+int
+main ()
+{
+  volatile int d = 1;
+  volatile int e = 1;
+  int f = 1 / a;
+  int g = 1U < f;
+  int h = 2 + g;
+  int i = 3 % h;
+  int j = e && b;
+  int k = 1 == c;
+  int l = d != 0;
+  short m = (short) (-1 * i * l);
+  short x = j * (k * m);
+  if (i == 1)
+    foo ("AB");
+  if (x != -1)
+    __builtin_abort ();
+  return 0;
+}
index cdfe06fbfae328be7624d29637d3500d38ab00b2..9264e0b60344d6d1f565fd42120c34bcce5baf9a 100644 (file)
@@ -5314,6 +5314,7 @@ reassociate_bb (basic_block bb)
                    }
                }
 
+             tree new_lhs = lhs;
              /* If the operand vector is now empty, all operands were 
                 consumed by the __builtin_powi optimization.  */
              if (ops.length () == 0)
@@ -5337,7 +5338,6 @@ reassociate_bb (basic_block bb)
                  machine_mode mode = TYPE_MODE (TREE_TYPE (lhs));
                  int ops_num = ops.length ();
                  int width = get_reassociation_width (ops_num, rhs_code, mode);
-                 tree new_lhs = lhs;
 
                  if (dump_file && (dump_flags & TDF_DETAILS))
                    fprintf (dump_file,
@@ -5357,7 +5357,8 @@ reassociate_bb (basic_block bb)
                         swap_ops_for_binary_stmt (ops, len - 3, stmt);
 
                      new_lhs = rewrite_expr_tree (stmt, 0, ops,
-                                                  powi_result != NULL);
+                                                  powi_result != NULL
+                                                  || negate_result);
                     }
 
                  /* If we combined some repeated factors into a 
@@ -5372,7 +5373,10 @@ reassociate_bb (basic_block bb)
                      gimple_set_lhs (lhs_stmt, target_ssa);
                      update_stmt (lhs_stmt);
                      if (lhs != new_lhs)
-                       target_ssa = new_lhs;
+                       {
+                         target_ssa = new_lhs;
+                         new_lhs = lhs;
+                       }
                      mul_stmt = gimple_build_assign (lhs, MULT_EXPR,
                                                      powi_result, target_ssa);
                      gimple_set_location (mul_stmt, gimple_location (stmt));
@@ -5386,10 +5390,11 @@ reassociate_bb (basic_block bb)
                  stmt = SSA_NAME_DEF_STMT (lhs);
                  tree tmp = make_ssa_name (TREE_TYPE (lhs));
                  gimple_set_lhs (stmt, tmp);
+                 if (lhs != new_lhs)
+                   tmp = new_lhs;
                  gassign *neg_stmt = gimple_build_assign (lhs, NEGATE_EXPR,
                                                           tmp);
                  gimple_set_uid (neg_stmt, gimple_uid (stmt));
-                 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
                  gsi_insert_after (&gsi, neg_stmt, GSI_NEW_STMT);
                  update_stmt (stmt);
                }