On Sun, Oct 25, 2026 at 9:24 PM Rajeev Gadgil <[email protected]> wrote:
>
>
> Thanks, you're right.  I checked: a user type such as

A few things, you replied to the wrong email.  This is an unrelated
patch which I submitted rather than my reply to your SRA patch.
Second top-posting is not very good email etiquette and is very much
frowned upon.

>
>   struct my { int32x4_t v[2]; };
>
> gets the same V2x4SI mode, and with the patch ESRA disqualifies it too
> when it is passed whole to an ordinary function in a loop.  The code
> didn't change in that example, but the predicate keys on the shape of the
> type rather than on the intrinsic tuples.
>
> The copies only matter when the tuple is handed whole to the ld<N>/st<N>
> lane builtins.  I tried requiring the call to be a BUILT_IN_MD builtin
> (gimple_call_builtin_p (call, BUILT_IN_MD)) instead.  User types can't
> reach those calls without a conversion, so the user struct above stays an
> SRA candidate. I haven't rerun the full bootstrap
> with that variant yet.
>
> 1. Is restricting it to target builtins acceptable to you, or would you
>    rather the middle-end didn't special-case vector tuples here at all?
>
> 2. If it should stay in tree-sra.cc, is scan_function the right place

I have not given thoughts on that part yet and I think that might work
but maybe there is something more that can be done for builtins (not
just target and internal functions too) in general here.

>
> Thanks.
> Rajeev
>
> On Mon, Oct 26, 2026 at 6:50 AM Andrea Pinski 
> <[email protected]> wrote:
>>
>> The problem here is after r17-3822-g44c89620f73, the code to make
>> sure the types match when factoring out operations, was moved after
>> the check for some functions which could return true early.
>> Moving the types matching code fixes the problem by not returning early.
>> Also change the function args check not to return early so that
>> the problem like this does not happen in the future if more code is added
>> afterwards.
>>
>> Bootstrapped and tested on x86_64-linux-gnu.
>>
>>         PR tree-optimization/128143
>>
>> gcc/ChangeLog:
>>
>>         * gimple-match-exports.cc (factor_operation_ok): Move the
>>         type matching code before the function check. Also don't
>>         return early for some builtin functions.
>>
>> gcc/testsuite/ChangeLog:
>>
>>         * gcc.dg/torture/sub-overflow-1.c: New test.
>>
>> Signed-off-by: Andrea Pinski <[email protected]>
>> ---
>>  gcc/gimple-match-exports.cc                   |  9 +++++----
>>  gcc/testsuite/gcc.dg/torture/sub-overflow-1.c | 13 +++++++++++++
>>  2 files changed, 18 insertions(+), 4 deletions(-)
>>  create mode 100644 gcc/testsuite/gcc.dg/torture/sub-overflow-1.c
>>
>> diff --git a/gcc/gimple-match-exports.cc b/gcc/gimple-match-exports.cc
>> index 8077bbad165..8f2de738b2f 100644
>> --- a/gcc/gimple-match-exports.cc
>> +++ b/gcc/gimple-match-exports.cc
>> @@ -1645,10 +1645,6 @@ factor_operation_ok (code_helper code, int opnum,
>>        && code == VEC_PERM_EXPR && opnum == 2)
>>      return false;
>>
>> -  /*  Some builtins should not be factored out with constants being 
>> involved.  */
>> -  if (!all_ssa_names && code.is_fn_code ())
>> -    return !fn_arg_must_be_const_p (combined_fn (code), opnum);
>> -
>>    // The types are need to be compatible.
>>    if (opnum >= 0)
>>      {
>> @@ -1657,5 +1653,10 @@ factor_operation_ok (code_helper code, int opnum,
>>           return false;
>>      }
>>
>> +  // Some builtins should not be factored out with constants being involved.
>> +  if (!all_ssa_names && code.is_fn_code ()
>> +      && fn_arg_must_be_const_p (combined_fn (code), opnum))
>> +    return false;
>> +
>>    return true;
>>  }
>> diff --git a/gcc/testsuite/gcc.dg/torture/sub-overflow-1.c 
>> b/gcc/testsuite/gcc.dg/torture/sub-overflow-1.c
>> new file mode 100644
>> index 00000000000..841cc7f8e92
>> --- /dev/null
>> +++ b/gcc/testsuite/gcc.dg/torture/sub-overflow-1.c
>> @@ -0,0 +1,13 @@
>> +/* { dg-do compile } */
>> +/* PR tree-optimization/128143 */
>> +
>> +int a(int c, signed char x, long long y)
>> +{
>> +  int r;
>> +  if (c)
>> +    r = __builtin_sub_overflow_p(y, x, (short) 0);
>> +  else
>> +    r = __builtin_sub_overflow_p(y, -40000, (short) 0);
>> +  return r;
>> +}
>> +
>> --
>> 2.43.0
>>

Reply via email to