aboutsummaryrefslogtreecommitdiff
path: root/gcc/modulo-sched.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2020-08-27 14:21:33 +0200
committerRichard Biener <rguenther@suse.de>2020-09-01 11:52:10 +0200
commitd6a05b494b4b714e996a5ca09c5a4a1c41dbd648 (patch)
tree0d9de018722a2f47b0fb13e01dd9ecc7439514a2 /gcc/modulo-sched.c
parenta37b0cccf4965f13006d2928f57a71e46e341cf8 (diff)
downloadgcc-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.c10
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));