1 ; RUN: opt %s -passes=always-inline | opt -passes='print<scalar-evolution>'
2 ; There was optimization bug in ScalarEvolution, that causes too long
3 ; compute time and stack overflow crash.
5 declare void @body(i32)
6 declare void @llvm.assume(i1)
8 define 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)
13 %cmp1 = icmp ne i64 %i.ext, %a1
14 call void @llvm.assume(i1 %cmp1)
17 %cmp2 = icmp ne i64 %i.ext, %a2
18 call void @llvm.assume(i1 %cmp2)
21 %cmp3 = icmp ne i64 %i.ext, %a3
22 call void @llvm.assume(i1 %cmp3)
25 %cmp4 = icmp ne i64 %i.ext, %a4
26 call void @llvm.assume(i1 %cmp4)
31 define available_externally void @assume2(i64 %i.ext, i64 %a) alwaysinline {
32 call void @assume1(i64 %i.ext, i64 %a)
35 %cmp1 = icmp ne i64 %i.ext, %a1
36 call void @assume1(i64 %i.ext, i64 %a1)
39 %cmp2 = icmp ne i64 %i.ext, %a2
40 call void @assume1(i64 %i.ext, i64 %a2)
43 %cmp3 = icmp ne i64 %i.ext, %a3
44 call void @assume1(i64 %i.ext, i64 %a3)
47 %cmp4 = icmp ne i64 %i.ext, %a4
48 call void @assume1(i64 %i.ext, i64 %a4)
53 define available_externally void @assume3(i64 %i.ext, i64 %a) alwaysinline {
54 call void @assume2(i64 %i.ext, i64 %a)
57 %cmp1 = icmp ne i64 %i.ext, %a1
58 call void @assume2(i64 %i.ext, i64 %a1)
61 %cmp2 = icmp ne i64 %i.ext, %a2
62 call void @assume2(i64 %i.ext, i64 %a2)
65 %cmp3 = icmp ne i64 %i.ext, %a3
66 call void @assume2(i64 %i.ext, i64 %a3)
69 %cmp4 = icmp ne i64 %i.ext, %a4
70 call void @assume2(i64 %i.ext, i64 %a4)
75 define available_externally void @assume4(i64 %i.ext, i64 %a) alwaysinline {
76 call void @assume3(i64 %i.ext, i64 %a)
79 %cmp1 = icmp ne i64 %i.ext, %a1
80 call void @assume3(i64 %i.ext, i64 %a1)
82 %a2 = add i64 %a1, 125
83 %cmp2 = icmp ne i64 %i.ext, %a2
84 call void @assume3(i64 %i.ext, i64 %a2)
86 %a3 = add i64 %a2, 125
87 %cmp3 = icmp ne i64 %i.ext, %a3
88 call void @assume3(i64 %i.ext, i64 %a3)
90 %a4 = add i64 %a3, 125
91 %cmp4 = icmp ne i64 %i.ext, %a4
92 call void @assume3(i64 %i.ext, i64 %a4)
97 define available_externally void @assume5(i64 %i.ext, i64 %a) alwaysinline {
98 call void @assume4(i64 %i.ext, i64 %a)
100 %a1 = add i64 %a, 625
101 %cmp1 = icmp ne i64 %i.ext, %a1
102 call void @assume4(i64 %i.ext, i64 %a1)
104 %a2 = add i64 %a1, 625
105 %cmp2 = icmp ne i64 %i.ext, %a2
106 call void @assume4(i64 %i.ext, i64 %a2)
108 %a3 = add i64 %a2, 625
109 %cmp3 = icmp ne i64 %i.ext, %a3
110 call void @assume4(i64 %i.ext, i64 %a3)
112 %a4 = add i64 %a3, 625
113 %cmp4 = icmp ne i64 %i.ext, %a4
114 call void @assume4(i64 %i.ext, i64 %a4)
119 define void @fn(i32 %init) {
124 %i = phi i32 [%init, %entry], [%next, %loop]
125 call void @body(i32 %i)
127 %i.ext = zext i32 %i to i64
129 call void @assume5(i64 %i.ext, i64 500000000)
131 %i.next = add i64 %i.ext, 1
132 %next = trunc i64 %i.next to i32
133 %done = icmp eq i32 %i, 500000000
135 br i1 %done, label %exit, label %loop