blob: d72cb6f3572060cd833ffcaaa064d3cfbe4b31b1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
// This testcase used to hang the compiler in vt_find_locations.
// { dg-do compile }
// { dg-options "-O2 -g" }
struct S
{
int a;
S *b, *c, *d;
};
struct T
{
void f1 (S *x);
void f2 (S *x);
void f3 (S *x, S *y);
S *e;
};
void
T::f3 (S *x, S *y)
{
while (x != this->e && (!x || x->a == 1))
{
if (x == y->c)
{
S *w = y->d;
if (w && w->a == 0)
{
w->a = 1;
y->a = 0;
f2 (y);
w = y->d;
}
if (w && (!w->c || w->c->a == 1) && (!w->d || w->d->a == 1))
{
w->a = 0;
x = y;
y = x->b;
}
else
{
if (w && (!w->d || w->d->a == 1))
{
if (w->c)
w->c->a = 1;
w->a = 0;
f1 (w);
w = y->d;
}
if (w)
{
w->a = y->a;
if (w->d)
w->d->a = 1;
}
y->a = 1;
f2 (y);
x = e;
}
}
else
{
S *w = y->c;
if (w && w->a == 0)
{
w->a = 1;
y->a = 0;
f1 (y);
w = y->c;
}
if (w && (!w->c || w->c->a == 1) && (!w->d || w->d->a == 1))
{
w->a = 0;
x = y;
y = x->b;
}
else
{
if (w && (!w->c || w->c->a == 1))
{
w->a = 0;
if (w->d)
w->d->a = 1;
f2 (w);
w = y->c;
}
if (w)
{
w->a = y->a;
if (w->c)
w->c->a = 1;
}
y->a = 1;
f1 (y);
x = e;
}
}
}
}
|