https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78904
--- Comment #2 from Uroš Bizjak <ubizjak at gmail dot com> --- (In reply to Segher Boessenkool from comment #1) > === > Trying 10, 9 -> 11: > Failed to match this instruction: > (parallel [ > (set (reg:QI 88 [ _2 ]) > (plus:QI (subreg:QI (zero_extract:SI (reg/v:SI 94 [ a ]) > (const_int 8 [0x8]) > (const_int 8 [0x8])) 0) > (subreg:QI (zero_extract:SI (reg/v:SI 95 [ b ]) > (const_int 8 [0x8]) > (const_int 8 [0x8])) 0))) > (clobber (reg:CC 17 flags)) > ]) > === > > and then it later tries 10, 9 -> 11 and 9, 11 -> 13 etc., but you need > 11, 10, 9 -> 13 to match your insn pattern. > > Maybe you want a pattern for the result of 10, 9 -> 11? It is a valid > insn for i386 I think? No, unfortunately the above is not a valid x86 insn. x86 has two-operand instructions, so output has to match one of the operands. It looks that combine prefers: (subreg:SI (plus:QI and (subreg:QI (zero_extract:SI (... op ...) while - according to the existing x86 patterns - in the past the patterns were seemingly combined into: (plus:SI and (zero_extract:SI (... op ...)