• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; 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}
113