2011/4/14 Georg-Johann Lay <a...@gjlay.de>:
> Denis Chertykov schrieb:
>> 2011/4/14 Georg-Johann Lay <a...@gjlay.de>:
>>> The "rotl<mode>3" expanders (mode \in {HI,SI,DI}) violates synopsis by
>>> using 4 operands instead of 3. This runs in ICE in top of
>>> optabs.c:maybe_gen_insn.
>>>
>>> The right way to do this is to use match_dup, not match_operand. So
>>> the fix is obvious.
>>>
>>> Regenerated avr-gcc and run against avr testsuite:
>>>
>>> gcc.target/avr/torture/pr41885.c generates these patterns
>>>
>>> Johann
>>>
>>> 2011-04-14  Georg-Johann Lay  <a...@gjlay.de>
>>>
>>>        * config/avr/avr.md ("rotlhi3", "rotlsi3", "rotldi3"): Fix
>>>        expanders operand 3 from match_operand to match_dup.
>>
>> May be better to use (clobber (match_scratch ...)) here and in
>> `*rotw<mode>' and `*rotb<mode>'.
>
> These are splitters that might split before reload, producing strange,
> non-matching insns like
>  (set (scratch:QI) ...
> or crashing already in avr_rotate_bytes becase the split condition reads
> "&& (reload_completed || <MODE>mode == DImode)"

Generally I'm agree with you, change match_operand to match_dup is easy.

But IMHO the right way is:
 - the splitters and avr_rotate_bytes are wrong and must be fixed too.
 - operands[3] is a scratch register and right way is to use match_scratch.

I can approve the patch.

Denis.

Reply via email to