1 /* { dg-do compile } */
2 /* { dg-options "-O2 -fdump-tree-thread4-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
test(tree expr,int t,int D17630)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 "FSM jump thread" 1 "thread4" } } */
53 
54