[Bug middle-end/78904] zero-extracts are not effective

ubizjak at gmail dot com gcc-bugzilla@gcc.gnu.org
Thu Dec 22 19:48:00 GMT 2016


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 ...)


More information about the Gcc-bugs mailing list