// { dg-do compile } // { dg-options "-O2 -fgimple -fdump-statistics" } // // This is a collection of seemingly threadble paths that should not be allowed. void foobar (int); // Possible thread from 2->4->3, but it would rotate the loop. void __GIMPLE (ssa) f1 () { int i; // Pre-header. __BB(2): goto __BB4; // Latch. __BB(3): foobar (i_1); i_5 = i_1 + 1; goto __BB4; __BB(4,loop_header(1)): i_1 = __PHI (__BB2: 0, __BB3: i_5); if (i_1 != 101) goto __BB3; else goto __BB5; __BB(5): return; } // Possible thread from 2->3->5 but threading through the empty latch // would create a non-empty latch. void __GIMPLE (ssa) f2 () { int i; // Pre-header. __BB(2): goto __BB3; __BB(3,loop_header(1)): i_8 = __PHI (__BB5: i_5, __BB2: 0); foobar (i_8); i_5 = i_8 + 1; if (i_5 != 256) goto __BB5; else goto __BB4; // Latch. __BB(5): goto __BB3; __BB(4): return; } // Possible thread from 3->5->6->3 but this would thread through the // header but not exit the loop. int __GIMPLE (ssa) f3 (int a) { int i; __BB(2): goto __BB6; __BB(3): if (i_1 != 0) goto __BB4; else goto __BB5; __BB(4): foobar (5); goto __BB5; // Latch. __BB(5): i_7 = i_1 + 1; goto __BB6; __BB(6,loop_header(1)): i_1 = __PHI (__BB2: 1, __BB5: i_7); if (i_1 <= 99) goto __BB3; else goto __BB7; __BB(7): return; } // { dg-final { scan-tree-dump-not "Jumps threaded" "statistics" } }