https://gcc.gnu.org/g:f54d42e00007e7a558b273d87f95b3e5b1938f5a
commit r15-4293-gf54d42e00007e7a558b273d87f95b3e5b1938f5a Author: Richard Biener <rguent...@suse.de> Date: Sat Oct 12 14:51:37 2024 +0200 tree-optimization/117104 - add missed guards to max(a,b) != a simplification For vector types we have to make sure the comparison result is a vector type and the resulting compare operation is supported. As the resulting compare is never an equality compare I didn't bother to check for the cbranch case. PR tree-optimization/117104 * match.pd ((cmp:c (minmax:c @0 @1) @0) -> (out @0 @1)): Properly guard the vector case. * gcc.dg/pr117104.c: New testcase. Diff: --- gcc/match.pd | 6 +++++- gcc/testsuite/gcc.dg/pr117104.c | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/gcc/match.pd b/gcc/match.pd index f2b5f3af9ef6..eff1ace87f54 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -4688,7 +4688,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) out (le gt gt le ge lt lt ge ) (simplify (cmp:c (minmax:c @0 @1) @0) - (if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))) + (if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0)) + && (!VECTOR_TYPE_P (TREE_TYPE (@0)) + || (VECTOR_TYPE_P (type) + && (!expand_vec_cmp_expr_p (TREE_TYPE (@0), type, cmp) + || expand_vec_cmp_expr_p (TREE_TYPE (@0), type, out))))) (out @0 @1)))) /* MIN (X, 5) == 0 -> X == 0 MIN (X, 5) == 7 -> false */ diff --git a/gcc/testsuite/gcc.dg/pr117104.c b/gcc/testsuite/gcc.dg/pr117104.c new file mode 100644 index 000000000000..9aa5734f7927 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr117104.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-vect-cost-model" } */ +/* { dg-additional-options "-mavx" { target { x86_64-*-* i?86-*-* } } } */ + +void g(); +void f(long *a) +{ + long b0 = a[0] > 0 ? a[0] : 0; + long b1 = a[1] > 0 ? a[1] : 0; + if ((b0|b1) == 0) + g(); +}