https://gcc.gnu.org/g:df76d7b05693dc511a114cb6ece2cbc5eef25dea

commit r12-11049-gdf76d7b05693dc511a114cb6ece2cbc5eef25dea
Author: Andrew Pinski <quic_apin...@quicinc.com>
Date:   Sun Oct 27 13:16:22 2024 -0700

    vec-lowering: Fix ABSU lowering [PR111285]
    
    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.
    
            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>
    (cherry picked from commit ad0084337e901ddaedd48c14e7a5dad9fc2a093e)

Diff:
---
 gcc/testsuite/g++.dg/torture/vect-absu-1.C | 29 +++++++++++++++++++++++++++++
 gcc/tree-vect-generic.cc                   | 10 +++++++++-
 2 files changed, 38 insertions(+), 1 deletion(-)

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 000000000000..0b2035f638f5
--- /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 9a3ca26d4143..5a6256a0b705 100644
--- a/gcc/tree-vect-generic.cc
+++ b/gcc/tree-vect-generic.cc
@@ -202,7 +202,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);
 }

Reply via email to