blob: 53fb13f2baf5605be4084729dbd3253c9a9593c5 [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}