[PATCH] [i386] Extend splitter pattern to reversed condition by swapping then and else rtx. [PR target/104982]

Uros Bizjak ubizjak@gmail.com
Tue Mar 22 07:06:14 GMT 2022


On Mon, Mar 21, 2022 at 2:08 PM liuhongt via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> 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
>
> Bootstrap and regtested on x86_64-pc-linux-gnu{-m32,}
> Ok for trunk?
>
> gcc/ChangeLog:
>
>         PR target/104982
>         * config/i386/i386.md (*jcc_bt<mode>_mask): Extend the
>         following splitter to reversed condition.

OK.

Thanks,
Uros.

> ---
>  gcc/config/i386/i386.md | 14 ++++++++------
>  1 file changed, 8 insertions(+), 6 deletions(-)
>
> diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
> index 02f298c2846..c74edd1aaef 100644
> --- a/gcc/config/i386/i386.md
> +++ b/gcc/config/i386/i386.md
> @@ -14182,12 +14182,12 @@ (define_insn_and_split "*jcc_bt<mode>_mask"
>  (define_split
>    [(set (match_operand:SWI248 0 "register_operand")
>         (if_then_else:SWI248
> -        (ne
> -         (zero_extract:SWI48
> -          (match_operand:SWI48 1 "register_operand")
> -          (const_int 1)
> -          (zero_extend:SI (match_operand:QI 2 "register_operand")))
> -         (const_int 0))
> +        (match_operator 5 "bt_comparison_operator"
> +         [(zero_extract:SWI48
> +           (match_operand:SWI48 1 "register_operand")
> +           (const_int 1)
> +           (zero_extend:SI (match_operand:QI 2 "register_operand")))
> +          (const_int 0)])
>          (match_operand:SWI248 3 "nonimmediate_operand")
>          (match_operand:SWI248 4 "nonimmediate_operand")))]
>    "TARGET_USE_BT && TARGET_CMOVE
> @@ -14202,6 +14202,8 @@ (define_split
>                              (match_dup 3)
>                              (match_dup 4)))]
>  {
> +  if (GET_CODE (operands[5]) == EQ)
> +    std::swap (operands[3], operands[4]);
>    operands[2] = lowpart_subreg (SImode, operands[2], QImode);
>  })
>
> --
> 2.18.1
>


More information about the Gcc-patches mailing list