1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 3 2# RUN: llc -start-after=finalize-isel -regalloc=greedy -stop-after=greedy \ 3# RUN: -verify-machineinstrs -verify-regalloc %s -o - | FileCheck %s 4--- | 5 target datalayout = "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i128:128-f64:32:64-f80:32-n8:16:32-S128" 6 target triple = "i386-unknown-linux-gnu" 7 8 define void @input(i32 %0) #0 { 9 call void asm "# $0", "rm,~{ax},~{cx},~{dx},~{si},~{di},~{bx},~{bp}"(i32 %0) 10 ret void 11 } 12 13 define i32 @output() #0 { 14 %1 = alloca i32, align 4 15 call void asm "# $0", "=*rm,~{ax},~{cx},~{dx},~{si},~{di},~{bx},~{bp}"(ptr nonnull elementtype(i32) %1) 16 %2 = load i32, ptr %1, align 4 17 ret i32 %2 18 } 19 20 define i32 @inout(i32 %0) #0 { 21 %2 = alloca i32, align 4 22 store i32 %0, ptr %2, align 4 23 call void asm "# $0 $1", "=*rm,0,~{ax},~{cx},~{dx},~{si},~{di},~{bx},~{bp}"(ptr nonnull elementtype(i32) %2, i32 %0) 24 %3 = load i32, ptr %2, align 4 25 ret i32 %3 26 } 27 28 attributes #0 = { nounwind } 29 30... 31--- 32name: input 33alignment: 16 34exposesReturnsTwice: false 35legalized: false 36regBankSelected: false 37selected: false 38failedISel: false 39tracksRegLiveness: true 40hasWinCFI: false 41callsEHReturn: false 42callsUnwindInit: false 43hasEHCatchret: false 44hasEHScopes: false 45hasEHFunclets: false 46isOutlined: false 47debugInstrRef: false 48failsVerification: false 49tracksDebugUserValues: false 50registers: 51 - { id: 0, class: gr32, preferred-register: '' } 52liveins: [] 53frameInfo: 54 isFrameAddressTaken: false 55 isReturnAddressTaken: false 56 hasStackMap: false 57 hasPatchPoint: false 58 stackSize: 0 59 offsetAdjustment: 0 60 maxAlignment: 4 61 adjustsStack: false 62 hasCalls: false 63 stackProtector: '' 64 functionContext: '' 65 maxCallFrameSize: 4294967295 66 cvBytesOfCalleeSavedRegisters: 0 67 hasOpaqueSPAdjustment: false 68 hasVAStart: false 69 hasMustTailInVarArgFunc: false 70 hasTailCall: false 71 localFrameSize: 0 72 savePoint: '' 73 restorePoint: '' 74fixedStack: 75 - { id: 0, type: default, offset: 0, size: 4, alignment: 16, stack-id: default, 76 isImmutable: true, isAliased: false, callee-saved-register: '', callee-saved-restored: true, 77 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } 78stack: [] 79entry_values: [] 80callSites: [] 81debugValueSubstitutions: [] 82constants: [] 83machineFunctionInfo: {} 84body: | 85 bb.0 (%ir-block.1): 86 ; CHECK-LABEL: name: input 87 ; CHECK: INLINEASM &"# $0", 8 /* mayload attdialect */, 262190 /* mem:m */, %fixed-stack.0, 1, $noreg, 0, $noreg, 12 /* clobber */, implicit-def dead early-clobber $ax, 12 /* clobber */, implicit-def dead early-clobber $cx, 12 /* clobber */, implicit-def dead early-clobber $dx, 12 /* clobber */, implicit-def dead early-clobber $si, 12 /* clobber */, implicit-def dead early-clobber $di, 12 /* clobber */, implicit-def dead early-clobber $bx, 12 /* clobber */, implicit-def dead early-clobber $bp :: (load (s32) from %fixed-stack.0, align 16) 88 ; CHECK-NEXT: RET 0 89 %0:gr32 = MOV32rm %fixed-stack.0, 1, $noreg, 0, $noreg :: (load (s32) from %fixed-stack.0, align 16) 90 INLINEASM &"# $0", 0 /* attdialect */, 1076101129 /* reguse:GR32 spillable */, %0, 12 /* clobber */, implicit-def early-clobber $ax, 12 /* clobber */, implicit-def early-clobber $cx, 12 /* clobber */, implicit-def early-clobber $dx, 12 /* clobber */, implicit-def early-clobber $si, 12 /* clobber */, implicit-def early-clobber $di, 12 /* clobber */, implicit-def early-clobber $bx, 12 /* clobber */, implicit-def early-clobber $bp 91 RET 0 92 93... 94--- 95name: output 96alignment: 16 97exposesReturnsTwice: false 98legalized: false 99regBankSelected: false 100selected: false 101failedISel: false 102tracksRegLiveness: true 103hasWinCFI: false 104callsEHReturn: false 105callsUnwindInit: false 106hasEHCatchret: false 107hasEHScopes: false 108hasEHFunclets: false 109isOutlined: false 110debugInstrRef: false 111failsVerification: false 112tracksDebugUserValues: false 113registers: 114 - { id: 0, class: gr32, preferred-register: '' } 115liveins: [] 116frameInfo: 117 isFrameAddressTaken: false 118 isReturnAddressTaken: false 119 hasStackMap: false 120 hasPatchPoint: false 121 stackSize: 0 122 offsetAdjustment: 0 123 maxAlignment: 4 124 adjustsStack: false 125 hasCalls: false 126 stackProtector: '' 127 functionContext: '' 128 maxCallFrameSize: 4294967295 129 cvBytesOfCalleeSavedRegisters: 0 130 hasOpaqueSPAdjustment: false 131 hasVAStart: false 132 hasMustTailInVarArgFunc: false 133 hasTailCall: false 134 localFrameSize: 0 135 savePoint: '' 136 restorePoint: '' 137fixedStack: [] 138stack: 139 - { id: 0, name: '', type: default, offset: 0, size: 4, alignment: 4, 140 stack-id: default, callee-saved-register: '', callee-saved-restored: true, 141 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } 142entry_values: [] 143callSites: [] 144debugValueSubstitutions: [] 145constants: [] 146machineFunctionInfo: {} 147body: | 148 bb.0 (%ir-block.0): 149 ; CHECK-LABEL: name: output 150 ; CHECK: INLINEASM &"# $0", 16 /* maystore attdialect */, 262190 /* mem:m */, %stack.1, 1, $noreg, 0, $noreg, 12 /* clobber */, implicit-def dead early-clobber $ax, 12 /* clobber */, implicit-def dead early-clobber $cx, 12 /* clobber */, implicit-def dead early-clobber $dx, 12 /* clobber */, implicit-def dead early-clobber $si, 12 /* clobber */, implicit-def dead early-clobber $di, 12 /* clobber */, implicit-def dead early-clobber $bx, 12 /* clobber */, implicit-def dead early-clobber $bp :: (store (s32) into %stack.1) 151 ; CHECK-NEXT: [[MOV32rm:%[0-9]+]]:gr32 = MOV32rm %stack.1, 1, $noreg, 0, $noreg :: (load (s32) from %stack.1) 152 ; CHECK-NEXT: MOV32mr %stack.0, 1, $noreg, 0, $noreg, [[MOV32rm]] :: (store (s32) into %ir.1) 153 ; CHECK-NEXT: $eax = COPY [[MOV32rm]] 154 ; CHECK-NEXT: RET 0, $eax 155 INLINEASM &"# $0", 0 /* attdialect */, 1076101130 /* regdef:GR32 spillable */, def %0, 12 /* clobber */, implicit-def early-clobber $ax, 12 /* clobber */, implicit-def early-clobber $cx, 12 /* clobber */, implicit-def early-clobber $dx, 12 /* clobber */, implicit-def early-clobber $si, 12 /* clobber */, implicit-def early-clobber $di, 12 /* clobber */, implicit-def early-clobber $bx, 12 /* clobber */, implicit-def early-clobber $bp 156 MOV32mr %stack.0, 1, $noreg, 0, $noreg, %0 :: (store (s32) into %ir.1) 157 $eax = COPY %0 158 RET 0, $eax 159 160... 161--- 162name: inout 163alignment: 16 164exposesReturnsTwice: false 165legalized: false 166regBankSelected: false 167selected: false 168failedISel: false 169tracksRegLiveness: true 170hasWinCFI: false 171callsEHReturn: false 172callsUnwindInit: false 173hasEHCatchret: false 174hasEHScopes: false 175hasEHFunclets: false 176isOutlined: false 177debugInstrRef: false 178failsVerification: false 179tracksDebugUserValues: false 180registers: 181 - { id: 0, class: gr32, preferred-register: '' } 182 - { id: 1, class: gr32, preferred-register: '' } 183liveins: [] 184frameInfo: 185 isFrameAddressTaken: false 186 isReturnAddressTaken: false 187 hasStackMap: false 188 hasPatchPoint: false 189 stackSize: 0 190 offsetAdjustment: 0 191 maxAlignment: 4 192 adjustsStack: false 193 hasCalls: false 194 stackProtector: '' 195 functionContext: '' 196 maxCallFrameSize: 4294967295 197 cvBytesOfCalleeSavedRegisters: 0 198 hasOpaqueSPAdjustment: false 199 hasVAStart: false 200 hasMustTailInVarArgFunc: false 201 hasTailCall: false 202 localFrameSize: 0 203 savePoint: '' 204 restorePoint: '' 205fixedStack: 206 - { id: 0, type: default, offset: 0, size: 4, alignment: 16, stack-id: default, 207 isImmutable: false, isAliased: false, callee-saved-register: '', 208 callee-saved-restored: true, debug-info-variable: '', debug-info-expression: '', 209 debug-info-location: '' } 210stack: [] 211entry_values: [] 212callSites: [] 213debugValueSubstitutions: [] 214constants: [] 215machineFunctionInfo: {} 216body: | 217 bb.0 (%ir-block.1): 218 ; CHECK-LABEL: name: inout 219 ; CHECK: [[MOV32rm:%[0-9]+]]:gr32 = MOV32rm %fixed-stack.0, 1, $noreg, 0, $noreg :: (load (s32) from %fixed-stack.0, align 16) 220 ; CHECK-NEXT: MOV32mr %stack.0, 1, $noreg, 0, $noreg, [[MOV32rm]] :: (store (s32) into %stack.0) 221 ; CHECK-NEXT: INLINEASM &"# $0 $1", 24 /* mayload maystore attdialect */, 262190 /* mem:m */, %stack.0, 1, $noreg, 0, $noreg, 262190 /* mem:m */, %stack.0, 1, $noreg, 0, $noreg, 12 /* clobber */, implicit-def dead early-clobber $ax, 12 /* clobber */, implicit-def dead early-clobber $cx, 12 /* clobber */, implicit-def dead early-clobber $dx, 12 /* clobber */, implicit-def dead early-clobber $si, 12 /* clobber */, implicit-def dead early-clobber $di, 12 /* clobber */, implicit-def dead early-clobber $bx, 12 /* clobber */, implicit-def dead early-clobber $bp :: (load store (s32) on %stack.0) 222 ; CHECK-NEXT: [[MOV32rm1:%[0-9]+]]:gr32 = MOV32rm %stack.0, 1, $noreg, 0, $noreg :: (load (s32) from %stack.0) 223 ; CHECK-NEXT: MOV32mr %fixed-stack.0, 1, $noreg, 0, $noreg, [[MOV32rm1]] :: (store (s32) into %ir.2, align 16) 224 ; CHECK-NEXT: $eax = COPY [[MOV32rm1]] 225 ; CHECK-NEXT: RET 0, $eax 226 %1:gr32 = MOV32rm %fixed-stack.0, 1, $noreg, 0, $noreg :: (load (s32) from %fixed-stack.0, align 16) 227 INLINEASM &"# $0 $1", 0 /* attdialect */, 1076101130 /* regdef:GR32 spillable */, def %0, 2147483657 /* reguse tiedto:$0 */, %1(tied-def 3), 12 /* clobber */, implicit-def early-clobber $ax, 12 /* clobber */, implicit-def early-clobber $cx, 12 /* clobber */, implicit-def early-clobber $dx, 12 /* clobber */, implicit-def early-clobber $si, 12 /* clobber */, implicit-def early-clobber $di, 12 /* clobber */, implicit-def early-clobber $bx, 12 /* clobber */, implicit-def early-clobber $bp 228 MOV32mr %fixed-stack.0, 1, $noreg, 0, $noreg, %0 :: (store (s32) into %ir.2, align 16) 229 $eax = COPY %0 230 RET 0, $eax 231 232... 233