aboutsummaryrefslogtreecommitdiff
path: root/gcc/ira.c
diff options
context:
space:
mode:
authorSegher Boessenkool <segher@kernel.crashing.org>2017-04-19 12:03:35 +0200
committerSegher Boessenkool <segher@gcc.gnu.org>2017-04-19 12:03:35 +0200
commitfd1ca3fe77e7cde6a8aa3ffdb833bf9a8b2b9974 (patch)
treeed30e131f24424977c1465b09f63eba83bc303bc /gcc/ira.c
parent46928a8fda6ed2673ab4eb598060f03278d87af4 (diff)
downloadgcc-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
Diffstat (limited to 'gcc/ira.c')
-rw-r--r--gcc/ira.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/gcc/ira.c b/gcc/ira.c
index 7079573..bfb0508 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -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)