/* { dg-do compile } */ /* { dg-options "-O2 -Wno-psabi -mavx2 -fdump-tree-forwprop1" } */ typedef double v4df __attribute__((vector_size (32))); typedef float v8sf __attribute__((vector_size (32))); typedef float v4sf __attribute__((vector_size (16))); typedef int v4si __attribute__((vector_size (16))); typedef double v2df __attribute__((vector_size (16))); v2df foo (v4df x, double *p, v2df y) { return (v2df) { x[3], *p }; } v4sf bar (v4si x, float *p) { return (v4sf) { x[0], x[1], x[2], *p }; } v4sf baz (v4si x) { return (v4sf) { x[0], x[1], 3.0f, 1.0f }; } v4sf barf (v8sf x) { return (v4sf) { x[4], x[5], 1.0f, 2.0f }; } /* For bar we do two inserts, first zero, then convert, then insert *p. } */ /* { dg-final { scan-tree-dump-times "BIT_INSERT_EXPR" 2 "forwprop1" } } */ /* We expect all other CTORs to turn into permutes, the FP converting ones to two each with the one with constants possibly elided in the future by converting 3.0f and 1.0f "back" to integers. */ /* For foo we do nothing. */ /* { dg-final { scan-tree-dump-times "VEC_PERM_EXPR" 3 "forwprop1" } } */ /* { dg-final { scan-tree-dump-times "VEC_PERM_EXPR" 2 "forwprop1" { xfail *-*-* } } } */