diff options
author | Richard Biener <rguenther@suse.de> | 2020-10-26 10:08:38 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2020-10-26 11:33:50 +0100 |
commit | 27c14056f4805c9d8cfc655ef2c846be128b02c9 (patch) | |
tree | d59e0999fb39d9c6635b69f2fbed3f03c42cf731 /gcc/tree-vect-loop-manip.c | |
parent | 40e67ab8e59cf1c558f2818625c7e06dbf7a8e50 (diff) | |
download | gcc-27c14056f4805c9d8cfc655ef2c846be128b02c9.zip gcc-27c14056f4805c9d8cfc655ef2c846be128b02c9.tar.gz gcc-27c14056f4805c9d8cfc655ef2c846be128b02c9.tar.bz2 |
tree-optimization/97539 - reset out-of-loop debug uses before peeling
This makes sure to reset out-of-loop debug uses before vectorizer
loop peeling as we cannot make sure to retain the use-def dominance
relationship when there are no LC SSA nodes.
2020-10-26 Richard Biener <rguenther@suse.de>
PR tree-optimization/97539
* tree-vect-loop-manip.c (vect_do_peeling): Reset out-of-loop
debug uses before peeling.
* gcc.dg/pr97539.c: New testcase.
Diffstat (limited to 'gcc/tree-vect-loop-manip.c')
-rw-r--r-- | gcc/tree-vect-loop-manip.c | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c index 7cf00e6..5d00b6f 100644 --- a/gcc/tree-vect-loop-manip.c +++ b/gcc/tree-vect-loop-manip.c @@ -2545,6 +2545,45 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1, if (!prolog_peeling && !epilog_peeling) return NULL; + /* Before doing any peeling make sure to reset debug binds outside of + the loop refering to defs not in LC SSA. */ + class loop *loop = LOOP_VINFO_LOOP (loop_vinfo); + for (unsigned i = 0; i < loop->num_nodes; ++i) + { + basic_block bb = LOOP_VINFO_BBS (loop_vinfo)[i]; + imm_use_iterator ui; + gimple *use_stmt; + for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); + gsi_next (&gsi)) + { + FOR_EACH_IMM_USE_STMT (use_stmt, ui, gimple_phi_result (gsi.phi ())) + if (gimple_debug_bind_p (use_stmt) + && loop != gimple_bb (use_stmt)->loop_father + && !flow_loop_nested_p (loop, + gimple_bb (use_stmt)->loop_father)) + { + gimple_debug_bind_reset_value (use_stmt); + update_stmt (use_stmt); + } + } + for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi); + gsi_next (&gsi)) + { + ssa_op_iter op_iter; + def_operand_p def_p; + FOR_EACH_SSA_DEF_OPERAND (def_p, gsi_stmt (gsi), op_iter, SSA_OP_DEF) + FOR_EACH_IMM_USE_STMT (use_stmt, ui, DEF_FROM_PTR (def_p)) + if (gimple_debug_bind_p (use_stmt) + && loop != gimple_bb (use_stmt)->loop_father + && !flow_loop_nested_p (loop, + gimple_bb (use_stmt)->loop_father)) + { + gimple_debug_bind_reset_value (use_stmt); + update_stmt (use_stmt); + } + } + } + prob_vector = profile_probability::guessed_always ().apply_scale (9, 10); estimated_vf = vect_vf_for_cost (loop_vinfo); if (estimated_vf == 2) @@ -2552,7 +2591,7 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1, prob_prolog = prob_epilog = profile_probability::guessed_always () .apply_scale (estimated_vf - 1, estimated_vf); - class loop *prolog, *epilog = NULL, *loop = LOOP_VINFO_LOOP (loop_vinfo); + class loop *prolog, *epilog = NULL; class loop *first_loop = loop; bool irred_flag = loop_preheader_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP; |