diff options
author | Zdenek Dvorak <dvorakz@suse.cz> | 2005-02-14 12:37:52 +0100 |
---|---|---|
committer | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2005-02-14 11:37:52 +0000 |
commit | af9ecd0ca05832b2681965b96e0f169b19355f89 (patch) | |
tree | ccf30967b64909fbd1caf38b5e2c68a7e4788148 /gcc/value-prof.c | |
parent | 09950393c3c5d37dc48236f04b9823be8f5425c0 (diff) | |
download | gcc-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.c | 24 |
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++) { |