Message ID | 20210807144132.3645400-1-hjl.tools@gmail.com |
---|---|
State | New |
Headers | show |
Series | x86: Optimize load of const all 1s float vectors | expand |
On Sat, Aug 7, 2021 at 4:41 PM H.J. Lu <hjl.tools@gmail.com> wrote: > > Update vector_all_ones_operand to return true for const all 1s float > vectors. > > gcc/ > > PR target/101804 > * config/i386/predicates.md (vector_all_ones_operand): Return > true for const all 1s float vectors. > > gcc/testsuite/ > > PR target/101804 > * gcc.target/i386/avx2-gather-2.c: Pass -march=skylake instead > of "-mavx2 -mtune=skylake". Scan vpcmpeqd. No, vector_all_ones_operand is intended to be integer minus-one. Use float_vector_all_ones_operand in a specific place, where it is needed. Uros. > --- > gcc/config/i386/predicates.md | 7 ++++--- > gcc/testsuite/gcc.target/i386/avx2-gather-2.c | 3 ++- > 2 files changed, 6 insertions(+), 4 deletions(-) > > diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md > index 6aa1ea32627..9637e64ea58 100644 > --- a/gcc/config/i386/predicates.md > +++ b/gcc/config/i386/predicates.md > @@ -1126,9 +1126,10 @@ (define_predicate "float_vector_all_ones_operand" > > /* Return true if operand is a vector constant that is all ones. */ > (define_predicate "vector_all_ones_operand" > - (and (match_code "const_vector") > - (match_test "INTEGRAL_MODE_P (GET_MODE (op))") > - (match_test "op == CONSTM1_RTX (GET_MODE (op))"))) > + (ior (and (match_code "const_vector") > + (match_test "INTEGRAL_MODE_P (GET_MODE (op))") > + (match_test "op == CONSTM1_RTX (GET_MODE (op))")) > + (match_operand 0 "float_vector_all_ones_operand"))) > > ; Return true when OP is operand acceptable for vector memory operand. > ; Only AVX can have misaligned memory operand. > diff --git a/gcc/testsuite/gcc.target/i386/avx2-gather-2.c b/gcc/testsuite/gcc.target/i386/avx2-gather-2.c > index 1a704afd834..ad5ef73107c 100644 > --- a/gcc/testsuite/gcc.target/i386/avx2-gather-2.c > +++ b/gcc/testsuite/gcc.target/i386/avx2-gather-2.c > @@ -1,6 +1,7 @@ > /* { dg-do compile } */ > -/* { dg-options "-O3 -mavx2 -fdump-tree-vect-details -mtune=skylake" } */ > +/* { dg-options "-O3 -fdump-tree-vect-details -march=skylake" } */ > > #include "avx2-gather-1.c" > > /* { dg-final { scan-tree-dump-times "vectorized 1 loops in function" 16 "vect" } } */ > +/* { dg-final { scan-assembler "vpcmpeqd" } } */ > -- > 2.31.1 >
diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md index 6aa1ea32627..9637e64ea58 100644 --- a/gcc/config/i386/predicates.md +++ b/gcc/config/i386/predicates.md @@ -1126,9 +1126,10 @@ (define_predicate "float_vector_all_ones_operand" /* Return true if operand is a vector constant that is all ones. */ (define_predicate "vector_all_ones_operand" - (and (match_code "const_vector") - (match_test "INTEGRAL_MODE_P (GET_MODE (op))") - (match_test "op == CONSTM1_RTX (GET_MODE (op))"))) + (ior (and (match_code "const_vector") + (match_test "INTEGRAL_MODE_P (GET_MODE (op))") + (match_test "op == CONSTM1_RTX (GET_MODE (op))")) + (match_operand 0 "float_vector_all_ones_operand"))) ; Return true when OP is operand acceptable for vector memory operand. ; Only AVX can have misaligned memory operand. diff --git a/gcc/testsuite/gcc.target/i386/avx2-gather-2.c b/gcc/testsuite/gcc.target/i386/avx2-gather-2.c index 1a704afd834..ad5ef73107c 100644 --- a/gcc/testsuite/gcc.target/i386/avx2-gather-2.c +++ b/gcc/testsuite/gcc.target/i386/avx2-gather-2.c @@ -1,6 +1,7 @@ /* { dg-do compile } */ -/* { dg-options "-O3 -mavx2 -fdump-tree-vect-details -mtune=skylake" } */ +/* { dg-options "-O3 -fdump-tree-vect-details -march=skylake" } */ #include "avx2-gather-1.c" /* { dg-final { scan-tree-dump-times "vectorized 1 loops in function" 16 "vect" } } */ +/* { dg-final { scan-assembler "vpcmpeqd" } } */