On Tue, Oct 8, 2024 at 10:19 AM Richard Biener <rguent...@suse.de> wrote: > > The following adds a pattern to elide a .REDUC_IOR operation when > the result is compared against zero with a cbranch. I've resorted > to using can_compare_p since that's what RTL expansion eventually > checks - while GIMPLE allowed whole vector equality compares for long > I'll notice vector lowering won't lower unsupported ones and RTL > expansion doesn't seem to try using [u]cmp<vector-mode> optabs > (and neither x86 nor aarch64 implements those). There's cstore > but no target implements that for vector modes either. > > Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. > > If anybody has suggestions on how to better guard the pattern I'm > all ears. > > Thanks, > Richard. > > PR tree-optimization/117000 > * match.pd (.REDUC_IOR !=/== 0): New pattern. > * gimple-match-head.cc: Include memmodel.h and optabs.h. > * generic-match-head.cc: Likewise. > > * gcc.target/i386/pr117000.c: New testcase. > --- > gcc/generic-match-head.cc | 2 ++ > gcc/gimple-match-head.cc | 2 ++ > gcc/match.pd | 9 +++++++++ > gcc/testsuite/gcc.target/i386/pr117000.c | 13 +++++++++++++ > 4 files changed, 26 insertions(+) > create mode 100644 gcc/testsuite/gcc.target/i386/pr117000.c > > diff --git a/gcc/generic-match-head.cc b/gcc/generic-match-head.cc > index 42dee626613..7d7e2a9f792 100644 > --- a/gcc/generic-match-head.cc > +++ b/gcc/generic-match-head.cc > @@ -35,6 +35,8 @@ along with GCC; see the file COPYING3. If not see > #include "builtins.h" > #include "case-cfn-macros.h" > #include "gimplify.h" > +#include "memmodel.h" > +#include "optabs.h" > #include "optabs-tree.h" > #include "dbgcnt.h" > #include "tm.h" > diff --git a/gcc/gimple-match-head.cc b/gcc/gimple-match-head.cc > index 4147a0eb38a..b9d5f751b7c 100644 > --- a/gcc/gimple-match-head.cc > +++ b/gcc/gimple-match-head.cc > @@ -41,6 +41,8 @@ along with GCC; see the file COPYING3. If not see > #include "internal-fn.h" > #include "case-cfn-macros.h" > #include "gimplify.h" > +#include "memmodel.h" > +#include "optabs.h" > #include "optabs-tree.h" > #include "tree-eh.h" > #include "dbgcnt.h" > diff --git a/gcc/match.pd b/gcc/match.pd > index ba83f0f29e6..c2efebd98bb 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -10332,6 +10332,15 @@ and, > (simplify (reduc (op @0 VECTOR_CST@1)) > (op (reduc:type @0) (reduc:type @1)))) > > +/* Simplify .REDUC_IOR (@0) ==/!= 0 to @0 ==/!= 0. */ > +(for cmp (eq ne) > + (simplify > + (cmp (IFN_REDUC_IOR @0) integer_zerop) > + (if (VECTOR_MODE_P (TYPE_MODE (TREE_TYPE (@0))) > + && can_compare_p (cmp == EQ_EXPR ? EQ : NE, TYPE_MODE (TREE_TYPE > (@0)), > + ccp_jump)) > + (cmp @0 { build_zero_cst (TREE_TYPE (@0)); })))) > + > /* Simplify vector floating point operations of alternating sub/add pairs > into using an fneg of a wider element type followed by a normal add. > under IEEE 754 the fneg of the wider type will negate every even entry > diff --git a/gcc/testsuite/gcc.target/i386/pr117000.c > b/gcc/testsuite/gcc.target/i386/pr117000.c > new file mode 100644 > index 00000000000..04f94344eb1 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/pr117000.c > @@ -0,0 +1,13 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -msse4.1" { target sse4 } } */
FYI, you don't have to guard compile tests with ISA target selectors. This is intended for assembly and execute tests, where assembler can't handle instructions from selected ISA. Uros.