On Fri, Sep 20, 2024 at 10:23 AM Kugan Vivekanandarajah
<kvivekana...@nvidia.com> wrote:
>
> 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.

Meh, this is getting so tedious.  Can you split out the (type)A >=/> 0
? A : -A    same as abs (A) part please?
We seem to have agreed on a version for that.

I don't understand what the issue is with the other, and I'm tired to
investigate myself so please
explain to me.

Richard.

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

Reply via email to