https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104001
--- Comment #4 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to Hongtao.liu from comment #2)
> I'm testing
>
> 1 file changed, 3 insertions(+), 3 deletions(-)
> gcc/config/i386/i386.md | 6 +++---
>
> modified gcc/config/i386/i386.md
> @@ -10455,7 +10455,7 @@ (define_insn_and_split "*xordi_1_btc"
>
> ;; PR target/94790: Optimize a ^ ((a ^ b) & mask) to (~mask & a) | (b &
> mask)
Please remove the reference to the PR.
> (define_insn_and_split "*xor2andn"
> - [(set (match_operand:SWI248 0 "nonimmediate_operand")
> + [(set (match_operand:SWI248 0 "register_operand")
> (xor:SWI248
> (and:SWI248
> (xor:SWI248
> @@ -10464,8 +10464,7 @@ (define_insn_and_split "*xor2andn"
> (match_operand:SWI248 3 "nonimmediate_operand"))
> (match_dup 1)))
> (clobber (reg:CC FLAGS_REG))]
> - "(TARGET_BMI || TARGET_AVX512BW)
> - && ix86_pre_reload_split ()"
> + "TARGET_BMI && ix86_pre_reload_split ()"
> "#"
> "&& 1"
> [(parallel [(set (match_dup 4)
> @@ -10486,6 +10485,7 @@ (define_insn_and_split "*xor2andn"
> (clobber (reg:CC FLAGS_REG))])]
> {
> operands[1] = force_reg (<MODE>mode, operands[1]);
> + operands[2] = force_reg (<MODE>mode, operands[2]);
You don't need to force this operand to reg, "and" will accept memory operand.
But please swap (match_dup 2) and (match_dup 3) here:
+ (parallel [(set (match_dup 5)
+ (and:SWI248
+ (match_dup 2)
+ (match_dup 3)))
+ (clobber (reg:CC FLAGS_REG))])
This will ease RA job a bit.
The patch is pre-approved with the above changes.
> operands[3] = force_reg (<MODE>mode, operands[3]);
> operands[4] = gen_reg_rtx (<MODE>mode);
> operands[5] = gen_reg_rtx (<MODE>mode);
>
> [back]