Undo a previous restriction on the inline cost calculation which Nick
[oota-llvm.git] / test / Transforms / Inline / alloca-bonus.ll
1 ; RUN: opt -inline < %s -S -o - -inline-threshold=8 | FileCheck %s
2
3 declare void @llvm.lifetime.start(i64 %size, i8* nocapture %ptr)
4
5 @glbl = external global i32
6
7 define void @outer1() {
8 ; CHECK: @outer1
9 ; CHECK-NOT: call void @inner1
10   %ptr = alloca i32
11   call void @inner1(i32* %ptr)
12   ret void
13 }
14
15 define void @inner1(i32 *%ptr) {
16   %A = load i32* %ptr
17   store i32 0, i32* %ptr
18   %C = getelementptr i32* %ptr, i32 0
19   %D = getelementptr i32* %ptr, i32 1
20   %E = bitcast i32* %ptr to i8*
21   %F = select i1 false, i32* %ptr, i32* @glbl
22   call void @llvm.lifetime.start(i64 0, i8* %E)
23   ret void
24 }
25
26 define void @outer2() {
27 ; CHECK: @outer2
28 ; CHECK: call void @inner2
29   %ptr = alloca i32
30   call void @inner2(i32* %ptr)
31   ret void
32 }
33
34 ; %D poisons this call, scalar-repl can't handle that instruction.
35 define void @inner2(i32 *%ptr) {
36   %A = load i32* %ptr
37   store i32 0, i32* %ptr
38   %C = getelementptr i32* %ptr, i32 0
39   %D = getelementptr i32* %ptr, i32 %A
40   %E = bitcast i32* %ptr to i8*
41   %F = select i1 false, i32* %ptr, i32* @glbl
42   call void @llvm.lifetime.start(i64 0, i8* %E)
43   ret void
44 }
45
46 define void @outer3() {
47 ; CHECK: @outer3
48 ; CHECK-NOT: call void @inner3
49   %ptr = alloca i32
50   call void @inner3(i32* %ptr, i1 undef)
51   ret void
52 }
53
54 define void @inner3(i32 *%ptr, i1 %x) {
55   %A = icmp eq i32* %ptr, null
56   %B = and i1 %x, %A
57   br i1 %A, label %bb.true, label %bb.false
58 bb.true:
59   ; This block musn't be counted in the inline cost.
60   %t1 = load i32* %ptr
61   %t2 = add i32 %t1, 1
62   %t3 = add i32 %t2, 1
63   %t4 = add i32 %t3, 1
64   %t5 = add i32 %t4, 1
65   %t6 = add i32 %t5, 1
66   %t7 = add i32 %t6, 1
67   %t8 = add i32 %t7, 1
68   %t9 = add i32 %t8, 1
69   %t10 = add i32 %t9, 1
70   %t11 = add i32 %t10, 1
71   %t12 = add i32 %t11, 1
72   %t13 = add i32 %t12, 1
73   %t14 = add i32 %t13, 1
74   %t15 = add i32 %t14, 1
75   %t16 = add i32 %t15, 1
76   %t17 = add i32 %t16, 1
77   %t18 = add i32 %t17, 1
78   %t19 = add i32 %t18, 1
79   %t20 = add i32 %t19, 1
80   ret void
81 bb.false:
82   ret void
83 }
84
85 define void @outer4(i32 %A) {
86 ; CHECK: @outer4
87 ; CHECK-NOT: call void @inner4
88   %ptr = alloca i32
89   call void @inner4(i32* %ptr, i32 %A)
90   ret void
91 }
92
93 ; %D poisons this call, scalar-repl can't handle that instruction. However, we
94 ; still want to detect that the icmp and branch *can* be handled.
95 define void @inner4(i32 *%ptr, i32 %A) {
96   %B = getelementptr i32* %ptr, i32 %A
97   %E = icmp eq i32* %ptr, null
98   br i1 %E, label %bb.true, label %bb.false
99 bb.true:
100   ; This block musn't be counted in the inline cost.
101   %t1 = load i32* %ptr
102   %t2 = add i32 %t1, 1
103   %t3 = add i32 %t2, 1
104   %t4 = add i32 %t3, 1
105   %t5 = add i32 %t4, 1
106   %t6 = add i32 %t5, 1
107   %t7 = add i32 %t6, 1
108   %t8 = add i32 %t7, 1
109   %t9 = add i32 %t8, 1
110   %t10 = add i32 %t9, 1
111   %t11 = add i32 %t10, 1
112   %t12 = add i32 %t11, 1
113   %t13 = add i32 %t12, 1
114   %t14 = add i32 %t13, 1
115   %t15 = add i32 %t14, 1
116   %t16 = add i32 %t15, 1
117   %t17 = add i32 %t16, 1
118   %t18 = add i32 %t17, 1
119   %t19 = add i32 %t18, 1
120   %t20 = add i32 %t19, 1
121   ret void
122 bb.false:
123   ret void
124 }