Hi,
On 17/09/26 12:05 PM, Kishan Parmar wrote:
> Hello All,
>
> Changes from V1:
> - Fix comment for aop<mode>3 expander.
>
> Below patch is bootstrapped and regtested on powerpc64le-linux with no
> regressions.
>
> Commit r17-3977-gfb21f1686938d6 introduced aop_optab (any_or_plus) to
> allow backends control over choices of PLUS vs. IOR during expansion.
> However, this caused a code-generation regression on rs6000 where
> bitfield stores (like those in testcase gcc.target/powerpc/20050603-3.c)
> were expanded using PLUS instead of logical IOR, preventing optimization
> into rlwimi. Additionally, this commit introduced an ICE on bootstrap
> during the cse1 pass after adding aop<mode>3 expander in rs6000.md
> because simplify-rtx was missing case label for the new AOP RTX code.
>
> This patch resolves both issues by:
> 1) Defining the direct aop<mode>3 expander for rs6000 to always emit
> logical IOR, restoring the expected code-generation and fixing the
> regression.
> 2) Adding the case label for AOP in simplify_binary_operation_1 to
> safely prevent the compiler crash.
>
> No new testcase is added since the existing testcase
> gcc.target/powerpc/20050603-3.c will work for this.
>
> 2026-09-17 Kishan Parmar <[email protected]>
>
> gcc/ChangeLog:
> PR target/127399
> * config/rs6000/rs6000.md (aop<mode>3): New define_expand to specify
> logical IOR for any_or_plus (AOP) operations on SDI modes.
> * simplify-rtx.cc (simplify_binary_operation_1): Add case AOP to
> safely handle and simplify the new AOP RTX binary code.
> ---
> gcc/config/rs6000/rs6000.md | 12 ++++++++++++
> gcc/simplify-rtx.cc | 5 +++++
> 2 files changed, 17 insertions(+)
>
> diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
> index ddfed3b63bc..ed672b6da02 100644
> --- a/gcc/config/rs6000/rs6000.md
> +++ b/gcc/config/rs6000/rs6000.md
> @@ -4047,6 +4047,18 @@
> operands[2] = force_reg (<MODE>mode, operands[2]);
> })
>
> +;; aop (any_or_plus). Use IOR on PowerPC.
> +(define_expand "aop<mode>3"
> + [(set (match_operand:SDI 0 "gpc_reg_operand")
> + (ior:SDI (match_operand:SDI 1 "gpc_reg_operand")
> + (match_operand:SDI 2 "reg_or_cint_operand")))]
Don't we want to handle QI and HI modes here?
- Surya
> + ""
> + {
> + emit_insn (gen_ior<mode>3 (operands[0], operands[1], operands[2]));
> + DONE;
> + }
> +)
> +
> (define_split
> [(set (match_operand:GPR 0 "gpc_reg_operand")
> (iorxor:GPR (match_operand:GPR 1 "gpc_reg_operand")
> diff --git a/gcc/simplify-rtx.cc b/gcc/simplify-rtx.cc
> index 38c8abfe3e7..c248fbe7253 100644
> --- a/gcc/simplify-rtx.cc
> +++ b/gcc/simplify-rtx.cc
> @@ -5629,6 +5629,11 @@ simplify_ashift:
> }
> return 0;
>
> + case AOP:
> + if (trueop1 == CONST0_RTX (mode))
> + return op0;
> + return 0;
> +
> default:
> gcc_unreachable ();
> }