https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65240

--- Comment #9 from Michael Meissner <meissner at gcc dot gnu.org> ---
It is likely due to a combination of -ffast-math and -mupper-regs on
power7/power8.  This is a problem I've seen before, but I thought I had
squashed it.

Basically, the code I've seen before, you have code that uses enough registers
that it wants to allocate registers using the traditional Altivec registers,
and you load up some constants.  If you don't use -ffast-math, then everything
is fine, because the constant is pushed to the constant pool before register
allocation begins.  However, due to wanting the constant around so that
reciprocal math can be done (i.e. -ffast-math), the constant is kept around
until register allocation time.  During register allocation time, we allocate a
FPR for the constant because it wants to use d-form addressing (reg+offset). 
However, one of the post reload passes (usually gcse-after-reload) goes in and
decides to change the load from loading up a FPR register to loading it
directly to an Altivec register and fails because we don't have d-form
addressing for Altivec registers.  The usual case is reload loads up a FPR and
then does a move to the Atlivec register, and that gets combined.  I think I've
see it also happen, where you are loading the same constant twice, and GCSE
decides to use the Altivec version.

I'll try to look at it tomorrow.

Reply via email to