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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
| ; RUN: opt %s -always-inline | opt -analyze -scalar-evolution
; There was optimization bug in ScalarEvolution, that causes too long
; compute time and stack overflow crash.
declare void @body(i32)
declare void @llvm.assume(i1)
define available_externally void @assume1(i64 %i.ext, i64 %a) alwaysinline {
%cmp0 = icmp ne i64 %i.ext, %a
call void @llvm.assume(i1 %cmp0)
%a1 = add i64 %a, 1
%cmp1 = icmp ne i64 %i.ext, %a1
call void @llvm.assume(i1 %cmp1)
%a2 = add i64 %a1, 1
%cmp2 = icmp ne i64 %i.ext, %a2
call void @llvm.assume(i1 %cmp2)
%a3 = add i64 %a2, 1
%cmp3 = icmp ne i64 %i.ext, %a3
call void @llvm.assume(i1 %cmp3)
%a4 = add i64 %a3, 1
%cmp4 = icmp ne i64 %i.ext, %a4
call void @llvm.assume(i1 %cmp4)
ret void
}
define available_externally void @assume2(i64 %i.ext, i64 %a) alwaysinline {
call void @assume1(i64 %i.ext, i64 %a)
%a1 = add i64 %a, 5
%cmp1 = icmp ne i64 %i.ext, %a1
call void @assume1(i64 %i.ext, i64 %a1)
%a2 = add i64 %a1, 5
%cmp2 = icmp ne i64 %i.ext, %a2
call void @assume1(i64 %i.ext, i64 %a2)
%a3 = add i64 %a2, 5
%cmp3 = icmp ne i64 %i.ext, %a3
call void @assume1(i64 %i.ext, i64 %a3)
%a4 = add i64 %a3, 5
%cmp4 = icmp ne i64 %i.ext, %a4
call void @assume1(i64 %i.ext, i64 %a4)
ret void
}
define available_externally void @assume3(i64 %i.ext, i64 %a) alwaysinline {
call void @assume2(i64 %i.ext, i64 %a)
%a1 = add i64 %a, 25
%cmp1 = icmp ne i64 %i.ext, %a1
call void @assume2(i64 %i.ext, i64 %a1)
%a2 = add i64 %a1, 25
%cmp2 = icmp ne i64 %i.ext, %a2
call void @assume2(i64 %i.ext, i64 %a2)
%a3 = add i64 %a2, 25
%cmp3 = icmp ne i64 %i.ext, %a3
call void @assume2(i64 %i.ext, i64 %a3)
%a4 = add i64 %a3, 25
%cmp4 = icmp ne i64 %i.ext, %a4
call void @assume2(i64 %i.ext, i64 %a4)
ret void
}
define available_externally void @assume4(i64 %i.ext, i64 %a) alwaysinline {
call void @assume3(i64 %i.ext, i64 %a)
%a1 = add i64 %a, 125
%cmp1 = icmp ne i64 %i.ext, %a1
call void @assume3(i64 %i.ext, i64 %a1)
%a2 = add i64 %a1, 125
%cmp2 = icmp ne i64 %i.ext, %a2
call void @assume3(i64 %i.ext, i64 %a2)
%a3 = add i64 %a2, 125
%cmp3 = icmp ne i64 %i.ext, %a3
call void @assume3(i64 %i.ext, i64 %a3)
%a4 = add i64 %a3, 125
%cmp4 = icmp ne i64 %i.ext, %a4
call void @assume3(i64 %i.ext, i64 %a4)
ret void
}
define available_externally void @assume5(i64 %i.ext, i64 %a) alwaysinline {
call void @assume4(i64 %i.ext, i64 %a)
%a1 = add i64 %a, 625
%cmp1 = icmp ne i64 %i.ext, %a1
call void @assume4(i64 %i.ext, i64 %a1)
%a2 = add i64 %a1, 625
%cmp2 = icmp ne i64 %i.ext, %a2
call void @assume4(i64 %i.ext, i64 %a2)
%a3 = add i64 %a2, 625
%cmp3 = icmp ne i64 %i.ext, %a3
call void @assume4(i64 %i.ext, i64 %a3)
%a4 = add i64 %a3, 625
%cmp4 = icmp ne i64 %i.ext, %a4
call void @assume4(i64 %i.ext, i64 %a4)
ret void
}
define void @fn(i32 %init) {
entry:
br label %loop
loop:
%i = phi i32 [%init, %entry], [%next, %loop]
call void @body(i32 %i)
%i.ext = zext i32 %i to i64
call void @assume5(i64 %i.ext, i64 500000000)
%i.next = add i64 %i.ext, 1
%next = trunc i64 %i.next to i32
%done = icmp eq i32 %i, 500000000
br i1 %done, label %exit, label %loop
exit:
ret void
} |