diff mbox

IRA: Don't create new regs for debug insns (PR80429)

Message ID 0f785cef9fcf40b5a54e2e2950083caa50d9bdce.1492506999.git.segher@kernel.crashing.org
State New
Headers show

Commit Message

Segher Boessenkool April 18, 2017, 9:30 a.m. UTC
In split_live_ranges_for_shrink_wrap IRA also splits regs that are
only used in debug insns, leading to -fcompare-debug failures.

Bootstrapped and tested on powerpc64-linux {-m32,-m64}.  This happens
on at least GCC 5, so not a regression; but it is trivial and obvious,
is it okay for trunk anyway?


Segher


2017-04-18  Segher Boessenkool  <segher@kernel.crashing.org>

	PR rtl-optimization/80429
	* ira.c (split_live_ranges_for_shrink_wrap): Skip DEBUG_INSNs.

---
 gcc/ira.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Jakub Jelinek April 18, 2017, 9:47 a.m. UTC | #1
On Tue, Apr 18, 2017 at 09:30:19AM +0000, Segher Boessenkool wrote:
> In split_live_ranges_for_shrink_wrap IRA also splits regs that are
> only used in debug insns, leading to -fcompare-debug failures.
> 
> Bootstrapped and tested on powerpc64-linux {-m32,-m64}.  This happens
> on at least GCC 5, so not a regression; but it is trivial and obvious,
> is it okay for trunk anyway?

I think the first question here is if it is beneficial to replace the
regs in DEBUG_INSNs or not.  If it is beneficial, then it of course
has to be changed such that it never does
newreg = ira_create_new_reg (dest);
just because it sees DEBUG_INSN uses, but otherwise it should do what it
does now.

So one option is e.g. to split that loop into two, one doing analysis,
i.e. that newreg = ira_create_new_reg (dest);, but not
validate_change (uin, DF_REF_REAL_LOC (use), newreg, true);
and this loop would also ignore DEBUG_INSN_P.
And the other loop, with the same content, just without that newreg = ...
and with the validate_change, as whole guarded with if (newreg),
replacing stuff on all insns.

Or another way to write this is have the loop as currently is, with
  if (DEBUG_INSN_P (uin) && (!newreg || debug_insns_seen_p))
    {
      debug_insns_seen_p = true;
      continue;
    }
and then another loop done only if (debug_insns_seen_p && newreg)
that would only adjust DEBUG_INSNs.

	Jakub
diff mbox

Patch

diff --git a/gcc/ira.c b/gcc/ira.c
index 7079573..1f760fe 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -4999,6 +4999,9 @@  split_live_ranges_for_shrink_wrap (void)
 	  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))