https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114457
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #62368|0 |1 is obsolete| | --- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Created attachment 62375 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=62375&action=edit gcc16-pr114457-wip.patch Updated patch. This handles both forward and backward gotos as well as switch to case/default label jumps, but still want to debug some details in there and turn: struct S { int a, b, c; }; int foo (int x) { int r = 0; if (x == 1) goto l1; S s1; if (x == 2) goto l1; S s2; { S s10; if (x == 12) goto l1; s10.a = 1; r += s10.a; int i1; if (x == 13) goto l1; i1 = 2; r += i1; } if (x == 3) goto l2; if (x == 4) goto l1; { S s3; if (x == 5) goto l2; S s4; if (x == 6) goto l1; { S s5; if (x == 7) goto l1; s5.a = 5; r += s5.a; } S s6; { S s7; S s8; if (x == 8) goto l1; S s9; if (x == 9) goto l2; if (x == 10) goto l2; if (x == 11) goto l2; l1: l2: s1.a = 1; s2.b = 2; s3.c = 3; s4.a = 4; s6.b = 6; s7.c = 7; s8.a = 8; s9.b = 9; r += s1.a + s2.b + s3.c; r += s4.a + s6.b + s7.c; r += s8.a + s9.b; if (x == 14) goto l3; S s11; switch (x) { S s12; case 15: S s13; // FALLTHRU l3: case 16: case 17: S s14; s11.a = 1; s12.b = 2; s13.c = 3; s14.a = 4; r += s11.a + s12.b + s13.c; r += s14.a; return r; case 18: S s15; s11.a = 1; s12.b = 2; s13.c = 3; s14.a = 4; s15.b = 5; r += s11.a + s12.b + s13.c; r += s14.a + s15.b; return r; default: if (x != 19 && x != 20) break; S s16; s11.a = 1; s12.b = 2; s13.c = 3; s14.a = 4; s15.b = 5; s16.c = 6; r += s11.a + s12.b + s13.c; r += s14.a + s15.b + s16.c; return r; } if (x == 21) goto l3; } S s17; if (x == 22) goto l3; if (x == 23) goto l1; if (x == 24) goto l2; s17.a = 1; r += s17.a; } S s18; if (x == 25) { S s19; s19.c = 2; r += s19.c; if (x == 29) l4:; goto l3; } if (x == 26) goto l1; if (x == 27) goto l2; s18.b = 1; r += s18.b; if (x == 28) goto l4; { S s20; { S s21; if (x == 29) goto l1; S s22; if (x == 30) goto l2; l5: s20.a = 1; s21.b = 2; s22.c = 3; r += s20.a + s21.b + s22.c; switch (x) { case 31: S s23; // FALLTHRU l6: case 32: case 33: S s24; s23.a = 1; s24.b = 2; r += s23.a + s24.b; return r; default: if (x >= 34 && x <= 35) return r; break; } if (x == 34) goto l5; if (x == 35) goto l6; return r; } if (x == 36) goto l5; if (x == 37) goto l6; } if (x == 38) goto l5; if (x == 39) goto l6; return r; } into a testsuite testcase with .DEFERRED_INIT call count checks for each of the vars.