On June 8, 2020 10:14:40 AM GMT+02:00, Jakub Jelinek <ja...@redhat.com> wrote: >Hi! > >As mentioned in the PR, the problem is that at least the x86 backend >asumes >that the vec_unpack* and vec_pack* optabs with integral modes are for >the >AVX512-ish vector masks rather than for very small vectors done in >GPRs. >The only other target that seems to have a scalar mode vec_{,un}pack* >optab >is aarch64 as discussed in the PR, so there is also a condition for >that. >All other targets have just vector mode optabs. > >Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. Richard. >2020-06-08 Jakub Jelinek <ja...@redhat.com> > > PR target/95528 > * tree-ssa-forwprop.c (simplify_vector_constructor): Don't use > VEC_UNPACK*_EXPR or VEC_PACK_TRUNC_EXPR with scalar modes unless the > type is vector boolean. > > * g++.dg/opt/pr95528.C: New test. > >--- gcc/tree-ssa-forwprop.c.jj 2020-05-26 09:28:53.244149208 +0200 >+++ gcc/tree-ssa-forwprop.c 2020-06-05 13:10:26.992648945 +0200 >@@ -2401,6 +2401,10 @@ simplify_vector_constructor (gimple_stmt > && (dblvectype > = build_vector_type (TREE_TYPE (TREE_TYPE (orig[0])), > nelts * 2)) >+ /* Only use it for vector modes or for vector booleans >represented >+ as scalar bitmasks. See PR95528. */ >+ && (VECTOR_MODE_P (TYPE_MODE (dblvectype)) >+ || VECTOR_BOOLEAN_TYPE_P (dblvectype)) > && (optab = optab_for_tree_code (FLOAT_TYPE_P (TREE_TYPE (type)) > ? VEC_UNPACK_FLOAT_LO_EXPR > : VEC_UNPACK_LO_EXPR, >@@ -2442,6 +2446,13 @@ simplify_vector_constructor (gimple_stmt > && (halfvectype > = build_vector_type (TREE_TYPE (TREE_TYPE (orig[0])), > nelts / 2)) >+ /* Only use it for vector modes or for vector booleans >+ represented as scalar bitmasks, or allow halfvectype >+ be the element mode. See PR95528. */ >+ && (VECTOR_MODE_P (TYPE_MODE (halfvectype)) >+ || VECTOR_BOOLEAN_TYPE_P (halfvectype) >+ || (TYPE_MODE (halfvectype) >+ == TYPE_MODE (TREE_TYPE (halfvectype)))) > && (optab = optab_for_tree_code (VEC_PACK_TRUNC_EXPR, > halfvectype, > optab_default)) >--- gcc/testsuite/g++.dg/opt/pr95528.C.jj 2020-06-05 13:13:17.137165849 >+0200 >+++ gcc/testsuite/g++.dg/opt/pr95528.C 2020-06-05 13:13:13.144224118 >+0200 >@@ -0,0 +1,27 @@ >+// PR target/95528 >+// { dg-do compile { target c++11 } } >+// { dg-options "-O3" } >+// { dg-additional-options "-march=skylake-avx512" { target i?86-*-*- >x86_64-*-* } } >+ >+template <typename a> struct b { >+ typedef a c __attribute__((vector_size(sizeof(a) * 4))); >+ union { >+ c d; >+ struct { >+ a e, f, g, h; >+ }; >+ }; >+ b(); >+ b(const b &i) : d(i.d) {} >+ static b j(c); >+ template <typename k> operator b<k>() { >+ b<k>::j(typename b<k>::c{k(e), k(f), k(g), k(h)}); >+ return b<k>(); >+ } >+}; >+template <typename a> using l = b<a>; >+using m = l<char>; >+using n = l<short>; >+m o(n i) { return i; } >+b<short> q; >+void p() { o(q); } > > Jakub