https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101925
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Assignee|rguenth at gcc dot gnu.org |unassigned at gcc dot gnu.org CC| |jamborm at gcc dot gnu.org Status|ASSIGNED |NEW --- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> --- Interestingly when I use struct _be_ip6_addr { union { short addr8[16]; } BIG_ENDIAN u; } BIG_ENDIAN; (note 'short' instead of 'char') I _do_ get rc.u.addr8[0] {rev}= _2; ... rc.u.addr8[1] {rev}= _4; ... so either the testcase is bogus or I fail to capture the desired semantics here. We do end up with aggregate copies here after inlining: rc.u.addr6 = D.2017; (note also no reverse storage marker). But then SRA comes along and scalarizes that aggregate copy: <bb 3> : _3 = ip.u.addr; - rc.u.addr {rev}= _3; + rc$u$addr_152 = _3; goto <bb 5>; [INV] ... + rc.u.addr6.u.addr8[0] = SR.48_91; + rc.u.addr6.u.addr8[1] = SR.49_92; + rc.u.addr6.u.addr8[2] = SR.50_93; + rc.u.addr6.u.addr8[3] = SR.51_94; + rc.u.addr6.u.addr8[4] = SR.52_95; + rc.u.addr6.u.addr8[5] = SR.53_96; + rc.u.addr6.u.addr8[6] = SR.54_97; + rc.u.addr6.u.addr8[7] = SR.55_98; + rc.u.addr6.u.addr8[8] = SR.56_99; + rc.u.addr6.u.addr8[9] = SR.57_100; + rc.u.addr6.u.addr8[10] = SR.58_101; + rc.u.addr6.u.addr8[11] = SR.59_102; + rc.u.addr6.u.addr8[12] = SR.60_103; + rc.u.addr6.u.addr8[13] = SR.61_104; + rc.u.addr6.u.addr8[14] = SR.62_105; + rc.u.addr6.u.addr8[15] = SR.63_106; + rc$u$addr_123 ={rev} MEM <int32_t> [(union *)&rc + 4B]; (??) ... + rc.is_v4 {rev}= rc$is_v4_74; + rc.u.addr {rev}= rc$u$addr_8; + MEM <char> [(struct _be_net_addr *)&rc + 8B] = rc$u$addr6$u$addr8$4_47; + MEM <char> [(struct _be_net_addr *)&rc + 9B] = rc$u$addr6$u$addr8$5_48; + MEM <char> [(struct _be_net_addr *)&rc + 10B] = rc$u$addr6$u$addr8$6_49; + MEM <char> [(struct _be_net_addr *)&rc + 11B] = rc$u$addr6$u$addr8$7_50; + MEM <char> [(struct _be_net_addr *)&rc + 12B] = rc$u$addr6$u$addr8$8_51; + MEM <char> [(struct _be_net_addr *)&rc + 13B] = rc$u$addr6$u$addr8$9_52; + MEM <char> [(struct _be_net_addr *)&rc + 14B] = rc$u$addr6$u$addr8$10_53; + MEM <char> [(struct _be_net_addr *)&rc + 15B] = rc$u$addr6$u$addr8$11_54; + MEM <char> [(struct _be_net_addr *)&rc + 16B] = rc$u$addr6$u$addr8$12_55; + MEM <char> [(struct _be_net_addr *)&rc + 17B] = rc$u$addr6$u$addr8$13_56; + MEM <char> [(struct _be_net_addr *)&rc + 18B] = rc$u$addr6$u$addr8$14_57; + MEM <char> [(struct _be_net_addr *)&rc + 19B] = rc$u$addr6$u$addr8$15_58; <retval> = rc; I'm somewhat lost as to how this works.