On Tue, Mar 8, 2022 at 9:30 AM Hongtao Liu <crazy...@gmail.com> wrote:
>
> ping^1
>
> On Fri, Feb 25, 2022 at 1:51 PM Hongtao Liu <crazy...@gmail.com> wrote:
> >
> > On Fri, Feb 25, 2022 at 1:50 PM liuhongt <hongtao....@intel.com> wrote:
> > >
> > > The patch fixes ICE in ix86_gimple_fold_builtin.
> > >
> > Bootstrapped and regtested on x86_64-linux-gnu{-m32,}.
> > Ok for main trunk?
I'm going to push the patch to trunk if there's no objection,
basically the patch cuts the code(partially) in ix86_expand_builtin
into ix86_check_builtin_isa_match, and use it to guard
ix86_gimple_fold_builtin.
The patch will fix GCC12 regression in PR104666.
> >
> > > gcc/ChangeLog:
> > >
> > >         PR target/104666
> > >         * config/i386/i386-expand.cc
> > >         (ix86_check_builtin_isa_match): New func.
> > >         (ix86_expand_builtin): Move code to
> > >         ix86_check_builtin_isa_match and call it.
> > >         * config/i386/i386-protos.h
> > >         (ix86_check_builtin_isa_match): Declare.
> > >         * config/i386/i386.cc (ix86_gimple_fold_builtin): Don't fold
> > >         builtin into gimple when isa mismatches.
> > >
> > > gcc/testsuite/ChangeLog:
> > >
> > >         * gcc.target/i386/pr104666.c: New test.
> > > ---
> > >  gcc/config/i386/i386-expand.cc           | 97 ++++++++++++++----------
> > >  gcc/config/i386/i386-protos.h            |  5 ++
> > >  gcc/config/i386/i386.cc                  |  4 +
> > >  gcc/testsuite/gcc.target/i386/pr104666.c | 49 ++++++++++++
> > >  4 files changed, 115 insertions(+), 40 deletions(-)
> > >  create mode 100644 gcc/testsuite/gcc.target/i386/pr104666.c
> > >
> > > diff --git a/gcc/config/i386/i386-expand.cc 
> > > b/gcc/config/i386/i386-expand.cc
> > > index faa0191c6dd..1d132f0181d 100644
> > > --- a/gcc/config/i386/i386-expand.cc
> > > +++ b/gcc/config/i386/i386-expand.cc
> > > @@ -12232,46 +12232,14 @@ ix86_expand_vec_set_builtin (tree exp)
> > >    return target;
> > >  }
> > >
> > > -/* Expand an expression EXP that calls a built-in function,
> > > -   with result going to TARGET if that's convenient
> > > -   (and in mode MODE if that's convenient).
> > > -   SUBTARGET may be used as the target for computing one of EXP's 
> > > operands.
> > > -   IGNORE is nonzero if the value is to be ignored.  */
> > > -
> > > -rtx
> > > -ix86_expand_builtin (tree exp, rtx target, rtx subtarget,
> > > -                    machine_mode mode, int ignore)
> > > +/* Return true if the necessary isa options for this builtin exist,
> > > +   else false.
> > > +   fcode = DECL_MD_FUNCTION_CODE (fndecl);  */
> > > +bool
> > > +ix86_check_builtin_isa_match (unsigned int fcode,
> > > +                             HOST_WIDE_INT* pbisa,
> > > +                             HOST_WIDE_INT* pbisa2)
> > >  {
> > > -  size_t i;
> > > -  enum insn_code icode, icode2;
> > > -  tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
> > > -  tree arg0, arg1, arg2, arg3, arg4;
> > > -  rtx op0, op1, op2, op3, op4, pat, pat2, insn;
> > > -  machine_mode mode0, mode1, mode2, mode3, mode4;
> > > -  unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
> > > -
> > > -  /* For CPU builtins that can be folded, fold first and expand the 
> > > fold.  */
> > > -  switch (fcode)
> > > -    {
> > > -    case IX86_BUILTIN_CPU_INIT:
> > > -      {
> > > -       /* Make it call __cpu_indicator_init in libgcc. */
> > > -       tree call_expr, fndecl, type;
> > > -        type = build_function_type_list (integer_type_node, NULL_TREE);
> > > -       fndecl = build_fn_decl ("__cpu_indicator_init", type);
> > > -       call_expr = build_call_expr (fndecl, 0);
> > > -       return expand_expr (call_expr, target, mode, EXPAND_NORMAL);
> > > -      }
> > > -    case IX86_BUILTIN_CPU_IS:
> > > -    case IX86_BUILTIN_CPU_SUPPORTS:
> > > -      {
> > > -       tree arg0 = CALL_EXPR_ARG (exp, 0);
> > > -       tree fold_expr = fold_builtin_cpu (fndecl, &arg0);
> > > -       gcc_assert (fold_expr != NULL_TREE);
> > > -       return expand_expr (fold_expr, target, mode, EXPAND_NORMAL);
> > > -      }
> > > -    }
> > > -
> > >    HOST_WIDE_INT isa = ix86_isa_flags;
> > >    HOST_WIDE_INT isa2 = ix86_isa_flags2;
> > >    HOST_WIDE_INT bisa = ix86_builtins_isa[fcode].isa;
> > > @@ -12321,7 +12289,56 @@ ix86_expand_builtin (tree exp, rtx target, rtx 
> > > subtarget,
> > >        bisa |= OPTION_MASK_ISA_SSE2;
> > >      }
> > >
> > > -  if ((bisa & isa) != bisa || (bisa2 & isa2) != bisa2)
> > > +  if (pbisa)
> > > +    *pbisa = bisa;
> > > +  if (pbisa2)
> > > +    *pbisa2 = bisa2;
> > > +
> > > +  return (bisa & isa) == bisa && (bisa2 & isa2) == bisa2;
> > > +}
> > > +
> > > +/* Expand an expression EXP that calls a built-in function,
> > > +   with result going to TARGET if that's convenient
> > > +   (and in mode MODE if that's convenient).
> > > +   SUBTARGET may be used as the target for computing one of EXP's 
> > > operands.
> > > +   IGNORE is nonzero if the value is to be ignored.  */
> > > +
> > > +rtx
> > > +ix86_expand_builtin (tree exp, rtx target, rtx subtarget,
> > > +                    machine_mode mode, int ignore)
> > > +{
> > > +  size_t i;
> > > +  enum insn_code icode, icode2;
> > > +  tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
> > > +  tree arg0, arg1, arg2, arg3, arg4;
> > > +  rtx op0, op1, op2, op3, op4, pat, pat2, insn;
> > > +  machine_mode mode0, mode1, mode2, mode3, mode4;
> > > +  unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
> > > +  HOST_WIDE_INT bisa, bisa2;
> > > +
> > > +  /* For CPU builtins that can be folded, fold first and expand the 
> > > fold.  */
> > > +  switch (fcode)
> > > +    {
> > > +    case IX86_BUILTIN_CPU_INIT:
> > > +      {
> > > +       /* Make it call __cpu_indicator_init in libgcc.  */
> > > +       tree call_expr, fndecl, type;
> > > +       type = build_function_type_list (integer_type_node, NULL_TREE);
> > > +       fndecl = build_fn_decl ("__cpu_indicator_init", type);
> > > +       call_expr = build_call_expr (fndecl, 0);
> > > +       return expand_expr (call_expr, target, mode, EXPAND_NORMAL);
> > > +      }
> > > +    case IX86_BUILTIN_CPU_IS:
> > > +    case IX86_BUILTIN_CPU_SUPPORTS:
> > > +      {
> > > +       tree arg0 = CALL_EXPR_ARG (exp, 0);
> > > +       tree fold_expr = fold_builtin_cpu (fndecl, &arg0);
> > > +       gcc_assert (fold_expr != NULL_TREE);
> > > +       return expand_expr (fold_expr, target, mode, EXPAND_NORMAL);
> > > +      }
> > > +    }
> > > +
> > > +  if (!ix86_check_builtin_isa_match (fcode, &bisa, &bisa2))
> > >      {
> > >        bool add_abi_p = bisa & OPTION_MASK_ISA_64BIT;
> > >        if (TARGET_ABI_X32)
> > > diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
> > > index d5e11259a5a..3596ce81ecf 100644
> > > --- a/gcc/config/i386/i386-protos.h
> > > +++ b/gcc/config/i386/i386-protos.h
> > > @@ -53,6 +53,7 @@ extern bool ix86_using_red_zone (void);
> > >  extern rtx ix86_gen_scratch_sse_rtx (machine_mode);
> > >
> > >  extern unsigned int ix86_regmode_natural_size (machine_mode);
> > > +extern bool ix86_check_builtin_isa_match (unsigned int fcode);
> > >  #ifdef RTX_CODE
> > >  extern int standard_80387_constant_p (rtx);
> > >  extern const char *standard_80387_constant_opcode (rtx);
> > > @@ -405,3 +406,7 @@ extern rtl_opt_pass 
> > > *make_pass_remove_partial_avx_dependency
> > >    (gcc::context *);
> > >
> > >  extern bool ix86_has_no_direct_extern_access;
> > > +
> > > +/* In i386-expand.cc.  */
> > > +bool ix86_check_builtin_isa_match (unsigned int, HOST_WIDE_INT*,
> > > +                                  HOST_WIDE_INT*);
> > > diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
> > > index b2bf90576d5..a0700c17d74 100644
> > > --- a/gcc/config/i386/i386.cc
> > > +++ b/gcc/config/i386/i386.cc
> > > @@ -18283,6 +18283,10 @@ ix86_gimple_fold_builtin (gimple_stmt_iterator 
> > > *gsi)
> > >    bool is_vshift;
> > >    unsigned HOST_WIDE_INT elems;
> > >
> > > +  /* Don't fold when there's isa mismatch.  */
> > > +  if (!ix86_check_builtin_isa_match (fn_code, NULL, NULL))
> > > +    return false;
> > > +
> > >    switch (fn_code)
> > >      {
> > >      case IX86_BUILTIN_TZCNT32:
> > > diff --git a/gcc/testsuite/gcc.target/i386/pr104666.c 
> > > b/gcc/testsuite/gcc.target/i386/pr104666.c
> > > new file mode 100644
> > > index 00000000000..cfde907e616
> > > --- /dev/null
> > > +++ b/gcc/testsuite/gcc.target/i386/pr104666.c
> > > @@ -0,0 +1,49 @@
> > > +/* { dg-do compile } */
> > > +/* { dg-options "-O2 -mno-sse --no-warning" } */
> > > +
> > > +typedef double __m128d __attribute__((__vector_size__(16), 
> > > __may_alias__));
> > > +typedef double __m256d __attribute__((__vector_size__(32), 
> > > __may_alias__));
> > > +
> > > +typedef float __m128 __attribute__((__vector_size__(16), __may_alias__));
> > > +typedef float __m256 __attribute__((__vector_size__(32), __may_alias__));
> > > +
> > > +typedef char __m128i __attribute__((__vector_size__(16), __may_alias__));
> > > +typedef char __m256i __attribute__((__vector_size__(32), __may_alias__));
> > > +
> > > +__m128d sse4_1_blendvpd (__m128d a, __m128d b, __m128d c) 
> > > __attribute__((__target__("avx2")));
> > > +
> > > +__m128d
> > > +generic_blendvpd (__m128d a, __m128d b, __m128d c) /* { dg-error "SSE 
> > > register return with SSE disabled" "" { target { ! ia32 } } }  */
> > > +{
> > > +  return __builtin_ia32_blendvpd (a, b, c); /* { dg-error "needs isa 
> > > option -msse4.1" "" { target ia32 } } */
> > > +}
> > > +
> > > +__m128
> > > +generic_blendvps (__m128 a, __m128 b, __m128 c)
> > > +{
> > > +  return __builtin_ia32_blendvps (a, b, c); /* { dg-error "needs isa 
> > > option -msse4.1" "" { target ia32 } } */
> > > +}
> > > +
> > > +__m128i
> > > +generic_pblendvb (__m128i a, __m128i b, __m128i c)
> > > +{
> > > +  return __builtin_ia32_pblendvb128 (a, b, c);/* { dg-error "needs isa 
> > > option -msse4.1" "" { target ia32 } } */
> > > +}
> > > +
> > > +__m256i
> > > +generic_pblendvb256 (__m256i a, __m256i b, __m256i c)
> > > +{
> > > +  return __builtin_ia32_pblendvb256 (a, b, c);/* { dg-error "needs isa 
> > > option -mavx2" "" { target ia32 } } */
> > > +}
> > > +
> > > +__m256d
> > > +generic_blendvpd256 (__m256d a, __m256d b, __m256d c)
> > > +{
> > > +  return __builtin_ia32_blendvpd256 (a, b, c);/* { dg-error "needs isa 
> > > option -mavx" "" { target ia32 } } */
> > > +}
> > > +
> > > +__m256
> > > +generic_blendvps256 (__m256 a, __m256 b, __m256 c)
> > > +{
> > > +  return __builtin_ia32_blendvps256 (a, b, c);/* { dg-error "needs isa 
> > > option -mavx" "" { target ia32 } } */
> > > +}
> > > --
> > > 2.18.1
> > >
> >
> >
> > --
> > BR,
> > Hongtao
>
>
>
> --
> BR,
> Hongtao



-- 
BR,
Hongtao

Reply via email to