------- Comment #3 from bonzini at gnu dot org 2007-07-11 19:49 ------- First, I'm not a reload expert. :-) But it does not look like a reload bug (or at least it is easily worked around in the machine description, methinks).
regmove should have changed that but it does not probably because the final constraint does not have a duplicate operand. Actually, I think you want to look at anddi_1_rex64, not adddi_1_rex64: [(set (match_operand:DI 0 "nonimmediate_operand" "=r,rm,r,r") (and:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,0,qm") (match_operand:DI 2 "x86_64_szext_general_operand" "Z,re,rm,L"))) (clobber (reg:CC FLAGS_REG))] The final constraint is for when and is used to create a zero-extending moves (L matches constants 0xFF and 0xFFFF). I would say that you have to 1) define a predicate which has the same behavior as L and 2) split that alternative out of the three anddi patterns that use it (grep for '\<L\>') into a separate insn. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32725