Hi Richard,

> On 17 Sep 2024, at 7:36 pm, Richard Biener <richard.guent...@gmail.com> wrote:
>
> External email: Use caution opening links or attachments
>
>
> On Tue, Sep 17, 2024 at 10:31 AM Kugan Vivekanandarajah
> <kvivekana...@nvidia.com> wrote:
>>
>> Hi Richard,
>>
>>> On 10 Sep 2024, at 9:33 pm, Richard Biener <richard.guent...@gmail.com> 
>>> wrote:
>>>
>>> External email: Use caution opening links or attachments
>>>
>>>
>>> On Thu, Sep 5, 2024 at 3:19 AM Kugan Vivekanandarajah
>>> <kvivekana...@nvidia.com> wrote:
>>>>
>>>> Thanks for the explanation.
>>>>
>>>>
>>>>> On 2 Sep 2024, at 9:47 am, Andrew Pinski <pins...@gmail.com> wrote:
>>>>>
>>>>> External email: Use caution opening links or attachments
>>>>>
>>>>>
>>>>> On Sun, Sep 1, 2024 at 4:27 PM Kugan Vivekanandarajah
>>>>> <kvivekana...@nvidia.com> wrote:
>>>>>>
>>>>>> Hi Andrew.
>>>>>>
>>>>>>> On 28 Aug 2024, at 2:23 pm, Andrew Pinski <pins...@gmail.com> wrote:
>>>>>>>
>>>>>>> External email: Use caution opening links or attachments
>>>>>>>
>>>>>>>
>>>>>>> On Tue, Aug 27, 2024 at 8:54 PM Kugan Vivekanandarajah
>>>>>>> <kvivekana...@nvidia.com> wrote:
>>>>>>>>
>>>>>>>> Hi Richard,
>>>>>>>>
>>>>>>>> Thanks for the reply.
>>>>>>>>
>>>>>>>>> On 27 Aug 2024, at 7:05 pm, Richard Biener 
>>>>>>>>> <richard.guent...@gmail.com> wrote:
>>>>>>>>>
>>>>>>>>> External email: Use caution opening links or attachments
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Tue, Aug 27, 2024 at 8:23 AM Kugan Vivekanandarajah
>>>>>>>>> <kvivekana...@nvidia.com> wrote:
>>>>>>>>>>
>>>>>>>>>> Hi Richard,
>>>>>>>>>>
>>>>>>>>>>> On 22 Aug 2024, at 10:34 pm, Richard Biener 
>>>>>>>>>>> <richard.guent...@gmail.com> wrote:
>>>>>>>>>>>
>>>>>>>>>>> External email: Use caution opening links or attachments
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Wed, Aug 21, 2024 at 12:08 PM Kugan Vivekanandarajah
>>>>>>>>>>> <kvivekana...@nvidia.com> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>> Hi Richard,
>>>>>>>>>>>>
>>>>>>>>>>>>> On 20 Aug 2024, at 6:09 pm, Richard Biener 
>>>>>>>>>>>>> <richard.guent...@gmail.com> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>> External email: Use caution opening links or attachments
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Fri, Aug 9, 2024 at 2:39 AM Kugan Vivekanandarajah
>>>>>>>>>>>>> <kvivekana...@nvidia.com> wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thanks for the comments.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On 2 Aug 2024, at 8:36 pm, Richard Biener 
>>>>>>>>>>>>>>> <richard.guent...@gmail.com> wrote:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> External email: Use caution opening links or attachments
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On Fri, Aug 2, 2024 at 11:20 AM Kugan Vivekanandarajah
>>>>>>>>>>>>>>> <kvivekana...@nvidia.com> wrote:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On 1 Aug 2024, at 10:46 pm, Richard Biener 
>>>>>>>>>>>>>>>>> <richard.guent...@gmail.com> wrote:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> External email: Use caution opening links or attachments
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On Thu, Aug 1, 2024 at 5:31 AM Kugan Vivekanandarajah
>>>>>>>>>>>>>>>>> <kvivekana...@nvidia.com> wrote:
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> On Mon, Jul 29, 2024 at 10:11 AM Andrew Pinski 
>>>>>>>>>>>>>>>>>> <pins...@gmail.com> wrote:
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> On Mon, Jul 29, 2024 at 12:57 AM Kugan Vivekanandarajah
>>>>>>>>>>>>>>>>>>> <kugan...@gmail.com> wrote:
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> On Thu, Jul 25, 2024 at 10:19 PM Richard Biener
>>>>>>>>>>>>>>>>>>>> <richard.guent...@gmail.com> wrote:
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> On Thu, Jul 25, 2024 at 4:42 AM Kugan Vivekanandarajah
>>>>>>>>>>>>>>>>>>>>> <kugan...@gmail.com> wrote:
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> On Tue, Jul 23, 2024 at 11:56 PM Richard Biener
>>>>>>>>>>>>>>>>>>>>>> <richard.guent...@gmail.com> wrote:
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> On Tue, Jul 23, 2024 at 10:27 AM Kugan Vivekanandarajah
>>>>>>>>>>>>>>>>>>>>>>> <kugan...@gmail.com> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> On Tue, Jul 23, 2024 at 10:35 AM Andrew Pinski 
>>>>>>>>>>>>>>>>>>>>>>>> <pins...@gmail.com> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> On Mon, Jul 22, 2024 at 5:26 PM Kugan Vivekanandarajah
>>>>>>>>>>>>>>>>>>>>>>>>> <kvivekana...@nvidia.com> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> Revised based on the comment and moved it into 
>>>>>>>>>>>>>>>>>>>>>>>>>> existing patterns as.
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> gcc/ChangeLog:
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> * match.pd: Extend A CMP 0 ? A : -A into (type)A CMP 
>>>>>>>>>>>>>>>>>>>>>>>>>> 0 ? A : -A.
>>>>>>>>>>>>>>>>>>>>>>>>>> Extend A CMP 0 ? A : -A into (type) A CMP 0 ? A : -A.
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> gcc/testsuite/ChangeLog:
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> * gcc.dg/tree-ssa/absfloat16.c: New test.
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> The testcase needs to make sure it runs only for 
>>>>>>>>>>>>>>>>>>>>>>>>> targets that support
>>>>>>>>>>>>>>>>>>>>>>>>> float16 so like:
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> /* { dg-require-effective-target float16 } */
>>>>>>>>>>>>>>>>>>>>>>>>> /* { dg-add-options float16 } */
>>>>>>>>>>>>>>>>>>>>>>>> Added in the attached version.
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> + /* (type)A >=/> 0 ? A : -A    same as abs (A) */
>>>>>>>>>>>>>>>>>>>>>>> (for cmp (ge gt)
>>>>>>>>>>>>>>>>>>>>>>> (simplify
>>>>>>>>>>>>>>>>>>>>>>> -   (cnd (cmp @0 zerop) @1 (negate @1))
>>>>>>>>>>>>>>>>>>>>>>> -    (if (!HONOR_SIGNED_ZEROS (TREE_TYPE(@0))
>>>>>>>>>>>>>>>>>>>>>>> -        && !TYPE_UNSIGNED (TREE_TYPE(@0))
>>>>>>>>>>>>>>>>>>>>>>> -        && bitwise_equal_p (@0, @1))
>>>>>>>>>>>>>>>>>>>>>>> +   (cnd (cmp (convert?@0 @1) zerop) @2 (negate @2))
>>>>>>>>>>>>>>>>>>>>>>> +    (if (!HONOR_SIGNED_ZEROS (TREE_TYPE (@1))
>>>>>>>>>>>>>>>>>>>>>>> +        && !TYPE_UNSIGNED (TREE_TYPE (@1))
>>>>>>>>>>>>>>>>>>>>>>> +        && ((VECTOR_TYPE_P (type)
>>>>>>>>>>>>>>>>>>>>>>> +             && tree_nop_conversion_p (TREE_TYPE (@0), 
>>>>>>>>>>>>>>>>>>>>>>> TREE_TYPE (@1)))
>>>>>>>>>>>>>>>>>>>>>>> +           || (!VECTOR_TYPE_P (type)
>>>>>>>>>>>>>>>>>>>>>>> +               && (TYPE_PRECISION (TREE_TYPE (@1))
>>>>>>>>>>>>>>>>>>>>>>> +                   <= TYPE_PRECISION (TREE_TYPE 
>>>>>>>>>>>>>>>>>>>>>>> (@0)))))
>>>>>>>>>>>>>>>>>>>>>>> +        && bitwise_equal_p (@1, @2))
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> I wonder about the bitwise_equal_p which tests @1 
>>>>>>>>>>>>>>>>>>>>>>> against @2 now
>>>>>>>>>>>>>>>>>>>>>>> with the convert still applied to @1 - that looks odd.  
>>>>>>>>>>>>>>>>>>>>>>> You are allowing
>>>>>>>>>>>>>>>>>>>>>>> sign-changing conversions but doesn't that change ge/gt 
>>>>>>>>>>>>>>>>>>>>>>> behavior?
>>>>>>>>>>>>>>>>>>>>>>> Also why are sign/zero-extensions not OK for vector 
>>>>>>>>>>>>>>>>>>>>>>> types?
>>>>>>>>>>>>>>>>>>>>>> Thanks for the review.
>>>>>>>>>>>>>>>>>>>>>> My main motivation here is for _Float16  as below.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> _Float16 absfloat16 (_Float16 x)
>>>>>>>>>>>>>>>>>>>>>> {
>>>>>>>>>>>>>>>>>>>>>> float _1;
>>>>>>>>>>>>>>>>>>>>>> _Float16 _2;
>>>>>>>>>>>>>>>>>>>>>> _Float16 _4;
>>>>>>>>>>>>>>>>>>>>>> <bb 2> [local count: 1073741824]:
>>>>>>>>>>>>>>>>>>>>>> _1 = (float) x_3(D);
>>>>>>>>>>>>>>>>>>>>>> if (_1 < 0.0)
>>>>>>>>>>>>>>>>>>>>>> goto <bb 3>; [41.00%]
>>>>>>>>>>>>>>>>>>>>>> else
>>>>>>>>>>>>>>>>>>>>>> goto <bb 4>; [59.00%]
>>>>>>>>>>>>>>>>>>>>>> <bb 3> [local count: 440234144]:\
>>>>>>>>>>>>>>>>>>>>>> _4 = -x_3(D);
>>>>>>>>>>>>>>>>>>>>>> <bb 4> [local count: 1073741824]:
>>>>>>>>>>>>>>>>>>>>>> # _2 = PHI <_4(3), x_3(D)(2)>
>>>>>>>>>>>>>>>>>>>>>> return _2;
>>>>>>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> This is why I added  bitwise_equal_p test of @1 against 
>>>>>>>>>>>>>>>>>>>>>> @2 with
>>>>>>>>>>>>>>>>>>>>>> TYPE_PRECISION checks.
>>>>>>>>>>>>>>>>>>>>>> I agree that I will have to check for sign-changing 
>>>>>>>>>>>>>>>>>>>>>> conversions.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Just to keep it simple, I disallowed vector types. I am 
>>>>>>>>>>>>>>>>>>>>>> not sure if
>>>>>>>>>>>>>>>>>>>>>> this would  hit vec types. I am happy to handle this if 
>>>>>>>>>>>>>>>>>>>>>> that is
>>>>>>>>>>>>>>>>>>>>>> needed.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> I think with __builtin_convertvector you should be able 
>>>>>>>>>>>>>>>>>>>>> to construct
>>>>>>>>>>>>>>>>>>>>> a testcase that does
>>>>>>>>>>>>>>>>>>>> Thanks.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> For the pattern,
>>>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>>>> /* A >=/> 0 ? A : -A    same as abs (A) */
>>>>>>>>>>>>>>>>>>>> (for cmp (ge gt)
>>>>>>>>>>>>>>>>>>>> (simplify
>>>>>>>>>>>>>>>>>>>> (cnd (cmp @0 zerop) @1 (negate @1))
>>>>>>>>>>>>>>>>>>>> (if (!HONOR_SIGNED_ZEROS (TREE_TYPE(@0))
>>>>>>>>>>>>>>>>>>>> && !TYPE_UNSIGNED (TREE_TYPE(@0))
>>>>>>>>>>>>>>>>>>>> && bitwise_equal_p (@0, @1))
>>>>>>>>>>>>>>>>>>>> (if (TYPE_UNSIGNED (type))
>>>>>>>>>>>>>>>>>>>> (absu:type @0)
>>>>>>>>>>>>>>>>>>>> (abs @0)))))
>>>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>>>> the vector type doesn't seem right. For example, if we 
>>>>>>>>>>>>>>>>>>>> have a 4
>>>>>>>>>>>>>>>>>>>> element vector with some negative and positive, I don't 
>>>>>>>>>>>>>>>>>>>> think  it
>>>>>>>>>>>>>>>>>>>> makes sense. Also, we dont seem to generate  (cmp @0 
>>>>>>>>>>>>>>>>>>>> zerop). Am I
>>>>>>>>>>>>>>>>>>>> missing it completely?
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Looks like I missed adding some vector testcases anyways 
>>>>>>>>>>>>>>>>>>> here is one
>>>>>>>>>>>>>>>>>>> to get this, note it is C++ due to the C front-end not 
>>>>>>>>>>>>>>>>>>> support `?:`
>>>>>>>>>>>>>>>>>>> for vectors yet (there is a patch).
>>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>>> #define vect8 __attribute__((vector_size(8)))
>>>>>>>>>>>>>>>>>>> vect8 int f(vect8 int a)
>>>>>>>>>>>>>>>>>>> {
>>>>>>>>>>>>>>>>>>> vect8 int na = -a;
>>>>>>>>>>>>>>>>>>> return (a > 0) ? a : na;
>>>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>>> At -O2 before forwprop1, we have:
>>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>>> vector(2) intD.9 a_2(D) = aD.2796;
>>>>>>>>>>>>>>>>>>> vector(2) intD.9 naD.2799;
>>>>>>>>>>>>>>>>>>> vector(2) <signed-boolean:32> _1;
>>>>>>>>>>>>>>>>>>> vector(2) intD.9 _4;
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> na_3 = -a_2(D);
>>>>>>>>>>>>>>>>>>> _1 = a_2(D) > { 0, 0 };
>>>>>>>>>>>>>>>>>>> _4 = VEC_COND_EXPR <_1, a_2(D), na_3>;
>>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>>> And forwprop using match is able to do:
>>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>>> Applying pattern match.pd:6306, gimple-match-10.cc:19843
>>>>>>>>>>>>>>>>>>> gimple_simplified to _4 = ABS_EXPR <a_2(D)>;
>>>>>>>>>>>>>>>>>>> Removing dead stmt:_1 = a_2(D) > { 0, 0 };
>>>>>>>>>>>>>>>>>>> Removing dead stmt:na_3 = -a_2(D);
>>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>>> (replace int with float and add  -fno-signed-zeros you can 
>>>>>>>>>>>>>>>>>>> get the ABS also).
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Note comparisons with vector types always generate a vector 
>>>>>>>>>>>>>>>>>>> boolean
>>>>>>>>>>>>>>>>>>> type. So cond_expr will never show up with a vector 
>>>>>>>>>>>>>>>>>>> comparison; only
>>>>>>>>>>>>>>>>>>> vec_cond.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Thanks for the information. I have revised the patch by 
>>>>>>>>>>>>>>>>>> adding test case for the vector type. I will look at 
>>>>>>>>>>>>>>>>>> removing the VEC_COND_EXPR as a follow up.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> This is likely a major task so do not get you distracted - I 
>>>>>>>>>>>>>>>>> just mentioned it.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> This is still rejected by the type checker.
>>>>>>>>>>>>>>>>>> v2hi  absvect2 (v2hi x, int i) {
>>>>>>>>>>>>>>>>>> v2hi neg = -x;
>>>>>>>>>>>>>>>>>> v2si tmp = __builtin_convertvector (x, v2si);
>>>>>>>>>>>>>>>>>> return (tmp > 0) ? x : neg;
>>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>>> as:
>>>>>>>>>>>>>>>>>> error: incompatible vector types in conditional expression: 
>>>>>>>>>>>>>>>>>> '__vector(2) int', 'v2hi' {aka '__vector(2) short int'} and 
>>>>>>>>>>>>>>>>>> 'v2hi' {aka '__vector(2) short int'}
>>>>>>>>>>>>>>>>>> 8 |     return (tmp > 0) ? x : neg;
>>>>>>>>>>>>>>>>>> |            ~~~~~~~~~~^~~~~~~~~
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Also
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> -      (absu:type @0)
>>>>>>>>>>>>>>>>>> -      (abs @0)))))
>>>>>>>>>>>>>>>>>> +      (absu:type @1)
>>>>>>>>>>>>>>>>>> +      (abs @1)))))
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Changing the @1 to @2  is resulting in failures.  Existing 
>>>>>>>>>>>>>>>>>> tests like  the following would be optimized away in this 
>>>>>>>>>>>>>>>>>> case.
>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>> unsigned abs_with_convert0 (int x)
>>>>>>>>>>>>>>>>>> {
>>>>>>>>>>>>>>>>>> unsigned int y = x;
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> if (x < 0)
>>>>>>>>>>>>>>>>>> y = -y;
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> return y;
>>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> How so - the TYPE_UNSIGNED tests should make the pattern not 
>>>>>>>>>>>>>>>>> trigger here?
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>> This follows the same intent as the original pattern.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Bootstrapped and regression tested on aarch64-linux-gnu. Is 
>>>>>>>>>>>>>>>>>> this OK for trunk.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> -   (cnd (cmp @0 zerop) @1 (negate @1))
>>>>>>>>>>>>>>>>> -    (if (!HONOR_SIGNED_ZEROS (TREE_TYPE(@0))
>>>>>>>>>>>>>>>>> -        && !TYPE_UNSIGNED (TREE_TYPE(@0))
>>>>>>>>>>>>>>>>> -        && bitwise_equal_p (@0, @1))
>>>>>>>>>>>>>>>>> +   (cnd (cmp (convert?@0 @1) zerop) @2 (negate @2))
>>>>>>>>>>>>>>>>> +    (if (!HONOR_SIGNED_ZEROS (TREE_TYPE (@1))
>>>>>>>>>>>>>>>>> +        && !TYPE_UNSIGNED (TREE_TYPE (@1))
>>>>>>>>>>>>>>>>> +        && !TYPE_UNSIGNED (TREE_TYPE (@0))
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> I think the outer type could be allowed signed if ...
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> +        && ((VECTOR_TYPE_P (TREE_TYPE (@0))
>>>>>>>>>>>>>>>>> +             && VECTOR_TYPE_P (TREE_TYPE (@1))
>>>>>>>>>>>>>>>>> +             && known_eq (TYPE_VECTOR_SUBPARTS (TREE_TYPE 
>>>>>>>>>>>>>>>>> (@0)),
>>>>>>>>>>>>>>>>> +                          TYPE_VECTOR_SUBPARTS (TREE_TYPE 
>>>>>>>>>>>>>>>>> (@1)))
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> this is always true
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> +             && element_precision (TREE_TYPE (@1))
>>>>>>>>>>>>>>>>> +                 <= element_precision (TREE_TYPE (@0)))
>>>>>>>>>>>>>>>>> +           || (!VECTOR_TYPE_P (TREE_TYPE (@0))
>>>>>>>>>>>>>>>>> +               && (TYPE_PRECISION (TREE_TYPE (@1))
>>>>>>>>>>>>>>>>> +                   <= TYPE_PRECISION (TREE_TYPE (@0)))))
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> ... you make the precision strictly larger.  With both 
>>>>>>>>>>>>>>>>> unsigned the same
>>>>>>>>>>>>>>>>> precision case should have been stripped anyway.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> You can use element_precision for both vector and non-vector 
>>>>>>>>>>>>>>>>> so I think this
>>>>>>>>>>>>>>>>> should simplify to just checking element_precision.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> +      (absu:type @1)
>>>>>>>>>>>>>>>>> +      (abs @1)))))
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> I still think this needs to be @2 for type correctness.  @1 
>>>>>>>>>>>>>>>>> is only
>>>>>>>>>>>>>>>>> bitwise equal,
>>>>>>>>>>>>>>>>> it could have different sign.  I think we should drop 
>>>>>>>>>>>>>>>>> bitwise_equal_p with the
>>>>>>>>>>>>>>>>> convert now in and instead have a matching constraint.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Thanks, so this should translate to:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> /* (type)A >=/> 0 ? A : -A    same as abs (A) */
>>>>>>>>>>>>>>>> (for cmp (ge gt)
>>>>>>>>>>>>>>>> (simplify
>>>>>>>>>>>>>>>> (cnd (cmp (convert?@0 @1) zerop) @2 (negate @2))
>>>>>>>>>>>>>>>> (if (!HONOR_SIGNED_ZEROS (TREE_TYPE (@1))
>>>>>>>>>>>>>>>>  && !TYPE_UNSIGNED (TREE_TYPE (@1))
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Oh, I mis-read this as unsigned, so this makes the conversions
>>>>>>>>>>>>>>> to always sign-extend which means it's important to ensure
>>>>>>>>>>>>>>> the type of @0 is also signed.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>  && !TYPE_UNSIGNED (TREE_TYPE (@2))
>>>>>>>>>>>>>>>>  && ((element_precision (TREE_TYPE (@1))
>>>>>>>>>>>>>>>>         < element_precision (TREE_TYPE (@0))
>>>>>>>>>>>>>>>>       || operand_equal_p (@1, @0)))
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> which means <= might be better then.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>  && bitwise_equal_p (@1, @2))
>>>>>>>>>>>>>>>> (if (TYPE_UNSIGNED (type))
>>>>>>>>>>>>>>>> (absu:type @2)
>>>>>>>>>>>>>>>> (abs @2)))))
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> However with this, I am seeing: Note that the @2 for these are 
>>>>>>>>>>>>>>>> unsigned.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> I see, so we rely on @1 being the signed equivalent of @2 which 
>>>>>>>>>>>>>>> might or
>>>>>>>>>>>>>>> might not be signed.  I guess that indeed we want @2 here.
>>>>>>>>>>>>>> Sorry I am not sure I understand this. When @2 is unsigned, 
>>>>>>>>>>>>>> ABS_EXPR and ABSU_EXPR is not
>>>>>>>>>>>>>> For example:
>>>>>>>>>>>>>> With
>>>>>>>>>>>>>> /* (type)A >=/> 0 ? A : -A    same as abs (A) */
>>>>>>>>>>>>>> (for cmp (ge gt)
>>>>>>>>>>>>>> (simplify
>>>>>>>>>>>>>> (cnd (cmp (convert?@0 @1) zerop) @2 (negate @2))
>>>>>>>>>>>>>> (if (!HONOR_SIGNED_ZEROS (TREE_TYPE (@1))
>>>>>>>>>>>>>>   && !TYPE_UNSIGNED (TREE_TYPE (@0))
>>>>>>>>>>>>>>   && !TYPE_UNSIGNED (TREE_TYPE (@1))
>>>>>>>>>>>>>>   && element_precision (TREE_TYPE (@1))
>>>>>>>>>>>>>>          <= element_precision (TREE_TYPE (@0))
>>>>>>>>>>>>>>   && bitwise_equal_p (@1, @2))
>>>>>>>>>>>>>> (if (TYPE_UNSIGNED (type))
>>>>>>>>>>>>>> (absu:type @2)
>>>>>>>>>>>>>> (abs @2)))))
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> The test case below becomes:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> unsigned abs_with_convert0 (int x)
>>>>>>>>>>>>>> {
>>>>>>>>>>>>>> unsigned int y = x;
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> if (x < 0)
>>>>>>>>>>>>>>  y = -y;
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> return y;
>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> unsigned int abs_with_convert0 (int x)
>>>>>>>>>>>>>> {
>>>>>>>>>>>>>> unsigned int y;
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> <bb 2> :
>>>>>>>>>>>>>> y_3 = (unsigned int) x_2(D);
>>>>>>>>>>>>>> if (x_2(D) < 0)
>>>>>>>>>>>>>> goto <bb 3>; [INV]
>>>>>>>>>>>>>> else
>>>>>>>>>>>>>> goto <bb 4>; [INV]
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> <bb 3> :
>>>>>>>>>>>>>> y_4 = -y_3;
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> <bb 4> :
>>>>>>>>>>>>>> # y_1 = PHI <y_3(2), y_4(3)>
>>>>>>>>>>>>>> return y_1;
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> To:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> unsigned int abs_with_convert0 (int x)
>>>>>>>>>>>>>> {
>>>>>>>>>>>>>> unsigned int y;
>>>>>>>>>>>>>> unsigned int _5;
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> <bb 2> :
>>>>>>>>>>>>>> y_3 = (unsigned int) x_2(D);
>>>>>>>>>>>>>> _5 = ABSU_EXPR <y_3>;
>>>>>>>>>>>>>> return _5;
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> This is an invalid gimple. Are you suggesting that we should 
>>>>>>>>>>>>>> also check if @2 is not UNSIGNED? If that is what you want, 
>>>>>>>>>>>>>> couple of test cases in the test suite including phi-opt-37.c 
>>>>>>>>>>>>>> would fail.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Trying to swap in the discussion after vacation ... iff @2 might 
>>>>>>>>>>>>> be
>>>>>>>>>>>>> unsigned then you'd need
>>>>>>>>>>>>> a conversion to signed to make 'abs' make sense.
>>>>>>>>>>>>>
>>>>>>>>>>>>>> (cnd (cmp (convert?@0 @1) zerop) @2 (negate @2))
>>>>>>>>>>>>>> (if (!HONOR_SIGNED_ZEROS (TREE_TYPE (@1))
>>>>>>>>>>>>>>   && !TYPE_UNSIGNED (TREE_TYPE (@0))
>>>>>>>>>>>>>>   && !TYPE_UNSIGNED (TREE_TYPE (@1))
>>>>>>>>>>>>>
>>>>>>>>>>>>> so this doesn't put any constraints on the signedness of @2
>>>>>>>>>>>>>
>>>>>>>>>>>>> What kind of extensions are valid on @1?  I think this warrants a
>>>>>>>>>>>>> comment.  I think in the end the compare should be signed to
>>>>>>>>>>>>> fit 'abs' semantics, but a zero-extension (unsigned @1) should be
>>>>>>>>>>>>> OK?  So why constrain the sign of @1?
>>>>>>>>>>>> I thing it is the conversion to signed (sign extend) that we want 
>>>>>>>>>>>> to support, But for cases like:
>>>>>>>>>>>> signed abs_with_convert1 (unsigned x)
>>>>>>>>>>>> {
>>>>>>>>>>>> int y = x;
>>>>>>>>>>>>
>>>>>>>>>>>> if (y < 0)
>>>>>>>>>>>>   y = -x;
>>>>>>>>>>>>
>>>>>>>>>>>> return y;
>>>>>>>>>>>> }
>>>>>>>>>>>> @2 is  unsigned.
>>>>>>>>>>>>
>>>>>>>>>>>>>>   && element_precision (TREE_TYPE (@1))
>>>>>>>>>>>>>>          <= element_precision (TREE_TYPE (@0))
>>>>>>>>>>>>>>   && bitwise_equal_p (@1, @2))
>>>>>>>>>>>>>> (if (TYPE_UNSIGNED (type))
>>>>>>>>>>>>>> (absu:type @2)
>>>>>>>>>>>>>> (abs @2)))))
>>>>>>>>>>>>>
>>>>>>>>>>>>> Of course then you'd want to convert @2 to signed?
>>>>>>>>>>>>
>>>>>>>>>>>> We have some test cases where @2 is unsigned where original 
>>>>>>>>>>>> pattern triggers and will not with the new pattern. For example 
>>>>>>>>>>>> gcc.dg/tree-ssa/phi-opt-37.c.
>>>>>>>>>>>>
>>>>>>>>>>>> Should we create a new pattern as:
>>>>>>>>>>>> /* (type)A >=/> 0 ? A : -A    same as abs (A) */
>>>>>>>>>>>> (for cmp (ge gt)
>>>>>>>>>>>> (simplify
>>>>>>>>>>>> (cnd (cmp (convert?@0 @1) zerop) @2 (negate @2))
>>>>>>>>>>>> (if (!HONOR_SIGNED_ZEROS (TREE_TYPE (@1))
>>>>>>>>>>>>    && !TYPE_UNSIGNED (TREE_TYPE (@1))
>>>>>>>>>>>>    && !TYPE_UNSIGNED (TREE_TYPE (@2))
>>>>>>>>>>>>    && element_precision (TREE_TYPE (@1))
>>>>>>>>>>>>           <= element_precision (TREE_TYPE (@0))
>>>>>>>>>>>>    && bitwise_equal_p (@1, @2))
>>>>>>>>>>>> (if (TYPE_UNSIGNED (type))
>>>>>>>>>>>> (abs @2)
>>>>>>>>>>>> (abs @2)))))
>>>>>>>>>>>>
>>>>>>>>>>>> And leave the old pattern as it is? Otherwise if we decide to use 
>>>>>>>>>>>> @2, we have to XFAIL these cases unless I am missing spmething.
>>>>>>>>>>>
>>>>>>>>>>> No, I think we want a single pattern.  I meant you possibly need to 
>>>>>>>>>>> do
>>>>>>>>>>>
>>>>>>>>>>> (with
>>>>>>>>>>> { tree stype = signed_type_for (TREE_TYPE (@2)); }
>>>>>>>>>>> (if (TYPE_UNSIGNED (type))
>>>>>>>>>>> (absu (convert:stype @2))
>>>>>>>>>>> (abs (convert:stype @2))))
>>>>>>>>>>>
>>>>>>>>>>> for when @2 is unsigned?
>>>>>>>>>>
>>>>>>>>>> Thanks. I have changed accordingly.
>>>>>>>>>>
>>>>>>>>>> I have also changed gcc.dg/tree-ssa/phi-opt-37.c to check phiopt2 as 
>>>>>>>>>> in phiopt1 we don’t now match because of:
>>>>>>>>>> phiopt match-simplify back:
>>>>>>>>>> _5 = (signed int) x_2(D);
>>>>>>>>>> _7 = ABSU_EXPR <_5>;
>>>>>>>>>> result: _7
>>>>>>>>>> rejected because early
>>>>>>>>>
>>>>>>>>> ?  I don't understand what you are saying.
>>>>>>>>
>>>>>>>> This is the dump from phiopt. Even though it is matching,
>>>>>>>> /* Return TRUE if SEQ/OP pair should be allowed during early phiopt.
>>>>>>>> Currently this is to allow MIN/MAX and ABS/NEGATE and constants.  */
>>>>>>>> static bool
>>>>>>>> phiopt_early_allow (gimple_seq &seq, gimple_match_op &op) is rejecting 
>>>>>>>> it, as the dump shows.
>>>>>>>
>>>>>>> So I looked into this slightly. I think the match patterns are greedy
>>>>>>> when it comes to optional converts, in that match tries to match with
>>>>>>> convert first and for integer types but bitwise_equal_p will handle a
>>>>>>> nop_convert here.
>>>>>>> So for scalar integer types, maybe skip `TYPE_PRECISION (TREE_TYPE
>>>>>>> (@1)) == TYPE_PRECISION (TREE_TYPE (@0))` as that is handled via
>>>>>>> bitwise_equal_p call and we don't want an extra convert being added by
>>>>>>> the simplification
>>>>>>
>>>>>>
>>>>>> phiopt_early_allow only allow single instruction sequences. But since we 
>>>>>> now use @2 instead of @1, we will need the conversion. Sorry I don’t 
>>>>>> understand the fix you want.
>>>>>
>>>>> The convert expression is already existing before the match.
>>>>> ```
>>>>> y_3 = (int) x_2(D);
>>>>> if (y_3 < 0)
>>>>>  goto <bb 3>; [INV]
>>>>> else
>>>>>  goto <bb 4>; [INV]
>>>>>
>>>>> <bb 3> :
>>>>> x_4 = -x_2(D);
>>>>>
>>>>> <bb 4> :
>>>>> # x_1 = PHI <x_2(D)(2), x_4(3)>
>>>>> return x_1;
>>>>> ```
>>>>>
>>>>> Adding a new convert via match and simplify is not useful and is the
>>>>> cause of the issue as I mentioned
>>>>>
>>>>> So you should add:
>>>>> ```
>>>>>    (if (INTEGRAL_TYPE (type)
>>>>>         && element_precision (TREE_TYPE (@1))
>>>>>                == element_precision (TREE_TYPE (@0)))
>>>>>     (if (TYPE_UNSIGNED (type))
>>>>> (absu:type @0)
>>>>> (abs @0))
>>>>> ```
>>>>> So you reuse the convert expression that was there previously and the
>>>>> testcase will just work.
>>>>
>>>> Here is the amended patch. Bootstrapped and regression tested on 
>>>> aarch64-linux-gnu. Is this OK for trunk?
>>>
>>> +      /* Handle nop convert first to prevent additional
>>> +         convertion.  */
>>> +      (if (INTEGRAL_TYPE_P (type)
>>> +           && element_precision (TREE_TYPE (@1))
>>> +              == element_precision (TREE_TYPE (@0)))
>>> +       (if (TYPE_UNSIGNED (type))
>>> +        (absu:type @0)
>>> +        (abs @0))
>>> +       (if (TYPE_UNSIGNED (type))
>>> +        (if (TYPE_UNSIGNED (TREE_TYPE (@2)))
>>> +        (absu (convert:stype @2))
>>> +        (absu @2))
>>> +        (if (TYPE_UNSIGNED (TREE_TYPE (@2)))
>>> +        (abs (convert:stype @2))
>>> +        (abs @2)))))))
>>>
>>> I think this is overly complicated - an unnecessary conversion is elided by
>>> match so you should be able to write just
>>>
>>>    (if (TYPE_UNSIGNED (type))
>>>     (absu (convert:stype @2))
>>>     (abs (convert:stype @2)))
>>
>> We also have to handle float type with convert:stype. Do you mean:
>> (for cmp (ge gt)
>>  (simplify
>>   (cnd (cmp (convert?@0 @1) zerop) @2 (negate @2))
>>    (if (!HONOR_SIGNED_ZEROS (TREE_TYPE (@1))
>>         /* Support SEXT of @0 only.  */
>>         && !TYPE_UNSIGNED (TREE_TYPE (@1))
>>         && element_precision (@1)
>>              <= element_precision (@0)
>>         && bitwise_equal_p (@1, @2))
>>     (with {
>>       tree stype = INTEGRAL_TYPE_P (type) ?
>>          signed_type_for (TREE_TYPE (@2)) : TREE_TYPE (@2);
>>      }
>>      /* Handle nop convert first to prevent additional
>>         convertion.  */
>>      (if (INTEGRAL_TYPE_P (type)
>>           && element_precision (TREE_TYPE (@1))
>>               == element_precision (TREE_TYPE (@0)))
>>       (if (TYPE_UNSIGNED (type))
>>         (absu:type @0)
>>         (abs @0))
>>       (if (TYPE_UNSIGNED (TREE_TYPE (@2)))
>>         (absu (convert:stype @2))
>>         (abs (convert:stype @2)))))))
>
> I was thinking
>
> (for cmp (ge gt)
>  (simplify
>   (cnd (cmp (convert?@0 @1) zerop) @2 (negate @2))
>    (if (!HONOR_SIGNED_ZEROS (TREE_TYPE (@1))
>         /* Support SEXT of @0 only.  */
>         && !TYPE_UNSIGNED (TREE_TYPE (@1))
>         && element_precision (@1)
>              <= element_precision (@0)
>         && bitwise_equal_p (@1, @2))
>     (if (TYPE_UNSIGNED (TREE_TYPE (@2)))
>       (with {
>         tree stype = signed_type_for (TREE_TYPE (@2));
>        }
>       (absu (convert:stype @2)))
>       (abs @2))))))
>
> if @2 is unsigned then 'type' is unsigned as well.

Thanks. This works but this would require changing  this: 
gcc.dg/tree-ssa/phi-opt-37.c: Check phiopt2 dump  as shown in 
0001-abshalffloat-simple.patch.
If we do that optimisation Andrew suggested, it would be 
0001-abshalffloat-handle_nop_convert.patch. This looks more complicated though.

Bootstrapped and regression tested both versions.

Thanks,
Kugan




>
>>>
>>> btw, you can write element_precision (@1) directly, the function handles
>>> non-type arguments as well.
>>
>>
>> Thanks,
>> Kugan
>>>
>>> Richard.
>>>
>>>> Thanks,
>>>> Kugan
>>>>
>>>>>
>>>>> Thanks,
>>>>> Andrew Pinski


Attachment: 0001-abshalffloat-simple.patch
Description: 0001-abshalffloat-simple.patch

Attachment: 0001-abshalffloat-handle_nop_convert.patch
Description: 0001-abshalffloat-handle_nop_convert.patch

Reply via email to