re PR middle-end/71269 (segfault while compiling sqlite)
authorKugan Vivekanandarajah <kuganv@linaro.org>
Mon, 30 May 2016 10:47:57 +0000 (10:47 +0000)
committerKugan Vivekanandarajah <kugan@gcc.gnu.org>
Mon, 30 May 2016 10:47:57 +0000 (10:47 +0000)
gcc/testsuite/ChangeLog:

2016-05-30  Kugan Vivekanandarajah  <kuganv@linaro.org>

PR middle-end/71269
PR middle-end/71292
* gcc.dg/tree-ssa/pr71269.c: New test.
* gcc.dg/tree-ssa/pr71292.c: New test.

gcc/ChangeLog:

2016-05-30  Kugan Vivekanandarajah  <kuganv@linaro.org>

PR middle-end/71269
PR middle-end/71252
* tree-ssa-reassoc.c (insert_stmt_before_use): Use find_insert_point so
that inserted stmt will not dominate stmts that defines its operand.
(rewrite_expr_tree): Add stmt_to_insert before adding the use stmt.
(rewrite_expr_tree_parallel): Likewise.

From-SVN: r236876

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr71269.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/pr71292.c [new file with mode: 0644]
gcc/tree-ssa-reassoc.c

index c88748f8840f882dc290f4f20bc6fa5389eb4aad..e328b4112f393db654542eb43426c980f0ad898e 100644 (file)
@@ -1,3 +1,12 @@
+2016-05-30  Kugan Vivekanandarajah  <kuganv@linaro.org>
+
+       PR middle-end/71269
+       PR middle-end/71252
+       * tree-ssa-reassoc.c (insert_stmt_before_use): Use find_insert_point so
+       that inserted stmt will not dominate stmts that defines its operand.
+       (rewrite_expr_tree): Add stmt_to_insert before adding the use stmt.
+       (rewrite_expr_tree_parallel): Likewise.
+
 2016-05-30  Kugan Vivekanandarajah  <kuganv@linaro.org>
 
        PR middle-end/71252
index 37f06b78c9946a17c9da4b76a32300020a5a25a1..9d233f1773ae7b9e526fd17c56f785ca7a454727 100644 (file)
@@ -1,3 +1,10 @@
+2016-05-30  Kugan Vivekanandarajah  <kuganv@linaro.org>
+
+       PR middle-end/71269
+       PR middle-end/71292
+       * gcc.dg/tree-ssa/pr71269.c: New test.
+       * gcc.dg/tree-ssa/pr71292.c: New test.
+
 2016-05-30  Kugan Vivekanandarajah  <kuganv@linaro.org>
 
        PR middle-end/71252
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr71269.c b/gcc/testsuite/gcc.dg/tree-ssa/pr71269.c
new file mode 100644 (file)
index 0000000..4dceaaa
--- /dev/null
@@ -0,0 +1,10 @@
+/* PR middle-end/71269 */
+/* { dg-do compile } */
+/* { dg-options "-O1" } */
+
+int a, b, c;
+void  fn2 (int);
+void fn1 ()
+{
+  fn2 (sizeof 0 + c + a + b + b);
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr71292.c b/gcc/testsuite/gcc.dg/tree-ssa/pr71292.c
new file mode 100644 (file)
index 0000000..1a25d93
--- /dev/null
@@ -0,0 +1,12 @@
+/* PR middle-end/71292 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+unsigned long a;
+long b, d;
+int c;
+void fn1 ()
+{
+  unsigned long e = a + c;
+  b = d + e + a + 8;
+}
index d13be29ffc772507b899f80d45082aff493d8f0d..9c06ca0374680bf9d118dd646ee44f31503d3650 100644 (file)
@@ -1777,16 +1777,6 @@ eliminate_redundant_comparison (enum tree_code opcode,
   return false;
 }
 
-/* If the stmt that defines operand has to be inserted, insert it
-   before the use.  */
-static void
-insert_stmt_before_use (gimple *stmt, gimple *stmt_to_insert)
-{
-  gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
-  gimple_set_uid (stmt_to_insert, gimple_uid (stmt));
-  gsi_insert_before (&gsi, stmt_to_insert, GSI_NEW_STMT);
-}
-
 
 /* Transform repeated addition of same values into multiply with
    constant.  */
@@ -3787,6 +3777,29 @@ find_insert_point (gimple *stmt, tree rhs1, tree rhs2)
   return stmt;
 }
 
