1/* { dg-do compile } */
2/* { dg-options "-O2 -fdump-tree-dom2-details" } */
3
4struct tree_common
5{
6  int code;
7};
8union tree_node
9{
10  struct tree_common common;
11};
12typedef union tree_node *tree;
13
14extern tree test (tree, int, int);
15extern tree foo (void);
16extern void abort (void) __attribute__ ((__noreturn__));
17
18tree
19test (tree expr, int t, int D17630)
20{
21  int __i;
22
23L0:
24  if (expr->common.code != 142) goto L23; else goto L2;
25
26L2:
27  __i = 0;
28  goto L10;
29
30L10:
31  __i = __i + 1;
32  if (D17630 != __i) goto L8; else goto L19;
33
34L8:
35  if (t) goto L15; else goto L10;
36
37L15:
38  expr = foo ();
39  if (expr->common.code != 142) goto L23; else goto L0;
40
41L19:
42  abort ();
43
44L23:
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 "Threaded jump" 1 "dom2" } } */
53/* { dg-final { cleanup-tree-dump "dom2" } } */
54
55