https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65832
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |ASSIGNED
Last reconfirmed| |2016-06-09
Component|target |middle-end
Ever confirmed|0 |1
--- Comment #8 from Richard Biener <rguenth at gcc dot gnu.org> ---
Testcase from PR71467 exposing the issue from vector lowering:
typedef int __v8si __attribute__ ((__vector_size__ (32)));
void vz(__v8si *v)
{
*v <<= 1;
}
It's also really a middle-end issue. Choices are making vec_init get
two modes, destination mode plus element mode like vec_init<v8si><v4si>
or simply making accepting any element mode(s?), making it essentially
a (vec_concat (vec_concat ...) ...)
For integer vectors expansion can also try expanding (v8si) { v4si, v4si }
as (v8si) (v2di) { (di) v4si, (di) v4si } thus go via integer modes. But
x86 doesn't support (v2ti) { TImode, TImode } for example.
Or we can add a different optab, say one for vec_concat and expand
the construction by pair-wise vec_concat (that's essentially what
targets would do with vec_init but they can of course choose optimal
sequences here).
I will probably work on the middle-end side but any input from target
maintainers is welcome.