DJ Delorie <[EMAIL PROTECTED]> writes:
> The r8c/m16c family cannot shift by more than 16 bits at a time ever,
> or 8 bits at a time with constant shifts. So, to do a variable number
> of shift on a 32 bit value, it needs to emit a conditional, turning
> the attached example into this:
>
> i = 0xfffff;
> if (j >= 16)
> {
> i >>= 8;
> i >>= 8;
> j -= 16;
> }
> ...
>
> Combine (rightfully) knows that i becomes the constant 0xf and
> replaces the two constant shifts with it. However, it doesn't update
> the life information. So, we have a basic block (#3 below) which has
> register 28 live, but being assigned (i.e. it's really dead). GCC
> notices this later, and dies.
>
> Ideas?
The problem is presumably arising from the REG_EQUAL notes. Where are
those being generated? Why does this case not arise for other targets?
The only fully correct fix that I see in combine is for combine to
notice that it is replacing the first use of a register which is live
at the start of the block. In that case, it should set the
appropriate bit in refresh_blocks. The place to do this would
probably be somewhere around the calls do distribute_notes in
try_combine. But I'm not sure that's really the right fix.
Ian