diff options
author | Richard Biener <rguenther@suse.de> | 2020-08-27 14:21:33 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2020-09-01 11:52:10 +0200 |
commit | d6a05b494b4b714e996a5ca09c5a4a1c41dbd648 (patch) | |
tree | 0d9de018722a2f47b0fb13e01dd9ecc7439514a2 /gcc/modulo-sched.c | |
parent | a37b0cccf4965f13006d2928f57a71e46e341cf8 (diff) | |
download | gcc-d6a05b494b4b714e996a5ca09c5a4a1c41dbd648.zip gcc-d6a05b494b4b714e996a5ca09c5a4a1c41dbd648.tar.gz gcc-d6a05b494b4b714e996a5ca09c5a4a1c41dbd648.tar.bz2 |
rtl-optimization/96812 - remap dependence info on RTL loop unrolling
This carries over the PR87609 fix also to RTL loop unrolling. The
gcc.dg/torture/pr90328.c testcase otherwise is miscompiled with
the tree-ssa-address.c hunk (or alternatively with -fno-ivopts
on master). I've tried to find the correct abstraction and
adjusted two other duplicate_insn_chain users for which I do not
have testcases. There may be other insn-chain copying routines
that could be affected but hopefully most appropriately go through
CFG hooks.
2020-08-27 Richard Biener <rguenther@suse.de>
PR rtl-optimization/96812
* tree-ssa-address.c (copy_ref_info): Also copy dependence info.
* cfgrtl.h (duplicate_insn_chain): Adjust prototype.
* cfgrtl.c (duplicate_insn_chain): Remap dependence info
if requested.
(cfg_layout_duplicate_bb): Make sure we remap dependence info.
* modulo-sched.c (duplicate_insns_of_cycles): Remap dependence
info.
(generate_prolog_epilog): Adjust.
* config/c6x/c6x.c (hwloop_optimize): Remap dependence info.
Diffstat (limited to 'gcc/modulo-sched.c')
-rw-r--r-- | gcc/modulo-sched.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/gcc/modulo-sched.c b/gcc/modulo-sched.c index 86701e0..6f699a8 100644 --- a/gcc/modulo-sched.c +++ b/gcc/modulo-sched.c @@ -1085,10 +1085,11 @@ optimize_sc (partial_schedule_ptr ps, ddg_ptr g) static void duplicate_insns_of_cycles (partial_schedule_ptr ps, int from_stage, - int to_stage, rtx count_reg) + int to_stage, rtx count_reg, class loop *loop) { int row; ps_insn_ptr ps_ij; + copy_bb_data id; for (row = 0; row < ps->ii; row++) for (ps_ij = ps->rows[row]; ps_ij; ps_ij = ps_ij->next_in_row) @@ -1113,7 +1114,8 @@ duplicate_insns_of_cycles (partial_schedule_ptr ps, int from_stage, if (from_stage <= last_u && to_stage >= first_u) { if (u < ps->g->num_nodes) - duplicate_insn_chain (ps_first_note (ps, u), u_insn); + duplicate_insn_chain (ps_first_note (ps, u), u_insn, + loop, &id); else emit_insn (copy_rtx (PATTERN (u_insn))); } @@ -1151,7 +1153,7 @@ generate_prolog_epilog (partial_schedule_ptr ps, class loop *loop, } for (i = 0; i < last_stage; i++) - duplicate_insns_of_cycles (ps, 0, i, count_reg); + duplicate_insns_of_cycles (ps, 0, i, count_reg, loop); /* Put the prolog on the entry edge. */ e = loop_preheader_edge (loop); @@ -1165,7 +1167,7 @@ generate_prolog_epilog (partial_schedule_ptr ps, class loop *loop, start_sequence (); for (i = 0; i < last_stage; i++) - duplicate_insns_of_cycles (ps, i + 1, last_stage, count_reg); + duplicate_insns_of_cycles (ps, i + 1, last_stage, count_reg, loop); /* Put the epilogue on the exit edge. */ gcc_assert (single_exit (loop)); |