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,
Andrew Pinski

>
> Thanks,
> Kugan
>
> >
> > >
> > > >
> > > > +      (absu:type @1)
> > > > +      (abs @1)))))
> > > >
> > > > I think this should use @2 now.
> > > I will change this.
> > >
> > > Thanks,
> > > Kugan
> > >
> > > >
> > > > > Thanks.
> > > > > Kugan
> > > > > >
> > > > > > (like what is in gcc.dg/c11-floatn-3.c and others).
> > > > > >
> > > > > > Other than that it looks good but I can't approve it.
> > > > > >
> > > > > > Thanks,
> > > > > > Andrew Pinski
> > > > > >
> > > > > > >
> > > > > > > Signed-off-by: Kugan Vivekanandarajah <kvivekana...@nvidia.com>
> > > > > > >
> > > > > > > Bootstrapped and regression test on aarch64-linux-gnu. Is this OK 
> > > > > > > for trunk?
> > > > > > > Thanks,
> > > > > > > Kugan
> > > > > > >
> > > > > > > ________________________________
> > > > > > > From: Andrew Pinski <pins...@gmail.com>
> > > > > > > Sent: Monday, 15 July 2024 5:30 AM
> > > > > > > To: Kugan Vivekanandarajah <kvivekana...@nvidia.com>
> > > > > > > Cc: gcc-patches@gcc.gnu.org <gcc-patches@gcc.gnu.org>; 
> > > > > > > richard.guent...@gmail.com <richard.guent...@gmail.com>
> > > > > > > Subject: Re: [PATCH] MATCH: add abs support for half float
> > > > > > >
> > > > > > > External email: Use caution opening links or attachments
> > > > > > >
> > > > > > >
> > > > > > > On Sun, Jul 14, 2024 at 1:12 AM Kugan Vivekanandarajah
> > > > > > > <kvivekana...@nvidia.com> wrote:
> > > > > > > >
> > > > > > > > This patch extends abs detection in matched for half float.
> > > > > > > >
> > > > > > > > Bootstrapped and regression test on aarch64-linux-gnu. Is this 
> > > > > > > > OK for trunk?
> > > > > > >
> > > > > > > This is basically this 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)))))
> > > > > > > ```
> > > > > > >
> > > > > > > except extended to handle an optional convert. Why didn't you just
> > > > > > > extend the above pattern to handle the convert instead? Also I 
> > > > > > > think
> > > > > > > you have an issue with unsigned types with the comparison.
> > > > > > > Also you should extend the -abs(A) pattern right below it in a 
> > > > > > > similar fashion.
> > > > > > >
> > > > > > > Thanks,
> > > > > > > Andrew Pinski
> > > > > > >
> > > > > > >
> > > > > > > >
> > > > > > > > gcc/ChangeLog:
> > > > > > > >
> > > > > > > > * match.pd: Add pattern to convert (type)A >=/> 0 ? A : -A into 
> > > > > > > > abs (A) for half float.
> > > > > > > >
> > > > > > > > gcc/testsuite/ChangeLog:
> > > > > > > >
> > > > > > > > * gcc.dg/tree-ssa/absfloat16.c: New test.
> > > > > > > >
> > > > > > > > Signed-off-by: Kugan Vivekanandarajah <kvivekana...@nvidia.com>
> > > > > > > >

Reply via email to