1 ; RUN: opt < %s -inline -inline-threshold=20 -S | FileCheck %s
3 define internal i32 @callee1(i32 %A, i32 %B) {
8 define i32 @caller1() {
9 ; CHECK: define i32 @caller1
10 ; CHECK-NEXT: ret i32 3
12 %X = call i32 @callee1( i32 10, i32 3 )
16 define i32 @caller2() {
17 ; Check that we can constant-prop through instructions after inlining callee21
18 ; to get constants in the inlined callsite to callee22.
19 ; FIXME: Currently, the threshold is fixed at 20 because we don't perform
20 ; *recursive* cost analysis to realize that the nested call site will definitely
21 ; inline and be cheap. We should eventually do that and lower the threshold here
24 ; CHECK-LABEL: @caller2(
25 ; CHECK-NOT: call void @callee2
28 %x = call i32 @callee21(i32 42, i32 48)
32 define i32 @callee21(i32 %x, i32 %y) {
34 %result = call i32 @callee22(i32 %sub)
40 define i32 @callee22(i32 %x) {
41 %icmp = icmp ugt i32 %x, 42
42 br i1 %icmp, label %bb.true, label %bb.false
44 ; This block musn't be counted in the inline cost.
59 define i32 @caller3() {
60 ; Check that even if the expensive path is hidden behind several basic blocks,
61 ; it doesn't count toward the inline cost when constant-prop proves those paths
64 ; CHECK-LABEL: @caller3(
69 %x = call i32 @callee3(i32 42, i32 48)
73 define i32 @callee3(i32 %x, i32 %y) {
75 %icmp = icmp ugt i32 %sub, 42
76 br i1 %icmp, label %bb.true, label %bb.false
79 %icmp2 = icmp ult i32 %sub, 64
80 br i1 %icmp2, label %bb.true.true, label %bb.true.false
83 ; This block musn't be counted in the inline cost.
95 ; This block musn't be counted in the inline cost.
107 %result = phi i32 [ %x8, %bb.true.true ], [ %y8, %bb.true.false ]
114 declare {i8, i1} @llvm.uadd.with.overflow.i8(i8 %a, i8 %b)
116 define i8 @caller4(i8 %z) {
117 ; Check that we can constant fold through intrinsics such as the
118 ; overflow-detecting arithmetic instrinsics. These are particularly important
119 ; as they are used heavily in standard library code and generic C++ code where
120 ; the arguments are oftent constant but complete generality is required.
122 ; CHECK-LABEL: @caller4(
127 %x = call i8 @callee4(i8 254, i8 14, i8 %z)
131 define i8 @callee4(i8 %x, i8 %y, i8 %z) {
132 %uadd = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 %x, i8 %y)
133 %o = extractvalue {i8, i1} %uadd, 1
134 br i1 %o, label %bb.true, label %bb.false
140 ; This block musn't be counted in the inline cost.
152 define i64 @caller5(i64 %y) {
153 ; Check that we can round trip constants through various kinds of casts etc w/o
154 ; losing track of the constant prop in the inline cost analysis.
156 ; CHECK-LABEL: @caller5(
161 %x = call i64 @callee5(i64 42, i64 %y)
165 define i64 @callee5(i64 %x, i64 %y) {
166 %inttoptr = inttoptr i64 %x to i8*
167 %bitcast = bitcast i8* %inttoptr to i32*
168 %ptrtoint = ptrtoint i32* %bitcast to i64
169 %trunc = trunc i64 %ptrtoint to i32
170 %zext = zext i32 %trunc to i64
171 %cmp = icmp eq i64 %zext, 42
172 br i1 %cmp, label %bb.true, label %bb.false
178 ; This block musn't be counted in the inline cost.
191 define i32 @PR13412.main() {
192 ; This is a somewhat complicated three layer subprogram that was reported to
193 ; compute the wrong value for a branch due to assuming that an argument
194 ; mid-inline couldn't be equal to another pointer.
196 ; After inlining, the branch should point directly to the exit block, not to
197 ; the intermediate block.
198 ; CHECK: @PR13412.main
199 ; CHECK: br i1 true, label %[[TRUE_DEST:.*]], label %[[FALSE_DEST:.*]]
200 ; CHECK: [[FALSE_DEST]]:
201 ; CHECK-NEXT: call void @PR13412.fail()
202 ; CHECK: [[TRUE_DEST]]:
203 ; CHECK-NEXT: ret i32 0
207 store i64 0, i64* %i1
208 %arraydecay = bitcast i64* %i1 to i32*
209 %call = call i1 @PR13412.first(i32* %arraydecay, i32* %arraydecay)
210 br i1 %call, label %cond.end, label %cond.false
213 call void @PR13412.fail()
220 define internal i1 @PR13412.first(i32* %a, i32* %b) {
222 %call = call i32* @PR13412.second(i32* %a, i32* %b)
223 %cmp = icmp eq i32* %call, %b
227 declare void @PR13412.fail()
229 define internal i32* @PR13412.second(i32* %a, i32* %b) {
231 %sub.ptr.lhs.cast = ptrtoint i32* %b to i64
232 %sub.ptr.rhs.cast = ptrtoint i32* %a to i64
233 %sub.ptr.sub = sub i64 %sub.ptr.lhs.cast, %sub.ptr.rhs.cast
234 %sub.ptr.div = ashr exact i64 %sub.ptr.sub, 2
235 %cmp = icmp ugt i64 %sub.ptr.div, 1
236 br i1 %cmp, label %if.then, label %if.end3
241 %cmp1 = icmp eq i32 %0, %1
242 br i1 %cmp1, label %return, label %if.end3
248 %retval.0 = phi i32* [ %b, %if.end3 ], [ %a, %if.then ]