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