From: Jennifer Schmitz Date: Thu, 5 Sep 2024 15:10:02 +0000 (-0700) Subject: match.pd: Check trunc_mod vector obtap before folding. X-Git-Tag: basepoints/gcc-16~5870 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6f3b6a451771cd54c98768e7db3c5d58aab2b6aa;p=thirdparty%2Fgcc.git 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 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. --- diff --git a/gcc/match.pd b/gcc/match.pd index 5566c0e4c41..4aa610e2270 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 00000000000..b74c749721b --- /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; + } +}