+/* If the stmt that defines operand has to be inserted, insert it
+   before the use.  */
+static void
+insert_stmt_before_use (gimple *stmt, gimple *stmt_to_insert)
+{
+  gcc_assert (is_gimple_assign (stmt_to_insert));
+  tree rhs1 = gimple_assign_rhs1 (stmt_to_insert);
+  tree rhs2 = gimple_assign_rhs2 (stmt_to_insert);
+  gimple *insert_point = find_insert_point (stmt, rhs1, rhs2);
+  gimple_stmt_iterator gsi = gsi_for_stmt (insert_point);
+  gimple_set_uid (stmt_to_insert, gimple_uid (insert_point));
+
+  /* If the insert point is not stmt, then insert_point would be
+     the point where operand rhs1 or rhs2 is defined. In this case,
+     stmt_to_insert has to be inserted afterwards. This would
+     only happen when the stmt insertion point is flexible. */
+  if (stmt == insert_point)
+    gsi_insert_before (&gsi, stmt_to_insert, GSI_NEW_STMT);
+  else
+    insert_stmt_after (stmt_to_insert, insert_point);
+}
+
+
 /* Recursively rewrite our linearized statements so that the operators
    match those in OPS[OPINDEX], putting the computation in rank
    order.  Return new lhs.  */
@@ -3823,6 +3836,12 @@ rewrite_expr_tree (gimple *stmt, unsigned int opindex,
              print_gimple_stmt (dump_file, stmt, 0, 0);
            }
 
+         /* If the stmt that defines operand has to be inserted, insert it
+            before the use.  */
+         if (oe1->stmt_to_insert)
+           insert_stmt_before_use (stmt, oe1->stmt_to_insert);
+         if (oe2->stmt_to_insert)
+           insert_stmt_before_use (stmt, oe2->stmt_to_insert);
          /* Even when changed is false, reassociation could have e.g. removed
             some redundant operations, so unless we are just swapping the
             arguments or unless there is no change at all (then we just
@@ -3831,12 +3850,6 @@ rewrite_expr_tree (gimple *stmt, unsigned int opindex,
            {
              gimple *insert_point
                = find_insert_point (stmt, oe1->op, oe2->op);
-             /* If the stmt that defines operand has to be inserted, insert it
-                before the use.  */
-             if (oe1->stmt_to_insert)
-               insert_stmt_before_use (stmt, oe1->stmt_to_insert);
-             if (oe2->stmt_to_insert)
-               insert_stmt_before_use (stmt, oe2->stmt_to_insert);
              lhs = make_ssa_name (TREE_TYPE (lhs));
              stmt
                = gimple_build_assign (lhs, gimple_assign_rhs_code (stmt),
@@ -3852,12 +3865,6 @@ rewrite_expr_tree (gimple *stmt, unsigned int opindex,
            {
              gcc_checking_assert (find_insert_point (stmt, oe1->op, oe2->op)
                                   == stmt);
-             /* If the stmt that defines operand has to be inserted, insert it
-                before the use.  */
-             if (oe1->stmt_to_insert)
-               insert_stmt_before_use (stmt, oe1->stmt_to_insert);
-             if (oe2->stmt_to_insert)
-               insert_stmt_before_use (stmt, oe2->stmt_to_insert);
              gimple_assign_set_rhs1 (stmt, oe1->op);
              gimple_assign_set_rhs2 (stmt, oe2->op);
              update_stmt (stmt);
@@ -4097,16 +4104,18 @@ rewrite_expr_tree_parallel (gassign *stmt, int width,
          print_gimple_stmt (dump_file, stmts[i], 0, 0);
        }
 
+      /* If the stmt that defines operand has to be inserted, insert it
+        before the use.  */
+      if (stmt1)
+       insert_stmt_before_use (stmts[i], stmt1);
+      if (stmt2)
+       insert_stmt_before_use (stmts[i], stmt2);
+      stmt1 = stmt2 = NULL;
+
       /* We keep original statement only for the last one.  All
         others are recreated.  */
       if (i == stmt_num - 1)
        {
-         /* If the stmt that defines operand has to be inserted, insert it
-            before the use.  */
-         if (stmt1)
-           insert_stmt_before_use (stmts[i], stmt1);
-         if (stmt2)
-           insert_stmt_before_use (stmts[i], stmt2);
          gimple_assign_set_rhs1 (stmts[i], op1);
          gimple_assign_set_rhs2 (stmts[i], op2);
          update_stmt (stmts[i]);
@@ -4114,12 +4123,6 @@ rewrite_expr_tree_parallel (gassign *stmt, int width,
       else
        {
          stmts[i] = build_and_add_sum (TREE_TYPE (last_rhs1), op1, op2, opcode);
-         /* If the stmt that defines operand has to be inserted, insert it
-            before new build_and_add stmt after it is created.  */
-         if (stmt1)
-           insert_stmt_before_use (stmts[i], stmt1);
-         if (stmt2)
-           insert_stmt_before_use (stmts[i], stmt2);
        }
       if (dump_file && (dump_flags & TDF_DETAILS))
        {