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