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 ();
>      }

Reply via email to