xref: /llvm-project/llvm/test/CodeGen/MIR/X86/inline-asm-rm-exhaustion.mir (revision b05335989239f08f0931b9153b1872790b8645f4)
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