f061367ae1237ec2a65ad379ef288f15161016c9
[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 ...
63 ---
64 name:            test
65 tracksRegLiveness: true
66 liveins:
67   - { reg: '%rdi' }
68 body:
69   - id:          0
70     name:        entry
71     liveins:     [ '%rdi' ]
72     instructions:
73 # CHECK:      %eax = MOV32rm %rdi, 1, _, 0, _ :: (load 4 from %ir.a)
74 # CHECK-NEXT: MOV32mi killed %rdi, 1, _, 0, _, 42 :: (store 4 into %ir.a)
75       - '%eax = MOV32rm %rdi, 1, _, 0, _ :: (load 4 from %ir.a)'
76       - 'MOV32mi killed %rdi, 1, _, 0, _, 42 :: (store 4 into %ir.a)'
77       - 'RETQ %eax'
78 ...
79 ---
80 name:            test2
81 tracksRegLiveness: true
82 liveins:
83   - { reg: '%rdi' }
84 body:
85   - id:          0
86     name:        entry2
87     liveins:     [ '%rdi' ]
88     instructions:
89 # CHECK: INC32m killed %rdi, 1, _, 0, _, implicit-def dead %eflags :: (store 4 into %ir."a value"), (load 4 from %ir."a value")
90       - 'INC32m killed %rdi, 1, _, 0, _, implicit-def dead %eflags :: (store 4 into %ir."a value"), (load 4 from %ir."a value")'
91       - RETQ
92 ...
93 ---
94 name:            volatile_inc
95 tracksRegLiveness: true
96 liveins:
97   - { reg: '%rdi' }
98 body:
99   - id:          0
100     name:        entry
101     liveins:     [ '%rdi' ]
102     instructions:
103     # CHECK: name: volatile_inc
104     # CHECK: %eax = MOV32rm %rdi, 1, _, 0, _ :: (volatile load 4 from %ir.x)
105     # CHECK: MOV32mr killed %rdi, 1, _, 0, _, %eax :: (volatile store 4 into %ir.x)
106       - '%eax = MOV32rm %rdi, 1, _, 0, _ :: (volatile load 4 from %ir.x)'
107       - '%eax = INC32r killed %eax, implicit-def dead %eflags'
108       - 'MOV32mr killed %rdi, 1, _, 0, _, %eax :: (volatile store 4 into %ir.x)'
109       - 'RETQ %eax'
110 ...
111 ---
112 name:            non_temporal_store
113 tracksRegLiveness: true
114 liveins:
115   - { reg: '%rdi' }
116   - { reg: '%esi' }
117 body:
118   - id:          0
119     name:        entry
120     liveins:     [ '%esi', '%rdi' ]
121     instructions:
122 # CHECK: name: non_temporal_store
123 # CHECK: MOVNTImr killed %rdi, 1, _, 0, _, killed %esi :: (non-temporal store 4 into %ir.a)
124       - 'MOVNTImr killed %rdi, 1, _, 0, _, killed %esi :: (non-temporal store 4 into %ir.a)'
125       - RETQ
126 ...
127 ---
128 name:            invariant_load
129 tracksRegLiveness: true
130 liveins:
131   - { reg: '%rdi' }
132 body:
133   - id:          0
134     name:        entry
135     liveins:     [ '%rdi' ]
136     instructions:
137 # CHECK: name: invariant_load
138 # CHECK: %eax = MOV32rm killed %rdi, 1, _, 0, _ :: (invariant load 4 from %ir.x)
139       - '%eax = MOV32rm killed %rdi, 1, _, 0, _ :: (invariant load 4 from %ir.x)'
140       - 'RETQ %eax'
141 ...
142 ---
143 name:            memory_offset
144 tracksRegLiveness: true
145 liveins:
146   - { reg: '%rdi' }
147 body:
148   - id:          0
149     name:        entry
150     liveins:     [ '%rdi' ]
151     instructions:
152 # CHECK: name: memory_offset
153 # CHECK:      %xmm0 = MOVAPSrm %rdi, 1, _, 0, _ :: (load 16 from %ir.vec)
154 # CHECK-NEXT: %xmm1 = MOVAPSrm %rdi, 1, _, 16, _ :: (load 16 from %ir.vec + 16)
155 # CHECK:      MOVAPSmr %rdi, 1, _, 0, _, killed %xmm0 :: (store 16 into %ir.vec)
156 # CHECK-NEXT: MOVAPSmr killed %rdi, 1, _, 16, _, killed %xmm1 :: (store 16 into %ir.vec + 16)
157       - '%xmm0 = MOVAPSrm %rdi, 1, _, 0, _ :: (load 16 from %ir.vec)'
158       - '%xmm1 = MOVAPSrm %rdi, 1, _, 16, _ :: (load 16 from %ir.vec + 16)'
159       - '%xmm2 = FsFLD0SS'
160       - '%xmm1 = MOVSSrr killed %xmm1, killed %xmm2'
161       - 'MOVAPSmr %rdi, 1, _, 0, _, killed %xmm0 :: (store 16 into %ir.vec)'
162       - 'MOVAPSmr killed %rdi, 1, _, 16, _, killed %xmm1 :: (store 16 into %ir.vec + 16)'
163       - RETQ
164 ...
165 ---
166 name:            memory_alignment
167 tracksRegLiveness: true
168 liveins:
169   - { reg: '%rdi' }
170 body:
171   - id:          0
172     name:        entry
173     liveins:     [ '%rdi' ]
174     instructions:
175 # CHECK: name: memory_alignment
176 # CHECK:      %xmm0 = MOVAPSrm %rdi, 1, _, 0, _ :: (load 16 from %ir.vec, align 32)
177 # CHECK-NEXT: %xmm1 = MOVAPSrm %rdi, 1, _, 16, _ :: (load 16 from %ir.vec + 16, align 32)
178 # CHECK:      MOVAPSmr %rdi, 1, _, 0, _, killed %xmm0 :: (store 16 into %ir.vec, align 32)
179 # CHECK-NEXT: MOVAPSmr killed %rdi, 1, _, 16, _, killed %xmm1 :: (store 16 into %ir.vec + 16, align 32)
180       - '%xmm0 = MOVAPSrm %rdi, 1, _, 0, _ :: (load 16 from %ir.vec, align 32)'
181       - '%xmm1 = MOVAPSrm %rdi, 1, _, 16, _ :: (load 16 from %ir.vec + 16, align 32)'
182       - '%xmm2 = FsFLD0SS'
183       - '%xmm1 = MOVSSrr killed %xmm1, killed %xmm2'
184       - 'MOVAPSmr %rdi, 1, _, 0, _, killed %xmm0 :: (store 16 into %ir.vec, align 32)'
185       - 'MOVAPSmr killed %rdi, 1, _, 16, _, killed %xmm1 :: (store 16 into %ir.vec + 16, align 32)'
186       - RETQ
187 ...