1 /* { dg-do run } */ 2 /* { dg-options "-O2 -fdump-tree-optimized" } */ 3 /* Same test as 990128-1.c. */ 4 5 extern int printf (const char *,...); 6 extern void abort (void); 7 8 struct s { struct s *n; } *p; 9 struct s ss; 10 #define MAX 10 11 struct s sss[MAX]; 12 int count = 0; 13 14 void sub( struct s *p, struct s **pp ); 15 int look( struct s *p, struct s **pp ); 16 17 int main()18main() 19 { 20 struct s *pp; 21 struct s *next; 22 int i; 23 24 p = &ss; 25 next = p; 26 for ( i = 0; i < MAX; i++ ) { 27 next->n = &sss[i]; 28 next = next->n; 29 } 30 next->n = 0; 31 32 sub( p, &pp ); 33 if (count != MAX+2) 34 abort (); 35 36 return( 0 ); 37 } 38 sub(struct s * p,struct s ** pp)39void sub( struct s *p, struct s **pp ) 40 { 41 for ( ; look( p, pp ); ) { 42 if ( p ) 43 p = p->n; 44 else 45 break; 46 } 47 } 48 look(struct s * p,struct s ** pp)49int look( struct s *p, struct s **pp ) 50 { 51 for ( ; p; p = p->n ) 52 ; 53 *pp = p; 54 count++; 55 return( 1 ); 56 } 57 58 /* { dg-final { scan-tree-dump "Cleaned-up latch block of loop with single BB" "optimized" { xfail { *-*-* } } } } */ 59 60