This is the mail archive of the
mailing list for the GCC project.
emit_no_conflict_block breaks some conditional moves
- From: Greg McGary <greg at mcgary dot org>
- To: gcc at gcc dot gnu dot org
- Cc: greg at mcgary dot org
- Date: 20 Apr 2005 17:55:58 -0700
- Subject: emit_no_conflict_block breaks some conditional moves
My port failed the DImode part of the rotate regression-tests
(gcc.c-torture/execute/20020508-.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()