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