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