From 82cfd93ae81a5687bf2a1b12d964c630e95517a7 Mon Sep 17 00:00:00 2001 From: Richard Biener <rguenther@suse.de> Date: Thu, 4 May 2023 10:06:47 +0200 Subject: [PATCH] tree-optimization/109721 - emulated vectors When fixing PR109672 I noticed we let SImode AND through when target_support_p even though it isn't word_mode and I didn't want to change that but had to catch the case where SImode PLUS is supported but emulated vectors rely on it being word_mode. The following makes sure to preserve the word_mode check when !target_support_p to avoid excessive lowering later even for bit operations. PR tree-optimization/109721 * tree-vect-stmts.cc (vectorizable_operation): Make sure to test word_mode for all !target_support_p operations. --- gcc/tree-vect-stmts.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc index 3ad6a7d28d77..cf5194ea4440 100644 --- a/gcc/tree-vect-stmts.cc +++ b/gcc/tree-vect-stmts.cc @@ -6389,9 +6389,15 @@ vectorizable_operation (vec_info *vinfo, if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "op not supported by target.\n"); - /* Check only during analysis. */ - if (((code == PLUS_EXPR || code == MINUS_EXPR || code == NEGATE_EXPR) + /* When vec_mode is not a vector mode and we verified ops we + do not have to lower like AND are natively supported let + those through even when the mode isn't word_mode. For + ops we have to lower the lowering code assumes we are + dealing with word_mode. */ + if ((((code == PLUS_EXPR || code == MINUS_EXPR || code == NEGATE_EXPR) + || !target_support_p) && maybe_ne (GET_MODE_SIZE (vec_mode), UNITS_PER_WORD)) + /* Check only during analysis. */ || (!vec_stmt && !vect_can_vectorize_without_simd_p (code))) { if (dump_enabled_p ()) -- GitLab