1# RUN: llc -mtriple=aarch64--- -run-pass=prologepilog -run-pass=machine-outliner -verify-machineinstrs -frame-pointer=non-leaf -outliner-leaf-descendants=false %s -o - | FileCheck %s 2--- | 3 4 @x = common global i32 0, align 4 5 6 define void @baz() #0 { 7 ret void 8 } 9 10 define i32 @main() #0 { 11 ret i32 0 12 } 13 14 define void @bar(i32 %a) #0 { 15 ret void 16 } 17 18 attributes #0 = { noinline noredzone } 19... 20--- 21# This test ensures that we 22# - Create outlined functions 23# - Don't outline anything to do with LR or W30 24# - Save LR when it's not available 25# - Functions whose addresses are taken can still be outlined 26# 27# CHECK-LABEL: main 28# CHECK-LABEL: bb.1: 29# CHECK-DAG: BL @OUTLINED_FUNCTION_[[F0:[0-9]+]] 30# CHECK-NEXT: $lr = ORRXrs $xzr, $x[[REG:[0-9]+]], 0 31# CHECK-NEXT: STRHHroW $w12, $x9, $w30, 1, 1 32# CHECK-NEXT: $lr = ORRXri $xzr, 1 33 34# CHECK-DAG: bb.2 35# CHECK: BL @OUTLINED_FUNCTION_[[F0]] 36# CHECK-NEXT: $lr = ORRXrs $xzr, $x[[REG]], 0 37# CHECK-NEXT: STRHHroW $w12, $x9, $w30, 1, 1 38# CHECK-NEXT: $lr = ORRXri $xzr, 1 39 40# CHECK-DAG: bb.3 41# CHECK: BL @OUTLINED_FUNCTION_[[F0]] 42# CHECK-NEXT: $lr = ORRXrs $xzr, $x[[REG]], 0 43# CHECK-NEXT: STRHHroW $w12, $x9, $w30, 1, 1 44# CHECK-NEXT: $lr = ORRXri $xzr, 1 45name: main 46tracksRegLiveness: true 47body: | 48 bb.0: 49 liveins: $lr 50 $sp = frame-setup SUBXri $sp, 16, 0 51 renamable $x9 = ADRP target-flags(aarch64-page) @bar 52 $x9 = ORRXri $xzr, 1 53 $w12 = ORRWri $wzr, 1 54 $w30 = ORRWri $wzr, 1 55 $lr = ORRXri $xzr, 1 56 bb.1: 57 liveins: $lr 58 $x20, $x19 = LDPXi $sp, 10 59 $w12 = ORRWri $wzr, 1 60 $w12 = ORRWri $wzr, 1 61 $w12 = ORRWri $wzr, 1 62 $w12 = ORRWri $wzr, 1 63 $w12 = ORRWri $wzr, 1 64 $w12 = ORRWri $wzr, 1 65 renamable $x9 = ADRP target-flags(aarch64-page) @x 66 $x12 = ADDXri $sp, 48, 0; 67 STRHHroW $w12, $x9, $w30, 1, 1 68 $lr = ORRXri $xzr, 1 69 bb.2: 70 liveins: $lr 71 $x20, $x19 = LDPXi $sp, 10 72 $w12 = ORRWri $wzr, 1 73 $w12 = ORRWri $wzr, 1 74 $w12 = ORRWri $wzr, 1 75 $w12 = ORRWri $wzr, 1 76 $w12 = ORRWri $wzr, 1 77 $w12 = ORRWri $wzr, 1 78 renamable $x9 = ADRP target-flags(aarch64-page) @x 79 $x12 = ADDXri $sp, 48, 0; 80 STRHHroW $w12, $x9, $w30, 1, 1 81 $lr = ORRXri $xzr, 1 82 bb.3: 83 liveins: $lr 84 $x20, $x19 = LDPXi $sp, 10 85 $w12 = ORRWri $wzr, 1 86 $w12 = ORRWri $wzr, 1 87 $w12 = ORRWri $wzr, 1 88 $w12 = ORRWri $wzr, 1 89 $w12 = ORRWri $wzr, 1 90 $w12 = ORRWri $wzr, 1 91 renamable $x9 = ADRP target-flags(aarch64-page) @x 92 $x12 = ADDXri $sp, 48, 0; 93 STRHHroW $w12, $x9, $w30, 1, 1 94 $lr = ORRXri $xzr, 1 95 $sp = ADDXri $sp, 16, 0 96 bb.4: 97 liveins: $lr 98 RET undef $lr 99 100... 101--- 102# This test ensures that we can avoid saving LR when it's available. 103# It also makes sure that KILL instructions don't impact outlining. 104# CHECK-LABEL: bb.1: 105# CHECK-NOT: BL @baz, implicit-def dead $lr, implicit $sp 106# CHECK: BL @OUTLINED_FUNCTION_[[F1:[0-9]+]], implicit-def $lr, implicit $sp 107# CHECK-NEXT: $w11 = ORRWri $wzr, 2 108# CHECK-NEXT: BL @OUTLINED_FUNCTION_[[F1]], implicit-def $lr, implicit $sp 109# CHECK-NEXT: $w8 = ORRWri $wzr, 0 110# CHECK-NOT: $w11 = KILL renamable $w11, implicit killed $w11 111name: bar 112tracksRegLiveness: true 113body: | 114 bb.0: 115 liveins: $w0, $lr, $w8 116 $sp = frame-setup SUBXri $sp, 32, 0 117 $fp = frame-setup ADDXri $sp, 16, 0 118 119 bb.1: 120 BL @baz, implicit-def dead $lr, implicit $sp 121 $w11 = ORRWri $wzr, 1 122 $w11 = ORRWri $wzr, 1 123 $w11 = KILL renamable $w11, implicit killed $w11 124 $w11 = ORRWri $wzr, 1 125 $w11 = ORRWri $wzr, 1 126 BL @baz, implicit-def dead $lr, implicit $sp 127 $w11 = ORRWri $wzr, 1 128 $w11 = ORRWri $wzr, 1 129 $w11 = ORRWri $wzr, 2 130 BL @baz, implicit-def dead $lr, implicit $sp 131 $w11 = ORRWri $wzr, 1 132 $w11 = ORRWri $wzr, 1 133 $w11 = ORRWri $wzr, 1 134 $w11 = ORRWri $wzr, 1 135 BL @baz, implicit-def dead $lr, implicit $sp 136 $w11 = ORRWri $wzr, 1 137 $w11 = ORRWri $wzr, 1 138 $w8 = ORRWri $wzr, 0 139 140 bb.2: 141 $w15 = ORRWri $wzr, 1 142 $w15 = ORRWri $wzr, 1 143 $w15 = ORRWri $wzr, 1 144 $w15 = ORRWri $wzr, 1 145 $x15 = ADDXri $sp, 48, 0; 146 $w9 = ORRWri $wzr, 0 147 $w15 = ORRWri $wzr, 1 148 $w15 = ORRWri $wzr, 1 149 $w15 = ORRWri $wzr, 1 150 $w15 = ORRWri $wzr, 1 151 $x15 = ADDXri $sp, 48, 0; 152 $w8 = ORRWri $wzr, 0 153 154 bb.3: 155 $fp, $lr = LDPXi $sp, 2 156 $sp = ADDXri $sp, 32, 0 157 RET undef $lr 158 159... 160--- 161name: baz 162tracksRegLiveness: true 163body: | 164 bb.0: 165 liveins: $w0, $lr, $w8 166 RET undef $lr 167 168# CHECK-LABEL: name: OUTLINED_FUNCTION_{{[0-9]}} 169# CHECK=LABEL: name: OUTLINED_FUNCTION_{{[1-9]}} 170