https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70013
Bug ID: 70013
Summary: packed structure tree-sra loses initialization
Product: gcc
Version: 6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: amodra at gmail dot com
Target Milestone: ---
Seen on powerpc64le-linux at -O1 -Wall
#pragma pack(1)
struct S0 {
unsigned f0 : 17;
};
int c;
int main(void)
{
struct S0 d[] = { { 1 }, { 2 } };
struct S0 e = d[1];
c = d[0].f0;
__builtin_printf("%x\n", e.f0);
return 0;
}
pack2.c: In function 'main':
pack2.c:10:13: warning: '*((void *)&d+3).f0' is used uninitialized in this
function [-Wuninitialized]
struct S0 d[] = { { 1 }, { 2 } };
^
and there is an uninitialized read from the stack
main:
.LCF0:
0: addis 2,12,.TOC.-.LCF0@ha
addi 2,2,.TOC.-.LCF0@l
.localentry main,.-main
mflr 0
std 0,16(1)
stdu 1,-112(1)
ld 4,96(1) # <-------- here.
tree-sra dump shows
main ()
{
<unnamed-unsigned:17> SR.5;
<unnamed-unsigned:17> d$3$f0;
<unnamed-unsigned:17> e$f0;
<unnamed-unsigned:17> d$0$f0;
struct S0 d[2];
int _3;
int _5;
<bb 2>:
SR.5_12 = MEM[(struct S0[2] *)&*.LC0].f0;
MEM[(struct S0[2] *)&d].f0 = SR.5_12;
d$3$f0_14 = MEM[(struct S0[2] *)&d + 3B].f0;
d$0$f0_7 = SR.5_12;
e$f0_9 = d$3$f0_14;
_3 = (int) d$0$f0_7;
c = _3;
_5 = (int) e$f0_9;
printf ("%x\n", _5);
d ={v} {CLOBBER};
return 0;
}
So d[0] is written from the constant mem, but d[1] is read without first being
written.