[Bug middle-end/95528] [10/11 Regression] internal compiler error: in emit_move_insn, at expr.c:3814

jakub at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Thu Jun 4 18:50:56 GMT 2020


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95528

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org,
                   |                            |rsandifo at gcc dot gnu.org

--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Adjusted testcase so that there are no warnings:
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); }

What vec_pack_trunc_si does looks completely reasonable for the vector bool
types that have integral modes (i.e. AVX512F+ masks).
I'd say the vectorizer/simplify_vector_constructor just shouldn't attempt to
use these (e.g. vec_pack*, vec_unpack* optabs) for !VEC_MODE_P unless it is
VECTOR_BOOLEAN_TYPE_P type.
For i386 it would be the right thing as the patterns really assume that it is
vector booleans and have their properties.
Though, aarch64 seems to have vec_pack_trunc_di and vec_pack_trunc_df
expanders, it is unclear to me what they are for and if they are really used.
Other targets seem to only define these for vector modes.


More information about the Gcc-bugs mailing list