https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104595
--- Comment #9 from rguenther at suse dot de <rguenther at suse dot de> --- On Wed, 23 Feb 2022, linkw at gcc dot gnu.org wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104595 > > --- Comment #8 from Kewen Lin <linkw at gcc dot gnu.org> --- > I had one local hack and just found it can survive on x86 bootstrapping and > regression testing. I guess maybe it's good to post here. Just ignore this if > it looks like noise. :) The point is to do the conversion for the loaded bool > value from memory, normally it should be like a nop, but for this test case, > it > can help us to generate the expected char comparison. Yes, but see my posted patch for a better fix. There's some underlying missing things we have in bool pattern recog that need to be fixed. Treating "external" (that includes memory) bools as 'char' would work but the type has effect on other IL which causes some ripple down effect and thus I think doing this isn't going to work in the end. > diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc > index 2baf974627e..d4b8920203b 100644 > --- a/gcc/tree-vect-patterns.cc > +++ b/gcc/tree-vect-patterns.cc > @@ -3911,6 +3911,11 @@ check_bool_pattern (tree var, vec_info *vinfo, > hash_set<gimple *> &stmts) > return false; > break; > > + case ARRAY_REF: > + if (TYPE_PRECISION (TREE_TYPE (var)) != 1) > + return false; > + break; > + > default: > if (TREE_CODE_CLASS (rhs_code) == tcc_comparison) > { > @@ -4005,6 +4010,19 @@ adjust_bool_pattern (vec_info *vinfo, tree var, tree > out_type, > SSA_NAME, irhs1); > break; > > + case ARRAY_REF: > + { > + itype = TREE_TYPE (var); > + gcc_assert (TYPE_PRECISION (itype) == 1); > + machine_mode mode = TYPE_MODE (itype); > + tree scalar_type = build_nonstandard_integer_type ( > + GET_MODE_BITSIZE (mode).to_constant (), TYPE_UNSIGNED (itype)); > + pattern_stmt > + = gimple_build_assign (vect_recog_temp_ssa_var (scalar_type, NULL), > + CONVERT_EXPR, var); > + } > + break; > + > case BIT_NOT_EXPR: > irhs1 = *defs.get (rhs1); > itype = TREE_TYPE (irhs1); > >