1  /* { dg-do compile } */
       2  /* { dg-options "-O2 -fdump-tree-thread2-details" } */
       3  
       4  struct tree_common 
       5  { 
       6    int code; 
       7  }; 
       8  union tree_node 
       9  { 
      10    struct tree_common common; 
      11  }; 
      12  typedef union tree_node *tree; 
      13   
      14  extern tree test (tree, int, int); 
      15  extern tree foo (void); 
      16  extern void abort (void) __attribute__ ((__noreturn__)); 
      17   
      18  tree 
      19  test (tree expr, int t, int D17630) 
      20  { 
      21    int __i; 
      22   
      23  L0: 
      24    if (expr->common.code != 142) goto L23; else goto L2; 
      25   
      26  L2: 
      27    __i = 0; 
      28    goto L10; 
      29   
      30  L10: 
      31    __i = __i + 1; 
      32    if (D17630 != __i) goto L8; else goto L19; 
      33   
      34  L8: 
      35    if (t) goto L15; else goto L10; 
      36   
      37  L15: 
      38    expr = foo (); 
      39    if (expr->common.code != 142) goto L23; else goto L0; 
      40   
      41  L19: 
      42    abort (); 
      43   
      44  L23: 
      45    return expr; 
      46  } 
      47  
      48  
      49  /* We should thread the backedge to the top of the loop; ie we only
      50     execute the if (expr->common.code != 142) test once per loop
      51     iteration.  */
      52  /* { dg-final { scan-tree-dump-times "jump thread" 1 "thread2" } } */
      53