1# RUN: llc -mtriple=aarch64-arm-none-eabi -run-pass=prologepilog \ 2# RUN: -run-pass=machine-outliner -verify-machineinstrs %s -o - | FileCheck %s 3 4# Check that we save LR to a callee-saved register when possible. 5# foo() should use a callee-saved register. However, bar() should not. 6--- | 7 8 define void @foo() #0 { 9 ret void 10 } 11 12 define void @bar() #0 { 13 ret void 14 } 15 16 attributes #0 = { nounwind "sign-return-address"="non-leaf" "sign-return-address-key"="b_key" minsize noinline noredzone "frame-pointer"="all" } 17... 18--- 19# CHECK-LABEL: name: foo 20# CHECK: bb.0: 21# CHECK: frame-setup EMITBKEY 22# CHECK-NEXT: frame-setup PACIBSP 23# CHECK-NEXT: frame-setup CFI_INSTRUCTION negate_ra_sign_state 24# CHECK: bb.1: 25# CHECK: BL @[[OUTLINED_FUNCTION:OUTLINED_FUNCTION_[0-9]+]] 26# CHECK: bb.2: 27# CHECK: BL @[[OUTLINED_FUNCTION]] 28# CHECK: bb.3: 29# CHECK: BL @[[OUTLINED_FUNCTION]] 30# CHECK: bb.4: 31# CHECK: BL @[[OUTLINED_FUNCTION]] 32# CHECK: bb.5: 33# CHECK: frame-destroy AUTIBSP 34# CHECK-NEXT: RET 35name: foo 36tracksRegLiveness: true 37fixedStack: 38body: | 39 bb.0: 40 $x25 = ORRXri $xzr, 1 41 $lr = ORRXri $xzr, 1 42 bb.1: 43 liveins: $lr, $w9 44 $w9 = ORRWri $wzr, 1 45 $w9 = ORRWri $wzr, 1 46 $w9 = ORRWri $wzr, 1 47 $w9 = ORRWri $wzr, 1 48 $w9 = ORRWri $wzr, 1 49 $w9 = ORRWri $wzr, 2 50 bb.2: 51 liveins: $lr, $w9 52 $w9 = ORRWri $wzr, 1 53 $w9 = ORRWri $wzr, 1 54 $w9 = ORRWri $wzr, 1 55 $w9 = ORRWri $wzr, 1 56 $w9 = ORRWri $wzr, 1 57 $w9 = ORRWri $wzr, 2 58 bb.3: 59 liveins: $lr, $w9 60 $w9 = ORRWri $wzr, 1 61 $w9 = ORRWri $wzr, 1 62 $w9 = ORRWri $wzr, 1 63 $w9 = ORRWri $wzr, 1 64 $w9 = ORRWri $wzr, 1 65 $w9 = ORRWri $wzr, 2 66 bb.4: 67 liveins: $lr, $w9 68 $w9 = ORRWri $wzr, 1 69 $w9 = ORRWri $wzr, 1 70 $w9 = ORRWri $wzr, 1 71 $w9 = ORRWri $wzr, 1 72 $w9 = ORRWri $wzr, 1 73 $w9 = ORRWri $wzr, 2 74 bb.5: 75 liveins: $w9 76 RET undef $lr 77 78... 79--- 80# CHECK: name: bar 81# CHECK: bb.0: 82# CHECK-NOT: OUTLINED_FUNCTION_ 83# CHECK: bb.1: 84# CHECK-NOT: OUTLINED_FUNCTION_ 85# CHECK: bb.2: 86# CHECK-NOT: OUTLINED_FUNCTION_ 87# CHECK: bb.3: 88# CHECK-NOT: OUTLINED_FUNCTION_ 89# CHECK: RET 90name: bar 91tracksRegLiveness: true 92body: | 93 bb.0: 94 liveins: $lr, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x19, $x20, $x21, $x22, $x23, $x20, $x21, $x22, $x23, $x24, $x25, $x26, $x27, $x28 95 $w10 = ORRWri $wzr, 1 96 $w10 = ORRWri $wzr, 1 97 $w10 = ORRWri $wzr, 1 98 $w10 = ORRWri $wzr, 1 99 $w10 = ORRWri $wzr, 1 100 $w12 = ORRWri $wzr, 2 101 bb.1: 102 liveins: $lr, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x19, $x20, $x21, $x22, $x23, $x20, $x21, $x22, $x23, $x24, $x25, $x26, $x27, $x28 103 $w10 = ORRWri $wzr, 1 104 $w10 = ORRWri $wzr, 1 105 $w10 = ORRWri $wzr, 1 106 $w10 = ORRWri $wzr, 1 107 $w10 = ORRWri $wzr, 1 108 $w12 = ORRWri $wzr, 2 109 bb.2: 110 liveins: $lr, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x19, $x20, $x21, $x22, $x23, $x20, $x21, $x22, $x23, $x24, $x25, $x26, $x27, $x28 111 $w10 = ORRWri $wzr, 1 112 $w10 = ORRWri $wzr, 1 113 $w10 = ORRWri $wzr, 1 114 $w10 = ORRWri $wzr, 1 115 $w10 = ORRWri $wzr, 1 116 $w12 = ORRWri $wzr, 2 117 bb.3: 118 liveins: $lr, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x19, $x20, $x21, $x22, $x23, $x20, $x21, $x22, $x23, $x24, $x25, $x26, $x27, $x28 119 RET undef $lr 120 121# CHECK: name: [[OUTLINED_FUNCTION]] 122# CHECK: body: 123# CHECK-NEXT: bb.0: 124# CHECK-NOT: frame-setup EMITBKEY 125# CHECK-NOT: frame-setup PACI{{[A,B]]}}SP 126# CHECK-NOT: frame-setup CFI_INSTRUCTION negate_ra_sign_state 127# CHECK-NOT: frame-destroy AUTI{{[A,B]]}}SP 128