blob: ba7025ae33ba78503a70939d4d187350bebc04d5 [file] [log] [blame]
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-thread1-details -fdump-tree-thread4" } */
extern int status, pt;
extern int count;
void
foo (int N, int c, int b, int *a)
{
int i, flag;
i = b -1;
flag = 1;
if (status && i < N && a[i] == b) {
N--;
flag = 0;
if (pt)
count++;
}
else
for (i = -1, flag = 1; ++i < N && flag;)
if (a[i] == b)
{
--N;
flag = 0;
if (i < N)
a[i] = a[N];
else
a[i] = 0;
if (pt)
count++;
}
if(status && flag)
pt--;
}
/* There are 2 jump threading opportunities (which don't cross loops),
all of which will be realized, which will eliminate testing of
FLAG, completely. */
/* { dg-final { scan-tree-dump-times "Registering jump" 2 "thread1"} } */
/* We used to remove references to FLAG by DCE2, but this was
depending on early threaders threading through loop boundaries
(which we shouldn't do). However, the late threading passes, which
run after loop optimizations , can successfully eliminate the
references to FLAG. Verify that ther are no references by the late
threading passes. */
/* { dg-final { scan-tree-dump-not "if .flag" "thread4"} } */