re PR tree-optimization/80948 (test case gcc.dg/torture/pr68017.c fails with ICE...
authorRichard Biener <rguenther@suse.de>
Fri, 2 Jun 2017 12:34:32 +0000 (12:34 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 2 Jun 2017 12:34:32 +0000 (12:34 +0000)
2017-06-02  Richard Biener  <rguenther@suse.de>

PR tree-optimization/80948
* tree-tailcall.c (find_tail_calls): Track stmts to move in
stmt order as well.

From-SVN: r248824

gcc/ChangeLog
gcc/tree-tailcall.c

index 122c8cdcf7259708c874ec5bf8902f7d181926fc..499e6bb63851dd209188b4677991273d78f59775 100644 (file)
@@ -1,3 +1,9 @@
+2017-06-02  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/80948
+       * tree-tailcall.c (find_tail_calls): Track stmts to move in
+       stmt order as well.
+
 2017-06-02  Richard Biener  <rguenther@suse.de>
 
        * tree-vect-loop.c (vect_analyze_loop_operations): Not relevant
index f6cfce5228726fa5672d7b7da6b0205cb99535eb..bc370af610f8bced9623e4cabe37b6177aa538c0 100644 (file)
@@ -531,7 +531,8 @@ find_tail_calls (basic_block bb, struct tailcall **ret)
      since we are running after dce.  */
   m = NULL_TREE;
   a = NULL_TREE;
-  auto_bitmap to_move;
+  auto_bitmap to_move_defs;
+  auto_vec<gimple *> to_move_stmts;
 
   abb = bb;
   agsi = gsi;
@@ -563,7 +564,7 @@ find_tail_calls (basic_block bb, struct tailcall **ret)
 
       /* This is a gimple assign. */
       par ret = process_assignment (as_a <gassign *> (stmt), gsi,
-                                   &tmp_m, &tmp_a, &ass_var, to_move);
+                                   &tmp_m, &tmp_a, &ass_var, to_move_defs);
       if (ret == FAIL)
        return;
       else if (ret == TRY_MOVE)
@@ -573,10 +574,12 @@ find_tail_calls (basic_block bb, struct tailcall **ret)
          for (unsigned opno = 1; opno < gimple_num_ops (stmt); ++opno)
            {
              tree op = gimple_op (stmt, opno);
-             if (independent_of_stmt_p (op, stmt, gsi, to_move) != op)
+             if (independent_of_stmt_p (op, stmt, gsi, to_move_defs) != op)
                return;
            }
-         bitmap_set_bit (to_move, SSA_NAME_VERSION (gimple_assign_lhs (stmt)));
+         bitmap_set_bit (to_move_defs,
+                         SSA_NAME_VERSION (gimple_assign_lhs (stmt)));
+         to_move_stmts.safe_push (stmt);
          continue;
        }
 
@@ -622,11 +625,9 @@ find_tail_calls (basic_block bb, struct tailcall **ret)
   /* Move queued defs.  */
   if (tail_recursion)
     {
-      bitmap_iterator bi;
       unsigned i;
-      EXECUTE_IF_SET_IN_BITMAP (to_move, 0, i, bi)
+      FOR_EACH_VEC_ELT (to_move_stmts, i, stmt)
        {
-         stmt = SSA_NAME_DEF_STMT (ssa_name (i));
          gimple_stmt_iterator mgsi = gsi_for_stmt (stmt);
          gsi_move_before (&mgsi, &gsi);
        }