1 # RUN: llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s | FileCheck %s
2 # This test ensures that the MIR parser parses the machine memory operands
7 define i32 @test(i32* %a) {
14 define void @test2(i32* %"a value") {
16 %b = load i32, i32* %"a value"
18 store i32 %c, i32* %"a value"
22 define i32 @volatile_inc(i32* %x) {
24 %0 = load volatile i32, i32* %x
26 store volatile i32 %1, i32* %x
30 define void @non_temporal_store(i32* %a, i32 %b) {
32 store i32 %b, i32* %a, align 16, !nontemporal !0
38 define i32 @invariant_load(i32* %x) {
40 %v = load i32, i32* %x, !invariant.load !1
46 define void @memory_offset(<8 x float>* %vec) {
48 %v = load <8 x float>, <8 x float>* %vec
49 %v2 = insertelement <8 x float> %v, float 0.0, i32 4
50 store <8 x float> %v2, <8 x float>* %vec
54 define void @memory_alignment(<8 x float>* %vec) {
56 %v = load <8 x float>, <8 x float>* %vec
57 %v2 = insertelement <8 x float> %v, float 0.0, i32 4
58 store <8 x float> %v2, <8 x float>* %vec
62 define double @constant_pool_psv(double %a) {
64 %b = fadd double %a, 3.250000e+00
68 declare x86_fp80 @cosl(x86_fp80) #0
70 define x86_fp80 @stack_psv(x86_fp80 %x) {
72 %y = call x86_fp80 @cosl(x86_fp80 %x) #0
76 attributes #0 = { readonly }
78 @G = external global i32
80 define i32 @got_psv() {
82 %a = load i32, i32* @G
87 define i32 @global_value() {
89 %a = load i32, i32* @G
94 define i32 @jumptable_psv(i32 %in) {
96 switch i32 %in, label %def [
117 tracksRegLiveness: true
125 # CHECK: %eax = MOV32rm %rdi, 1, _, 0, _ :: (load 4 from %ir.a)
126 # CHECK-NEXT: MOV32mi killed %rdi, 1, _, 0, _, 42 :: (store 4 into %ir.a)
127 - '%eax = MOV32rm %rdi, 1, _, 0, _ :: (load 4 from %ir.a)'
128 - 'MOV32mi killed %rdi, 1, _, 0, _, 42 :: (store 4 into %ir.a)'
133 tracksRegLiveness: true
141 # CHECK: INC32m killed %rdi, 1, _, 0, _, implicit-def dead %eflags :: (store 4 into %ir."a value"), (load 4 from %ir."a value")
142 - 'INC32m killed %rdi, 1, _, 0, _, implicit-def dead %eflags :: (store 4 into %ir."a value"), (load 4 from %ir."a value")'
147 tracksRegLiveness: true
155 # CHECK: name: volatile_inc
156 # CHECK: %eax = MOV32rm %rdi, 1, _, 0, _ :: (volatile load 4 from %ir.x)
157 # CHECK: MOV32mr killed %rdi, 1, _, 0, _, %eax :: (volatile store 4 into %ir.x)
158 - '%eax = MOV32rm %rdi, 1, _, 0, _ :: (volatile load 4 from %ir.x)'
159 - '%eax = INC32r killed %eax, implicit-def dead %eflags'
160 - 'MOV32mr killed %rdi, 1, _, 0, _, %eax :: (volatile store 4 into %ir.x)'
164 name: non_temporal_store
165 tracksRegLiveness: true
172 liveins: [ '%esi', '%rdi' ]
174 # CHECK: name: non_temporal_store
175 # CHECK: MOVNTImr killed %rdi, 1, _, 0, _, killed %esi :: (non-temporal store 4 into %ir.a)
176 - 'MOVNTImr killed %rdi, 1, _, 0, _, killed %esi :: (non-temporal store 4 into %ir.a)'
181 tracksRegLiveness: true
189 # CHECK: name: invariant_load
190 # CHECK: %eax = MOV32rm killed %rdi, 1, _, 0, _ :: (invariant load 4 from %ir.x)
191 - '%eax = MOV32rm killed %rdi, 1, _, 0, _ :: (invariant load 4 from %ir.x)'
196 tracksRegLiveness: true
204 # CHECK: name: memory_offset
205 # CHECK: %xmm0 = MOVAPSrm %rdi, 1, _, 0, _ :: (load 16 from %ir.vec)
206 # CHECK-NEXT: %xmm1 = MOVAPSrm %rdi, 1, _, 16, _ :: (load 16 from %ir.vec + 16)
207 # CHECK: MOVAPSmr %rdi, 1, _, 0, _, killed %xmm0 :: (store 16 into %ir.vec)
208 # CHECK-NEXT: MOVAPSmr killed %rdi, 1, _, 16, _, killed %xmm1 :: (store 16 into %ir.vec + 16)
209 - '%xmm0 = MOVAPSrm %rdi, 1, _, 0, _ :: (load 16 from %ir.vec)'
210 - '%xmm1 = MOVAPSrm %rdi, 1, _, 16, _ :: (load 16 from %ir.vec + 16)'
212 - '%xmm1 = MOVSSrr killed %xmm1, killed %xmm2'
213 - 'MOVAPSmr %rdi, 1, _, 0, _, killed %xmm0 :: (store 16 into %ir.vec)'
214 - 'MOVAPSmr killed %rdi, 1, _, 16, _, killed %xmm1 :: (store 16 into %ir.vec + 16)'
218 name: memory_alignment
219 tracksRegLiveness: true
227 # CHECK: name: memory_alignment
228 # CHECK: %xmm0 = MOVAPSrm %rdi, 1, _, 0, _ :: (load 16 from %ir.vec, align 32)
229 # CHECK-NEXT: %xmm1 = MOVAPSrm %rdi, 1, _, 16, _ :: (load 16 from %ir.vec + 16, align 32)
230 # CHECK: MOVAPSmr %rdi, 1, _, 0, _, killed %xmm0 :: (store 16 into %ir.vec, align 32)
231 # CHECK-NEXT: MOVAPSmr killed %rdi, 1, _, 16, _, killed %xmm1 :: (store 16 into %ir.vec + 16, align 32)
232 - '%xmm0 = MOVAPSrm %rdi, 1, _, 0, _ :: (load 16 from %ir.vec, align 32)'
233 - '%xmm1 = MOVAPSrm %rdi, 1, _, 16, _ :: (load 16 from %ir.vec + 16, align 32)'
235 - '%xmm1 = MOVSSrr killed %xmm1, killed %xmm2'
236 - 'MOVAPSmr %rdi, 1, _, 0, _, killed %xmm0 :: (store 16 into %ir.vec, align 32)'
237 - 'MOVAPSmr killed %rdi, 1, _, 16, _, killed %xmm1 :: (store 16 into %ir.vec + 16, align 32)'
241 name: constant_pool_psv
242 tracksRegLiveness: true
247 value: 'double 3.250000e+00'
253 # CHECK: name: constant_pool_psv
254 # CHECK: %xmm0 = ADDSDrm killed %xmm0, %rip, 1, _, %const.0, _ :: (load 8 from constant-pool)
255 # CHECK-NEXT: %xmm0 = ADDSDrm killed %xmm0, %rip, 1, _, %const.0, _ :: (load 8 from constant-pool + 8)
256 - '%xmm0 = ADDSDrm killed %xmm0, %rip, 1, _, %const.0, _ :: (load 8 from constant-pool)'
257 - '%xmm0 = ADDSDrm killed %xmm0, %rip, 1, _, %const.0, _ :: (load 8 from constant-pool + 8)'
262 tracksRegLiveness: true
270 - { id: 0, offset: 0, size: 10, alignment: 16, isImmutable: true, isAliased: false }
275 - '%rsp = frame-setup SUB64ri8 %rsp, 24, implicit-def dead %eflags'
276 - CFI_INSTRUCTION .cfi_def_cfa_offset 32
277 - 'LD_F80m %rsp, 1, _, 32, _, implicit-def dead %fpsw'
278 # CHECK: name: stack_psv
279 # CHECK: ST_FP80m %rsp, 1, _, 0, _, implicit-def dead %fpsw :: (store 10 into stack, align 16)
280 - 'ST_FP80m %rsp, 1, _, 0, _, implicit-def dead %fpsw :: (store 10 into stack, align 16)'
281 - 'CALL64pcrel32 $cosl, csr_64, implicit %rsp, implicit-def %rsp, implicit-def %fp0'
282 - '%rsp = ADD64ri8 %rsp, 24, implicit-def dead %eflags'
287 tracksRegLiveness: true
292 # CHECK: name: got_psv
293 # CHECK: %rax = MOV64rm %rip, 1, _, @G, _ :: (load 8 from got)
294 - '%rax = MOV64rm %rip, 1, _, @G, _ :: (load 8 from got)'
295 - '%eax = MOV32rm killed %rax, 1, _, 0, _'
296 - '%eax = INC32r killed %eax, implicit-def dead %eflags'
301 tracksRegLiveness: true
306 - '%rax = MOV64rm %rip, 1, _, @G, _'
307 # CHECK: name: global_value
308 # CHECK: %eax = MOV32rm killed %rax, 1, _, 0, _ :: (load 4 from %ir.G)
309 - '%eax = MOV32rm killed %rax, 1, _, 0, _ :: (load 4 from %ir.G)'
310 - '%eax = INC32r killed %eax, implicit-def dead %eflags'
315 tracksRegLiveness: true
319 kind: label-difference32
322 blocks: [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ]
326 successors: [ '%bb.2.def', '%bb.1.entry' ]
329 - '%eax = MOV32rr %edi, implicit-def %rax'
330 - 'CMP32ri8 killed %edi, 3, implicit-def %eflags'
331 - 'JA_1 %bb.2.def, implicit killed %eflags'
334 successors: [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ]
337 - '%rcx = LEA64r %rip, 1, _, %jump-table.0, _'
338 # CHECK: name: jumptable_psv
339 # CHECK: %rax = MOVSX64rm32 %rcx, 4, killed %rax, 0, _ :: (load 4 from jump-table, align 8)
340 - '%rax = MOVSX64rm32 %rcx, 4, killed %rax, 0, _ :: (load 4 from jump-table, align 8)'
341 - '%rax = ADD64rr killed %rax, killed %rcx, implicit-def dead %eflags'
342 - 'JMP64r killed %rax'
346 - '%eax = MOV32r0 implicit-def dead %eflags'