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? Richard. > Thanks, > Kugan > > > >> > >> Thanks, > >> Kugan > >> > >>> > >>>> Tests that now fail, but worked before (4 tests): > >>>> > >>>> gcc: gcc.dg/tree-ssa/phi-opt-36.c scan-tree-dump-not phiopt2 "if " > >>>> gcc: gcc.dg/tree-ssa/phi-opt-36.c scan-tree-dump-times phiopt1 "if " 2 > >>>> gcc: gcc.dg/tree-ssa/phi-opt-37.c scan-tree-dump-not phiopt1 "if "gcc: > >>>> gcc.dg/tree-ssa/phi-opt-37.c scan-tree-dump-times phiopt1 "ABSU_EXPR <" 2 > >>>> > >>>> > >>>> unsigned f2(int A) > >>>> { > >>>> unsigned t = A; > >>>> // A >= 0? A : -A same as abs (A) > >>>> if (A >= 0) return t; > >>>> return -t; > >>>> } > >>>> > >>>> unsigned abs_with_convert0 (int x) > >>>> { > >>>> unsigned int y = x; > >>>> > >>>> if (x < 0) > >>>> y = -y; > >>>> > >>>> return y; > >>>> } > >>>> unsigned abs_with_convert1 (unsigned x) > >>>> { > >>>> int y = x; > >>>> > >>>> if (y < 0) > >>>> x = -x; > >>>> > >>>> return x; > >>>> } > >>>> > >>>> In the original pattern, we have check for !TYPE_UNSIGNED > >>>> (TREE_TYPE(@0)) and (absu:type @0) > >>>> > >>>> Shouldnt that translate !TYPE_UNSIGNED (TREE_TYPE(@1)) and (absu:type > >>>> @1) in the new pattern > >>>> > >>>> Thanks, > >>>> Kugan > >>>> > >>>>> > >>>>> Same comments apply to the 2nd pattern update. > >>>>> > >>>>> Richard. > >>>>> > >>>>>> Thanks, > >>>>>> Kugan > >>>>>> > >>>>>> 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: > >>>>>> > >>>>>> * g++.dg/absvect.C: New test. > >>>>>> * gcc.dg/tree-ssa/absfloat16.c: New test. > >>>>>> > >>>>>> > >>>>>> signed-off-by: Kugan Vivekanandarajah <kvivekana...@nvidia.com> > >>>>>> > >>>>>> > >>>>>> Note I think we should be able to merge VEC_COND_EXPR and COND_EXPR > >>>>>> codes by instead looking whether the condition is vector or scalar. > >>>>>> Fallout > >>>>>> might be a bit too big, but it might be a thing to try. > >>>>>> > >>>>>> Richard. > >>>>>> > >>>>>>> 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> > >