My port failed the DImode part of the rotate regression-tests
(gcc.c-torture/execute/20020508-[123].c).  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.  AFAICT, any other port (arc, m32r, v850,
xtensa) that emits a cmpsi followed by movsicc and has no native
DImode shift insns will be subject to this bug also.

Any hints on the proper approach?  My initial idea is to make
emit_no_conflict_block() maintain pairing between cmpsi and movsicc,
which will work as long as cmpsi's operands are never clobbered.
Ultimately, I'll side-step the bug by defining expands or splits for
DImode shifts & rotates, but I'd like to see emit_no_conflict_block()
fixed.

Comments?

Greg

Reply via email to