https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105624
--- Comment #7 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> --- (In reply to Uroš Bizjak from comment #6) > I was afraid I don't understood the reason of the failure well, although it > happened very rarely (actually, no failures were detected during the build > or testsuite run). The patch obviously triggered some inconsistency in the > infrastructure, so without some assurances, I took the safe way and reverted > everything. But like I say, I think it's due to the % in that particular instruction. When % is used on operand N, the constraints for operands N and N+1 have to be tight enough to support both the predicate on operand N and the predicate on operand N+1. So for: (define_insn_and_split "*anddi_1_btr" [(set (match_operand:DI 0 "nonimmediate_operand" "=rm") (and:DI (match_operand:DI 1 "nonimmediate_operand" "%0") (match_operand:DI 2 "const_int_operand"))) (clobber (reg:CC FLAGS_REG))] The constraints on operand 2 are effectively matching nonimmediate_operand|const_int_operand rather than just const_int_operand. I think it would work to keep the constraints for const_int_operands that are in a % pair and drop them elsewhere. (So a partial reapplication, rather than a full reapplication.)