https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109596
--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Great, --- gcc/tree-ssa-loop-ch.cc.jj 2024-03-19 16:27:35.969474787 +0100 +++ gcc/tree-ssa-loop-ch.cc 2024-03-19 17:12:57.904712489 +0100 @@ -957,7 +957,7 @@ ch_base::copy_headers (function *fun) edge entry = loop_preheader_edge (loop); - propagate_threaded_block_debug_into (exit->dest, entry->dest); + propagate_threaded_block_debug_into (nonexit->dest, entry->dest); if (!gimple_duplicate_seme_region (entry, exit, bbs, n_bbs, copied_bbs, true)) { looks very much promising: -XFAIL: gcc.dg/guality/example.c -O1 -DPREVENT_OPTIMIZATION execution test +XPASS: gcc.dg/guality/example.c -O1 -DPREVENT_OPTIMIZATION execution test -FAIL: gcc.dg/guality/pr43051-1.c -O1 -DPREVENT_OPTIMIZATION line 34 c == &a[0] +PASS: gcc.dg/guality/pr43051-1.c -O1 -DPREVENT_OPTIMIZATION line 34 c == &a[0] -FAIL: gcc.dg/guality/pr43051-1.c -O1 -DPREVENT_OPTIMIZATION line 39 c == &a[0] +PASS: gcc.dg/guality/pr43051-1.c -O1 -DPREVENT_OPTIMIZATION line 39 c == &a[0] -PASS: gcc.dg/guality/pr43051-1.c -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions -DPREVENT_OPTIMIZATION line 34 c == &a[0] +FAIL: gcc.dg/guality/pr43051-1.c -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions -DPREVENT_OPTIMIZATION line 34 c == &a[0] -PASS: gcc.dg/guality/pr43051-1.c -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions -DPREVENT_OPTIMIZATION line 39 c == &a[0] +FAIL: gcc.dg/guality/pr43051-1.c -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions -DPREVENT_OPTIMIZATION line 39 c == &a[0] -FAIL: gcc.dg/guality/pr54693-2.c -O1 -DPREVENT_OPTIMIZATION line 21 i == v + 1 -UNSUPPORTED: gcc.dg/guality/pr54693-2.c -O1 -DPREVENT_OPTIMIZATION line 21 x == 10 - i -UNSUPPORTED: gcc.dg/guality/pr54693-2.c -O1 -DPREVENT_OPTIMIZATION line 21 y == 20 - 2 * i -UNSUPPORTED: gcc.dg/guality/pr54693-2.c -O1 -DPREVENT_OPTIMIZATION line 21 z == 30 - 3 * i +PASS: gcc.dg/guality/pr54693-2.c -O1 -DPREVENT_OPTIMIZATION line 21 i == v + 1 +PASS: gcc.dg/guality/pr54693-2.c -O1 -DPREVENT_OPTIMIZATION line 21 x == 10 - i +PASS: gcc.dg/guality/pr54693-2.c -O1 -DPREVENT_OPTIMIZATION line 21 y == 20 - 2 * i +PASS: gcc.dg/guality/pr54693-2.c -O1 -DPREVENT_OPTIMIZATION line 21 z == 30 - 3 * i -FAIL: gcc.dg/guality/pr54693-2.c -O2 -DPREVENT_OPTIMIZATION line 21 i == v + 1 -UNSUPPORTED: gcc.dg/guality/pr54693-2.c -O2 -DPREVENT_OPTIMIZATION line 21 x == 10 - i -UNSUPPORTED: gcc.dg/guality/pr54693-2.c -O2 -DPREVENT_OPTIMIZATION line 21 y == 20 - 2 * i -UNSUPPORTED: gcc.dg/guality/pr54693-2.c -O2 -DPREVENT_OPTIMIZATION line 21 z == 30 - 3 * i +PASS: gcc.dg/guality/pr54693-2.c -O2 -DPREVENT_OPTIMIZATION line 21 i == v + 1 +PASS: gcc.dg/guality/pr54693-2.c -O2 -DPREVENT_OPTIMIZATION line 21 x == 10 - i +PASS: gcc.dg/guality/pr54693-2.c -O2 -DPREVENT_OPTIMIZATION line 21 y == 20 - 2 * i +PASS: gcc.dg/guality/pr54693-2.c -O2 -DPREVENT_OPTIMIZATION line 21 z == 30 - 3 * i -FAIL: gcc.dg/guality/pr54693-2.c -O2 -flto -fno-use-linker-plugin -flto-partition=none -DPREVENT_OPTIMIZATION line 21 i == v + 1 -UNSUPPORTED: gcc.dg/guality/pr54693-2.c -O2 -flto -fno-use-linker-plugin -flto-partition=none -DPREVENT_OPTIMIZATION line 21 x == 10 - i -UNSUPPORTED: gcc.dg/guality/pr54693-2.c -O2 -flto -fno-use-linker-plugin -flto-partition=none -DPREVENT_OPTIMIZATION line 21 y == 20 - 2 * i -UNSUPPORTED: gcc.dg/guality/pr54693-2.c -O2 -flto -fno-use-linker-plugin -flto-partition=none -DPREVENT_OPTIMIZATION line 21 z == 30 - 3 * i +PASS: gcc.dg/guality/pr54693-2.c -O2 -flto -fno-use-linker-plugin -flto-partition=none -DPREVENT_OPTIMIZATION line 21 i == v + 1 +PASS: gcc.dg/guality/pr54693-2.c -O2 -flto -fno-use-linker-plugin -flto-partition=none -DPREVENT_OPTIMIZATION line 21 x == 10 - i +PASS: gcc.dg/guality/pr54693-2.c -O2 -flto -fno-use-linker-plugin -flto-partition=none -DPREVENT_OPTIMIZATION line 21 y == 20 - 2 * i +PASS: gcc.dg/guality/pr54693-2.c -O2 -flto -fno-use-linker-plugin -flto-partition=none -DPREVENT_OPTIMIZATION line 21 z == 30 - 3 * i -UNSUPPORTED: gcc.dg/guality/pr54693-2.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects -DPREVENT_OPTIMIZATION line 21 x == 10 - i -UNSUPPORTED: gcc.dg/guality/pr54693-2.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects -DPREVENT_OPTIMIZATION line 21 y == 20 - 2 * i -UNSUPPORTED: gcc.dg/guality/pr54693-2.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects -DPREVENT_OPTIMIZATION line 21 z == 30 - 3 * i +FAIL: gcc.dg/guality/pr54693-2.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects -DPREVENT_OPTIMIZATION line 21 x == 10 - i +FAIL: gcc.dg/guality/pr54693-2.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects -DPREVENT_OPTIMIZATION line 21 y == 20 - 2 * i +FAIL: gcc.dg/guality/pr54693-2.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects -DPREVENT_OPTIMIZATION line 21 z == 30 - 3 * i -FAIL: gcc.dg/guality/pr54693-2.c -O3 -g -DPREVENT_OPTIMIZATION line 21 i == v + 1 -UNSUPPORTED: gcc.dg/guality/pr54693-2.c -O3 -g -DPREVENT_OPTIMIZATION line 21 x == 10 - i -UNSUPPORTED: gcc.dg/guality/pr54693-2.c -O3 -g -DPREVENT_OPTIMIZATION line 21 y == 20 - 2 * i -UNSUPPORTED: gcc.dg/guality/pr54693-2.c -O3 -g -DPREVENT_OPTIMIZATION line 21 z == 30 - 3 * i +PASS: gcc.dg/guality/pr54693-2.c -O3 -g -DPREVENT_OPTIMIZATION line 21 i == v + 1 +PASS: gcc.dg/guality/pr54693-2.c -O3 -g -DPREVENT_OPTIMIZATION line 21 x == 10 - i +PASS: gcc.dg/guality/pr54693-2.c -O3 -g -DPREVENT_OPTIMIZATION line 21 y == 20 - 2 * i +PASS: gcc.dg/guality/pr54693-2.c -O3 -g -DPREVENT_OPTIMIZATION line 21 z == 30 - 3 * i -FAIL: gcc.dg/guality/pr54693.c -O1 -DPREVENT_OPTIMIZATION line 22 i == c - 48 +PASS: gcc.dg/guality/pr54693.c -O1 -DPREVENT_OPTIMIZATION line 22 i == c - 48 -FAIL: gcc.dg/guality/pr54693.c -O2 -DPREVENT_OPTIMIZATION line 22 i == c - 48 +PASS: gcc.dg/guality/pr54693.c -O2 -DPREVENT_OPTIMIZATION line 22 i == c - 48 -FAIL: gcc.dg/guality/pr54693.c -O2 -flto -fno-use-linker-plugin -flto-partition=none -DPREVENT_OPTIMIZATION line 22 i == c - 48 +PASS: gcc.dg/guality/pr54693.c -O2 -flto -fno-use-linker-plugin -flto-partition=none -DPREVENT_OPTIMIZATION line 22 i == c - 48 -FAIL: gcc.dg/guality/pr54693.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects -DPREVENT_OPTIMIZATION line 22 i == c - 48 +PASS: gcc.dg/guality/pr54693.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects -DPREVENT_OPTIMIZATION line 22 i == c - 48 -FAIL: gcc.dg/guality/pr54693.c -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions -DPREVENT_OPTIMIZATION line 22 i == c - 48 +PASS: gcc.dg/guality/pr54693.c -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions -DPREVENT_OPTIMIZATION line 22 i == c - 48 -FAIL: gcc.dg/guality/pr54693.c -O3 -g -DPREVENT_OPTIMIZATION line 22 i == c - 48 +PASS: gcc.dg/guality/pr54693.c -O3 -g -DPREVENT_OPTIMIZATION line 22 i == c - 48 -FAIL: gcc.dg/guality/pr54693.c -Os -DPREVENT_OPTIMIZATION line 22 i == c - 48 +PASS: gcc.dg/guality/pr54693.c -Os -DPREVENT_OPTIMIZATION line 22 i == c - 48 -FAIL: gcc.dg/guality/pr89463.c -O1 -DPREVENT_OPTIMIZATION line 23 i + 1 == 7 +PASS: gcc.dg/guality/pr89463.c -O1 -DPREVENT_OPTIMIZATION line 23 i + 1 == 7 -FAIL: gcc.dg/guality/pr90074.c -O1 -DPREVENT_OPTIMIZATION line 28 c + 1 == 2 -FAIL: gcc.dg/guality/pr90074.c -O1 -DPREVENT_OPTIMIZATION line 28 i + 1 == 8 +PASS: gcc.dg/guality/pr90074.c -O1 -DPREVENT_OPTIMIZATION line 28 c + 1 == 2 +PASS: gcc.dg/guality/pr90074.c -O1 -DPREVENT_OPTIMIZATION line 28 i + 1 == 8 -UNSUPPORTED: gcc.dg/guality/pr90131.c -O1 -DPREVENT_OPTIMIZATION line 31 i + 1 == 1 +PASS: gcc.dg/guality/pr90131.c -O1 -DPREVENT_OPTIMIZATION line 31 i + 1 == 1 -FAIL: gcc.dg/guality/pr90716.c -O1 -DPREVENT_OPTIMIZATION line 23 j + 1 == 9 +PASS: gcc.dg/guality/pr90716.c -O1 -DPREVENT_OPTIMIZATION line 23 j + 1 == 9 -FAIL: gcc.dg/guality/pr90716.c -O2 -DPREVENT_OPTIMIZATION line 23 j + 1 == 9 +UNSUPPORTED: gcc.dg/guality/pr90716.c -O2 -DPREVENT_OPTIMIZATION line 23 j + 1 == 9 -FAIL: gcc.dg/guality/pr90716.c -O2 -flto -fno-use-linker-plugin -flto-partition=none -DPREVENT_OPTIMIZATION line 23 j + 1 == 9 +UNSUPPORTED: gcc.dg/guality/pr90716.c -O2 -flto -fno-use-linker-plugin -flto-partition=none -DPREVENT_OPTIMIZATION line 23 j + 1 == 9 -FAIL: gcc.dg/guality/pr90716.c -Os -DPREVENT_OPTIMIZATION line 23 j + 1 == 9 +UNSUPPORTED: gcc.dg/guality/pr90716.c -Os -DPREVENT_OPTIMIZATION line 23 j + 1 == 9 so feels like it mostly gets back to the 13 results. Guess for pr90716.c it would be nice (bet stage1 material) if ldist did better job with debug stmts when it replaces the whole loop with a function call try to figure out the final value of the SSA_NAMEs used in the debug stmts. It has before ldist: b_7 = b_14 + 1; # DEBUG b => b_7 ivtmp_3 = ivtmp_1 - 1; if (ivtmp_3 != 0) goto <bb 7>; [85.71%] else goto <bb 6>; [14.29%] where the 4->6 edge is the loop exit one, and similarly j_9 = j_15 + 1; # DEBUG j => j_9 # DEBUG BEGIN_STMT ivtmp_4 = ivtmp_13 - 1; if (ivtmp_4 != 0) goto <bb 8>; [87.50%] else goto <bb 4>; [12.50%] before this bb, and ldist clearly needs to figure out how many iterations the loop has, so if it added # DEBUG j => 8 # DEBUG b => 7 to start of bb 6 when it kills the loop, that would be great.