From 88e861655b3e59bc982ba22cd6e2e7348efae866 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 4 Jan 2022 15:49:50 +0100 Subject: [PATCH] tree-optimization/103800 - sanity check more PHI vectorization Bool pattern detection doesn't really handle PHIs well so we have to be prepared for mismatched vector types in more cases than originally thought. 2022-01-04 Richard Biener PR tree-optimization/103800 * tree-vect-loop.c (vectorizable_phi): Remove assert and expand comment. * gcc.dg/vect/bb-slp-pr103800.c: New testcase. --- gcc/testsuite/gcc.dg/vect/bb-slp-pr103800.c | 17 +++++++++++++++++ gcc/tree-vect-loop.c | 10 ++++------ 2 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/vect/bb-slp-pr103800.c diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-pr103800.c b/gcc/testsuite/gcc.dg/vect/bb-slp-pr103800.c new file mode 100644 index 0000000..33c2d20 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-pr103800.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-O3" } */ + +int a; +long b; +extern int c[], d[]; +extern _Bool e[]; +void f() { + if (a) + ; + for (;;) { + for (int g = 2; g; g = a) + d[g] = 0; + for (int h = 1; h < 13; h++) + e[h] = b ? (short)c[4 + h - 1] : c[4 + h - 1]; + } +} diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index ebd7d9c..77f1cc0 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -7850,17 +7850,15 @@ vectorizable_phi (vec_info *, && !useless_type_conversion_p (vectype, SLP_TREE_VECTYPE (child))) { - /* With bools we can have mask and non-mask precision vectors, - while pattern recog is supposed to guarantee consistency here - bugs in it can cause mismatches (PR103489 for example). + /* With bools we can have mask and non-mask precision vectors + or different non-mask precisions. while pattern recog is + supposed to guarantee consistency here bugs in it can cause + mismatches (PR103489 and PR103800 for example). Deal with them here instead of ICEing later. */ if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "incompatible vector type setup from " "bool pattern detection\n"); - gcc_checking_assert - (VECTOR_BOOLEAN_TYPE_P (SLP_TREE_VECTYPE (child)) - != VECTOR_BOOLEAN_TYPE_P (vectype)); return false; } -- 2.7.4