From 10843f8303509fcba880c6c05c08e4b4ccd24f36 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 24 Sep 2020 10:14:33 +0200 Subject: [PATCH] tree-optimization/97085 - fold some trivial bool vector ?: The following aovids the ICE in the testcase by doing some additional simplification of VEC_COND_EXPRs for VECTOR_BOOLEAN_TYPE_P which we don't really expect, esp. when they are not classical vectors, thus AVX512 or SVE masks. 2020-09-24 Richard Biener PR tree-optimization/97085 * match.pd (mask ? { false,..} : { true, ..} -> ~mask): New. * gcc.dg/vect/pr97085.c: New testcase. --- gcc/match.pd | 11 +++++++++++ gcc/testsuite/gcc.dg/vect/pr97085.c | 13 +++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/vect/pr97085.c diff --git a/gcc/match.pd b/gcc/match.pd index 7d63bb973cb..e6dcdd0b855 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -3521,6 +3521,17 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (if (optimize_vectors_before_lowering_p () && types_match (@0, @1)) (vec_cond (bit_and (bit_not @0) @1) @2 @3))) +/* Canonicalize mask ? { 0, ... } : { -1, ...} to ~mask if the mask + types are compatible. */ +(simplify + (vec_cond @0 VECTOR_CST@1 VECTOR_CST@2) + (if (VECTOR_BOOLEAN_TYPE_P (type) + && types_match (type, TREE_TYPE (@0))) + (if (integer_zerop (@1) && integer_all_onesp (@2)) + (bit_not @0) + (if (integer_all_onesp (@1) && integer_zerop (@2)) + @0)))) + /* Simplification moved from fold_cond_expr_with_comparison. It may also be extended. */ /* This pattern implements two kinds simplification: diff --git a/gcc/testsuite/gcc.dg/vect/pr97085.c b/gcc/testsuite/gcc.dg/vect/pr97085.c new file mode 100644 index 00000000000..ffde9f10995 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr97085.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-march=armv8.2-a+sve" { target aarch64-*-* } } */ + +int a, b, c, d; +short e, g; +unsigned short f; +void h() { + for (; d; d++) { + g = d; + e = b == 0 ? 1 : a % b; + c ^= (f = e) > (g == 5); + } +} -- 2.30.2