]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
simplify-rtx: Fix incorrect folding of shift and AND [PR117012]
authorTamar Christina <tamar.christina@arm.com>
Mon, 14 Oct 2024 13:00:25 +0000 (14:00 +0100)
committerTamar Christina <tamar.christina@arm.com>
Mon, 14 Oct 2024 13:00:25 +0000 (14:00 +0100)
The optimization added in r15-1047-g7876cde25cbd2f is using the wrong
operaiton to check for uniform constant vectors.

The Author intended to check that all the lanes in the vector are the same and
so used CONST_VECTOR_DUPLICATE_P.  However this only checks that the vector
is created from a pattern duplication, but doesn't say how many pattern
alternatives make up the duplication.  Normally would would need to check this
separately or use const_vec_duplicate_p.

Without this the optimization incorrectly triggers.

gcc/ChangeLog:

PR rtl-optimization/117012
* simplify-rtx.cc (simplify_context::simplify_binary_operation_1): Use
const_vec_duplicate_p instead of CONST_VECTOR_DUPLICATE_P.

gcc/testsuite/ChangeLog:

PR rtl-optimization/117012
* gcc.target/aarch64/pr117012.c: New test.

gcc/simplify-rtx.cc
gcc/testsuite/gcc.target/aarch64/pr117012.c [new file with mode: 0644]

index dc0d192dd21890b862d274f08737446968b3138f..4d024ec523b128ee04b570e3c1e884db16a888a7 100644 (file)
@@ -4088,10 +4088,10 @@ simplify_context::simplify_binary_operation_1 (rtx_code code,
       if (VECTOR_MODE_P (mode) && GET_CODE (op0) == ASHIFTRT
          && (CONST_INT_P (XEXP (op0, 1))
              || (GET_CODE (XEXP (op0, 1)) == CONST_VECTOR
-                 && CONST_VECTOR_DUPLICATE_P (XEXP (op0, 1))
+                 && const_vec_duplicate_p (XEXP (op0, 1))
                  && CONST_INT_P (XVECEXP (XEXP (op0, 1), 0, 0))))
          && GET_CODE (op1) == CONST_VECTOR
-         && CONST_VECTOR_DUPLICATE_P (op1)
+         && const_vec_duplicate_p (op1)
          && CONST_INT_P (XVECEXP (op1, 0, 0)))
        {
          unsigned HOST_WIDE_INT shift_count
diff --git a/gcc/testsuite/gcc.target/aarch64/pr117012.c b/gcc/testsuite/gcc.target/aarch64/pr117012.c
new file mode 100644 (file)
index 0000000..537c0fa
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#define vector16 __attribute__((vector_size(16)))
+
+vector16 unsigned char
+g (vector16 unsigned char a)
+{
+  vector16 signed char b = (vector16 signed char)a;
+  b = b >> 7;
+  vector16 unsigned char c = (vector16 unsigned char)b;
+  vector16 unsigned char d = { 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 };
+  return c & d;
+}
+
+/* { dg-final { scan-assembler-times {and\tv[0-9]+\.16b, v[0-9]+\.16b, v[0-9]+\.16b} 1 } } */