Extend splitter pattern to reversed condition by swapping then and else rtx. [PR...
authorliuhongt <hongtao.liu@intel.com>
Mon, 21 Mar 2022 12:54:30 +0000 (20:54 +0800)
committerliuhongt <hongtao.liu@intel.com>
Tue, 22 Mar 2022 08:31:34 +0000 (16:31 +0800)
commit919fbffef0755562cd3b686c838069c20bc7878f
tree9da11ffc30ea692e46fcc3e0d4444fef3c578c7a
parent7d5ee289510f0c7ac2c318e396c8a6f0d0d93db0
Extend splitter pattern to reversed condition by swapping then and else rtx. [PR target/104982]

Failed to match this instruction:
(set (reg/v:SI 88 [ z ])
    (if_then_else:SI (eq (zero_extract:SI (reg:SI 92)
                (const_int 1 [0x1])
                (zero_extend:SI (subreg:QI (reg:SI 93) 0)))
            (const_int 0 [0]))
        (reg:SI 95)
        (reg:SI 94)))

but it's equal to

(set (reg/v:SI 88 [ z ])
    (if_then_else:SI (ne (zero_extract:SI (reg:SI 92)
                (const_int 1 [0x1])
                (zero_extend:SI (subreg:QI (reg:SI 93) 0)))
            (const_int 0 [0]))
        (reg:SI 94)
        (reg:SI 95)))

which is the exact existing splitter.

The patch will fix below regressions:

On x86-64, r12-7687 caused:

FAIL: gcc.target/i386/bt-5.c scan-assembler-not sar[lq][ \t]
FAIL: gcc.target/i386/bt-5.c scan-assembler-times bt[lq][ \t] 7

gcc/ChangeLog:

PR target/104982
* config/i386/i386.md (*jcc_bt<mode>_mask): Extend the
following splitter to reversed condition.
gcc/config/i386/i386.md