1 ; RUN: llvm-dis < %s.bc| FileCheck %s
3 ; memOperations.3.2.ll.bc was generated by passing this file to llvm-as-3.2.
4 ; The test checks that LLVM does not misread memory related instructions of
9 ; CHECK: %res1 = alloca i8
12 ; CHECK-NEXT: %res2 = alloca i8, i32 2
13 %res2 = alloca i8, i32 2
15 ; CHECK-NEXT: %res3 = alloca i8, i32 2, align 4
16 %res3 = alloca i8, i32 2, align 4
18 ; CHECK-NEXT: %res4 = alloca i8, align 4
19 %res4 = alloca i8, align 4
29 ; CHECK: %res1 = load i8* %ptr1
30 %res1 = load i8* %ptr1
32 ; CHECK-NEXT: %res2 = load volatile i8* %ptr1
33 %res2 = load volatile i8* %ptr1
35 ; CHECK-NEXT: %res3 = load i8* %ptr1, align 1
36 %res3 = load i8* %ptr1, align 1
38 ; CHECK-NEXT: %res4 = load volatile i8* %ptr1, align 1
39 %res4 = load volatile i8* %ptr1, align 1
41 ; CHECK-NEXT: %res5 = load i8* %ptr1, !nontemporal !0
42 %res5 = load i8* %ptr1, !nontemporal !0
44 ; CHECK-NEXT: %res6 = load volatile i8* %ptr1, !nontemporal !0
45 %res6 = load volatile i8* %ptr1, !nontemporal !0
47 ; CHECK-NEXT: %res7 = load i8* %ptr1, align 1, !nontemporal !0
48 %res7 = load i8* %ptr1, align 1, !nontemporal !0
50 ; CHECK-NEXT: %res8 = load volatile i8* %ptr1, align 1, !nontemporal !0
51 %res8 = load volatile i8* %ptr1, align 1, !nontemporal !0
53 ; CHECK-NEXT: %res9 = load i8* %ptr1, !invariant.load !1
54 %res9 = load i8* %ptr1, !invariant.load !1
56 ; CHECK-NEXT: %res10 = load volatile i8* %ptr1, !invariant.load !1
57 %res10 = load volatile i8* %ptr1, !invariant.load !1
59 ; CHECK-NEXT: %res11 = load i8* %ptr1, align 1, !invariant.load !1
60 %res11 = load i8* %ptr1, align 1, !invariant.load !1
62 ; CHECK-NEXT: %res12 = load volatile i8* %ptr1, align 1, !invariant.load !1
63 %res12 = load volatile i8* %ptr1, align 1, !invariant.load !1
65 ; CHECK-NEXT: %res13 = load i8* %ptr1, {{[(!nontemporal !0, !invariant.load !1) | (!invariant.load !1, !nontemporal !0)]}}
66 %res13 = load i8* %ptr1, !nontemporal !0, !invariant.load !1
68 ; CHECK-NEXT: %res14 = load volatile i8* %ptr1, {{[(!nontemporal !0, !invariant.load !1) | (!invariant.load !1, !nontemporal !0)]}}
69 %res14 = load volatile i8* %ptr1, !nontemporal !0, !invariant.load !1
71 ; CHECK-NEXT: %res15 = load i8* %ptr1, align 1, {{[(!nontemporal !0, !invariant.load !1) | (!invariant.load !1, !nontemporal !0)]}}
72 %res15 = load i8* %ptr1, align 1, !nontemporal !0, !invariant.load !1
74 ; CHECK-NEXT: %res16 = load volatile i8* %ptr1, align 1, {{[(!nontemporal !0, !invariant.load !1) | (!invariant.load !1, !nontemporal !0)]}}
75 %res16 = load volatile i8* %ptr1, align 1, !nontemporal !0, !invariant.load !1
80 define void @loadAtomic(){
85 ; CHECK: %res1 = load atomic i8* %ptr1 unordered, align 1
86 %res1 = load atomic i8* %ptr1 unordered, align 1
88 ; CHECK-NEXT: %res2 = load atomic i8* %ptr1 monotonic, align 1
89 %res2 = load atomic i8* %ptr1 monotonic, align 1
91 ; CHECK-NEXT: %res3 = load atomic i8* %ptr1 acquire, align 1
92 %res3 = load atomic i8* %ptr1 acquire, align 1
94 ; CHECK-NEXT: %res4 = load atomic i8* %ptr1 seq_cst, align 1
95 %res4 = load atomic i8* %ptr1 seq_cst, align 1
97 ; CHECK-NEXT: %res5 = load atomic volatile i8* %ptr1 unordered, align 1
98 %res5 = load atomic volatile i8* %ptr1 unordered, align 1
100 ; CHECK-NEXT: %res6 = load atomic volatile i8* %ptr1 monotonic, align 1
101 %res6 = load atomic volatile i8* %ptr1 monotonic, align 1
103 ; CHECK-NEXT: %res7 = load atomic volatile i8* %ptr1 acquire, align 1
104 %res7 = load atomic volatile i8* %ptr1 acquire, align 1
106 ; CHECK-NEXT: %res8 = load atomic volatile i8* %ptr1 seq_cst, align 1
107 %res8 = load atomic volatile i8* %ptr1 seq_cst, align 1
109 ; CHECK-NEXT: %res9 = load atomic i8* %ptr1 singlethread unordered, align 1
110 %res9 = load atomic i8* %ptr1 singlethread unordered, align 1
112 ; CHECK-NEXT: %res10 = load atomic i8* %ptr1 singlethread monotonic, align 1
113 %res10 = load atomic i8* %ptr1 singlethread monotonic, align 1
115 ; CHECK-NEXT: %res11 = load atomic i8* %ptr1 singlethread acquire, align 1
116 %res11 = load atomic i8* %ptr1 singlethread acquire, align 1
118 ; CHECK-NEXT: %res12 = load atomic i8* %ptr1 singlethread seq_cst, align 1
119 %res12 = load atomic i8* %ptr1 singlethread seq_cst, align 1
121 ; CHECK-NEXT: %res13 = load atomic volatile i8* %ptr1 singlethread unordered, align 1
122 %res13 = load atomic volatile i8* %ptr1 singlethread unordered, align 1
124 ; CHECK-NEXT: %res14 = load atomic volatile i8* %ptr1 singlethread monotonic, align 1
125 %res14 = load atomic volatile i8* %ptr1 singlethread monotonic, align 1
127 ; CHECK-NEXT: %res15 = load atomic volatile i8* %ptr1 singlethread acquire, align 1
128 %res15 = load atomic volatile i8* %ptr1 singlethread acquire, align 1
130 ; CHECK-NEXT: %res16 = load atomic volatile i8* %ptr1 singlethread seq_cst, align 1
131 %res16 = load atomic volatile i8* %ptr1 singlethread seq_cst, align 1
136 define void @store(){
140 ; CHECK: store i8 2, i8* %ptr1
141 store i8 2, i8* %ptr1
143 ; CHECK-NEXT: store volatile i8 2, i8* %ptr1
144 store volatile i8 2, i8* %ptr1
146 ; CHECK-NEXT: store i8 2, i8* %ptr1, align 1
147 store i8 2, i8* %ptr1, align 1
149 ; CHECK-NEXT: store volatile i8 2, i8* %ptr1, align 1
150 store volatile i8 2, i8* %ptr1, align 1
152 ; CHECK-NEXT: store i8 2, i8* %ptr1, !nontemporal !0
153 store i8 2, i8* %ptr1, !nontemporal !0
155 ; CHECK-NEXT: store volatile i8 2, i8* %ptr1, !nontemporal !0
156 store volatile i8 2, i8* %ptr1, !nontemporal !0
158 ; CHECK-NEXT: store i8 2, i8* %ptr1, align 1, !nontemporal !0
159 store i8 2, i8* %ptr1, align 1, !nontemporal !0
161 ; CHECK-NEXT: store volatile i8 2, i8* %ptr1, align 1, !nontemporal !0
162 store volatile i8 2, i8* %ptr1, align 1, !nontemporal !0
167 define void @storeAtomic(){
171 ; CHECK: store atomic i8 2, i8* %ptr1 unordered, align 1
172 store atomic i8 2, i8* %ptr1 unordered, align 1
174 ; CHECK-NEXT: store atomic i8 2, i8* %ptr1 monotonic, align 1
175 store atomic i8 2, i8* %ptr1 monotonic, align 1
177 ; CHECK-NEXT: store atomic i8 2, i8* %ptr1 release, align 1
178 store atomic i8 2, i8* %ptr1 release, align 1
180 ; CHECK-NEXT: store atomic i8 2, i8* %ptr1 seq_cst, align 1
181 store atomic i8 2, i8* %ptr1 seq_cst, align 1
183 ; CHECK-NEXT: store atomic volatile i8 2, i8* %ptr1 unordered, align 1
184 store atomic volatile i8 2, i8* %ptr1 unordered, align 1
186 ; CHECK-NEXT: store atomic volatile i8 2, i8* %ptr1 monotonic, align 1
187 store atomic volatile i8 2, i8* %ptr1 monotonic, align 1
189 ; CHECK-NEXT: store atomic volatile i8 2, i8* %ptr1 release, align 1
190 store atomic volatile i8 2, i8* %ptr1 release, align 1
192 ; CHECK-NEXT: store atomic volatile i8 2, i8* %ptr1 seq_cst, align 1
193 store atomic volatile i8 2, i8* %ptr1 seq_cst, align 1
195 ; CHECK-NEXT: store atomic i8 2, i8* %ptr1 singlethread unordered, align 1
196 store atomic i8 2, i8* %ptr1 singlethread unordered, align 1
198 ; CHECK-NEXT: store atomic i8 2, i8* %ptr1 singlethread monotonic, align 1
199 store atomic i8 2, i8* %ptr1 singlethread monotonic, align 1
201 ; CHECK-NEXT: store atomic i8 2, i8* %ptr1 singlethread release, align 1
202 store atomic i8 2, i8* %ptr1 singlethread release, align 1
204 ; CHECK-NEXT: store atomic i8 2, i8* %ptr1 singlethread seq_cst, align 1
205 store atomic i8 2, i8* %ptr1 singlethread seq_cst, align 1
207 ; CHECK-NEXT: store atomic volatile i8 2, i8* %ptr1 singlethread unordered, align 1
208 store atomic volatile i8 2, i8* %ptr1 singlethread unordered, align 1
210 ; CHECK-NEXT: store atomic volatile i8 2, i8* %ptr1 singlethread monotonic, align 1
211 store atomic volatile i8 2, i8* %ptr1 singlethread monotonic, align 1
213 ; CHECK-NEXT: store atomic volatile i8 2, i8* %ptr1 singlethread release, align 1
214 store atomic volatile i8 2, i8* %ptr1 singlethread release, align 1
216 ; CHECK-NEXT: store atomic volatile i8 2, i8* %ptr1 singlethread seq_cst, align 1
217 store atomic volatile i8 2, i8* %ptr1 singlethread seq_cst, align 1
222 define void @cmpxchg(i32* %ptr,i32 %cmp,i32 %new){
224 ;cmpxchg [volatile] <ty>* <pointer>, <ty> <cmp>, <ty> <new> [singlethread] <ordering>
226 ; CHECK: [[TMP:%[a-z0-9]+]] = cmpxchg i32* %ptr, i32 %cmp, i32 %new monotonic monotonic
227 ; CHECK-NEXT: %res1 = extractvalue { i32, i1 } [[TMP]], 0
228 %res1 = cmpxchg i32* %ptr, i32 %cmp, i32 %new monotonic monotonic
230 ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new monotonic monotonic
231 ; CHECK-NEXT: %res2 = extractvalue { i32, i1 } [[TMP]], 0
232 %res2 = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new monotonic monotonic
234 ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = cmpxchg i32* %ptr, i32 %cmp, i32 %new singlethread monotonic monotonic
235 ; CHECK-NEXT: %res3 = extractvalue { i32, i1 } [[TMP]], 0
236 %res3 = cmpxchg i32* %ptr, i32 %cmp, i32 %new singlethread monotonic monotonic
238 ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new singlethread monotonic monotonic
239 ; CHECK-NEXT: %res4 = extractvalue { i32, i1 } [[TMP]], 0
240 %res4 = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new singlethread monotonic monotonic
243 ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = cmpxchg i32* %ptr, i32 %cmp, i32 %new acquire acquire
244 ; CHECK-NEXT: %res5 = extractvalue { i32, i1 } [[TMP]], 0
245 %res5 = cmpxchg i32* %ptr, i32 %cmp, i32 %new acquire acquire
247 ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new acquire acquire
248 ; CHECK-NEXT: %res6 = extractvalue { i32, i1 } [[TMP]], 0
249 %res6 = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new acquire acquire
251 ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = cmpxchg i32* %ptr, i32 %cmp, i32 %new singlethread acquire acquire
252 ; CHECK-NEXT: %res7 = extractvalue { i32, i1 } [[TMP]], 0
253 %res7 = cmpxchg i32* %ptr, i32 %cmp, i32 %new singlethread acquire acquire
255 ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new singlethread acquire acquire
256 ; CHECK-NEXT: %res8 = extractvalue { i32, i1 } [[TMP]], 0
257 %res8 = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new singlethread acquire acquire
260 ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = cmpxchg i32* %ptr, i32 %cmp, i32 %new release monotonic
261 ; CHECK-NEXT: %res9 = extractvalue { i32, i1 } [[TMP]], 0
262 %res9 = cmpxchg i32* %ptr, i32 %cmp, i32 %new release monotonic
264 ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new release monotonic
265 ; CHECK-NEXT: %res10 = extractvalue { i32, i1 } [[TMP]], 0
266 %res10 = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new release monotonic
268 ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = cmpxchg i32* %ptr, i32 %cmp, i32 %new singlethread release monotonic
269 ; CHECK-NEXT: %res11 = extractvalue { i32, i1 } [[TMP]], 0
270 %res11 = cmpxchg i32* %ptr, i32 %cmp, i32 %new singlethread release monotonic
272 ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new singlethread release monotonic
273 ; CHECK-NEXT: %res12 = extractvalue { i32, i1 } [[TMP]], 0
274 %res12 = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new singlethread release monotonic
277 ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = cmpxchg i32* %ptr, i32 %cmp, i32 %new acq_rel acquire
278 ; CHECK-NEXT: %res13 = extractvalue { i32, i1 } [[TMP]], 0
279 %res13 = cmpxchg i32* %ptr, i32 %cmp, i32 %new acq_rel acquire
281 ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new acq_rel acquire
282 ; CHECK-NEXT: %res14 = extractvalue { i32, i1 } [[TMP]], 0
283 %res14 = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new acq_rel acquire
285 ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = cmpxchg i32* %ptr, i32 %cmp, i32 %new singlethread acq_rel acquire
286 ; CHECK-NEXT: %res15 = extractvalue { i32, i1 } [[TMP]], 0
287 %res15 = cmpxchg i32* %ptr, i32 %cmp, i32 %new singlethread acq_rel acquire
289 ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new singlethread acq_rel acquire
290 ; CHECK-NEXT: %res16 = extractvalue { i32, i1 } [[TMP]], 0
291 %res16 = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new singlethread acq_rel acquire
294 ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = cmpxchg i32* %ptr, i32 %cmp, i32 %new seq_cst seq_cst
295 ; CHECK-NEXT: %res17 = extractvalue { i32, i1 } [[TMP]], 0
296 %res17 = cmpxchg i32* %ptr, i32 %cmp, i32 %new seq_cst seq_cst
298 ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new seq_cst seq_cst
299 ; CHECK-NEXT: %res18 = extractvalue { i32, i1 } [[TMP]], 0
300 %res18 = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new seq_cst seq_cst
302 ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = cmpxchg i32* %ptr, i32 %cmp, i32 %new singlethread seq_cst seq_cst
303 ; CHECK-NEXT: %res19 = extractvalue { i32, i1 } [[TMP]], 0
304 %res19 = cmpxchg i32* %ptr, i32 %cmp, i32 %new singlethread seq_cst seq_cst
306 ; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new singlethread seq_cst seq_cst
307 ; CHECK-NEXT: %res20 = extractvalue { i32, i1 } [[TMP]], 0
308 %res20 = cmpxchg volatile i32* %ptr, i32 %cmp, i32 %new singlethread seq_cst seq_cst
313 define void @getelementptr({i8, i8}* %s, <4 x i8*> %ptrs, <4 x i64> %offsets ){
315 ; CHECK: %res1 = getelementptr { i8, i8 }* %s, i32 1, i32 1
316 %res1 = getelementptr {i8, i8}* %s, i32 1, i32 1
318 ; CHECK-NEXT: %res2 = getelementptr inbounds { i8, i8 }* %s, i32 1, i32 1
319 %res2 = getelementptr inbounds {i8, i8}* %s, i32 1, i32 1
321 ; CHECK-NEXT: %res3 = getelementptr <4 x i8*> %ptrs, <4 x i64> %offsets
322 %res3 = getelementptr <4 x i8*> %ptrs, <4 x i64> %offsets
327 !0 = metadata !{ i32 1 }