aboutsummaryrefslogtreecommitdiff
path: root/gcc/cfgrtl.c
diff options
context:
space:
mode:
authorZdenek Dvorak <dvorakz@suse.cz>2005-02-14 12:37:52 +0100
committerZdenek Dvorak <rakdver@gcc.gnu.org>2005-02-14 11:37:52 +0000
commitaf9ecd0ca05832b2681965b96e0f169b19355f89 (patch)
treeccf30967b64909fbd1caf38b5e2c68a7e4788148 /gcc/cfgrtl.c
parent09950393c3c5d37dc48236f04b9823be8f5425c0 (diff)
downloadgcc-af9ecd0ca05832b2681965b96e0f169b19355f89.zip
gcc-af9ecd0ca05832b2681965b96e0f169b19355f89.tar.gz
gcc-af9ecd0ca05832b2681965b96e0f169b19355f89.tar.bz2
re PR rtl-optimization/17428 (internal compiler error: in spill_failure, at reload1.c:1880 (-fspeculative-prefetching))
PR target/17428 * cfgrtl.c (safe_insert_insn_on_edge): Avoid extending life range of hard registers. * value-prof.c (insn_prefetch_values_to_profile): Only scan normal insns. * value-prof.c (rtl_find_values_to_profile): Do not look for values to profile in libcalls. From-SVN: r95007
Diffstat (limited to 'gcc/cfgrtl.c')
-rw-r--r--gcc/cfgrtl.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index fa0af4b..8de7644 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -1470,6 +1470,16 @@ safe_insert_insn_on_edge (rtx insn, edge e)
for (x = insn; x; x = NEXT_INSN (x))
if (INSN_P (x))
note_stores (PATTERN (x), mark_killed_regs, killed);
+
+ /* Mark all hard registers as killed. Register allocator/reload cannot
+ cope with the situation when life range of hard register spans operation
+ for that the appropriate register is needed, i.e. it would be unsafe to
+ extend the life ranges of hard registers. */
+ for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
+ if (!fixed_regs[regno]
+ && !REGNO_PTR_FRAME_P (regno))
+ SET_REGNO_REG_SET (killed, regno);
+
bitmap_and_into (killed, e->dest->global_live_at_start);
EXECUTE_IF_SET_IN_REG_SET (killed, 0, regno, rsi)
@@ -1515,6 +1525,7 @@ safe_insert_insn_on_edge (rtx insn, edge e)
insert_insn_on_edge (insn, e);
FREE_REG_SET (killed);
+
return true;
}