On Mon, Oct 28, 2024 at 12:41 AM Andrew Pinski <quic_apin...@quicinc.com> wrote: > > ABSU_EXPR lowering incorrectly used the resulting type > for the new expression but in the case of ABSU the resulting > type is an unsigned type and with ABSU is folded away. The fix > is to use a signed type for the expression instead. > > Bootstrapped and tested on x86_64-linux-gnu.
OK. > PR middle-end/111285 > > gcc/ChangeLog: > > * tree-vect-generic.cc (do_unop): Use a signed type for the > operand if the operation was ABSU_EXPR. > > gcc/testsuite/ChangeLog: > > * g++.dg/torture/vect-absu-1.C: New test. > > Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> > --- > gcc/testsuite/g++.dg/torture/vect-absu-1.C | 29 ++++++++++++++++++++++ > gcc/tree-vect-generic.cc | 10 +++++++- > 2 files changed, 38 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/g++.dg/torture/vect-absu-1.C > > diff --git a/gcc/testsuite/g++.dg/torture/vect-absu-1.C > b/gcc/testsuite/g++.dg/torture/vect-absu-1.C > new file mode 100644 > index 00000000000..0b2035f638f > --- /dev/null > +++ b/gcc/testsuite/g++.dg/torture/vect-absu-1.C > @@ -0,0 +1,29 @@ > +// { dg-do run } > +// PR middle-end/111285 > + > +// The lowering of vect absu was done incorrectly > + > +#define vect1 __attribute__((vector_size(sizeof(int)))) > + > +#define negabs(a) a < 0 ? a : -a > + > +__attribute__((noinline)) > +int s(int a) > +{ > + return negabs(a); > +} > +__attribute__((noinline)) > +vect1 int v(vect1 int a) > +{ > + return negabs(a); > +} > + > +int main(void) > +{ > + for(int i = -10; i < 10; i++) > + { > + vect1 int t = {i}; > + if (v(t)[0] != s(i)) > + __builtin_abort(); > + } > +} > diff --git a/gcc/tree-vect-generic.cc b/gcc/tree-vect-generic.cc > index ef7d2dd259d..21d906e9c55 100644 > --- a/gcc/tree-vect-generic.cc > +++ b/gcc/tree-vect-generic.cc > @@ -168,7 +168,15 @@ do_unop (gimple_stmt_iterator *gsi, tree inner_type, > tree a, > tree b ATTRIBUTE_UNUSED, tree bitpos, tree bitsize, > enum tree_code code, tree type ATTRIBUTE_UNUSED) > { > - a = tree_vec_extract (gsi, inner_type, a, bitsize, bitpos); > + tree rhs_type = inner_type; > + > + /* For ABSU_EXPR, use the signed type for the rhs if the rhs was signed. */ > + if (code == ABSU_EXPR > + && ANY_INTEGRAL_TYPE_P (TREE_TYPE (a)) > + && !TYPE_UNSIGNED (TREE_TYPE (a))) > + rhs_type = signed_type_for (rhs_type); > + > + a = tree_vec_extract (gsi, rhs_type, a, bitsize, bitpos); > return gimplify_build1 (gsi, code, inner_type, a); > } > > -- > 2.43.0 >