https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67756
--- Comment #13 from Vladimir Makarov <vmakarov at gcc dot gnu.org> --- (In reply to Bernd Edlinger from comment #11) > I must admit, that I don't know what I am doing here, > ... but this (completely untested) patch seems to fix the ICE: > (and at least my linux kernel compiles without ICE now) > This is a wrong fix. If the pseudos has the same value, they should not conflict if they start with the same register. This part of code concerns exactly about the pseudos with the same value. The root of the problem is in that the pseudos should not have the same value. > --- lra-assigns.c.jj 2015-07-16 17:26:35.000000000 +0200 > +++ lra-assigns.c 2015-10-01 14:40:06.262300720 +0200 > @@ -576,7 +576,7 @@ find_hard_regno_for_1 (int regno, int *c > /* Remember about multi-register pseudos. For example, 2 hard > register pseudos can start on the same hard register but can > not start on HR and HR+1/HR-1. */ > - for (hr = conflict_hr + 1; > + for (hr = conflict_hr; > hr < FIRST_PSEUDO_REGISTER && hr < conflict_hr + nregs; > hr++) > SET_HARD_REG_BIT (impossible_start_hard_regs, hr); > > > > The problem starts when lra assigns r143 and r144 to r1 > although both have obviously conflicting live ranges.