https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113630
Bug ID: 113630 Summary: -fno-strict-aliasing introduces out-of-bounds memory access Product: gcc Version: 14.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: kristerw at gcc dot gnu.org Target Milestone: --- The test gcc.dg/torture/pr110799.c crashes because of an out of bounds memory access when compiled with "-O2 -fno-strict-aliasing". What is happening is that the pre pass has changed struct S { int a; }; struct M { int a, b; }; __attribute__((noipa, noinline, noclone, no_icf)) int f (struct S * p, int c, int d) { int r; <bb 2>: if (c_2(D) != 0) goto <bb 3>; else goto <bb 6>; <bb 3>: if (d_6(D) != 0) goto <bb 4>; else goto <bb 5>; <bb 4> r_8 = p_4(D)->a; goto <bb 7>; <bb 5> r_7 = MEM[(struct M *)p_4(D)].a; goto <bb 7>; <bb 6> r_5 = MEM[(struct M *)p_4(D)].b; <bb 7> # r_1 = PHI <r_7(5), r_5(6), r_8(4)> return r_1; } by combining bb 4 and bb 5 and doing all accesses as struct M: __attribute__((noipa, noinline, noclone, no_icf)) int f (struct S * p, int c, int d) { int r; int pretmp_9; <bb 2>: if (c_2(D) != 0) goto <bb 3>; [50.00%] else goto <bb 4>; [50.00%] <bb 3>: pretmp_9 = MEM[(struct M *)p_4(D)].a; goto <bb 5>; <bb 4>: r_5 = MEM[(struct M *)p_4(D)].b; <bb 5>: # r_1 = PHI <pretmp_9(3), r_5(4)> return r_1; } This in turn allows later passes to hoist the two loads __attribute__((noipa, noinline, noclone, no_icf)) int f (struct S * p, int c, int d) { int r; int pretmp_9; <bb 2>: pretmp_9 = MEM[(struct M *)p_4(D)].a; r_5 = MEM[(struct M *)p_4(D)].b; if (c_2(D) != 0) goto <bb 3>; else goto <bb 4>; <bb 3>: <bb 4>: # r_1 = PHI <pretmp_9(3), r_5(2)> return r_1; } which now reads out of bounds when we pass a struct S as f(&s, 1, 1).