002d147b354712c02394ab5b575b5051886573ed
[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 @jumptable_psv(i32 %in) {
88   entry:
89     switch i32 %in, label %def [
90       i32 0, label %lbl1
91       i32 1, label %lbl2
92       i32 2, label %lbl3
93       i32 3, label %lbl4
94     ]
95   def:
96     ret i32 0
97   lbl1:
98     ret i32 1
99   lbl2:
100     ret i32 2
101   lbl3:
102     ret i32 4
103   lbl4:
104     ret i32 8
105   }
106
107 ...
108 ---
109 name:            test
110 tracksRegLiveness: true
111 liveins:
112   - { reg: '%rdi' }
113 body:
114   - id:          0
115     name:        entry
116     liveins:     [ '%rdi' ]
117     instructions:
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)'
122       - 'RETQ %eax'
123 ...
124 ---
125 name:            test2
126 tracksRegLiveness: true
127 liveins:
128   - { reg: '%rdi' }
129 body:
130   - id:          0
131     name:        entry2
132     liveins:     [ '%rdi' ]
133     instructions:
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")'
136       - RETQ
137 ...
138 ---
139 name:            volatile_inc
140 tracksRegLiveness: true
141 liveins:
142   - { reg: '%rdi' }
143 body:
144   - id:          0
145     name:        entry
146     liveins:     [ '%rdi' ]
147     instructions:
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)'
154       - 'RETQ %eax'
155 ...
156 ---
157 name:            non_temporal_store
158 tracksRegLiveness: true
159 liveins:
160   - { reg: '%rdi' }
161   - { reg: '%esi' }
162 body:
163   - id:          0
164     name:        entry
165     liveins:     [ '%esi', '%rdi' ]
166     instructions:
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)'
170       - RETQ
171 ...
172 ---
173 name:            invariant_load
174 tracksRegLiveness: true
175 liveins:
176   - { reg: '%rdi' }
177 body:
178   - id:          0
179     name:        entry
180     liveins:     [ '%rdi' ]
181     instructions:
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)'
185       - 'RETQ %eax'
186 ...
187 ---
188 name:            memory_offset
189 tracksRegLiveness: true
190 liveins:
191   - { reg: '%rdi' }
192 body:
193   - id:          0
194     name:        entry
195     liveins:     [ '%rdi' ]
196     instructions:
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)'
204       - '%xmm2 = FsFLD0SS'
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)'
208       - RETQ
209 ...
210 ---
211 name:            memory_alignment
212 tracksRegLiveness: true
213 liveins:
214   - { reg: '%rdi' }
215 body:
216   - id:          0
217     name:        entry
218     liveins:     [ '%rdi' ]
219     instructions:
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)'
227       - '%xmm2 = FsFLD0SS'
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)'
231       - RETQ
232 ...
233 ---
234 name:            constant_pool_psv
235 tracksRegLiveness: true
236 liveins:
237   - { reg: '%xmm0' }
238 constants:
239   - id:          0
240     value:       'double 3.250000e+00'
241 body:
242   - id:          0
243     name:        entry
244     liveins:     [ '%xmm0' ]
245     instructions:
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)'
251       - 'RETQ %xmm0'
252 ...
253 ---
254 name:            stack_psv
255 tracksRegLiveness: true
256 frameInfo:
257   stackSize:       24
258   maxAlignment:    16
259   adjustsStack:    true
260   hasCalls:        true
261   maxCallFrameSize: 16
262 fixedStack:
263   - { id: 0, offset: 0, size: 10, alignment: 16, isImmutable: true, isAliased: false }
264 body:
265   - id:          0
266     name:        entry
267     instructions:
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'
276       - RETQ
277 ...
278 ---
279 name:            got_psv
280 tracksRegLiveness: true
281 body:
282   - id:          0
283     name:        entry
284     instructions:
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'
290       - 'RETQ %eax'
291 ...
292 ---
293 name:            jumptable_psv
294 tracksRegLiveness: true
295 liveins:
296   - { reg: '%edi' }
297 jumpTable:
298   kind:          label-difference32
299   entries:
300     - id:        0
301       blocks:    [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ]
302 body:
303   - id:          0
304     name:        entry
305     successors:  [ '%bb.2.def', '%bb.1.entry' ]
306     liveins:     [ '%edi' ]
307     instructions:
308       - '%eax = MOV32rr %edi, implicit-def %rax'
309       - 'CMP32ri8 killed %edi, 3, implicit-def %eflags'
310       - 'JA_1 %bb.2.def, implicit killed %eflags'
311   - id:          1
312     name:        entry
313     successors:  [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ]
314     liveins:     [ '%rax' ]
315     instructions:
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'
322   - id:              2
323     name:            def
324     instructions:
325       - '%eax = MOV32r0 implicit-def dead %eflags'
326       - 'RETQ %eax'
327   - id:              3
328     name:            lbl1
329     instructions:
330       - '%eax = MOV32ri 1'
331       - 'RETQ %eax'
332   - id:              4
333     name:            lbl2
334     instructions:
335       - '%eax = MOV32ri 2'
336       - 'RETQ %eax'
337   - id:              5
338     name:            lbl3
339     instructions:
340       - '%eax = MOV32ri 4'
341       - 'RETQ %eax'
342   - id:              6
343     name:            lbl4
344     instructions:
345       - '%eax = MOV32ri 8'
346       - 'RETQ %eax'
347 ...