This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

emit_no_conflict_block breaks some conditional moves


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]