On Mon, Sep 23, 2024 at 10:52 AM Kugan Vivekanandarajah <kvivekana...@nvidia.com> wrote: > > Hi Richard, > > > On 20 Sep 2024, at 8:11 pm, Richard Biener <richard.guent...@gmail.com> > > wrote: > > > > External email: Use caution opening links or attachments > > > > > > On Fri, Sep 20, 2024 at 10:23 AM Kugan Vivekanandarajah > > <kvivekana...@nvidia.com> wrote: > >> > >> Hi Richard, > >> > >>> On 17 Sep 2024, at 7:36 pm, Richard Biener <richard.guent...@gmail.com> > >>> wrote: > >>> > >>> External email: Use caution opening links or attachments > >>> > >>> > >>> On Tue, Sep 17, 2024 at 10:31 AM Kugan Vivekanandarajah > >>> <kvivekana...@nvidia.com> wrote: > >>>> > >>>> 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))))))) > >>> > >>> I was thinking > >>> > >>> (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)) > >>> (if (TYPE_UNSIGNED (TREE_TYPE (@2))) > >>> (with { > >>> tree stype = signed_type_for (TREE_TYPE (@2)); > >>> } > >>> (absu (convert:stype @2))) > >>> (abs @2)))))) > >>> > >>> if @2 is unsigned then 'type' is unsigned as well. > >> > >> Thanks. This works but this would require changing this: > >> gcc.dg/tree-ssa/phi-opt-37.c: Check phiopt2 dump as shown in > >> 0001-abshalffloat-simple.patch. > >> If we do that optimisation Andrew suggested, it would be > >> 0001-abshalffloat-handle_nop_convert.patch. This looks more complicated > >> though. > > > > Meh, this is getting so tedious. Can you split out the (type)A >=/> 0 > > ? A : -A same as abs (A) part please? > > We seem to have agreed on a version for that. > > Thanks. Attached patch does just this. > > > > > > I don't understand what the issue is with the other, and I'm tired to > > investigate myself so please > > explain to me. > > For gcc.dg/tree-ssa/phi-opt-37.c > We have: > <bb 2> : > 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; > > > phiopt1 dump now shows (additional convert): > > phiopt match-simplify back: > _5 = (signed int) x_2(D); > _7 = ABSU_EXPR <_5>; > result: _7 > rejected because early > > This is because there is a heuristics in phiopt that does not allow two inns > here to enable certain optimisations. This however would get optimised later. > May be this is ok as this would get optimised
I see, so the point is to not "un-CSE" in the replacement if (convert?@0 @1) is equal to (convert:stype @2). I think the same applies to the first pattern and we should handle it consistently. In your previous -simple patch you have + (for cmp (le lt) + (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)) + (if ((ANY_INTEGRAL_TYPE_P (TREE_TYPE (@1)) + && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (@1))) I believe you want to check @2s type here since we use abs/absu on that. + || TYPE_UNSIGNED (TREE_TYPE(@2))) + (with { + tree stype = signed_type_for (TREE_TYPE (@2)); + tree utype = unsigned_type_for (TREE_TYPE (@1)); + } + (convert (negate (absu:utype (convert:stype @2))))) instead of this do (if (types_match (@0, stype)) (convert (negate (absu:utype @0))) (convert (negate (absu:utype (convert:stype @2)))) + (convert (negate (abs @2)))))) and adjust the other pattern similarly (we also want to avoid un-CSE there). Thanks and sorry for the very slow process. Richard. > Bootstrapped and regression tests on aarch64-linux-gnu. Is this OK? > > Thanks, > Kugan > > > > > > Richard. > > > >> Bootstrapped and regression tested both versions. > >> > >> Thanks, > >> Kugan > >> > >> > >> > >> > >>> > >>>>> > >>>>> btw, you can write element_precision (@1) directly, the function handles > >>>>> non-type arguments as well. > >>>> > >>>> > >>>> Thanks, > >>>> Kugan > >>>>> > >>>>> Richard. > >>>>> > >>>>>> Thanks, > >>>>>> Kugan > >>>>>> > >>>>>>> > >>>>>>> Thanks, > >>>>>>> Andrew Pinski > >