1/* { dg-do compile } */
2/* { dg-options "-O2 -fdump-tree-vrp1-details" } */
3
4static int blocksize = 4096;
5
6int bar (int);
7
8void foo (void)
9{
10  int toread;
11  int bytes;
12  static char eof_reached = 0;
13
14  toread = blocksize;
15  bytes = 1;
16
17  while (toread != 0)
18    {
19      bytes = bar (toread);
20      if (bytes <= 0)
21        {
22          if (bytes < 0)
23            continue;
24          break;
25        }
26      toread -= bytes;
27    }
28
29  if (bytes == 0)
30    eof_reached = 1;
31}
32
33
34/* First, we should simplify the bits < 0 test within the loop.  */
35/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp1" } } */
36
37/* Second, we should thread the edge out of the loop via the break
38   statement.  We also realize that the final bytes == 0 test is useless,
39   and thread over it.  */
40/* { dg-final { scan-tree-dump-times "Threaded jump" 3 "vrp1" } } */
41
42/* { dg-final { cleanup-tree-dump "vrp1" } } */
43
44