http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53101
Bug #: 53101 Summary: Recognize casts to sub-vectors Classification: Unclassified Product: gcc Version: 4.7.0 Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: target AssignedTo: unassig...@gcc.gnu.org ReportedBy: marc.gli...@normalesup.org Target: x86_64-linux-gnu Hello, starting from an AVX __m256d vector x, getting its first element is best done with *(double*)&x, which is what x[0] internally does, and which generates no instruction (well, the following has vzeroupper, but let's forget that). However, *(__m128d*)&x generates 2 movs and I have to explicitly use _mm256_extractf128_pd to get the proper nop. Could the compiler be taught to recognize the casts between pointers to vectors of the same object type the same way it recognizes casts to pointers to that object type? #include <x86intrin.h> #if 0 typedef double T; #else typedef __m128d T; #endif T f(__m256d x){ return *(T*)&x; } The closest report I found is PR 44551, which is quite different. PR 29881 shows that using a union is not an interesting alternative. I marked this one as target, but it may very well be that the recognition should be in the middle-end, or even that the front-end should mark the cast somehow.