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?
>
>> > + (op:c (cond (lt @0 @1) @3 { build_zero_cst (type); }) @2))))
>>
>> :c doesn't do anything in the result (I wonder why we don't diagnose it
>> ...) Please re-use a captured (lt @0 @1).
>>
>> Similar below.
>
>
> Ok
>
>
> Thanks,
> Raphael