aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/tree-ssa/pr66752-3.c
blob: e9bb744389c20af8418eb3ed0449f816c91ee060 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-threadfull1-details -fdump-tree-thread2" } */

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 "threadfull1"} } */

/* 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" "thread2"} } */