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