https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61969
--- Comment #4 from Andi Kleen <andi-gcc at firstfloor dot org> --- The problem is when returning a struct from func_52: const struct S0 func_52 (uint32_t p_53) { const struct S0 l_55 = { 4, 40290, 10, 4 }; return l_55; } The main code stores the struct value from the stack into the global variable and eventually prints it 80482f4: 83 ec 38 sub $0x38,%esp 80482f7: 0f b6 15 4c da 04 08 movzbl 0x804da4c,%edx 80482fe: 8b 1d 20 d1 04 08 mov 0x804d120,%ebx 8048304: 0f b6 35 70 da 04 08 movzbl 0x804da70,%esi 804830b: e8 b0 0c 00 00 call 8048fc0 <func_52> 8048310: 0f b7 45 d2 movzwl -0x2e(%ebp),%eax 8048314: ba 01 00 00 00 mov $0x1,%edx 8048319: c7 05 20 d1 04 08 48 movl $0x804da48,0x804d120 8048320: da 04 08 8048323: 66 a3 5c da 04 08 mov %ax,0x804da5c But func_52 has been completely optimized away and puts nothing onto the stack: 08048fc0 <func_52>: 8048fc0: f3 c3 repz ret 8048fc2: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi 8048fc9: 8d bc 27 00 00 00 00 lea 0x0(%edi,%eiz,1),%edi So the value is random stack garbage.