aboutsummaryrefslogtreecommitdiff
path: root/gcc/value-prof.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/value-prof.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/value-prof.c')
-rw-r--r--gcc/value-prof.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/gcc/value-prof.c b/gcc/value-prof.c
index 1663e64..e5e4320 100644
--- a/gcc/value-prof.c
+++ b/gcc/value-prof.c
@@ -245,7 +245,8 @@ insn_prefetch_values_to_profile (rtx insn, histogram_values *values)
int write;
histogram_value hist;
- if (!INSN_P (insn))
+ /* It only makes sense to look for memory references in ordinary insns. */
+ if (GET_CODE (insn) != INSN)
return false;
if (!find_mem_reference (insn, &mem, &write))
@@ -288,13 +289,30 @@ static void
rtl_find_values_to_profile (histogram_values *values)
{
rtx insn;
- unsigned i;
+ unsigned i, libcall_level;
life_analysis (NULL, PROP_DEATH_NOTES);
*values = VEC_alloc (histogram_value, 0);
+ libcall_level = 0;
for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
- insn_values_to_profile (insn, values);
+ {
+ if (find_reg_note (insn, REG_LIBCALL, NULL_RTX))
+ libcall_level++;
+
+ /* Do not instrument values inside libcalls (we are going to split block
+ due to instrumentation, and libcall blocks should be local to a single
+ basic block). */
+ if (!libcall_level)
+ insn_values_to_profile (insn, values);
+
+ if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
+ {
+ gcc_assert (libcall_level > 0);
+ libcall_level--;
+ }
+ }
+ gcc_assert (libcall_level == 0);
for (i = 0; i < VEC_length (histogram_value, *values); i++)
{