https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69504
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |accepts-invalid, | |ice-on-invalid-code Status|UNCONFIRMED |NEW Last reconfirmed| |2016-01-27 Component|tree-optimization |c Ever confirmed|0 |1 --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- This is because you use the vector extension of indexing a vector with [] but with variable indexes the FE represents this in a way that takes the address of the vector variable which isn't possible in this case - it's a register. printf ((const char * restrict) "%d\n", (int) *((unsigned char *) &u8x16 + (sizetype) i)); so I fear the solution here is to reject the code with an error or force the frontend to special-case register vars by going through a temporary, that is, use ({ u8x16_t tem = u8x16; tem[i]; }) Frontend issue. If you do sth like void foo (u8x16_t *); int main(void) { register u8x16_t u8x16 asm ("xmm0"); foo (&u8x16); } the FEs will reject it with error: address of register variable ‘u8x16’ requested so I think rejecting this code is a reasonable thing. Using intrinsics if you use processor specific registers is a reasonable thing to expect from you here.