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" 3 4 define i32 @noattr_callee(i32 %i) { 5 ret i32 %i 6 } 7 8 define i32 @sanitize_address_callee(i32 %i) sanitize_address { 9 ret i32 %i 10 } 11 12 define i32 @sanitize_thread_callee(i32 %i) sanitize_thread { 13 ret i32 %i 14 } 15 16 define i32 @sanitize_memory_callee(i32 %i) sanitize_memory { 17 ret i32 %i 18 } 19 20 define i32 @alwaysinline_callee(i32 %i) alwaysinline { 21 ret i32 %i 22 } 23 24 define i32 @alwaysinline_sanitize_address_callee(i32 %i) alwaysinline sanitize_address { 25 ret i32 %i 26 } 27 28 define i32 @alwaysinline_sanitize_thread_callee(i32 %i) alwaysinline sanitize_thread { 29 ret i32 %i 30 } 31 32 define 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 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) 47 ret i32 %x4 48 ; CHECK-LABEL: @test_no_sanitize_address( 49 ; CHECK-NEXT: @sanitize_address_callee 50 ; CHECK-NEXT: ret i32 51 } 52 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) 58 ret i32 %x4 59 ; CHECK-LABEL: @test_no_sanitize_memory( 60 ; CHECK-NEXT: @sanitize_memory_callee 61 ; CHECK-NEXT: ret i32 62 } 63 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) 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 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) 86 ret i32 %x4 87 ; CHECK-LABEL: @test_sanitize_address( 88 ; CHECK-NEXT: @noattr_callee 89 ; CHECK-NEXT: ret i32 90 } 91 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) 97 ret i32 %x4 98 ; CHECK-LABEL: @test_sanitize_memory( 99 ; CHECK-NEXT: @noattr_callee 100 ; CHECK-NEXT: ret i32 101 } 102 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) 108 ret i32 %x4 109 ; CHECK-LABEL: @test_sanitize_thread( 110 ; CHECK-NEXT: @noattr_callee 111 ; CHECK-NEXT: ret i32 112 } 113