diff options
author | Segher Boessenkool <segher@kernel.crashing.org> | 2017-04-19 12:03:35 +0200 |
---|---|---|
committer | Segher Boessenkool <segher@gcc.gnu.org> | 2017-04-19 12:03:35 +0200 |
commit | fd1ca3fe77e7cde6a8aa3ffdb833bf9a8b2b9974 (patch) | |
tree | ed30e131f24424977c1465b09f63eba83bc303bc | |
parent | 46928a8fda6ed2673ab4eb598060f03278d87af4 (diff) | |
download | gcc-fd1ca3fe77e7cde6a8aa3ffdb833bf9a8b2b9974.zip gcc-fd1ca3fe77e7cde6a8aa3ffdb833bf9a8b2b9974.tar.gz gcc-fd1ca3fe77e7cde6a8aa3ffdb833bf9a8b2b9974.tar.bz2 |
IRA: Don't create new regs for debug insns (PR80429)
In split_live_ranges_for_shrink_wrap IRA also splits regs that are
only used in debug insns, leading to -fcompare-debug failures.
PR rtl-optimization/80429
* ira.c (split_live_ranges_for_shrink_wrap): Don't split regs that
are only used in debug insns.
From-SVN: r246991
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ira.c | 25 |
2 files changed, 26 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d52db8a..15cc6c8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-04-19 Segher Boessenkool <segher@kernel.crashing.org> + + PR rtl-optimization/80429 + * ira.c (split_live_ranges_for_shrink_wrap): Don't split regs that + are only used in debug insns. + 2017-04-19 Eric Botcazou <ebotcazou@adacore.com> Vladimir Makarov <vmakarov@redhat.com> @@ -4992,25 +4992,40 @@ split_live_ranges_for_shrink_wrap (void) if (!dest || dest == pic_offset_table_rtx) continue; - rtx newreg = NULL_RTX; + bool need_newreg = false; df_ref use, next; for (use = DF_REG_USE_CHAIN (REGNO (dest)); use; use = next) { rtx_insn *uin = DF_REF_INSN (use); next = DF_REF_NEXT_REG (use); + if (DEBUG_INSN_P (uin)) + continue; + basic_block ubb = BLOCK_FOR_INSN (uin); if (ubb == call_dom || dominated_by_p (CDI_DOMINATORS, ubb, call_dom)) { - if (!newreg) - newreg = ira_create_new_reg (dest); - validate_change (uin, DF_REF_REAL_LOC (use), newreg, true); + need_newreg = true; + break; } } - if (newreg) + if (need_newreg) { + rtx newreg = ira_create_new_reg (dest); + + for (use = DF_REG_USE_CHAIN (REGNO (dest)); use; use = next) + { + rtx_insn *uin = DF_REF_INSN (use); + next = DF_REF_NEXT_REG (use); + + basic_block ubb = BLOCK_FOR_INSN (uin); + if (ubb == call_dom + || dominated_by_p (CDI_DOMINATORS, ubb, call_dom)) + validate_change (uin, DF_REF_REAL_LOC (use), newreg, true); + } + rtx_insn *new_move = gen_move_insn (newreg, dest); emit_insn_after (new_move, bb_note (call_dom)); if (dump_file) |