diff options
Diffstat (limited to 'gcc/tree-ssa-loop-im.c')
-rw-r--r-- | gcc/tree-ssa-loop-im.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c index 738249445b0..6c6a9f17a1d 100644 --- a/gcc/tree-ssa-loop-im.c +++ b/gcc/tree-ssa-loop-im.c @@ -764,6 +764,7 @@ rewrite_reciprocal (gimple_stmt_iterator *bsi) gimple stmt, stmt1, stmt2; tree var, name, lhs, type; tree real_one; + gimple_stmt_iterator gsi; stmt = gsi_stmt (*bsi); lhs = gimple_assign_lhs (stmt); @@ -798,8 +799,9 @@ rewrite_reciprocal (gimple_stmt_iterator *bsi) /* Replace division stmt with reciprocal and multiply stmts. The multiply stmt is not invariant, so update iterator and avoid rescanning. */ - gsi_replace (bsi, stmt1, true); - gsi_insert_after (bsi, stmt2, GSI_NEW_STMT); + gsi = *bsi; + gsi_insert_before (bsi, stmt1, GSI_NEW_STMT); + gsi_replace (&gsi, stmt2, true); /* Continue processing with invariant reciprocal statement. */ return stmt1; @@ -858,6 +860,8 @@ rewrite_bittest (gimple_stmt_iterator *bsi) if (outermost_invariant_loop (b, loop_containing_stmt (stmt1)) != NULL && outermost_invariant_loop (a, loop_containing_stmt (stmt1)) == NULL) { + gimple_stmt_iterator rsi; + /* 1 << B */ var = create_tmp_var (TREE_TYPE (a), "shifttmp"); add_referenced_var (var); @@ -878,9 +882,14 @@ rewrite_bittest (gimple_stmt_iterator *bsi) SET_USE (use, name); gimple_cond_set_rhs (use_stmt, build_int_cst_type (TREE_TYPE (name), 0)); - gsi_insert_before (bsi, stmt1, GSI_SAME_STMT); - propagate_defs_into_debug_stmts (gsi_stmt (*bsi), NULL, NULL); - gsi_replace (bsi, stmt2, true); + /* Don't use gsi_replace here, none of the new assignments sets + the variable originally set in stmt. Move bsi to stmt1, and + then remove the original stmt, so that we get a chance to + retain debug info for it. */ + rsi = *bsi; + gsi_insert_before (bsi, stmt1, GSI_NEW_STMT); + gsi_insert_before (&rsi, stmt2, GSI_SAME_STMT); + gsi_remove (&rsi, true); return stmt1; } @@ -1060,7 +1069,6 @@ move_computations_stmt (struct dom_walk_data *dw_data ATTRIBUTE_UNUSED, mark_virtual_ops_for_renaming (stmt); gsi_insert_on_edge (loop_preheader_edge (level), stmt); - propagate_defs_into_debug_stmts (gsi_stmt (bsi), NULL, NULL); gsi_remove (&bsi, false); } } |