https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118727

--- Comment #11 from Tamar Christina <tnfchris at gcc dot gnu.org> ---
(In reply to Xi Ruoyao from comment #10)
> The difference from AArch64 and LoongArch64 is AArch64 has WIDEN_ABD, and
> (with GCC 14.2):
> 
> t.c:10:17: note:   abd pattern recognized: patt_29 = (int) patt_30;
> t.c:10:17: note:   extra pattern stmt: patt_30 = .VEC_WIDEN_ABD (a.0_4,
> b.1_6);
> t.c:10:17: note:   vect_is_simple_use: operand ABS_EXPR <c_17>, type of def:
> internal
> t.c:10:17: note:   vect_is_simple_use: operand .VEC_WIDEN_ABD (a.0_4,
> b.1_6), type of def: internal
> t.c:10:17: note:   vect_is_simple_use: operand ABS_EXPR <c_17>, type of def:
> internal
> t.c:10:17: note:   vect_is_simple_use: operand .VEC_WIDEN_ABD (a.0_4,
> b.1_6), type of def: internal
> t.c:10:17: note:   vect_recog_sad_pattern: detected: r_18 = _8 + r_23;
> t.c:10:17: note:   sad pattern recognized: patt_28 = SAD_EXPR <a.0_4, b.1_6,
> r_23>;
> 
> So a different code path is used:
> 
>       if (gimple_call_internal_fn (abd_stmt) == IFN_ABD)
>         {
> ==>       if (!vect_look_through_possible_promotion (vinfo, abd_oprnd0,  <==
> LoongArch code path
>                                                      &unprom[0])
>               || !vect_look_through_possible_promotion (vinfo, abd_oprnd1,
>                                                         &unprom[1]))
>             return NULL;
>         }
>       else if (gimple_call_internal_fn (abd_stmt) == IFN_VEC_WIDEN_ABD)
>         {
> ==>       unprom[0].op = abd_oprnd0;                         <== AArch64
> code path (already fixed in PR108692)
>           unprom[0].type = TREE_TYPE (abd_oprnd0);
>           unprom[1].op = abd_oprnd1;
>           unprom[1].type = TREE_TYPE (abd_oprnd1);
>         }
>       else 
>         return NULL;

Yes, that's why I disabled the patterns to look...

There's still something platform specific going on here.
My guess is it's a difference between signess of char.

on AArch64 char is unsigned and so the first cast is redundant.

my guess is your testcase on uint8_t it'll pass.

The inputs should be unsigned, but it needs to dig through the promotions to
find intermediate casts inserted by e.g. vect_recog_over_widening_pattern

So Indeed, half_type is likely wrong for you, but I don't think commenting out
that is the correct fix.

Reply via email to