1# RUN: llc -verify-machineinstrs -run-pass=machine-outliner %s -o - | FileCheck %s 2 3--- | 4 target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" 5 target triple = "aarch64-arm-linux-gnu" 6 7 @v = common dso_local global i32* null, align 8 8 9 ; Function Attrs: nounwind 10 define dso_local void @legal0() #0 { 11 %1 = alloca i32, align 4 12 store volatile i32* %1, i32** @v, align 8 13 store volatile i32* %1, i32** @v, align 8 14 store volatile i32* %1, i32** @v, align 8 15 store volatile i32* %1, i32** @v, align 8 16 store volatile i32* %1, i32** @v, align 8 17 store volatile i32* %1, i32** @v, align 8 18 store volatile i32* %1, i32** @v, align 8 19 ret void 20 } 21 22 ; Function Attrs: nounwind 23 define dso_local void @legal1() #0 { 24 %1 = alloca i32, align 4 25 store volatile i32* %1, i32** @v, align 8 26 store volatile i32* %1, i32** @v, align 8 27 store volatile i32* %1, i32** @v, align 8 28 store volatile i32* %1, i32** @v, align 8 29 store volatile i32* %1, i32** @v, align 8 30 store volatile i32* %1, i32** @v, align 8 31 store volatile i32* %1, i32** @v, align 8 32 ret void 33 } 34 35 ; Function Attrs: nounwind 36 define dso_local void @illegal0() #0 { 37 %1 = alloca i32, align 4 38 store volatile i32* %1, i32** @v, align 8 39 store volatile i32* %1, i32** @v, align 8 40 store volatile i32* %1, i32** @v, align 8 41 store volatile i32* %1, i32** @v, align 8 42 store volatile i32* %1, i32** @v, align 8 43 store volatile i32* %1, i32** @v, align 8 44 store volatile i32* %1, i32** @v, align 8 45 ret void 46 } 47 48 ; Function Attrs: nounwind 49 define dso_local void @illegal1() #0 { 50 %1 = alloca i32, align 4 51 store volatile i32* %1, i32** @v, align 8 52 store volatile i32* %1, i32** @v, align 8 53 store volatile i32* %1, i32** @v, align 8 54 store volatile i32* %1, i32** @v, align 8 55 store volatile i32* %1, i32** @v, align 8 56 store volatile i32* %1, i32** @v, align 8 57 store volatile i32* %1, i32** @v, align 8 58 ret void 59 } 60 61 attributes #0 = { nounwind "sign-return-address"="all" "sign-return-address-key"="a_key" noinline noredzone "frame-pointer"="all" } 62 63... 64--- 65name: legal0 66tracksRegLiveness: true 67body: | 68 bb.0 (%ir-block.0): 69 liveins: $lr 70 frame-setup PACIASP implicit-def $lr, implicit killed $lr, implicit $sp 71 frame-setup CFI_INSTRUCTION negate_ra_sign_state 72 $sp = frame-setup SUBXri $sp, 16, 0 73 renamable $x8 = ADRP target-flags(aarch64-page) @v 74 $x9 = ADDXri $sp, 12, 0 75 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 76 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 77 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 78 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 79 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 80 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 81 STRXui killed renamable $x9, killed renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 82 $sp = frame-destroy ADDXri $sp, 16, 0 83 frame-destroy AUTIASP implicit-def $lr, implicit killed $lr, implicit $sp 84 RET undef $lr 85 86# CHECK-LABEL: name: legal0 87# CHECK: body: | 88# CHECK-NEXT: bb.0 (%ir-block.0): 89# CHECK-NEXT: liveins: $lr 90# CHECK: frame-setup PACIASP implicit-def $lr, implicit killed $lr, implicit $sp 91# CHECK-NEXT: frame-setup CFI_INSTRUCTION negate_ra_sign_state 92# CHECK: BL @[[OUTLINED_FUNC:OUTLINED_FUNCTION_[0-9]+]] 93# CHECK: frame-destroy AUTIASP implicit-def $lr, implicit killed $lr, implicit $sp 94# CHECK-NEXT: RET undef $lr 95 96... 97--- 98name: legal1 99tracksRegLiveness: true 100body: | 101 bb.0 (%ir-block.0): 102 liveins: $lr 103 frame-setup PACIASP implicit-def $lr, implicit killed $lr, implicit $sp 104 frame-setup CFI_INSTRUCTION negate_ra_sign_state 105 $sp = frame-setup SUBXri $sp, 16, 0 106 renamable $x8 = ADRP target-flags(aarch64-page) @v 107 $x9 = ADDXri $sp, 12, 0 108 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 109 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 110 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 111 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 112 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 113 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 114 STRXui killed renamable $x9, killed renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 115 $sp = frame-destroy ADDXri $sp, 16, 0 116 frame-destroy AUTIASP implicit-def $lr, implicit killed $lr, implicit $sp 117 RET undef $lr 118 119# CHECK-LABEL: name: legal1 120# CHECK: body: | 121# CHECK-NEXT: bb.0 (%ir-block.0): 122# CHECK-NEXT: liveins: $lr 123# CHECK: frame-setup PACIASP implicit-def $lr, implicit killed $lr, implicit $sp 124# CHECK-NEXT: frame-setup CFI_INSTRUCTION negate_ra_sign_state 125# CHECK: BL @[[OUTLINED_FUNC]] 126# CHECK: frame-destroy AUTIASP implicit-def $lr, implicit killed $lr, implicit $sp 127# CHECK-NEXT: RET undef $lr 128 129... 130--- 131name: illegal0 132tracksRegLiveness: true 133body: | 134 bb.0 (%ir-block.0): 135 liveins: $lr 136 frame-setup PACIASP implicit-def $lr, implicit killed $lr, implicit $sp 137 frame-setup CFI_INSTRUCTION negate_ra_sign_state 138 $sp = frame-setup SUBXri $sp, 16, 0 139 renamable $x8 = ADRP target-flags(aarch64-page) @v 140 $x9 = ADDXri $sp, 12, 0 141 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 142 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 143 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 144 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 145 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 146 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 147 STRXui killed renamable $x9, killed renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 148 $sp = frame-destroy ADDXri $sp, 12, 0 149 frame-destroy AUTIASP implicit-def $lr, implicit killed $lr, implicit $sp 150 RET undef $lr 151 152... 153--- 154name: illegal1 155tracksRegLiveness: true 156body: | 157 bb.0 (%ir-block.0): 158 liveins: $lr 159 frame-setup PACIASP implicit-def $lr, implicit killed $lr, implicit $sp 160 frame-setup CFI_INSTRUCTION negate_ra_sign_state 161 $sp = frame-setup SUBXri $sp, 16, 0 162 renamable $x8 = ADRP target-flags(aarch64-page) @v 163 $x9 = ADDXri $sp, 12, 0 164 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 165 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 166 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 167 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 168 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 169 STRXui renamable $x9, renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 170 STRXui killed renamable $x9, killed renamable $x8, target-flags(aarch64-pageoff, aarch64-nc) @v :: (volatile store 8 into @v) 171 $sp = frame-destroy ADDXri $sp, 12, 0 172 frame-destroy AUTIASP implicit-def $lr, implicit killed $lr, implicit $sp 173 RET undef $lr 174 175# CHECK-LABEL: name: illegal0 176# CHECK: body: | 177# CHECK-NEXT: bb.0 (%ir-block.0): 178# CHECK-NEXT: liveins: $lr 179# CHECK: frame-setup PACIASP implicit-def $lr, implicit killed $lr, implicit $sp 180# CHECK-NEXT: frame-setup CFI_INSTRUCTION negate_ra_sign_state 181# CHECK-NOT: BL @OUTLINED_FUNCTION_{{.*}} 182# CHECK: frame-destroy AUTIASP implicit-def $lr, implicit killed $lr, implicit $sp 183# CHECK-NEXT: RET undef $lr 184 185# CHECK-LABEL: name: illegal1 186# CHECK: body: | 187# CHECK-NEXT: bb.0 (%ir-block.0): 188# CHECK-NEXT: liveins: $lr 189# CHECK: frame-setup PACIASP implicit-def $lr, implicit killed $lr, implicit $sp 190# CHECK-NEXT: frame-setup CFI_INSTRUCTION negate_ra_sign_state 191# CHECK-NOT: BL @OUTLINED_FUNCTION_{{.*}} 192# CHECK: frame-destroy AUTIASP implicit-def $lr, implicit killed $lr, implicit $sp 193# CHECK-NEXT: RET undef $lr 194 195# Outlined function that contains only legal sp modifications 196# CHECK: name: [[OUTLINED_FUNC]] 197# CHECK: body: | 198# CHECK-NEXT: bb.0: 199# CHECK-NEXT: liveins: $lr 200# CHECK-NEXT: {{^ $}} 201# CHECK-NEXT: frame-setup PACIASP implicit-def $lr, implicit $lr, implicit $sp 202# CHECK-NEXT: frame-setup CFI_INSTRUCTION negate_ra_sign_state 203# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0 204# CHECK: $sp = frame-destroy ADDXri $sp, 16, 0 205# CHECK-NEXT: frame-destroy AUTIASP implicit-def $lr, implicit $lr, implicit $sp 206# CHECK-NEXT: RET $lr 207