diff options
Diffstat (limited to 'gcc/tree-vect-loop-manip.c')
-rw-r--r-- | gcc/tree-vect-loop-manip.c | 45 |
1 files changed, 30 insertions, 15 deletions
diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c index 9ac0d9a..87afb6e 100644 --- a/gcc/tree-vect-loop-manip.c +++ b/gcc/tree-vect-loop-manip.c @@ -294,13 +294,15 @@ slpeel_update_phis_for_duplicate_loop (struct loop *orig_loop, gsi_next (&gsi_new), gsi_next (&gsi_orig)) { source_location locus; + tree block; phi_new = gsi_stmt (gsi_new); phi_orig = gsi_stmt (gsi_orig); /* step 1. */ def = PHI_ARG_DEF_FROM_EDGE (phi_orig, entry_arg_e); locus = gimple_phi_arg_location_from_edge (phi_orig, entry_arg_e); - add_phi_arg (phi_new, def, new_loop_entry_e, locus); + block = gimple_phi_arg_block_from_edge (phi_orig, entry_arg_e); + add_phi_arg (phi_new, def, new_loop_entry_e, locus, block); /* step 2. */ def = PHI_ARG_DEF_FROM_EDGE (phi_orig, orig_loop_latch); @@ -317,7 +319,8 @@ slpeel_update_phis_for_duplicate_loop (struct loop *orig_loop, } /* An ordinary ssa name defined in the loop. */ - add_phi_arg (phi_new, new_ssa_name, loop_latch_edge (new_loop), locus); + add_phi_arg (phi_new, new_ssa_name, loop_latch_edge (new_loop), locus, + block); /* Drop any debug references outside the loop, if they would become ill-formed SSA. */ @@ -512,6 +515,7 @@ slpeel_update_phi_nodes_for_guard1 (edge guard_edge, struct loop *loop, gsi_next (&gsi_orig), gsi_next (&gsi_update)) { source_location loop_locus, guard_locus; + tree loop_block, guard_block; orig_phi = gsi_stmt (gsi_orig); update_phi = gsi_stmt (gsi_update); @@ -527,13 +531,19 @@ slpeel_update_phi_nodes_for_guard1 (edge guard_edge, struct loop *loop, loop_locus = gimple_phi_arg_location_from_edge (orig_phi, EDGE_SUCC (loop->latch, 0)); + loop_block = gimple_phi_arg_block_from_edge (orig_phi, + EDGE_SUCC (loop->latch, + 0)); + guard_arg = PHI_ARG_DEF_FROM_EDGE (orig_phi, loop_preheader_edge (loop)); guard_locus = gimple_phi_arg_location_from_edge (orig_phi, loop_preheader_edge (loop)); + guard_block = gimple_phi_arg_block_from_edge (orig_phi, + loop_preheader_edge (loop)); - add_phi_arg (new_phi, loop_arg, new_exit_e, loop_locus); - add_phi_arg (new_phi, guard_arg, guard_edge, guard_locus); + add_phi_arg (new_phi, loop_arg, new_exit_e, loop_locus, loop_block); + add_phi_arg (new_phi, guard_arg, guard_edge, guard_locus, guard_block); /* 1.3. Update phi in successor block. */ gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi, e) == loop_arg @@ -552,7 +562,7 @@ slpeel_update_phi_nodes_for_guard1 (edge guard_edge, struct loop *loop, *new_exit_bb); /* 2.2. NEW_EXIT_BB has one incoming edge: the exit-edge of the loop. */ - add_phi_arg (new_phi, loop_arg, single_exit (loop), loop_locus); + add_phi_arg (new_phi, loop_arg, single_exit (loop), loop_locus, loop_block); /* 2.3. Update phi in successor of NEW_EXIT_BB: */ gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi2, new_exit_e) == loop_arg); @@ -680,8 +690,8 @@ slpeel_update_phi_nodes_for_guard2 (edge guard_edge, struct loop *loop, if (new_name2) guard_arg = new_name2; - add_phi_arg (new_phi, loop_arg, new_exit_e, UNKNOWN_LOCATION); - add_phi_arg (new_phi, guard_arg, guard_edge, UNKNOWN_LOCATION); + add_phi_arg (new_phi, loop_arg, new_exit_e, UNKNOWN_LOCATION, NULL); + add_phi_arg (new_phi, guard_arg, guard_edge, UNKNOWN_LOCATION, NULL); /* 1.3. Update phi in successor block. */ gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi, e) == orig_def); @@ -696,7 +706,8 @@ slpeel_update_phi_nodes_for_guard2 (edge guard_edge, struct loop *loop, *new_exit_bb); /* 2.2. NEW_EXIT_BB has one incoming edge: the exit-edge of the loop. */ - add_phi_arg (new_phi, loop_arg, single_exit (loop), UNKNOWN_LOCATION); + add_phi_arg (new_phi, loop_arg, single_exit (loop), UNKNOWN_LOCATION, + NULL); /* 2.3. Update phi in successor of NEW_EXIT_BB: */ gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi2, new_exit_e) == loop_arg); @@ -733,7 +744,7 @@ slpeel_update_phi_nodes_for_guard2 (edge guard_edge, struct loop *loop, /* 3.3. GUARD_BB has one incoming edge: */ gcc_assert (EDGE_COUNT (guard_edge->src->preds) == 1); add_phi_arg (new_phi, arg, EDGE_PRED (guard_edge->src, 0), - UNKNOWN_LOCATION); + UNKNOWN_LOCATION, NULL); /* 3.4. Update phi in successor of GUARD_BB: */ gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi2, guard_edge) @@ -859,14 +870,16 @@ slpeel_tree_duplicate_loop_to_edge_cfg (struct loop *loop, edge e) { edge new_loop_exit_edge; source_location locus; + tree block; locus = gimple_phi_arg_location_from_edge (phi, single_exit (loop)); + block = gimple_phi_arg_block_from_edge (phi, single_exit (loop)); if (EDGE_SUCC (new_loop->header, 0)->dest == new_loop->latch) new_loop_exit_edge = EDGE_SUCC (new_loop->header, 1); else new_loop_exit_edge = EDGE_SUCC (new_loop->header, 0); - add_phi_arg (phi, phi_arg, new_loop_exit_edge, locus); + add_phi_arg (phi, phi_arg, new_loop_exit_edge, locus, block); } } @@ -905,7 +918,8 @@ slpeel_tree_duplicate_loop_to_edge_cfg (struct loop *loop, edge e) phi_arg = PHI_ARG_DEF_FROM_EDGE (phi, entry_e); if (phi_arg) add_phi_arg (phi, phi_arg, new_exit_e, - gimple_phi_arg_location_from_edge (phi, entry_e)); + gimple_phi_arg_location_from_edge (phi, entry_e), + gimple_phi_arg_block_from_edge (phi, entry_e)); } redirect_edge_and_branch_force (entry_e, new_loop->header); @@ -1089,8 +1103,8 @@ set_prologue_iterations (basic_block bb_before_first_loop, newphi = create_phi_node (var, bb_before_first_loop); add_phi_arg (newphi, prologue_after_cost_adjust_name, e_fallthru, - UNKNOWN_LOCATION); - add_phi_arg (newphi, *first_niters, e_false, UNKNOWN_LOCATION); + UNKNOWN_LOCATION, NULL); + add_phi_arg (newphi, *first_niters, e_false, UNKNOWN_LOCATION, NULL); *first_niters = PHI_RESULT (newphi); } @@ -1193,7 +1207,7 @@ slpeel_tree_peel_loop_to_edge (struct loop *loop, new_phi); use_operand_p use_p; - add_phi_arg (new_phi, vop, exit_e, UNKNOWN_LOCATION); + add_phi_arg (new_phi, vop, exit_e, UNKNOWN_LOCATION, NULL); gimple_phi_set_result (new_phi, new_vop); FOR_EACH_IMM_USE_STMT (stmt, imm_iter, vop) if (stmt != new_phi && gimple_bb (stmt) != loop->header) @@ -2551,7 +2565,8 @@ vect_loop_versioning (loop_vec_info loop_vinfo, new_exit_bb); arg = PHI_ARG_DEF_FROM_EDGE (orig_phi, e); add_phi_arg (new_phi, arg, new_exit_e, - gimple_phi_arg_location_from_edge (orig_phi, e)); + gimple_phi_arg_location_from_edge (orig_phi, e), + gimple_phi_arg_block_from_edge (orig_phi, e)); adjust_phi_and_debug_stmts (orig_phi, e, PHI_RESULT (new_phi)); } |