https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92706
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2019-11-28
Ever confirmed|0 |1
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
Testcase w/o too excessive alignment (and not relying on __int128):
typedef __UINT64_TYPE__ uint64_t;
typedef __UINT32_TYPE__ uint32_t;
struct S { uint32_t i[2]; } __attribute__((aligned(__alignof__(uint64_t))));
typedef uint64_t my_int64 __attribute__((may_alias));
uint64_t load (void *p)
{
struct S u, v, w;
uint64_t tem;
tem = *(my_int64 *)p;
*(my_int64 *)&v = tem;
u = v;
w = u;
return *(my_int64 *)&w;
}
nicely showing a case where the total scalarized aggregate doesn't
even go away?!
@@ -20,11 +64,13 @@
tem_5 = MEM[(my_int64 * {ref-all})p_4(D)];
MEM[(my_int64 * {ref-all})&v] = tem_5;
u = v;
- w = u;
- _9 = MEM[(my_int64 * {ref-all})&w];
- u ={v} {CLOBBER};
+ u$i$0_1 = v.i[0];
+ u$i$1_2 = v.i[1];
+ MEM <uint32_t> [(struct S *)&u] = u$i$0_1;
+ MEM <uint32_t> [(struct S *)&u + 4B] = u$i$1_2;
+ w_15 = MEM[(struct S *)&u];
+ _9 = w_15;
v ={v} {CLOBBER};
- w ={v} {CLOBBER};
return _9;
maybe it's because SRA arrives late at the decision to scalarize w?