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