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 @jumptable_psv(i32 %in) {
89 switch i32 %in, label %def [
110 tracksRegLiveness: true
118 # CHECK: %eax = MOV32rm %rdi, 1, _, 0, _ :: (load 4 from %ir.a)
119 # CHECK-NEXT: MOV32mi killed %rdi, 1, _, 0, _, 42 :: (store 4 into %ir.a)
120 - '%eax = MOV32rm %rdi, 1, _, 0, _ :: (load 4 from %ir.a)'
121 - 'MOV32mi killed %rdi, 1, _, 0, _, 42 :: (store 4 into %ir.a)'
126 tracksRegLiveness: true
134 # CHECK: INC32m killed %rdi, 1, _, 0, _, implicit-def dead %eflags :: (store 4 into %ir."a value"), (load 4 from %ir."a value")
135 - 'INC32m killed %rdi, 1, _, 0, _, implicit-def dead %eflags :: (store 4 into %ir."a value"), (load 4 from %ir."a value")'
140 tracksRegLiveness: true
148 # CHECK: name: volatile_inc
149 # CHECK: %eax = MOV32rm %rdi, 1, _, 0, _ :: (volatile load 4 from %ir.x)
150 # CHECK: MOV32mr killed %rdi, 1, _, 0, _, %eax :: (volatile store 4 into %ir.x)
151 - '%eax = MOV32rm %rdi, 1, _, 0, _ :: (volatile load 4 from %ir.x)'
152 - '%eax = INC32r killed %eax, implicit-def dead %eflags'
153 - 'MOV32mr killed %rdi, 1, _, 0, _, %eax :: (volatile store 4 into %ir.x)'
157 name: non_temporal_store
158 tracksRegLiveness: true
165 liveins: [ '%esi', '%rdi' ]
167 # CHECK: name: non_temporal_store
168 # CHECK: MOVNTImr killed %rdi, 1, _, 0, _, killed %esi :: (non-temporal store 4 into %ir.a)
169 - 'MOVNTImr killed %rdi, 1, _, 0, _, killed %esi :: (non-temporal store 4 into %ir.a)'
174 tracksRegLiveness: true
182 # CHECK: name: invariant_load
183 # CHECK: %eax = MOV32rm killed %rdi, 1, _, 0, _ :: (invariant load 4 from %ir.x)
184 - '%eax = MOV32rm killed %rdi, 1, _, 0, _ :: (invariant load 4 from %ir.x)'
189 tracksRegLiveness: true
197 # CHECK: name: memory_offset
198 # CHECK: %xmm0 = MOVAPSrm %rdi, 1, _, 0, _ :: (load 16 from %ir.vec)
199 # CHECK-NEXT: %xmm1 = MOVAPSrm %rdi, 1, _, 16, _ :: (load 16 from %ir.vec + 16)
200 # CHECK: MOVAPSmr %rdi, 1, _, 0, _, killed %xmm0 :: (store 16 into %ir.vec)
201 # CHECK-NEXT: MOVAPSmr killed %rdi, 1, _, 16, _, killed %xmm1 :: (store 16 into %ir.vec + 16)
202 - '%xmm0 = MOVAPSrm %rdi, 1, _, 0, _ :: (load 16 from %ir.vec)'
203 - '%xmm1 = MOVAPSrm %rdi, 1, _, 16, _ :: (load 16 from %ir.vec + 16)'
205 - '%xmm1 = MOVSSrr killed %xmm1, killed %xmm2'
206 - 'MOVAPSmr %rdi, 1, _, 0, _, killed %xmm0 :: (store 16 into %ir.vec)'
207 - 'MOVAPSmr killed %rdi, 1, _, 16, _, killed %xmm1 :: (store 16 into %ir.vec + 16)'
211 name: memory_alignment
212 tracksRegLiveness: true
220 # CHECK: name: memory_alignment
221 # CHECK: %xmm0 = MOVAPSrm %rdi, 1, _, 0, _ :: (load 16 from %ir.vec, align 32)
222 # CHECK-NEXT: %xmm1 = MOVAPSrm %rdi, 1, _, 16, _ :: (load 16 from %ir.vec + 16, align 32)
223 # CHECK: MOVAPSmr %rdi, 1, _, 0, _, killed %xmm0 :: (store 16 into %ir.vec, align 32)
224 # CHECK-NEXT: MOVAPSmr killed %rdi, 1, _, 16, _, killed %xmm1 :: (store 16 into %ir.vec + 16, align 32)
225 - '%xmm0 = MOVAPSrm %rdi, 1, _, 0, _ :: (load 16 from %ir.vec, align 32)'
226 - '%xmm1 = MOVAPSrm %rdi, 1, _, 16, _ :: (load 16 from %ir.vec + 16, align 32)'
228 - '%xmm1 = MOVSSrr killed %xmm1, killed %xmm2'
229 - 'MOVAPSmr %rdi, 1, _, 0, _, killed %xmm0 :: (store 16 into %ir.vec, align 32)'
230 - 'MOVAPSmr killed %rdi, 1, _, 16, _, killed %xmm1 :: (store 16 into %ir.vec + 16, align 32)'
234 name: constant_pool_psv
235 tracksRegLiveness: true
240 value: 'double 3.250000e+00'
246 # CHECK: name: constant_pool_psv
247 # CHECK: %xmm0 = ADDSDrm killed %xmm0, %rip, 1, _, %const.0, _ :: (load 8 from constant-pool)
248 # CHECK-NEXT: %xmm0 = ADDSDrm killed %xmm0, %rip, 1, _, %const.0, _ :: (load 8 from constant-pool + 8)
249 - '%xmm0 = ADDSDrm killed %xmm0, %rip, 1, _, %const.0, _ :: (load 8 from constant-pool)'
250 - '%xmm0 = ADDSDrm killed %xmm0, %rip, 1, _, %const.0, _ :: (load 8 from constant-pool + 8)'
255 tracksRegLiveness: true
263 - { id: 0, offset: 0, size: 10, alignment: 16, isImmutable: true, isAliased: false }
268 - '%rsp = frame-setup SUB64ri8 %rsp, 24, implicit-def dead %eflags'
269 - CFI_INSTRUCTION .cfi_def_cfa_offset 32
270 - 'LD_F80m %rsp, 1, _, 32, _, implicit-def dead %fpsw'
271 # CHECK: name: stack_psv
272 # CHECK: ST_FP80m %rsp, 1, _, 0, _, implicit-def dead %fpsw :: (store 10 into stack, align 16)
273 - 'ST_FP80m %rsp, 1, _, 0, _, implicit-def dead %fpsw :: (store 10 into stack, align 16)'
274 - 'CALL64pcrel32 $cosl, csr_64, implicit %rsp, implicit-def %rsp, implicit-def %fp0'
275 - '%rsp = ADD64ri8 %rsp, 24, implicit-def dead %eflags'
280 tracksRegLiveness: true
285 # CHECK: name: got_psv
286 # CHECK: %rax = MOV64rm %rip, 1, _, @G, _ :: (load 8 from got)
287 - '%rax = MOV64rm %rip, 1, _, @G, _ :: (load 8 from got)'
288 - '%eax = MOV32rm killed %rax, 1, _, 0, _'
289 - '%eax = INC32r killed %eax, implicit-def dead %eflags'
294 tracksRegLiveness: true
298 kind: label-difference32
301 blocks: [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ]
305 successors: [ '%bb.2.def', '%bb.1.entry' ]
308 - '%eax = MOV32rr %edi, implicit-def %rax'
309 - 'CMP32ri8 killed %edi, 3, implicit-def %eflags'
310 - 'JA_1 %bb.2.def, implicit killed %eflags'
313 successors: [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ]
316 - '%rcx = LEA64r %rip, 1, _, %jump-table.0, _'
317 # CHECK: name: jumptable_psv
318 # CHECK: %rax = MOVSX64rm32 %rcx, 4, killed %rax, 0, _ :: (load 4 from jump-table, align 8)
319 - '%rax = MOVSX64rm32 %rcx, 4, killed %rax, 0, _ :: (load 4 from jump-table, align 8)'
320 - '%rax = ADD64rr killed %rax, killed %rcx, implicit-def dead %eflags'
321 - 'JMP64r killed %rax'
325 - '%eax = MOV32r0 implicit-def dead %eflags'