> Am 19.05.2026 um 15:17 schrieb Jeffrey Law <[email protected]>:
> 
> 
> 
>> On 5/19/2026 12:14 AM, Richard Biener wrote:
>>> On Mon, May 18, 2026 at 4:37 PM Raphael Zinsly
>>> <[email protected]> wrote:
>>> 
>>> On Fri, May 15, 2026 at 10:09 AM Richard Biener <[email protected]> wrote:
>>>> On Wed, 13 May 2026, Raphael Moreira Zinsly wrote:
>>>> ...
>>>>> +/* Simplify (a < 0) ? ARG1 OP CONST : ARG1 to ((a < 0) ? 0 : CONST) OP 
>>>>> ARG1
>>>>> +   when CONST is a 2^n-1 constant.  */
>>>>> +(for op (plus bit_ior bit_xor)
>>>>> + (simplify
>>>>> +  (cond (lt @0 integer_zerop@1) (op:c @2 INTEGER_CST@3) @2)
>>>> No :c necessary on 'op'
>>>> 
>>> Ok.
>>> 
>>>>> +   (if (wi::exact_log2 (wi::to_wide (@3) + 1) != -1)
>>>> Why is it cheap to splat the sign bit?  If it's cheap to splat
>>>> the sign bit it's cheap to select between zero and a constant:
>>>> <splat-sign-bit-to-full-width> & COSTANT.
>>>> 
>>>> That you leave in the (cond ...) hints strongly in that it's
>>>> an oddly special "canonicalization" and that it is really
>>>> a target dependent RTL thing?
>>>> 
>>> It is a canonicalization, but I believe it's worth it.
>>> The message of this commit is misleading, which is my mistake, I was so 
>>> immersed in trying to generate a splat sign bit that I kept the original 
>>> commit description without much thought.
>>> I'm in fact generating a conditional move that can be transformed into a 
>>> splat sign bit in the targets that benefit from it.
>>> I will describe it better in V2.
>>> 
>>> The current code produces for 'c < 0 ? a : a + 7':
>>> 
>>>   if (c_2(D) >= 0)
>>>     goto <bb 3>;
>>>   else
>>>     goto <bb 4>;
>>> 
>>>   <bb 3>
>>>   _4 = a_3(D) + 7;
>>> 
>>>   <bb 4>
>>>   # _1 = PHI <a_3(D)(2), _4(3)>
>>>   return _1;
>>> 
>>> After this patch we get:
>>> 
>>>   _1 = c_2(D) < 0;
>>>   _4 = _1 ? 0 : 7;
>>>   _8 = a_3(D) + _4;
>>>   return _8;
>>> 
>>> Is it reasonable?
>> I think so.  But as said, why only for 7 and not for 42?
> 2^n-1 is interesting because there's a highly generic way to synthesize that 
> sequence.  It's just two shifts.  So long as you have a barrel shifter, 
> that's going to be pretty efficient. Arbitrary constants aren't as clear cut 
> as you have to worry about whether or not the nonzero constant can be encoded 
> by the target.
> 
> Granted we're in gimple, so one could make an argument that these are low 
> level issues that aren't applicable.
> 
> The way I've generally encouraged folks to think about these transformations 
> is to look at both gimple and RTL simplification.  I think in this case we 
> were initially looking at the RTL side of things, then concluded the idea was 
> sound for gimple without too much consideration for whether or not it ought 
> to be generalized to more constants in gimple.

Ok, we’re not making such distinction elsewhere in GIMPLE and if it’s supposed 
to be a canpnicalization then it’s odd to do it only for special constants.  
And if it’s a target specific thing it belongs to RTL expansion or RTL ifvct.  
IMHO.

Richard 

> jeff
> 

Reply via email to