On 21/09/26 5:31 PM, Surya Kumari Jangala wrote:
> 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?

The rotate insert patterns exist for SI & DI modes, so handling only these
modes is fine here.

The patch looks good to me.

- Surya

> 
> - 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