1; RUN: llvm-dis < %s.bc| FileCheck %s 2 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 5; older bitcode files. 6 7define void @alloca(){ 8entry: 9; CHECK: %res1 = alloca i8 10 %res1 = alloca i8 11 12; CHECK-NEXT: %res2 = alloca i8, i32 2 13 %res2 = alloca i8, i32 2 14 15; CHECK-NEXT: %res3 = alloca i8, i32 2, align 4 16 %res3 = alloca i8, i32 2, align 4 17 18; CHECK-NEXT: %res4 = alloca i8, align 4 19 %res4 = alloca i8, align 4 20 21 ret void 22} 23 24define void @load(){ 25entry: 26 %ptr1 = alloca i8 27 store i8 2, i8* %ptr1 28 29; CHECK: %res1 = load i8* %ptr1 30 %res1 = load i8* %ptr1 31 32; CHECK-NEXT: %res2 = load volatile i8* %ptr1 33 %res2 = load volatile i8* %ptr1 34 35; CHECK-NEXT: %res3 = load i8* %ptr1, align 1 36 %res3 = load i8* %ptr1, align 1 37 38; CHECK-NEXT: %res4 = load volatile i8* %ptr1, align 1 39 %res4 = load volatile i8* %ptr1, align 1 40 41; CHECK-NEXT: %res5 = load i8* %ptr1, !nontemporal !0 42 %res5 = load i8* %ptr1, !nontemporal !0 43 44; CHECK-NEXT: %res6 = load volatile i8* %ptr1, !nontemporal !0 45 %res6 = load volatile i8* %ptr1, !nontemporal !0 46 47; CHECK-NEXT: %res7 = load i8* %ptr1, align 1, !nontemporal !0 48 %res7 = load i8* %ptr1, align 1, !nontemporal !0 49 50; CHECK-NEXT: %res8 = load volatile i8* %ptr1, align 1, !nontemporal !0 51 %res8 = load volatile i8* %ptr1, align 1, !nontemporal !0 52 53; CHECK-NEXT: %res9 = load i8* %ptr1, !invariant.load !1 54 %res9 = load i8* %ptr1, !invariant.load !1 55 56; CHECK-NEXT: %res10 = load volatile i8* %ptr1, !invariant.load !1 57 %res10 = load volatile i8* %ptr1, !invariant.load !1 58 59; CHECK-NEXT: %res11 = load i8* %ptr1, align 1, !invariant.load !1 60 %res11 = load i8* %ptr1, align 1, !invariant.load !1 61 62; CHECK-NEXT: %res12 = load volatile i8* %ptr1, align 1, !invariant.load !1 63 %res12 = load volatile i8* %ptr1, align 1, !invariant.load !1 64 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 67 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 70 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 73 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 76 77 ret void 78} 79 80define void @loadAtomic(){ 81entry: 82 %ptr1 = alloca i8 83 store i8 2, i8* %ptr1 84 85; CHECK: %res1 = load atomic i8* %ptr1 unordered, align 1 86 %res1 = load atomic i8* %ptr1 unordered, align 1 87 88; CHECK-NEXT: %res2 = load atomic i8* %ptr1 monotonic, align 1 89 %res2 = load atomic i8* %ptr1 monotonic, align 1 90 91; CHECK-NEXT: %res3 = load atomic i8* %ptr1 acquire, align 1 92 %res3 = load atomic i8* %ptr1 acquire, align 1 93 94; CHECK-NEXT: %res4 = load atomic i8* %ptr1 seq_cst, align 1 95 %res4 = load atomic i8* %ptr1 seq_cst, align 1 96 97; CHECK-NEXT: %res5 = load atomic volatile i8* %ptr1 unordered, align 1 98 %res5 = load atomic volatile i8* %ptr1 unordered, align 1 99 100; CHECK-NEXT: %res6 = load atomic volatile i8* %ptr1 monotonic, align 1 101 %res6 = load atomic volatile i8* %ptr1 monotonic, align 1 102 103; CHECK-NEXT: %res7 = load atomic volatile i8* %ptr1 acquire, align 1 104 %res7 = load atomic volatile i8* %ptr1 acquire, align 1 105 106; CHECK-NEXT: %res8 = load atomic volatile i8* %ptr1 seq_cst, align 1 107 %res8 = load atomic volatile i8* %ptr1 seq_cst, align 1 108 109; CHECK-NEXT: %res9 = load atomic i8* %ptr1 singlethread unordered, align 1 110 %res9 = load atomic i8* %ptr1 singlethread unordered, align 1 111 112; CHECK-NEXT: %res10 = load atomic i8* %ptr1 singlethread monotonic, align 1 113 %res10 = load atomic i8* %ptr1 singlethread monotonic, align 1 114 115; CHECK-NEXT: %res11 = load atomic i8* %ptr1 singlethread acquire, align 1 116 %res11 = load atomic i8* %ptr1 singlethread acquire, align 1 117 118; CHECK-NEXT: %res12 = load atomic i8* %ptr1 singlethread seq_cst, align 1 119 %res12 = load atomic i8* %ptr1 singlethread seq_cst, align 1 120 121; CHECK-NEXT: %res13 = load atomic volatile i8* %ptr1 singlethread unordered, align 1 122 %res13 = load atomic volatile i8* %ptr1 singlethread unordered, align 1 123 124; CHECK-NEXT: %res14 = load atomic volatile i8* %ptr1 singlethread monotonic, align 1 125 %res14 = load atomic volatile i8* %ptr1 singlethread monotonic, align 1 126 127; CHECK-NEXT: %res15 = load atomic volatile i8* %ptr1 singlethread acquire, align 1 128 %res15 = load atomic volatile i8* %ptr1 singlethread acquire, align 1 129 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 132 133 ret void 134} 135 136define void @store(){ 137entry: 138 %ptr1 = alloca i8 139 140; CHECK: store i8 2, i8* %ptr1 141 store i8 2, i8* %ptr1 142 143; CHECK-NEXT: store volatile i8 2, i8* %ptr1 144 store volatile i8 2, i8* %ptr1 145 146; CHECK-NEXT: store i8 2, i8* %ptr1, align 1 147 store i8 2, i8* %ptr1, align 1 148 149; CHECK-NEXT: store volatile i8 2, i8* %ptr1, align 1 150 store volatile i8 2, i8* %ptr1, align 1 151 152; CHECK-NEXT: store i8 2, i8* %ptr1, !nontemporal !0 153 store i8 2, i8* %ptr1, !nontemporal !0 154 155; CHECK-NEXT: store volatile i8 2, i8* %ptr1, !nontemporal !0 156 store volatile i8 2, i8* %ptr1, !nontemporal !0 157 158; CHECK-NEXT: store i8 2, i8* %ptr1, align 1, !nontemporal !0 159 store i8 2, i8* %ptr1, align 1, !nontemporal !0 160 161; CHECK-NEXT: store volatile i8 2, i8* %ptr1, align 1, !nontemporal !0 162 store volatile i8 2, i8* %ptr1, align 1, !nontemporal !0 163 164 ret void 165} 166 167define void @storeAtomic(){ 168entry: 169 %ptr1 = alloca i8 170 171; CHECK: store atomic i8 2, i8* %ptr1 unordered, align 1 172 store atomic i8 2, i8* %ptr1 unordered, align 1 173 174; CHECK-NEXT: store atomic i8 2, i8* %ptr1 monotonic, align 1 175 store atomic i8 2, i8* %ptr1 monotonic, align 1 176 177; CHECK-NEXT: store atomic i8 2, i8* %ptr1 release, align 1 178 store atomic i8 2, i8* %ptr1 release, align 1 179 180; CHECK-NEXT: store atomic i8 2, i8* %ptr1 seq_cst, align 1 181 store atomic i8 2, i8* %ptr1 seq_cst, align 1 182 183; CHECK-NEXT: store atomic volatile i8 2, i8* %ptr1 unordered, align 1 184 store atomic volatile i8 2, i8* %ptr1 unordered, align 1 185 186; CHECK-NEXT: store atomic volatile i8 2, i8* %ptr1 monotonic, align 1 187 store atomic volatile i8 2, i8* %ptr1 monotonic, align 1 188 189; CHECK-NEXT: store atomic volatile i8 2, i8* %ptr1 release, align 1 190 store atomic volatile i8 2, i8* %ptr1 release, align 1 191 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 194 195; CHECK-NEXT: store atomic i8 2, i8* %ptr1 singlethread unordered, align 1 196 store atomic i8 2, i8* %ptr1 singlethread unordered, align 1 197 198; CHECK-NEXT: store atomic i8 2, i8* %ptr1 singlethread monotonic, align 1 199 store atomic i8 2, i8* %ptr1 singlethread monotonic, align 1 200 201; CHECK-NEXT: store atomic i8 2, i8* %ptr1 singlethread release, align 1 202 store atomic i8 2, i8* %ptr1 singlethread release, align 1 203 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 206 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 209 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 212 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 215 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 218 219 ret void 220} 221 222define void @cmpxchg(i32* %ptr,i32 %cmp,i32 %new){ 223entry: 224 ;cmpxchg [volatile] <ty>* <pointer>, <ty> <cmp>, <ty> <new> [singlethread] <ordering> 225 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 229 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 233 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 237 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 241 242 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 246 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 250 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 254 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 258 259 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 263 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 267 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 271 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 275 276 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 280 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 284 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 288 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 292 293 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 297 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 301 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 305 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 309 310 ret void 311} 312 313define void @getelementptr({i8, i8}* %s, <4 x i8*> %ptrs, <4 x i64> %offsets ){ 314entry: 315; CHECK: %res1 = getelementptr { i8, i8 }* %s, i32 1, i32 1 316 %res1 = getelementptr {i8, i8}* %s, i32 1, i32 1 317 318; CHECK-NEXT: %res2 = getelementptr inbounds { i8, i8 }* %s, i32 1, i32 1 319 %res2 = getelementptr inbounds {i8, i8}* %s, i32 1, i32 1 320 321; CHECK-NEXT: %res3 = getelementptr <4 x i8*> %ptrs, <4 x i64> %offsets 322 %res3 = getelementptr <4 x i8*> %ptrs, <4 x i64> %offsets 323 324 ret void 325} 326 327!0 = metadata !{ i32 1 } 328!1 = metadata !{}