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)19test (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