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);
> 
>

Reply via email to