MIR Parser: Allow the MI IR references to reference global values.
[oota-llvm.git] / test / CodeGen / MIR / X86 / memory-operands.mir
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
3 # correctly.
4
5 --- |
6
7   define i32 @test(i32* %a) {
8   entry:
9     %b = load i32, i32* %a
10     store i32 42, i32* %a
11     ret i32 %b
12   }
13
14   define void @test2(i32* %"a value") {
15   entry2:
16     %b = load i32, i32* %"a value"
17     %c = add i32 %b, 1
18     store i32 %c, i32* %"a value"
19     ret void
20   }
21
22   define i32 @volatile_inc(i32* %x) {
23   entry:
24     %0 = load volatile i32, i32* %x
25     %1 = add i32 %0, 1
26     store volatile i32 %1, i32* %x
27     ret i32 %1
28   }
29
30   define void @non_temporal_store(i32* %a, i32 %b) {
31   entry:
32     store i32 %b, i32* %a, align 16, !nontemporal !0
33     ret void
34   }
35
36   !0 = !{i32 1}
37
38   define i32 @invariant_load(i32* %x) {
39   entry:
40     %v = load i32, i32* %x, !invariant.load !1
41     ret i32 %v
42   }
43
44   !1 = !{}
45
46   define void @memory_offset(<8 x float>* %vec) {
47   entry:
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
51     ret void
52   }
53
54   define void @memory_alignment(<8 x float>* %vec) {
55   entry:
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
59     ret void
60   }
61
62   define double @constant_pool_psv(double %a) {
63   entry:
64     %b = fadd double %a, 3.250000e+00
65     ret double %b
66   }
67
68   declare x86_fp80 @cosl(x86_fp80) #0
69
70   define x86_fp80 @stack_psv(x86_fp80 %x) {
71   entry:
72     %y = call x86_fp80 @cosl(x86_fp80 %x) #0
73     ret x86_fp80 %y
74   }
75
76   attributes #0 = { readonly }
77
78   @G = external global i32
79
80   define i32 @got_psv() {
81   entry:
82     %a = load i32, i32* @G
83     %b = add i32 %a, 1
84     ret i32 %b
85   }
86
87   define i32 @global_value() {
88   entry:
89     %a = load i32, i32* @G
90     %b = add i32 %a, 1
91     ret i32 %b
92   }
93
94   define i32 @jumptable_psv(i32 %in) {
95   entry:
96     switch i32 %in, label %def [
97       i32 0, label %lbl1
98       i32 1, label %lbl2
99       i32 2, label %lbl3
100       i32 3, label %lbl4
101     ]
102   def:
103     ret i32 0
104   lbl1:
105     ret i32 1
106   lbl2:
107     ret i32 2
108   lbl3:
109     ret i32 4
110   lbl4:
111     ret i32 8
112   }
113
114 ...
115 ---
116 name:            test
117 tracksRegLiveness: true
118 liveins:
119   - { reg: '%rdi' }
120 body:
121   - id:          0
122     name:        entry
123     liveins:     [ '%rdi' ]
124     instructions:
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)'
129       - 'RETQ %eax'
130 ...
131 ---
132 name:            test2
133 tracksRegLiveness: true
134 liveins:
135   - { reg: '%rdi' }
136 body:
137   - id:          0
138     name:        entry2
139     liveins:     [ '%rdi' ]
140     instructions:
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")'
143       - RETQ
144 ...
145 ---
146 name:            volatile_inc
147 tracksRegLiveness: true
148 liveins:
149   - { reg: '%rdi' }
150 body:
151   - id:          0
152     name:        entry
153     liveins:     [ '%rdi' ]
154     instructions:
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)'
161       - 'RETQ %eax'
162 ...
163 ---
164 name:            non_temporal_store
165 tracksRegLiveness: true
166 liveins:
167   - { reg: '%rdi' }
168   - { reg: '%esi' }
169 body:
170   - id:          0
171     name:        entry
172     liveins:     [ '%esi', '%rdi' ]
173     instructions:
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)'
177       - RETQ
178 ...
179 ---
180 name:            invariant_load
181 tracksRegLiveness: true
182 liveins:
183   - { reg: '%rdi' }
184 body:
185   - id:          0
186     name:        entry
187     liveins:     [ '%rdi' ]
188     instructions:
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)'
192       - 'RETQ %eax'
193 ...
194 ---
195 name:            memory_offset
196 tracksRegLiveness: true
197 liveins:
198   - { reg: '%rdi' }
199 body:
200   - id:          0
201     name:        entry
202     liveins:     [ '%rdi' ]
203     instructions:
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)'
211       - '%xmm2 = FsFLD0SS'
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)'
215       - RETQ
216 ...
217 ---
218 name:            memory_alignment
219 tracksRegLiveness: true
220 liveins:
221   - { reg: '%rdi' }
222 body:
223   - id:          0
224     name:        entry
225     liveins:     [ '%rdi' ]
226     instructions:
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)'
234       - '%xmm2 = FsFLD0SS'
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)'
238       - RETQ
239 ...
240 ---
241 name:            constant_pool_psv
242 tracksRegLiveness: true
243 liveins:
244   - { reg: '%xmm0' }
245 constants:
246   - id:          0
247     value:       'double 3.250000e+00'
248 body:
249   - id:          0
250     name:        entry
251     liveins:     [ '%xmm0' ]
252     instructions:
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)'
258       - 'RETQ %xmm0'
259 ...
260 ---
261 name:            stack_psv
262 tracksRegLiveness: true
263 frameInfo:
264   stackSize:       24
265   maxAlignment:    16
266   adjustsStack:    true
267   hasCalls:        true
268   maxCallFrameSize: 16
269 fixedStack:
270   - { id: 0, offset: 0, size: 10, alignment: 16, isImmutable: true, isAliased: false }
271 body:
272   - id:          0
273     name:        entry
274     instructions:
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'
283       - RETQ
284 ...
285 ---
286 name:            got_psv
287 tracksRegLiveness: true
288 body:
289   - id:          0
290     name:        entry
291     instructions:
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'
297       - 'RETQ %eax'
298 ...
299 ---
300 name:            global_value
301 tracksRegLiveness: true
302 body:
303   - id:          0
304     name:        entry
305     instructions:
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'
311       - 'RETQ %eax'
312 ...
313 ---
314 name:            jumptable_psv
315 tracksRegLiveness: true
316 liveins:
317   - { reg: '%edi' }
318 jumpTable:
319   kind:          label-difference32
320   entries:
321     - id:        0
322       blocks:    [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ]
323 body:
324   - id:          0
325     name:        entry
326     successors:  [ '%bb.2.def', '%bb.1.entry' ]
327     liveins:     [ '%edi' ]
328     instructions:
329       - '%eax = MOV32rr %edi, implicit-def %rax'
330       - 'CMP32ri8 killed %edi, 3, implicit-def %eflags'
331       - 'JA_1 %bb.2.def, implicit killed %eflags'
332   - id:          1
333     name:        entry
334     successors:  [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ]
335     liveins:     [ '%rax' ]
336     instructions:
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'
343   - id:              2
344     name:            def
345     instructions:
346       - '%eax = MOV32r0 implicit-def dead %eflags'
347       - 'RETQ %eax'
348   - id:              3
349     name:            lbl1
350     instructions:
351       - '%eax = MOV32ri 1'
352       - 'RETQ %eax'
353   - id:              4
354     name:            lbl2
355     instructions:
356       - '%eax = MOV32ri 2'
357       - 'RETQ %eax'
358   - id:              5
359     name:            lbl3
360     instructions:
361       - '%eax = MOV32ri 4'
362       - 'RETQ %eax'
363   - id:              6
364     name:            lbl4
365     instructions:
366       - '%eax = MOV32ri 8'
367       - 'RETQ %eax'
368 ...