blob: 62b10fb3beb5b3699d21cc2a1ee77e326ca26366 [file] [log] [blame]
Evgeniy Stepanov2ad36982013-08-08 08:22:39 +00001; RUN: opt < %s -inline -S | FileCheck %s
2target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
3
4define i32 @noattr_callee(i32 %i) {
5 ret i32 %i
6}
7
8define i32 @sanitize_address_callee(i32 %i) sanitize_address {
9 ret i32 %i
10}
11
12define i32 @sanitize_thread_callee(i32 %i) sanitize_thread {
13 ret i32 %i
14}
15
16define i32 @sanitize_memory_callee(i32 %i) sanitize_memory {
17 ret i32 %i
18}
19
20define i32 @alwaysinline_callee(i32 %i) alwaysinline {
21 ret i32 %i
22}
23
24define i32 @alwaysinline_sanitize_address_callee(i32 %i) alwaysinline sanitize_address {
25 ret i32 %i
26}
27
28define i32 @alwaysinline_sanitize_thread_callee(i32 %i) alwaysinline sanitize_thread {
29 ret i32 %i
30}
31
32define i32 @alwaysinline_sanitize_memory_callee(i32 %i) alwaysinline sanitize_memory {
33 ret i32 %i
34}
35
36
37; Check that:
38; * noattr callee is inlined into noattr caller,
39; * sanitize_(address|memory|thread) callee is not inlined into noattr caller,
40; * alwaysinline callee is always inlined no matter what sanitize_* attributes are present.
41
42define i32 @test_no_sanitize_address(i32 %arg) {
43 %x1 = call i32 @noattr_callee(i32 %arg)
44 %x2 = call i32 @sanitize_address_callee(i32 %x1)
45 %x3 = call i32 @alwaysinline_callee(i32 %x2)
46 %x4 = call i32 @alwaysinline_sanitize_address_callee(i32 %x3)
47 ret i32 %x4
48; CHECK-LABEL: @test_no_sanitize_address(
49; CHECK-NEXT: @sanitize_address_callee
50; CHECK-NEXT: ret i32
51}
52
53define i32 @test_no_sanitize_memory(i32 %arg) {
54 %x1 = call i32 @noattr_callee(i32 %arg)
55 %x2 = call i32 @sanitize_memory_callee(i32 %x1)
56 %x3 = call i32 @alwaysinline_callee(i32 %x2)
57 %x4 = call i32 @alwaysinline_sanitize_memory_callee(i32 %x3)
58 ret i32 %x4
59; CHECK-LABEL: @test_no_sanitize_memory(
60; CHECK-NEXT: @sanitize_memory_callee
61; CHECK-NEXT: ret i32
62}
63
64define i32 @test_no_sanitize_thread(i32 %arg) {
65 %x1 = call i32 @noattr_callee(i32 %arg)
66 %x2 = call i32 @sanitize_thread_callee(i32 %x1)
67 %x3 = call i32 @alwaysinline_callee(i32 %x2)
68 %x4 = call i32 @alwaysinline_sanitize_thread_callee(i32 %x3)
69 ret i32 %x4
70; CHECK-LABEL: @test_no_sanitize_thread(
71; CHECK-NEXT: @sanitize_thread_callee
72; CHECK-NEXT: ret i32
73}
74
75
76; Check that:
77; * noattr callee is not inlined into sanitize_(address|memory|thread) caller,
78; * sanitize_(address|memory|thread) callee is inlined into the caller with the same attribute,
79; * alwaysinline callee is always inlined no matter what sanitize_* attributes are present.
80
81define i32 @test_sanitize_address(i32 %arg) sanitize_address {
82 %x1 = call i32 @noattr_callee(i32 %arg)
83 %x2 = call i32 @sanitize_address_callee(i32 %x1)
84 %x3 = call i32 @alwaysinline_callee(i32 %x2)
85 %x4 = call i32 @alwaysinline_sanitize_address_callee(i32 %x3)
86 ret i32 %x4
87; CHECK-LABEL: @test_sanitize_address(
88; CHECK-NEXT: @noattr_callee
89; CHECK-NEXT: ret i32
90}
91
92define i32 @test_sanitize_memory(i32 %arg) sanitize_memory {
93 %x1 = call i32 @noattr_callee(i32 %arg)
94 %x2 = call i32 @sanitize_memory_callee(i32 %x1)
95 %x3 = call i32 @alwaysinline_callee(i32 %x2)
96 %x4 = call i32 @alwaysinline_sanitize_memory_callee(i32 %x3)
97 ret i32 %x4
98; CHECK-LABEL: @test_sanitize_memory(
99; CHECK-NEXT: @noattr_callee
100; CHECK-NEXT: ret i32
101}
102
103define i32 @test_sanitize_thread(i32 %arg) sanitize_thread {
104 %x1 = call i32 @noattr_callee(i32 %arg)
105 %x2 = call i32 @sanitize_thread_callee(i32 %x1)
106 %x3 = call i32 @alwaysinline_callee(i32 %x2)
107 %x4 = call i32 @alwaysinline_sanitize_thread_callee(i32 %x3)
108 ret i32 %x4
109; CHECK-LABEL: @test_sanitize_thread(
110; CHECK-NEXT: @noattr_callee
111; CHECK-NEXT: ret i32
112}
Akira Hatanakaf99e1912015-04-13 18:43:38 +0000113
114; Check that a function doesn't get inlined if target-cpu strings don't match
115; exactly.
116define i32 @test_target_cpu_callee0(i32 %i) "target-cpu"="corei7" {
117 ret i32 %i
118}
119
120define i32 @test_target_cpu0(i32 %i) "target-cpu"="corei7" {
121 %1 = call i32 @test_target_cpu_callee0(i32 %i)
122 ret i32 %1
123; CHECK-LABEL: @test_target_cpu0(
124; CHECK-NOT: @test_target_cpu_callee0
125}
126
127define i32 @test_target_cpu_callee1(i32 %i) "target-cpu"="x86-64" {
128 ret i32 %i
129}
130
131define i32 @test_target_cpu1(i32 %i) "target-cpu"="corei7" {
132 %1 = call i32 @test_target_cpu_callee1(i32 %i)
133 ret i32 %1
134; CHECK-LABEL: @test_target_cpu1(
135; CHECK-NEXT: @test_target_cpu_callee1
136; CHECK-NEXT: ret i32
137}
138
139; Check that a function doesn't get inlined if target-features strings don't
140; match exactly.
141define i32 @test_target_features_callee0(i32 %i) "target-features"="+sse4.2" {
142 ret i32 %i
143}
144
145define i32 @test_target_features0(i32 %i) "target-features"="+sse4.2" {
146 %1 = call i32 @test_target_features_callee0(i32 %i)
147 ret i32 %1
148; CHECK-LABEL: @test_target_features0(
149; CHECK-NOT: @test_target_features_callee0
150}
151
152define i32 @test_target_features_callee1(i32 %i) "target-features"="+avx2" {
153 ret i32 %i
154}
155
156define i32 @test_target_features1(i32 %i) "target-features"="+sse4.2" {
157 %1 = call i32 @test_target_features_callee1(i32 %i)
158 ret i32 %1
159; CHECK-LABEL: @test_target_features1(
160; CHECK-NEXT: @test_target_features_callee1
161; CHECK-NEXT: ret i32
162}
Akira Hatanakab45b1ea2016-01-13 06:02:45 +0000163
164define i32 @less-precise-fpmad_callee0(i32 %i) "less-precise-fpmad"="false" {
165 ret i32 %i
166; CHECK: @less-precise-fpmad_callee0(i32 %i) [[FPMAD_FALSE:#[0-9]+]] {
167; CHECK-NEXT: ret i32
168}
169
170define i32 @less-precise-fpmad_callee1(i32 %i) "less-precise-fpmad"="true" {
171 ret i32 %i
172; CHECK: @less-precise-fpmad_callee1(i32 %i) [[FPMAD_TRUE:#[0-9]+]] {
173; CHECK-NEXT: ret i32
174}
175
176define i32 @test_less-precise-fpmad0(i32 %i) "less-precise-fpmad"="false" {
177 %1 = call i32 @less-precise-fpmad_callee0(i32 %i)
178 ret i32 %1
179; CHECK: @test_less-precise-fpmad0(i32 %i) [[FPMAD_FALSE]] {
180; CHECK-NEXT: ret i32
181}
182
183define i32 @test_less-precise-fpmad1(i32 %i) "less-precise-fpmad"="false" {
184 %1 = call i32 @less-precise-fpmad_callee1(i32 %i)
185 ret i32 %1
186; CHECK: @test_less-precise-fpmad1(i32 %i) [[FPMAD_FALSE]] {
187; CHECK-NEXT: ret i32
188}
189
190define i32 @test_less-precise-fpmad2(i32 %i) "less-precise-fpmad"="true" {
191 %1 = call i32 @less-precise-fpmad_callee0(i32 %i)
192 ret i32 %1
193; CHECK: @test_less-precise-fpmad2(i32 %i) [[FPMAD_FALSE]] {
194; CHECK-NEXT: ret i32
195}
196
197define i32 @test_less-precise-fpmad3(i32 %i) "less-precise-fpmad"="true" {
198 %1 = call i32 @less-precise-fpmad_callee1(i32 %i)
199 ret i32 %1
200; CHECK: @test_less-precise-fpmad3(i32 %i) [[FPMAD_TRUE]] {
201; CHECK-NEXT: ret i32
202}
203
204define i32 @no-implicit-float_callee0(i32 %i) {
205 ret i32 %i
206; CHECK: @no-implicit-float_callee0(i32 %i) {
207; CHECK-NEXT: ret i32
208}
209
210define i32 @no-implicit-float_callee1(i32 %i) noimplicitfloat {
211 ret i32 %i
212; CHECK: @no-implicit-float_callee1(i32 %i) [[NOIMPLICITFLOAT:#[0-9]+]] {
213; CHECK-NEXT: ret i32
214}
215
216define i32 @test_no-implicit-float0(i32 %i) {
217 %1 = call i32 @no-implicit-float_callee0(i32 %i)
218 ret i32 %1
219; CHECK: @test_no-implicit-float0(i32 %i) {
220; CHECK-NEXT: ret i32
221}
222
223define i32 @test_no-implicit-float1(i32 %i) {
224 %1 = call i32 @no-implicit-float_callee1(i32 %i)
225 ret i32 %1
226; CHECK: @test_no-implicit-float1(i32 %i) [[NOIMPLICITFLOAT]] {
227; CHECK-NEXT: ret i32
228}
229
230define i32 @test_no-implicit-float2(i32 %i) noimplicitfloat {
231 %1 = call i32 @no-implicit-float_callee0(i32 %i)
232 ret i32 %1
233; CHECK: @test_no-implicit-float2(i32 %i) [[NOIMPLICITFLOAT]] {
234; CHECK-NEXT: ret i32
235}
236
237define i32 @test_no-implicit-float3(i32 %i) noimplicitfloat {
238 %1 = call i32 @no-implicit-float_callee1(i32 %i)
239 ret i32 %1
240; CHECK: @test_no-implicit-float3(i32 %i) [[NOIMPLICITFLOAT]] {
241; CHECK-NEXT: ret i32
242}
243
Nirav Dave2aab7f42016-03-29 17:46:23 +0000244; Check that no-jump-tables flag propagates from inlined callee to caller
245
246define i32 @no-use-jump-tables_callee0(i32 %i) {
247 ret i32 %i
248; CHECK: @no-use-jump-tables_callee0(i32 %i) {
249; CHECK-NEXT: ret i32
250}
251
252define i32 @no-use-jump-tables_callee1(i32 %i) "no-jump-tables"="true" {
253 ret i32 %i
254; CHECK: @no-use-jump-tables_callee1(i32 %i) [[NOUSEJUMPTABLES:#[0-9]+]] {
255; CHECK-NEXT: ret i32
256}
257
258define i32 @test_no-use-jump-tables0(i32 %i) {
259 %1 = call i32 @no-use-jump-tables_callee0(i32 %i)
260 ret i32 %1
261; CHECK: @test_no-use-jump-tables0(i32 %i) {
262; CHECK-NEXT: ret i32
263}
264
265define i32 @test_no-use-jump-tables1(i32 %i) {
266 %1 = call i32 @no-use-jump-tables_callee1(i32 %i)
267 ret i32 %1
268; CHECK: @test_no-use-jump-tables1(i32 %i) [[NOUSEJUMPTABLES]] {
269; CHECK-NEXT: ret i32
270}
271
272define i32 @test_no-use-jump-tables2(i32 %i) "no-jump-tables"="true" {
273 %1 = call i32 @no-use-jump-tables_callee0(i32 %i)
274 ret i32 %1
275; CHECK: @test_no-use-jump-tables2(i32 %i) [[NOUSEJUMPTABLES]] {
276; CHECK-NEXT: ret i32
277}
278
279define i32 @test_no-use-jump-tables3(i32 %i) "no-jump-tables"="true" {
280 %1 = call i32 @no-use-jump-tables_callee1(i32 %i)
281 ret i32 %1
282; CHECK: @test_no-use-jump-tables3(i32 %i) [[NOUSEJUMPTABLES]] {
283; CHECK-NEXT: ret i32
284}
285
Akira Hatanakab45b1ea2016-01-13 06:02:45 +0000286; CHECK: attributes [[FPMAD_FALSE]] = { "less-precise-fpmad"="false" }
287; CHECK: attributes [[FPMAD_TRUE]] = { "less-precise-fpmad"="true" }
288; CHECK: attributes [[NOIMPLICITFLOAT]] = { noimplicitfloat }
Nirav Dave2aab7f42016-03-29 17:46:23 +0000289; CHECK: attributes [[NOUSEJUMPTABLES]] = { "no-jump-tables"="true" }