diff options
author | Segher Boessenkool <segher@kernel.crashing.org> | 2017-12-13 15:05:57 +0100 |
---|---|---|
committer | Segher Boessenkool <segher@gcc.gnu.org> | 2017-12-13 15:05:57 +0100 |
commit | 2046f23f52d5ed4299f12e5f98a88491e4936c44 (patch) | |
tree | fdd3d7a0babdfbf3b3c64e2de65288c9cc43e89b /gcc/combine.c | |
parent | 2b031ef48e365e256495a3e6d226a59f2290444f (diff) | |
download | gcc-2046f23f52d5ed4299f12e5f98a88491e4936c44.zip gcc-2046f23f52d5ed4299f12e5f98a88491e4936c44.tar.gz gcc-2046f23f52d5ed4299f12e5f98a88491e4936c44.tar.bz2 |
combine: Fix PR83393
In move_deaths we move a REG_DEAD note if the instruction combination
has extended the lifetime of a register so that the existing note is
no longer valid. We find that note using reg_stat, but what that finds
can refer to a later insn. If so, we cannot use the cached value. This
patch implements that.
PR rtl-optimization/83393
* combine.c (move_deaths): If reg_stat points to a too new insn in
last_death, do not use it: find the proper insn instead.
gcc/testsuite/
PR rtl-optimization/83393
* gcc.dg/pr83393.c: New testcase.
From-SVN: r255606
Diffstat (limited to 'gcc/combine.c')
-rw-r--r-- | gcc/combine.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/gcc/combine.c b/gcc/combine.c index b6410c3..eb737f6 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -13880,7 +13880,7 @@ move_deaths (rtx x, rtx maybe_kill_insn, int from_luid, rtx_insn *to_insn, /* If we do not know where the register died, it may still die between FROM_LUID and TO_INSN. If so, find it. This is PR83304. */ - if (!where_dead) + if (!where_dead || DF_INSN_LUID (where_dead) >= DF_INSN_LUID (to_insn)) { rtx_insn *insn = prev_real_insn (to_insn); while (insn |