https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94703
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |rguenth at gcc dot gnu.org Version|unknown |10.0 Last reconfirmed| |2020-04-22 Status|UNCONFIRMED |NEW Ever confirmed|0 |1 Target| |x86_64-*-* --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- Confirmed. We end up with get4_1 (const void * X) { uint64_t r; unsigned int _4; uint64_t _6; <bb 2> [local count: 1073741824]: r = 0; _4 = MEM <unsigned int> [(char * {ref-all})X_3(D)]; MEM <unsigned int> [(char * {ref-all})&r] = _4; _6 = r; r ={v} {CLOBBER}; return _6; and get4_nospill (const void * X) { union { uint64_t u64; } u; unsigned int _4; uint64_t _6; <bb 2> [local count: 1073741824]: u.u64 = 0; _4 = MEM <unsigned int> [(char * {ref-all})X_3(D)]; MEM <unsigned int> [(char * {ref-all})&u] = _4; _6 = u.u64; u ={v} {CLOBBER}; return _6; so it's the same on the GIMPLE level but somehow RTL expansion likes the latter more, expanding 'u' to a register but not 'r'. Ah, that's because we have to keep TREE_ADDRESSABLE to prevent 'r' from being rewritten into SSA but not 'u' ... Extending DECL_GIMPLE_REG_P to non-vector/comples vars would likely fix this. We can also rewrite 'r' into SSA when we use BIT_INSERT_EXPR more aggressively (not sure if we want that).