[opaque pointer type] Add textual IR support for explicit type parameter to load...
[oota-llvm.git] / test / Transforms / Inline / alloca-bonus.ll
1 ; RUN: opt -inline < %s -S -o - -inline-threshold=8 | FileCheck %s
2
3 target datalayout = "p:32:32"
4
5 declare void @llvm.lifetime.start(i64 %size, i8* nocapture %ptr)
6
7 @glbl = external global i32
8
9 define void @outer1() {
10 ; CHECK-LABEL: @outer1(
11 ; CHECK-NOT: call void @inner1
12   %ptr = alloca i32
13   call void @inner1(i32* %ptr)
14   ret void
15 }
16
17 define void @inner1(i32 *%ptr) {
18   %A = load i32, i32* %ptr
19   store i32 0, i32* %ptr
20   %C = getelementptr inbounds i32, i32* %ptr, i32 0
21   %D = getelementptr inbounds i32, i32* %ptr, i32 1
22   %E = bitcast i32* %ptr to i8*
23   %F = select i1 false, i32* %ptr, i32* @glbl
24   call void @llvm.lifetime.start(i64 0, i8* %E)
25   ret void
26 }
27
28 define void @outer2() {
29 ; CHECK-LABEL: @outer2(
30 ; CHECK: call void @inner2
31   %ptr = alloca i32
32   call void @inner2(i32* %ptr)
33   ret void
34 }
35
36 ; %D poisons this call, scalar-repl can't handle that instruction.
37 define void @inner2(i32 *%ptr) {
38   %A = load i32, i32* %ptr
39   store i32 0, i32* %ptr
40   %C = getelementptr inbounds i32, i32* %ptr, i32 0
41   %D = getelementptr inbounds i32, i32* %ptr, i32 %A
42   %E = bitcast i32* %ptr to i8*
43   %F = select i1 false, i32* %ptr, i32* @glbl
44   call void @llvm.lifetime.start(i64 0, i8* %E)
45   ret void
46 }
47
48 define void @outer3() {
49 ; CHECK-LABEL: @outer3(
50 ; CHECK-NOT: call void @inner3
51   %ptr = alloca i32
52   call void @inner3(i32* %ptr, i1 undef)
53   ret void
54 }
55
56 define void @inner3(i32 *%ptr, i1 %x) {
57   %A = icmp eq i32* %ptr, null
58   %B = and i1 %x, %A
59   br i1 %A, label %bb.true, label %bb.false
60 bb.true:
61   ; This block musn't be counted in the inline cost.
62   %t1 = load i32, i32* %ptr
63   %t2 = add i32 %t1, 1
64   %t3 = add i32 %t2, 1
65   %t4 = add i32 %t3, 1
66   %t5 = add i32 %t4, 1
67   %t6 = add i32 %t5, 1
68   %t7 = add i32 %t6, 1
69   %t8 = add i32 %t7, 1
70   %t9 = add i32 %t8, 1
71   %t10 = add i32 %t9, 1
72   %t11 = add i32 %t10, 1
73   %t12 = add i32 %t11, 1
74   %t13 = add i32 %t12, 1
75   %t14 = add i32 %t13, 1
76   %t15 = add i32 %t14, 1
77   %t16 = add i32 %t15, 1
78   %t17 = add i32 %t16, 1
79   %t18 = add i32 %t17, 1
80   %t19 = add i32 %t18, 1
81   %t20 = add i32 %t19, 1
82   ret void
83 bb.false:
84   ret void
85 }
86
87 define void @outer4(i32 %A) {
88 ; CHECK-LABEL: @outer4(
89 ; CHECK-NOT: call void @inner4
90   %ptr = alloca i32
91   call void @inner4(i32* %ptr, i32 %A)
92   ret void
93 }
94
95 ; %B poisons this call, scalar-repl can't handle that instruction. However, we
96 ; still want to detect that the icmp and branch *can* be handled.
97 define void @inner4(i32 *%ptr, i32 %A) {
98   %B = getelementptr inbounds i32, i32* %ptr, i32 %A
99   %C = icmp eq i32* %ptr, null
100   br i1 %C, label %bb.true, label %bb.false
101 bb.true:
102   ; This block musn't be counted in the inline cost.
103   %t1 = load i32, i32* %ptr
104   %t2 = add i32 %t1, 1
105   %t3 = add i32 %t2, 1
106   %t4 = add i32 %t3, 1
107   %t5 = add i32 %t4, 1
108   %t6 = add i32 %t5, 1
109   %t7 = add i32 %t6, 1
110   %t8 = add i32 %t7, 1
111   %t9 = add i32 %t8, 1
112   %t10 = add i32 %t9, 1
113   %t11 = add i32 %t10, 1
114   %t12 = add i32 %t11, 1
115   %t13 = add i32 %t12, 1
116   %t14 = add i32 %t13, 1
117   %t15 = add i32 %t14, 1
118   %t16 = add i32 %t15, 1
119   %t17 = add i32 %t16, 1
120   %t18 = add i32 %t17, 1
121   %t19 = add i32 %t18, 1
122   %t20 = add i32 %t19, 1
123   ret void
124 bb.false:
125   ret void
126 }
127
128 define void @outer5() {
129 ; CHECK-LABEL: @outer5(
130 ; CHECK-NOT: call void @inner5
131   %ptr = alloca i32
132   call void @inner5(i1 false, i32* %ptr)
133   ret void
134 }
135
136 ; %D poisons this call, scalar-repl can't handle that instruction. However, if
137 ; the flag is set appropriately, the poisoning instruction is inside of dead
138 ; code, and so shouldn't be counted.
139 define void @inner5(i1 %flag, i32 *%ptr) {
140   %A = load i32, i32* %ptr
141   store i32 0, i32* %ptr
142   %C = getelementptr inbounds i32, i32* %ptr, i32 0
143   br i1 %flag, label %if.then, label %exit
144
145 if.then:
146   %D = getelementptr inbounds i32, i32* %ptr, i32 %A
147   %E = bitcast i32* %ptr to i8*
148   %F = select i1 false, i32* %ptr, i32* @glbl
149   call void @llvm.lifetime.start(i64 0, i8* %E)
150   ret void
151
152 exit:
153   ret void
154 }
155