1 ; RUN: opt < %s -inline -S | FileCheck %s
2 target 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"
4 define i32 @noattr_callee(i32 %i) {
8 define i32 @sanitize_address_callee(i32 %i) sanitize_address {
12 define i32 @sanitize_thread_callee(i32 %i) sanitize_thread {
16 define i32 @sanitize_memory_callee(i32 %i) sanitize_memory {
20 define i32 @alwaysinline_callee(i32 %i) alwaysinline {
24 define i32 @alwaysinline_sanitize_address_callee(i32 %i) alwaysinline sanitize_address {
28 define i32 @alwaysinline_sanitize_thread_callee(i32 %i) alwaysinline sanitize_thread {
32 define i32 @alwaysinline_sanitize_memory_callee(i32 %i) alwaysinline sanitize_memory {
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.
42 define 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)
48 ; CHECK-LABEL: @test_no_sanitize_address(
49 ; CHECK-NEXT: @sanitize_address_callee
53 define 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)
59 ; CHECK-LABEL: @test_no_sanitize_memory(
60 ; CHECK-NEXT: @sanitize_memory_callee
64 define 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)
70 ; CHECK-LABEL: @test_no_sanitize_thread(
71 ; CHECK-NEXT: @sanitize_thread_callee
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.
81 define 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)
87 ; CHECK-LABEL: @test_sanitize_address(
88 ; CHECK-NEXT: @noattr_callee
92 define 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)
98 ; CHECK-LABEL: @test_sanitize_memory(
99 ; CHECK-NEXT: @noattr_callee
100 ; CHECK-NEXT: ret i32
103 define 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)
109 ; CHECK-LABEL: @test_sanitize_thread(
110 ; CHECK-NEXT: @noattr_callee
111 ; CHECK-NEXT: ret i32
114 ; Check that a function doesn't get inlined if target-cpu strings don't match
116 define i32 @test_target_cpu_callee0(i32 %i) "target-cpu"="corei7" {
120 define i32 @test_target_cpu0(i32 %i) "target-cpu"="corei7" {
121 %1 = call i32 @test_target_cpu_callee0(i32 %i)
123 ; CHECK-LABEL: @test_target_cpu0(
124 ; CHECK-NOT: @test_target_cpu_callee0
127 define i32 @test_target_cpu_callee1(i32 %i) "target-cpu"="x86-64" {
131 define i32 @test_target_cpu1(i32 %i) "target-cpu"="corei7" {
132 %1 = call i32 @test_target_cpu_callee1(i32 %i)
134 ; CHECK-LABEL: @test_target_cpu1(
135 ; CHECK-NEXT: @test_target_cpu_callee1
136 ; CHECK-NEXT: ret i32
139 ; Check that a function doesn't get inlined if target-features strings don't
141 define i32 @test_target_features_callee0(i32 %i) "target-features"="+sse4.2" {
145 define i32 @test_target_features0(i32 %i) "target-features"="+sse4.2" {
146 %1 = call i32 @test_target_features_callee0(i32 %i)
148 ; CHECK-LABEL: @test_target_features0(
149 ; CHECK-NOT: @test_target_features_callee0
152 define i32 @test_target_features_callee1(i32 %i) "target-features"="+avx2" {
156 define i32 @test_target_features1(i32 %i) "target-features"="+sse4.2" {
157 %1 = call i32 @test_target_features_callee1(i32 %i)
159 ; CHECK-LABEL: @test_target_features1(
160 ; CHECK-NEXT: @test_target_features_callee1
161 ; CHECK-NEXT: ret i32