aboutsummaryrefslogtreecommitdiff
path: root/gcc/combine.c
diff options
context:
space:
mode:
authorPaolo Bonzini <bonzini@gnu.org>2006-01-16 18:20:32 +0000
committerPaolo Bonzini <bonzini@gcc.gnu.org>2006-01-16 18:20:32 +0000
commit0efa4029c4390bacd5ac9659cbb30238d0975880 (patch)
tree09fe661a6f25ff56550e333ac12b26e02d767733 /gcc/combine.c
parent61ead1351f094cfab41940ea093b88d1ec6dcde6 (diff)
downloadgcc-0efa4029c4390bacd5ac9659cbb30238d0975880.zip
gcc-0efa4029c4390bacd5ac9659cbb30238d0975880.tar.gz
gcc-0efa4029c4390bacd5ac9659cbb30238d0975880.tar.bz2
combine.c (record_value_for_reg): Invalidate registers if INSN is null.
2005-01-16 Paolo Bonzini <bonzini@gnu.org> * combine.c (record_value_for_reg): Invalidate registers if INSN is null. (record_dead_and_set_regs_1): Likewise, by passing them to record_value_for_reg. (record_dead_and_set_regs): Invalidate stores made by a call. We do not combine across a call, but we still relied on equivalences. From-SVN: r109759
Diffstat (limited to 'gcc/combine.c')
-rw-r--r--gcc/combine.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index 16bb99c..69b9c10 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -10927,7 +10927,7 @@ record_value_for_reg (rtx reg, rtx insn, rtx value)
for (i = regno; i < endregno; i++)
{
reg_stat[i].last_set_label = label_tick;
- if (value && reg_stat[i].last_set_table_tick == label_tick)
+ if (!insn || (value && reg_stat[i].last_set_table_tick == label_tick))
reg_stat[i].last_set_invalid = 1;
else
reg_stat[i].last_set_invalid = 0;
@@ -10976,6 +10976,13 @@ record_dead_and_set_regs_1 (rtx dest, rtx setter, void *data)
if (GET_CODE (dest) == SUBREG)
dest = SUBREG_REG (dest);
+ if (!record_dead_insn)
+ {
+ if (REG_P (dest))
+ record_value_for_reg (dest, NULL_RTX, NULL_RTX);
+ return;
+ }
+
if (REG_P (dest))
{
/* If we are setting the whole register, we know its value. Otherwise
@@ -11049,15 +11056,14 @@ record_dead_and_set_regs (rtx insn)
last_call_cuid = mem_last_set = INSN_CUID (insn);
- /* Don't bother recording what this insn does. It might set the
- return value register, but we can't combine into a call
- pattern anyway, so there's no point trying (and it may cause
- a crash, if e.g. we wind up asking for last_set_value of a
- SUBREG of the return value register). */
- return;
+ /* We can't combine into a call pattern. Remember, though, that
+ the return value register is set at this CUID. We could
+ still replace a register with the return value from the
+ wrong subroutine call! */
+ note_stores (PATTERN (insn), record_dead_and_set_regs_1, NULL_RTX);
}
-
- note_stores (PATTERN (insn), record_dead_and_set_regs_1, insn);
+ else
+ note_stores (PATTERN (insn), record_dead_and_set_regs_1, insn);
}
/* If a SUBREG has the promoted bit set, it is in fact a property of the