Greg McGary wrote:
I found that
emit_no_conflict_block() reordered insns gen'd by
expand_doubleword_shift() in a way that violated dependency between
compares and associated conditional-move insns that had the target
register as destination.

You didn't say precisely what went wrong, but I'd guess you have
cmpsi ...
movsicc target, ...
cmpsi ...
movsicc target, ...
which got reordered to
cmpsi ...
cmpsi ...
movsi target, ...
movsi target, ...
which obviously does not work if your condition code register is a hard register.


Perhaps a check like
&& GET_MODE_CLASS (GET_MODE (SET_DEST (set))) != MODE_CC
or maybe check for any hard register
&& (SET_DEST (set) != REG
|| REGNO (set) >= FIRST_PSEUDO_REGISTER)
Safer is probably to do both checks, so that we only reject CCmode hard regs here, e.g.
&& (GET_MODE_CLASS (GET_MODE (SET_DEST (set))) != MODE_CC
|| SET_DEST (set) != REG
|| REGNO (set) >= FIRST_PSEUDO_REGISTER))
which should handle the specific case you ran into.
--
Jim Wilson, GNU Tools Support, http://www.SpecifixInc.com

Reply via email to