[lra] Fix rtl checking failure
Richard Sandiford
rdsandiford@googlemail.com
Thu Oct 18 13:40:00 GMT 2012
This is the first of two patches needed to get a clean bootstrap on
x86_64-linux-gnu with RTL checking enabled. It simply stops us from
pushing notes, barriers, etc. onto the stack, which then trigger a
checking failure when we try to access their patterns later.
Tested on x86_64-linux-gnu. OK for lra branch?
There are still some extra testsuite failures compared to the default
checking mode:
FAIL: g++.dg/torture/pr49938.C -O3 -fomit-frame-pointer -funroll-loops (internal compiler error)
FAIL: g++.dg/torture/pr49938.C -O3 -fomit-frame-pointer -funroll-loops (test for excess errors)
FAIL: g++.dg/torture/pr49938.C -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions (internal compiler error)
FAIL: g++.dg/torture/pr49938.C -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions (test for excess errors)
These failures are due to subregs of hard registers appearing in the
insn stream. Although that in itself is easy to fix, I think there
might be some problems with the way we handle multi-register hard
registers during splitting, e.g. for situations like:
write (reg:DI 2)
...split 2/3 here...
read (reg:SI 3)
...
read (reg:SI 2)
That probably needs looking at first.
Richard
gcc/
* lra.c (push_insns): Check INSN_P.
Index: gcc/lra.c
===================================================================
--- gcc/lra.c 2012-10-17 16:36:34.000000000 +0100
+++ gcc/lra.c 2012-10-18 11:48:40.423088311 +0100
@@ -1810,7 +1810,8 @@ push_insns (rtx from, rtx to)
if (from == NULL_RTX)
return;
for (insn = from; insn != to; insn = PREV_INSN (insn))
- lra_push_insn (insn);
+ if (INSN_P (insn))
+ lra_push_insn (insn);
}
/* Emit insns BEFORE before INSN and insns AFTER after INSN. Put the
More information about the Gcc-patches
mailing list