aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJennifer Schmitz <jschmitz@nvidia.com>2024-09-05 08:10:02 -0700
committerJennifer Schmitz <jschmitz@nvidia.com>2024-09-18 13:07:25 +0200
commit6f3b6a451771cd54c98768e7db3c5d58aab2b6aa (patch)
treecd1a625d5c2f37c08b4fe570c43e100eb07f5153
parent5bfb91c14f98f6750281217f737b3d95c4e73584 (diff)
downloadgcc-6f3b6a451771cd54c98768e7db3c5d58aab2b6aa.zip
gcc-6f3b6a451771cd54c98768e7db3c5d58aab2b6aa.tar.gz
gcc-6f3b6a451771cd54c98768e7db3c5d58aab2b6aa.tar.bz2
match.pd: Check trunc_mod vector obtap before folding.
In the pattern X - (X / Y) * Y to X % Y, this patch guards the simplification for vector types by a check for: 1) Support of the mod optab for vectors OR 2) Application before vector lowering for non-VL vectors. This is to prevent reverting vectorization of modulo to div/mult/sub if the target does not support vector mod optab. The patch was bootstrapped and tested with no regression on aarch64-linux-gnu and x86_64-linux-gnu. OK for mainline? Signed-off-by: Jennifer Schmitz <jschmitz@nvidia.com> gcc/ PR tree-optimization/116569 * match.pd: Guard simplification to trunc_mod with check for mod optab support. gcc/testsuite/ PR tree-optimization/116569 * gcc.dg/torture/pr116569.c: New test.
-rw-r--r--gcc/match.pd7
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr116569.c18
2 files changed, 24 insertions, 1 deletions
diff --git a/gcc/match.pd b/gcc/match.pd
index 5566c0e..4aa610e 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -894,7 +894,12 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
/* X - (X / Y) * Y is the same as X % Y. */
(simplify
(minus (convert1? @0) (convert2? (mult:c (trunc_div @@0 @@1) @1)))
- (if (INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type))
+ (if (INTEGRAL_TYPE_P (type)
+ || (VECTOR_INTEGER_TYPE_P (type)
+ && ((optimize_vectors_before_lowering_p ()
+ && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
+ || target_supports_op_p (type, TRUNC_MOD_EXPR,
+ optab_vector))))
(convert (trunc_mod @0 @1))))
/* x * (1 + y / x) - y -> x - y % x */
diff --git a/gcc/testsuite/gcc.dg/torture/pr116569.c b/gcc/testsuite/gcc.dg/torture/pr116569.c
new file mode 100644
index 0000000..b74c749
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr116569.c
@@ -0,0 +1,18 @@
+/* { dg-additional-options "-mcpu=neoverse-v2" { target aarch64*-*-* } } */
+int a;
+short b, c, e;
+long d, f;
+long g (long h)
+{
+ if (h)
+ return h;
+ return d;
+}
+void i (int h[][0][0][0])
+{
+ for (short j; j; j += 3)
+ {
+ a = g(h[1][2] ? 0 : h[1][1][1][1]);
+ b = e ?: f % c;
+ }
+}