blob: bd56a62a4b468df71105d6dd3e63d90cae4d0acc [file] [log] [blame]
// { 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" } }