aboutsummaryrefslogtreecommitdiff
path: root/gcc/combine.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2005-11-15 00:59:21 +0000
committerAlan Modra <amodra@gcc.gnu.org>2005-11-15 11:29:21 +1030
commit46de9b3caffed182eced14f567b27bb77630335f (patch)
treefb1b5a7c58c0d92dea3fff32e17615973850ea40 /gcc/combine.c
parent12431170a7501c25893590d93c876951081da6f9 (diff)
downloadgcc-46de9b3caffed182eced14f567b27bb77630335f.zip
gcc-46de9b3caffed182eced14f567b27bb77630335f.tar.gz
gcc-46de9b3caffed182eced14f567b27bb77630335f.tar.bz2
re PR rtl-optimization/22002 (internal consistency failure with -funroll-loops)
PR rtl-optimization/22002 * combine.c (distribute_notes): Detect cases where a reg dies two or more times in a bb, including on the insn we are combining, and place the death note on the correct range. From-SVN: r106921
Diffstat (limited to 'gcc/combine.c')
-rw-r--r--gcc/combine.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index 82d260d..9f910a7 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -12232,6 +12232,10 @@ distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2, rtx elim_i2,
{
basic_block bb = this_basic_block;
+ /* You might think you could search back from FROM_INSN
+ rather than from I3, but combine tries to split invalid
+ combined instructions. This can result in the old I2
+ or I1 moving later in the insn sequence. */
for (tem = PREV_INSN (i3); place == 0; tem = PREV_INSN (tem))
{
if (! INSN_P (tem))
@@ -12332,6 +12336,22 @@ distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2, rtx elim_i2,
|| (CALL_P (tem)
&& find_reg_fusage (tem, USE, XEXP (note, 0))))
{
+ /* This may not be the correct place for the death
+ note if FROM_INSN is before TEM, and the reg is
+ set between FROM_INSN and TEM. The reg might
+ die two or more times. An existing death note
+ means we are looking at the wrong live range. */
+ if (from_insn
+ && INSN_CUID (from_insn) < INSN_CUID (tem)
+ && find_regno_note (tem, REG_DEAD,
+ REGNO (XEXP (note, 0))))
+ {
+ tem = from_insn;
+ if (tem == BB_HEAD (bb))
+ break;
+ continue;
+ }
+
place = tem;
/* If we are doing a 3->2 combination, and we have a