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.