1; RUN: opt %s -always-inline | opt -analyze -scalar-evolution
2; There was optimization bug in ScalarEvolution, that causes too long
3; compute time and stack overflow crash.
4
5declare void @body(i32)
6declare void @llvm.assume(i1)
7
8define available_externally void @assume1(i64 %i.ext, i64 %a) alwaysinline {
9  %cmp0 = icmp ne i64 %i.ext, %a
10  call void @llvm.assume(i1 %cmp0)
11
12  %a1 = add i64 %a, 1
13  %cmp1 = icmp ne i64 %i.ext, %a1
14  call void @llvm.assume(i1 %cmp1)
15
16  %a2 = add i64 %a1, 1
17  %cmp2 = icmp ne i64 %i.ext, %a2
18  call void @llvm.assume(i1 %cmp2)
19
20  %a3 = add i64 %a2, 1
21  %cmp3 = icmp ne i64 %i.ext, %a3
22  call void @llvm.assume(i1 %cmp3)
23
24  %a4 = add i64 %a3, 1
25  %cmp4 = icmp ne i64 %i.ext, %a4
26  call void @llvm.assume(i1 %cmp4)
27
28  ret void
29}
30
31define available_externally void @assume2(i64 %i.ext, i64 %a) alwaysinline {
32  call void @assume1(i64 %i.ext, i64 %a)
33
34  %a1 = add i64 %a, 5
35  %cmp1 = icmp ne i64 %i.ext, %a1
36  call void @assume1(i64 %i.ext, i64 %a1)
37
38  %a2 = add i64 %a1, 5
39  %cmp2 = icmp ne i64 %i.ext, %a2
40  call void @assume1(i64 %i.ext, i64 %a2)
41
42  %a3 = add i64 %a2, 5
43  %cmp3 = icmp ne i64 %i.ext, %a3
44  call void @assume1(i64 %i.ext, i64 %a3)
45
46  %a4 = add i64 %a3, 5
47  %cmp4 = icmp ne i64 %i.ext, %a4
48  call void @assume1(i64 %i.ext, i64 %a4)
49
50  ret void
51}
52
53define available_externally void @assume3(i64 %i.ext, i64 %a) alwaysinline {
54  call void @assume2(i64 %i.ext, i64 %a)
55
56  %a1 = add i64 %a, 25
57  %cmp1 = icmp ne i64 %i.ext, %a1
58  call void @assume2(i64 %i.ext, i64 %a1)
59
60  %a2 = add i64 %a1, 25
61  %cmp2 = icmp ne i64 %i.ext, %a2
62  call void @assume2(i64 %i.ext, i64 %a2)
63
64  %a3 = add i64 %a2, 25
65  %cmp3 = icmp ne i64 %i.ext, %a3
66  call void @assume2(i64 %i.ext, i64 %a3)
67
68  %a4 = add i64 %a3, 25
69  %cmp4 = icmp ne i64 %i.ext, %a4
70  call void @assume2(i64 %i.ext, i64 %a4)
71
72  ret void
73}
74
75define available_externally void @assume4(i64 %i.ext, i64 %a) alwaysinline {
76  call void @assume3(i64 %i.ext, i64 %a)
77
78  %a1 = add i64 %a, 125
79  %cmp1 = icmp ne i64 %i.ext, %a1
80  call void @assume3(i64 %i.ext, i64 %a1)
81
82  %a2 = add i64 %a1, 125
83  %cmp2 = icmp ne i64 %i.ext, %a2
84  call void @assume3(i64 %i.ext, i64 %a2)
85
86  %a3 = add i64 %a2, 125
87  %cmp3 = icmp ne i64 %i.ext, %a3
88  call void @assume3(i64 %i.ext, i64 %a3)
89
90  %a4 = add i64 %a3, 125
91  %cmp4 = icmp ne i64 %i.ext, %a4
92  call void @assume3(i64 %i.ext, i64 %a4)
93
94  ret void
95}
96
97define available_externally void @assume5(i64 %i.ext, i64 %a) alwaysinline {
98  call void @assume4(i64 %i.ext, i64 %a)
99
100  %a1 = add i64 %a, 625
101  %cmp1 = icmp ne i64 %i.ext, %a1
102  call void @assume4(i64 %i.ext, i64 %a1)
103
104  %a2 = add i64 %a1, 625
105  %cmp2 = icmp ne i64 %i.ext, %a2
106  call void @assume4(i64 %i.ext, i64 %a2)
107
108  %a3 = add i64 %a2, 625
109  %cmp3 = icmp ne i64 %i.ext, %a3
110  call void @assume4(i64 %i.ext, i64 %a3)
111
112  %a4 = add i64 %a3, 625
113  %cmp4 = icmp ne i64 %i.ext, %a4
114  call void @assume4(i64 %i.ext, i64 %a4)
115
116  ret void
117}
118
119define void @fn(i32 %init) {
120entry:
121  br label %loop
122
123loop:
124  %i = phi i32 [%init, %entry], [%next, %loop]
125  call void @body(i32 %i)
126
127  %i.ext = zext i32 %i to i64
128
129  call void @assume5(i64 %i.ext, i64 500000000)
130
131  %i.next = add i64 %i.ext, 1
132  %next = trunc i64 %i.next to i32
133  %done = icmp eq i32 %i, 500000000
134
135  br i1 %done, label %exit, label %loop
136
137exit:
138  ret void
139}