On 11/28/2013, 6:50 PM, Alan Modra wrote:
On Wed, Nov 20, 2013 at 11:18:49AM -0700, Jeff Law wrote:
2013-11-13 Robert Suchanek <robert.sucha...@imgtec.com>
* lra.c (lra): Set lra_in_progress before check_rtl call.
* recog.c (insn_invalid_p): Add !lra_in_progress to prevent
adding clobber regs when LRA is running
Trying to run the testsuite with -mlra and the default -mcmodel=medium
on powerpc64 now results in enormous numbers of failures like the
following.
/home/alanm/src/gcc-virgin/libatomic/testsuite/libatomic.c/atomic-exchange-1.c:67:1:
error: insn does not satisfy its constraints:
}
^
(insn 5 2 6 2 (set (reg/f:DI 212)
(mem/u/c:DI (unspec:DI [
(symbol_ref/u:DI ("*.LC0") [flags 0x2])
(reg:DI 2 2)
] UNSPEC_TOCREL) [0 S8 A8]))
/home/alanm/src/gcc-virgin/libatomic/testsuite/libatomic.c/atomic-exchange-1.c:14
505 {*movdi_internal64}
(expr_list:REG_EQUAL (symbol_ref:DI ("v") <var_decl 0x3fff9bd00850 v>)
(nil)))
This is due to that innocuous seeming change of setting
lra_in_progress before calling check_rtl(), in combination with
previous changes Vlad made to the rs6000 backend here:
http://gcc.gnu.org/ml/gcc-patches/2013-10/msg02208.html
In particular the "Call legitimate_constant_pool_address_p in strict
mode for LRA" change, that sets "strict" when lra_in_progress.
I'm not at all familiar with lra so why Vlad made those changes to
rs6000.c is totally opaque to me. If this were a reload problem I
could dive in and fix it, but not lra, sorry..
What I can say is that the rtl shown above is a toc reference of the
form that is valid for -mcmodel=small both before and after reload,
and generates "ld offset(r2)" machine instructions. The form is valid
for -mcmodel=medium/large only before reload. After reload it is
supposed to be split into high/lo_sum variants that generate
"addis rtmp,offset@ha(r2); ld offset@l(rtmp)".
Thanks, Alan. I suspected that might be a problem with the patch but I
did not expected so many problems (s390 is completely broken too). I've
just stated to work on this. I hope it will be fixed today.