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