https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82180
Tom de Vries <vries at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |kcy at codesourcery dot com --- Comment #3 from Tom de Vries <vries at gcc dot gnu.org> --- (In reply to Tom de Vries from comment #0) > Trying a bit harder, I can fix the problem by skipping over the unaligned > register here: > ... > diff --git a/gcc/lra-spills.c b/gcc/lra-spills.c > index 492fc18..6ecfad2 100644 > --- a/gcc/lra-spills.c > +++ b/gcc/lra-spills.c > @@ -276,7 +276,10 @@ assign_spill_hard_regs (int *pseudo_regnos, int n) > for (k = 0; k < spill_class_size; k++) > { > hard_regno = ira_class_hard_regs[spill_class][k]; > - if (! overlaps_hard_reg_set_p (conflict_hard_regs, mode, > hard_regno)) > + if (! > ira_prohibited_class_mode_regs[spill_class][PSEUDO_REGNO_MODE (regno)] > + && ! overlaps_hard_reg_set_p (conflict_hard_regs, mode, > + hard_regno)) > break; > } > if (k >= spill_class_size) > ... > Kwok has pointed out that in fact ira_prohibited_class_mode_regs is a HARD_REG_SET which needs to be tested using TEST_HARD_REG_BIT.