On Mon, Jun 22, 2026 at 4:52 PM Richard Biener <[email protected]> wrote: > > On Mon, Jun 22, 2026 at 5:04 AM Kewen Lin <[email protected]> wrote: > > > > Hi, > > > > 在 2026/6/18 20:36, Richard Biener 写道: > > > On Thu, Jun 18, 2026 at 2:13 PM Kewen Lin <[email protected]> wrote: > > snip...>>>> Do you suggest something like: > > >> > > >> diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc > > >> index b1fd86c2b32..964c4bdef90 100644 > > >> --- a/gcc/config/i386/i386.cc > > >> +++ b/gcc/config/i386/i386.cc > > >> @@ -26510,8 +26510,15 @@ ix86_vector_costs::add_stmt_cost (int count, > > >> vect_cost_for_stmt kind, > > >> break; > > >> > > >> default: > > >> - if (truth_value_p (subcode)) > > >> + if (TREE_CODE_CLASS (subcode) == tcc_comparison) > > >> { > > >> + tree op_type = vect_comparison_type (stmt_info); > > >> + if (VECTOR_TYPE_P (vectype)) > > >> + op_type > > >> + = get_related_vectype_for_scalar_type > > >> (m_vinfo->vector_mode, > > >> + op_type); > > >> + mode = TYPE_MODE (op_type); > > > > > > More like > > > > > > if (kind == vector_stmt) > > > op_type = SLP_TREE_VECTYPE (SLP_TREE_CHILDREN (node)[0]); > > > else > > > op_type = vect_comparison_type (stmt_info); > > > mode = TYPE_MODE (op_type); > > > > > > > Got it, thanks Richi! As suggested, patch v2 is as below. > > > > ----- > > > > This patch is authored-by: Zhongjie Guo <[email protected]> > > > > AVX512 vector comparisons produce mask results, but the instructions > > operate on vector operands. The instruction cost should therefore be > > based on the operand vector mode rather than the mask result mode. > > > > The mismatch is especially visible on AVX512 split-regs targets, where > > ix86_vec_cost scales 512-bit vector operations. Using the mask result > > type misses that scaling and can make 512-bit vectorization look too > > cheap. > > > > As Richi suggested, this can be extended to cover scalar as well. > > So this patch is to obtain the mode of comparison operand first, then > > continue with the existing comparison cost logic. It also adjusts > > truth_value_p with tcc_comparison check. > > > > Bootstrapped and regtested on a hygon c86-4g-m7 machine. > > > > Is it ok for trunk? > > LGTM, please give target maintainers the chance to chime in though. Also LGTM. > > Thanks, > Richard. > > > BR, > > Kewen > > ----- > > gcc/ChangeLog: > > > > * config/i386/i386.cc (ix86_vector_costs::add_stmt_cost): Cost > > comparisons using the comparison operand mode. > > > > gcc/testsuite/ChangeLog: > > > > * gcc.target/i386/vect-compare-cost.c: New test. > > > > Signed-off-by: Zhongjie Guo <[email protected]> > > Co-Authored-By: Richard Biener <[email protected]> > > --- > > gcc/config/i386/i386.cc | 9 ++++++++- > > gcc/testsuite/gcc.target/i386/vect-compare-cost.c | 14 ++++++++++++++ > > 2 files changed, 22 insertions(+), 1 deletion(-) > > create mode 100644 gcc/testsuite/gcc.target/i386/vect-compare-cost.c > > > > diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc > > index b1fd86c2b32..4138e6f8289 100644 > > --- a/gcc/config/i386/i386.cc > > +++ b/gcc/config/i386/i386.cc > > @@ -26510,8 +26510,15 @@ ix86_vector_costs::add_stmt_cost (int count, > > vect_cost_for_stmt kind, > > break; > > > > default: > > - if (truth_value_p (subcode)) > > + if (TREE_CODE_CLASS (subcode) == tcc_comparison) > > { > > + tree op_type; > > + if (kind == vector_stmt) > > + op_type = SLP_TREE_VECTYPE (SLP_TREE_CHILDREN (node)[0]); > > + else > > + op_type = vect_comparison_type (stmt_info); > > + mode = TYPE_MODE (op_type); > > + > > if (SSE_FLOAT_MODE_SSEMATH_OR_HFBF_P (mode)) > > /* CMPccS? insructions are cheap, so use sse_op. While they > > produce a mask which may need to be turned to 0/1 by and, > > diff --git a/gcc/testsuite/gcc.target/i386/vect-compare-cost.c > > b/gcc/testsuite/gcc.target/i386/vect-compare-cost.c > > new file mode 100644 > > index 00000000000..5fb04773b4a > > --- /dev/null > > +++ b/gcc/testsuite/gcc.target/i386/vect-compare-cost.c > > @@ -0,0 +1,14 @@ > > +/* { dg-do compile } */ > > +/* { dg-options "-O3 -mavx512f -mtune=c86-4g-m7 --param > > ix86-vect-compare-costs=1 -fdump-tree-vect-details" } */ > > + > > +int > > +find_ll (const unsigned long long *p, unsigned long long x, int n) > > +{ > > + for (int i = 0; i < n; ++i) > > + if (p[i] == x) > > + return i; > > + return -1; > > +} > > + > > +/* The compare cost should make c86-4g-m7 prefer 32-byte vectors. */ > > +/* { dg-final { scan-tree-dump "loop vectorized using 32 byte vectors" > > "vect" } } */ > > -- > > 2.34.1 > > > >
-- BR, Hongtao
