1; RUN: opt < %s -tsan -S | FileCheck %s 2; Check that atomic memory operations are converted to calls into ThreadSanitizer runtime. 3target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" 4 5define i8 @atomic8_load_unordered(i8* %a) nounwind uwtable { 6entry: 7 %0 = load atomic i8, i8* %a unordered, align 1, !dbg !7 8 ret i8 %0, !dbg !7 9} 10; CHECK-LABEL: atomic8_load_unordered 11; CHECK: call i8 @__tsan_atomic8_load(i8* %a, i32 0), !dbg 12 13define i8 @atomic8_load_monotonic(i8* %a) nounwind uwtable { 14entry: 15 %0 = load atomic i8, i8* %a monotonic, align 1, !dbg !7 16 ret i8 %0, !dbg !7 17} 18; CHECK-LABEL: atomic8_load_monotonic 19; CHECK: call i8 @__tsan_atomic8_load(i8* %a, i32 0), !dbg 20 21define i8 @atomic8_load_acquire(i8* %a) nounwind uwtable { 22entry: 23 %0 = load atomic i8, i8* %a acquire, align 1, !dbg !7 24 ret i8 %0, !dbg !7 25} 26; CHECK-LABEL: atomic8_load_acquire 27; CHECK: call i8 @__tsan_atomic8_load(i8* %a, i32 2), !dbg 28 29define i8 @atomic8_load_seq_cst(i8* %a) nounwind uwtable { 30entry: 31 %0 = load atomic i8, i8* %a seq_cst, align 1, !dbg !7 32 ret i8 %0, !dbg !7 33} 34; CHECK-LABEL: atomic8_load_seq_cst 35; CHECK: call i8 @__tsan_atomic8_load(i8* %a, i32 5), !dbg 36 37define void @atomic8_store_unordered(i8* %a) nounwind uwtable { 38entry: 39 store atomic i8 0, i8* %a unordered, align 1, !dbg !7 40 ret void, !dbg !7 41} 42; CHECK-LABEL: atomic8_store_unordered 43; CHECK: call void @__tsan_atomic8_store(i8* %a, i8 0, i32 0), !dbg 44 45define void @atomic8_store_monotonic(i8* %a) nounwind uwtable { 46entry: 47 store atomic i8 0, i8* %a monotonic, align 1, !dbg !7 48 ret void, !dbg !7 49} 50; CHECK-LABEL: atomic8_store_monotonic 51; CHECK: call void @__tsan_atomic8_store(i8* %a, i8 0, i32 0), !dbg 52 53define void @atomic8_store_release(i8* %a) nounwind uwtable { 54entry: 55 store atomic i8 0, i8* %a release, align 1, !dbg !7 56 ret void, !dbg !7 57} 58; CHECK-LABEL: atomic8_store_release 59; CHECK: call void @__tsan_atomic8_store(i8* %a, i8 0, i32 3), !dbg 60 61define void @atomic8_store_seq_cst(i8* %a) nounwind uwtable { 62entry: 63 store atomic i8 0, i8* %a seq_cst, align 1, !dbg !7 64 ret void, !dbg !7 65} 66; CHECK-LABEL: atomic8_store_seq_cst 67; CHECK: call void @__tsan_atomic8_store(i8* %a, i8 0, i32 5), !dbg 68 69define void @atomic8_xchg_monotonic(i8* %a) nounwind uwtable { 70entry: 71 atomicrmw xchg i8* %a, i8 0 monotonic, !dbg !7 72 ret void, !dbg !7 73} 74; CHECK-LABEL: atomic8_xchg_monotonic 75; CHECK: call i8 @__tsan_atomic8_exchange(i8* %a, i8 0, i32 0), !dbg 76 77define void @atomic8_add_monotonic(i8* %a) nounwind uwtable { 78entry: 79 atomicrmw add i8* %a, i8 0 monotonic, !dbg !7 80 ret void, !dbg !7 81} 82; CHECK-LABEL: atomic8_add_monotonic 83; CHECK: call i8 @__tsan_atomic8_fetch_add(i8* %a, i8 0, i32 0), !dbg 84 85define void @atomic8_sub_monotonic(i8* %a) nounwind uwtable { 86entry: 87 atomicrmw sub i8* %a, i8 0 monotonic, !dbg !7 88 ret void, !dbg !7 89} 90; CHECK-LABEL: atomic8_sub_monotonic 91; CHECK: call i8 @__tsan_atomic8_fetch_sub(i8* %a, i8 0, i32 0), !dbg 92 93define void @atomic8_and_monotonic(i8* %a) nounwind uwtable { 94entry: 95 atomicrmw and i8* %a, i8 0 monotonic, !dbg !7 96 ret void, !dbg !7 97} 98; CHECK-LABEL: atomic8_and_monotonic 99; CHECK: call i8 @__tsan_atomic8_fetch_and(i8* %a, i8 0, i32 0), !dbg 100 101define void @atomic8_or_monotonic(i8* %a) nounwind uwtable { 102entry: 103 atomicrmw or i8* %a, i8 0 monotonic, !dbg !7 104 ret void, !dbg !7 105} 106; CHECK-LABEL: atomic8_or_monotonic 107; CHECK: call i8 @__tsan_atomic8_fetch_or(i8* %a, i8 0, i32 0), !dbg 108 109define void @atomic8_xor_monotonic(i8* %a) nounwind uwtable { 110entry: 111 atomicrmw xor i8* %a, i8 0 monotonic, !dbg !7 112 ret void, !dbg !7 113} 114; CHECK-LABEL: atomic8_xor_monotonic 115; CHECK: call i8 @__tsan_atomic8_fetch_xor(i8* %a, i8 0, i32 0), !dbg 116 117define void @atomic8_nand_monotonic(i8* %a) nounwind uwtable { 118entry: 119 atomicrmw nand i8* %a, i8 0 monotonic, !dbg !7 120 ret void, !dbg !7 121} 122; CHECK-LABEL: atomic8_nand_monotonic 123; CHECK: call i8 @__tsan_atomic8_fetch_nand(i8* %a, i8 0, i32 0), !dbg 124 125define void @atomic8_xchg_acquire(i8* %a) nounwind uwtable { 126entry: 127 atomicrmw xchg i8* %a, i8 0 acquire, !dbg !7 128 ret void, !dbg !7 129} 130; CHECK-LABEL: atomic8_xchg_acquire 131; CHECK: call i8 @__tsan_atomic8_exchange(i8* %a, i8 0, i32 2), !dbg 132 133define void @atomic8_add_acquire(i8* %a) nounwind uwtable { 134entry: 135 atomicrmw add i8* %a, i8 0 acquire, !dbg !7 136 ret void, !dbg !7 137} 138; CHECK-LABEL: atomic8_add_acquire 139; CHECK: call i8 @__tsan_atomic8_fetch_add(i8* %a, i8 0, i32 2), !dbg 140 141define void @atomic8_sub_acquire(i8* %a) nounwind uwtable { 142entry: 143 atomicrmw sub i8* %a, i8 0 acquire, !dbg !7 144 ret void, !dbg !7 145} 146; CHECK-LABEL: atomic8_sub_acquire 147; CHECK: call i8 @__tsan_atomic8_fetch_sub(i8* %a, i8 0, i32 2), !dbg 148 149define void @atomic8_and_acquire(i8* %a) nounwind uwtable { 150entry: 151 atomicrmw and i8* %a, i8 0 acquire, !dbg !7 152 ret void, !dbg !7 153} 154; CHECK-LABEL: atomic8_and_acquire 155; CHECK: call i8 @__tsan_atomic8_fetch_and(i8* %a, i8 0, i32 2), !dbg 156 157define void @atomic8_or_acquire(i8* %a) nounwind uwtable { 158entry: 159 atomicrmw or i8* %a, i8 0 acquire, !dbg !7 160 ret void, !dbg !7 161} 162; CHECK-LABEL: atomic8_or_acquire 163; CHECK: call i8 @__tsan_atomic8_fetch_or(i8* %a, i8 0, i32 2), !dbg 164 165define void @atomic8_xor_acquire(i8* %a) nounwind uwtable { 166entry: 167 atomicrmw xor i8* %a, i8 0 acquire, !dbg !7 168 ret void, !dbg !7 169} 170; CHECK-LABEL: atomic8_xor_acquire 171; CHECK: call i8 @__tsan_atomic8_fetch_xor(i8* %a, i8 0, i32 2), !dbg 172 173define void @atomic8_nand_acquire(i8* %a) nounwind uwtable { 174entry: 175 atomicrmw nand i8* %a, i8 0 acquire, !dbg !7 176 ret void, !dbg !7 177} 178; CHECK-LABEL: atomic8_nand_acquire 179; CHECK: call i8 @__tsan_atomic8_fetch_nand(i8* %a, i8 0, i32 2), !dbg 180 181define void @atomic8_xchg_release(i8* %a) nounwind uwtable { 182entry: 183 atomicrmw xchg i8* %a, i8 0 release, !dbg !7 184 ret void, !dbg !7 185} 186; CHECK-LABEL: atomic8_xchg_release 187; CHECK: call i8 @__tsan_atomic8_exchange(i8* %a, i8 0, i32 3), !dbg 188 189define void @atomic8_add_release(i8* %a) nounwind uwtable { 190entry: 191 atomicrmw add i8* %a, i8 0 release, !dbg !7 192 ret void, !dbg !7 193} 194; CHECK-LABEL: atomic8_add_release 195; CHECK: call i8 @__tsan_atomic8_fetch_add(i8* %a, i8 0, i32 3), !dbg 196 197define void @atomic8_sub_release(i8* %a) nounwind uwtable { 198entry: 199 atomicrmw sub i8* %a, i8 0 release, !dbg !7 200 ret void, !dbg !7 201} 202; CHECK-LABEL: atomic8_sub_release 203; CHECK: call i8 @__tsan_atomic8_fetch_sub(i8* %a, i8 0, i32 3), !dbg 204 205define void @atomic8_and_release(i8* %a) nounwind uwtable { 206entry: 207 atomicrmw and i8* %a, i8 0 release, !dbg !7 208 ret void, !dbg !7 209} 210; CHECK-LABEL: atomic8_and_release 211; CHECK: call i8 @__tsan_atomic8_fetch_and(i8* %a, i8 0, i32 3), !dbg 212 213define void @atomic8_or_release(i8* %a) nounwind uwtable { 214entry: 215 atomicrmw or i8* %a, i8 0 release, !dbg !7 216 ret void, !dbg !7 217} 218; CHECK-LABEL: atomic8_or_release 219; CHECK: call i8 @__tsan_atomic8_fetch_or(i8* %a, i8 0, i32 3), !dbg 220 221define void @atomic8_xor_release(i8* %a) nounwind uwtable { 222entry: 223 atomicrmw xor i8* %a, i8 0 release, !dbg !7 224 ret void, !dbg !7 225} 226; CHECK-LABEL: atomic8_xor_release 227; CHECK: call i8 @__tsan_atomic8_fetch_xor(i8* %a, i8 0, i32 3), !dbg 228 229define void @atomic8_nand_release(i8* %a) nounwind uwtable { 230entry: 231 atomicrmw nand i8* %a, i8 0 release, !dbg !7 232 ret void, !dbg !7 233} 234; CHECK-LABEL: atomic8_nand_release 235; CHECK: call i8 @__tsan_atomic8_fetch_nand(i8* %a, i8 0, i32 3), !dbg 236 237define void @atomic8_xchg_acq_rel(i8* %a) nounwind uwtable { 238entry: 239 atomicrmw xchg i8* %a, i8 0 acq_rel, !dbg !7 240 ret void, !dbg !7 241} 242; CHECK-LABEL: atomic8_xchg_acq_rel 243; CHECK: call i8 @__tsan_atomic8_exchange(i8* %a, i8 0, i32 4), !dbg 244 245define void @atomic8_add_acq_rel(i8* %a) nounwind uwtable { 246entry: 247 atomicrmw add i8* %a, i8 0 acq_rel, !dbg !7 248 ret void, !dbg !7 249} 250; CHECK-LABEL: atomic8_add_acq_rel 251; CHECK: call i8 @__tsan_atomic8_fetch_add(i8* %a, i8 0, i32 4), !dbg 252 253define void @atomic8_sub_acq_rel(i8* %a) nounwind uwtable { 254entry: 255 atomicrmw sub i8* %a, i8 0 acq_rel, !dbg !7 256 ret void, !dbg !7 257} 258; CHECK-LABEL: atomic8_sub_acq_rel 259; CHECK: call i8 @__tsan_atomic8_fetch_sub(i8* %a, i8 0, i32 4), !dbg 260 261define void @atomic8_and_acq_rel(i8* %a) nounwind uwtable { 262entry: 263 atomicrmw and i8* %a, i8 0 acq_rel, !dbg !7 264 ret void, !dbg !7 265} 266; CHECK-LABEL: atomic8_and_acq_rel 267; CHECK: call i8 @__tsan_atomic8_fetch_and(i8* %a, i8 0, i32 4), !dbg 268 269define void @atomic8_or_acq_rel(i8* %a) nounwind uwtable { 270entry: 271 atomicrmw or i8* %a, i8 0 acq_rel, !dbg !7 272 ret void, !dbg !7 273} 274; CHECK-LABEL: atomic8_or_acq_rel 275; CHECK: call i8 @__tsan_atomic8_fetch_or(i8* %a, i8 0, i32 4), !dbg 276 277define void @atomic8_xor_acq_rel(i8* %a) nounwind uwtable { 278entry: 279 atomicrmw xor i8* %a, i8 0 acq_rel, !dbg !7 280 ret void, !dbg !7 281} 282; CHECK-LABEL: atomic8_xor_acq_rel 283; CHECK: call i8 @__tsan_atomic8_fetch_xor(i8* %a, i8 0, i32 4), !dbg 284 285define void @atomic8_nand_acq_rel(i8* %a) nounwind uwtable { 286entry: 287 atomicrmw nand i8* %a, i8 0 acq_rel, !dbg !7 288 ret void, !dbg !7 289} 290; CHECK-LABEL: atomic8_nand_acq_rel 291; CHECK: call i8 @__tsan_atomic8_fetch_nand(i8* %a, i8 0, i32 4), !dbg 292 293define void @atomic8_xchg_seq_cst(i8* %a) nounwind uwtable { 294entry: 295 atomicrmw xchg i8* %a, i8 0 seq_cst, !dbg !7 296 ret void, !dbg !7 297} 298; CHECK-LABEL: atomic8_xchg_seq_cst 299; CHECK: call i8 @__tsan_atomic8_exchange(i8* %a, i8 0, i32 5), !dbg 300 301define void @atomic8_add_seq_cst(i8* %a) nounwind uwtable { 302entry: 303 atomicrmw add i8* %a, i8 0 seq_cst, !dbg !7 304 ret void, !dbg !7 305} 306; CHECK-LABEL: atomic8_add_seq_cst 307; CHECK: call i8 @__tsan_atomic8_fetch_add(i8* %a, i8 0, i32 5), !dbg 308 309define void @atomic8_sub_seq_cst(i8* %a) nounwind uwtable { 310entry: 311 atomicrmw sub i8* %a, i8 0 seq_cst, !dbg !7 312 ret void, !dbg !7 313} 314; CHECK-LABEL: atomic8_sub_seq_cst 315; CHECK: call i8 @__tsan_atomic8_fetch_sub(i8* %a, i8 0, i32 5), !dbg 316 317define void @atomic8_and_seq_cst(i8* %a) nounwind uwtable { 318entry: 319 atomicrmw and i8* %a, i8 0 seq_cst, !dbg !7 320 ret void, !dbg !7 321} 322; CHECK-LABEL: atomic8_and_seq_cst 323; CHECK: call i8 @__tsan_atomic8_fetch_and(i8* %a, i8 0, i32 5), !dbg 324 325define void @atomic8_or_seq_cst(i8* %a) nounwind uwtable { 326entry: 327 atomicrmw or i8* %a, i8 0 seq_cst, !dbg !7 328 ret void, !dbg !7 329} 330; CHECK-LABEL: atomic8_or_seq_cst 331; CHECK: call i8 @__tsan_atomic8_fetch_or(i8* %a, i8 0, i32 5), !dbg 332 333define void @atomic8_xor_seq_cst(i8* %a) nounwind uwtable { 334entry: 335 atomicrmw xor i8* %a, i8 0 seq_cst, !dbg !7 336 ret void, !dbg !7 337} 338; CHECK-LABEL: atomic8_xor_seq_cst 339; CHECK: call i8 @__tsan_atomic8_fetch_xor(i8* %a, i8 0, i32 5), !dbg 340 341define void @atomic8_nand_seq_cst(i8* %a) nounwind uwtable { 342entry: 343 atomicrmw nand i8* %a, i8 0 seq_cst, !dbg !7 344 ret void, !dbg !7 345} 346; CHECK-LABEL: atomic8_nand_seq_cst 347; CHECK: call i8 @__tsan_atomic8_fetch_nand(i8* %a, i8 0, i32 5), !dbg 348 349define void @atomic8_cas_monotonic(i8* %a) nounwind uwtable { 350entry: 351 cmpxchg i8* %a, i8 0, i8 1 monotonic monotonic, !dbg !7 352 cmpxchg i8* %a, i8 0, i8 1 monotonic acquire, !dbg !7 353 cmpxchg i8* %a, i8 0, i8 1 monotonic seq_cst, !dbg !7 354 ret void, !dbg !7 355} 356; CHECK-LABEL: atomic8_cas_monotonic 357; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 0, i32 0), !dbg 358; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 0, i32 2), !dbg 359; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 0, i32 5), !dbg 360 361define void @atomic8_cas_acquire(i8* %a) nounwind uwtable { 362entry: 363 cmpxchg i8* %a, i8 0, i8 1 acquire monotonic, !dbg !7 364 cmpxchg i8* %a, i8 0, i8 1 acquire acquire, !dbg !7 365 cmpxchg i8* %a, i8 0, i8 1 acquire seq_cst, !dbg !7 366 ret void, !dbg !7 367} 368; CHECK-LABEL: atomic8_cas_acquire 369; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 2, i32 0), !dbg 370; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 2, i32 2), !dbg 371; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 2, i32 5), !dbg 372 373define void @atomic8_cas_release(i8* %a) nounwind uwtable { 374entry: 375 cmpxchg i8* %a, i8 0, i8 1 release monotonic, !dbg !7 376 cmpxchg i8* %a, i8 0, i8 1 release acquire, !dbg !7 377 cmpxchg i8* %a, i8 0, i8 1 release seq_cst, !dbg !7 378 ret void, !dbg !7 379} 380; CHECK-LABEL: atomic8_cas_release 381; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 3, i32 0), !dbg 382; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 3, i32 2), !dbg 383; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 3, i32 5), !dbg 384 385define void @atomic8_cas_acq_rel(i8* %a) nounwind uwtable { 386entry: 387 cmpxchg i8* %a, i8 0, i8 1 acq_rel monotonic, !dbg !7 388 cmpxchg i8* %a, i8 0, i8 1 acq_rel acquire, !dbg !7 389 cmpxchg i8* %a, i8 0, i8 1 acq_rel seq_cst, !dbg !7 390 ret void, !dbg !7 391} 392; CHECK-LABEL: atomic8_cas_acq_rel 393; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 4, i32 0), !dbg 394; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 4, i32 2), !dbg 395; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 4, i32 5), !dbg 396 397define void @atomic8_cas_seq_cst(i8* %a) nounwind uwtable { 398entry: 399 cmpxchg i8* %a, i8 0, i8 1 seq_cst monotonic, !dbg !7 400 cmpxchg i8* %a, i8 0, i8 1 seq_cst acquire, !dbg !7 401 cmpxchg i8* %a, i8 0, i8 1 seq_cst seq_cst, !dbg !7 402 ret void, !dbg !7 403} 404; CHECK-LABEL: atomic8_cas_seq_cst 405; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 5, i32 0), !dbg 406; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 5, i32 2), !dbg 407; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 5, i32 5), !dbg 408 409define i16 @atomic16_load_unordered(i16* %a) nounwind uwtable { 410entry: 411 %0 = load atomic i16, i16* %a unordered, align 2, !dbg !7 412 ret i16 %0, !dbg !7 413} 414; CHECK-LABEL: atomic16_load_unordered 415; CHECK: call i16 @__tsan_atomic16_load(i16* %a, i32 0), !dbg 416 417define i16 @atomic16_load_monotonic(i16* %a) nounwind uwtable { 418entry: 419 %0 = load atomic i16, i16* %a monotonic, align 2, !dbg !7 420 ret i16 %0, !dbg !7 421} 422; CHECK-LABEL: atomic16_load_monotonic 423; CHECK: call i16 @__tsan_atomic16_load(i16* %a, i32 0), !dbg 424 425define i16 @atomic16_load_acquire(i16* %a) nounwind uwtable { 426entry: 427 %0 = load atomic i16, i16* %a acquire, align 2, !dbg !7 428 ret i16 %0, !dbg !7 429} 430; CHECK-LABEL: atomic16_load_acquire 431; CHECK: call i16 @__tsan_atomic16_load(i16* %a, i32 2), !dbg 432 433define i16 @atomic16_load_seq_cst(i16* %a) nounwind uwtable { 434entry: 435 %0 = load atomic i16, i16* %a seq_cst, align 2, !dbg !7 436 ret i16 %0, !dbg !7 437} 438; CHECK-LABEL: atomic16_load_seq_cst 439; CHECK: call i16 @__tsan_atomic16_load(i16* %a, i32 5), !dbg 440 441define void @atomic16_store_unordered(i16* %a) nounwind uwtable { 442entry: 443 store atomic i16 0, i16* %a unordered, align 2, !dbg !7 444 ret void, !dbg !7 445} 446; CHECK-LABEL: atomic16_store_unordered 447; CHECK: call void @__tsan_atomic16_store(i16* %a, i16 0, i32 0), !dbg 448 449define void @atomic16_store_monotonic(i16* %a) nounwind uwtable { 450entry: 451 store atomic i16 0, i16* %a monotonic, align 2, !dbg !7 452 ret void, !dbg !7 453} 454; CHECK-LABEL: atomic16_store_monotonic 455; CHECK: call void @__tsan_atomic16_store(i16* %a, i16 0, i32 0), !dbg 456 457define void @atomic16_store_release(i16* %a) nounwind uwtable { 458entry: 459 store atomic i16 0, i16* %a release, align 2, !dbg !7 460 ret void, !dbg !7 461} 462; CHECK-LABEL: atomic16_store_release 463; CHECK: call void @__tsan_atomic16_store(i16* %a, i16 0, i32 3), !dbg 464 465define void @atomic16_store_seq_cst(i16* %a) nounwind uwtable { 466entry: 467 store atomic i16 0, i16* %a seq_cst, align 2, !dbg !7 468 ret void, !dbg !7 469} 470; CHECK-LABEL: atomic16_store_seq_cst 471; CHECK: call void @__tsan_atomic16_store(i16* %a, i16 0, i32 5), !dbg 472 473define void @atomic16_xchg_monotonic(i16* %a) nounwind uwtable { 474entry: 475 atomicrmw xchg i16* %a, i16 0 monotonic, !dbg !7 476 ret void, !dbg !7 477} 478; CHECK-LABEL: atomic16_xchg_monotonic 479; CHECK: call i16 @__tsan_atomic16_exchange(i16* %a, i16 0, i32 0), !dbg 480 481define void @atomic16_add_monotonic(i16* %a) nounwind uwtable { 482entry: 483 atomicrmw add i16* %a, i16 0 monotonic, !dbg !7 484 ret void, !dbg !7 485} 486; CHECK-LABEL: atomic16_add_monotonic 487; CHECK: call i16 @__tsan_atomic16_fetch_add(i16* %a, i16 0, i32 0), !dbg 488 489define void @atomic16_sub_monotonic(i16* %a) nounwind uwtable { 490entry: 491 atomicrmw sub i16* %a, i16 0 monotonic, !dbg !7 492 ret void, !dbg !7 493} 494; CHECK-LABEL: atomic16_sub_monotonic 495; CHECK: call i16 @__tsan_atomic16_fetch_sub(i16* %a, i16 0, i32 0), !dbg 496 497define void @atomic16_and_monotonic(i16* %a) nounwind uwtable { 498entry: 499 atomicrmw and i16* %a, i16 0 monotonic, !dbg !7 500 ret void, !dbg !7 501} 502; CHECK-LABEL: atomic16_and_monotonic 503; CHECK: call i16 @__tsan_atomic16_fetch_and(i16* %a, i16 0, i32 0), !dbg 504 505define void @atomic16_or_monotonic(i16* %a) nounwind uwtable { 506entry: 507 atomicrmw or i16* %a, i16 0 monotonic, !dbg !7 508 ret void, !dbg !7 509} 510; CHECK-LABEL: atomic16_or_monotonic 511; CHECK: call i16 @__tsan_atomic16_fetch_or(i16* %a, i16 0, i32 0), !dbg 512 513define void @atomic16_xor_monotonic(i16* %a) nounwind uwtable { 514entry: 515 atomicrmw xor i16* %a, i16 0 monotonic, !dbg !7 516 ret void, !dbg !7 517} 518; CHECK-LABEL: atomic16_xor_monotonic 519; CHECK: call i16 @__tsan_atomic16_fetch_xor(i16* %a, i16 0, i32 0), !dbg 520 521define void @atomic16_nand_monotonic(i16* %a) nounwind uwtable { 522entry: 523 atomicrmw nand i16* %a, i16 0 monotonic, !dbg !7 524 ret void, !dbg !7 525} 526; CHECK-LABEL: atomic16_nand_monotonic 527; CHECK: call i16 @__tsan_atomic16_fetch_nand(i16* %a, i16 0, i32 0), !dbg 528 529define void @atomic16_xchg_acquire(i16* %a) nounwind uwtable { 530entry: 531 atomicrmw xchg i16* %a, i16 0 acquire, !dbg !7 532 ret void, !dbg !7 533} 534; CHECK-LABEL: atomic16_xchg_acquire 535; CHECK: call i16 @__tsan_atomic16_exchange(i16* %a, i16 0, i32 2), !dbg 536 537define void @atomic16_add_acquire(i16* %a) nounwind uwtable { 538entry: 539 atomicrmw add i16* %a, i16 0 acquire, !dbg !7 540 ret void, !dbg !7 541} 542; CHECK-LABEL: atomic16_add_acquire 543; CHECK: call i16 @__tsan_atomic16_fetch_add(i16* %a, i16 0, i32 2), !dbg 544 545define void @atomic16_sub_acquire(i16* %a) nounwind uwtable { 546entry: 547 atomicrmw sub i16* %a, i16 0 acquire, !dbg !7 548 ret void, !dbg !7 549} 550; CHECK-LABEL: atomic16_sub_acquire 551; CHECK: call i16 @__tsan_atomic16_fetch_sub(i16* %a, i16 0, i32 2), !dbg 552 553define void @atomic16_and_acquire(i16* %a) nounwind uwtable { 554entry: 555 atomicrmw and i16* %a, i16 0 acquire, !dbg !7 556 ret void, !dbg !7 557} 558; CHECK-LABEL: atomic16_and_acquire 559; CHECK: call i16 @__tsan_atomic16_fetch_and(i16* %a, i16 0, i32 2), !dbg 560 561define void @atomic16_or_acquire(i16* %a) nounwind uwtable { 562entry: 563 atomicrmw or i16* %a, i16 0 acquire, !dbg !7 564 ret void, !dbg !7 565} 566; CHECK-LABEL: atomic16_or_acquire 567; CHECK: call i16 @__tsan_atomic16_fetch_or(i16* %a, i16 0, i32 2), !dbg 568 569define void @atomic16_xor_acquire(i16* %a) nounwind uwtable { 570entry: 571 atomicrmw xor i16* %a, i16 0 acquire, !dbg !7 572 ret void, !dbg !7 573} 574; CHECK-LABEL: atomic16_xor_acquire 575; CHECK: call i16 @__tsan_atomic16_fetch_xor(i16* %a, i16 0, i32 2), !dbg 576 577define void @atomic16_nand_acquire(i16* %a) nounwind uwtable { 578entry: 579 atomicrmw nand i16* %a, i16 0 acquire, !dbg !7 580 ret void, !dbg !7 581} 582; CHECK-LABEL: atomic16_nand_acquire 583; CHECK: call i16 @__tsan_atomic16_fetch_nand(i16* %a, i16 0, i32 2), !dbg 584 585define void @atomic16_xchg_release(i16* %a) nounwind uwtable { 586entry: 587 atomicrmw xchg i16* %a, i16 0 release, !dbg !7 588 ret void, !dbg !7 589} 590; CHECK-LABEL: atomic16_xchg_release 591; CHECK: call i16 @__tsan_atomic16_exchange(i16* %a, i16 0, i32 3), !dbg 592 593define void @atomic16_add_release(i16* %a) nounwind uwtable { 594entry: 595 atomicrmw add i16* %a, i16 0 release, !dbg !7 596 ret void, !dbg !7 597} 598; CHECK-LABEL: atomic16_add_release 599; CHECK: call i16 @__tsan_atomic16_fetch_add(i16* %a, i16 0, i32 3), !dbg 600 601define void @atomic16_sub_release(i16* %a) nounwind uwtable { 602entry: 603 atomicrmw sub i16* %a, i16 0 release, !dbg !7 604 ret void, !dbg !7 605} 606; CHECK-LABEL: atomic16_sub_release 607; CHECK: call i16 @__tsan_atomic16_fetch_sub(i16* %a, i16 0, i32 3), !dbg 608 609define void @atomic16_and_release(i16* %a) nounwind uwtable { 610entry: 611 atomicrmw and i16* %a, i16 0 release, !dbg !7 612 ret void, !dbg !7 613} 614; CHECK-LABEL: atomic16_and_release 615; CHECK: call i16 @__tsan_atomic16_fetch_and(i16* %a, i16 0, i32 3), !dbg 616 617define void @atomic16_or_release(i16* %a) nounwind uwtable { 618entry: 619 atomicrmw or i16* %a, i16 0 release, !dbg !7 620 ret void, !dbg !7 621} 622; CHECK-LABEL: atomic16_or_release 623; CHECK: call i16 @__tsan_atomic16_fetch_or(i16* %a, i16 0, i32 3), !dbg 624 625define void @atomic16_xor_release(i16* %a) nounwind uwtable { 626entry: 627 atomicrmw xor i16* %a, i16 0 release, !dbg !7 628 ret void, !dbg !7 629} 630; CHECK-LABEL: atomic16_xor_release 631; CHECK: call i16 @__tsan_atomic16_fetch_xor(i16* %a, i16 0, i32 3), !dbg 632 633define void @atomic16_nand_release(i16* %a) nounwind uwtable { 634entry: 635 atomicrmw nand i16* %a, i16 0 release, !dbg !7 636 ret void, !dbg !7 637} 638; CHECK-LABEL: atomic16_nand_release 639; CHECK: call i16 @__tsan_atomic16_fetch_nand(i16* %a, i16 0, i32 3), !dbg 640 641define void @atomic16_xchg_acq_rel(i16* %a) nounwind uwtable { 642entry: 643 atomicrmw xchg i16* %a, i16 0 acq_rel, !dbg !7 644 ret void, !dbg !7 645} 646; CHECK-LABEL: atomic16_xchg_acq_rel 647; CHECK: call i16 @__tsan_atomic16_exchange(i16* %a, i16 0, i32 4), !dbg 648 649define void @atomic16_add_acq_rel(i16* %a) nounwind uwtable { 650entry: 651 atomicrmw add i16* %a, i16 0 acq_rel, !dbg !7 652 ret void, !dbg !7 653} 654; CHECK-LABEL: atomic16_add_acq_rel 655; CHECK: call i16 @__tsan_atomic16_fetch_add(i16* %a, i16 0, i32 4), !dbg 656 657define void @atomic16_sub_acq_rel(i16* %a) nounwind uwtable { 658entry: 659 atomicrmw sub i16* %a, i16 0 acq_rel, !dbg !7 660 ret void, !dbg !7 661} 662; CHECK-LABEL: atomic16_sub_acq_rel 663; CHECK: call i16 @__tsan_atomic16_fetch_sub(i16* %a, i16 0, i32 4), !dbg 664 665define void @atomic16_and_acq_rel(i16* %a) nounwind uwtable { 666entry: 667 atomicrmw and i16* %a, i16 0 acq_rel, !dbg !7 668 ret void, !dbg !7 669} 670; CHECK-LABEL: atomic16_and_acq_rel 671; CHECK: call i16 @__tsan_atomic16_fetch_and(i16* %a, i16 0, i32 4), !dbg 672 673define void @atomic16_or_acq_rel(i16* %a) nounwind uwtable { 674entry: 675 atomicrmw or i16* %a, i16 0 acq_rel, !dbg !7 676 ret void, !dbg !7 677} 678; CHECK-LABEL: atomic16_or_acq_rel 679; CHECK: call i16 @__tsan_atomic16_fetch_or(i16* %a, i16 0, i32 4), !dbg 680 681define void @atomic16_xor_acq_rel(i16* %a) nounwind uwtable { 682entry: 683 atomicrmw xor i16* %a, i16 0 acq_rel, !dbg !7 684 ret void, !dbg !7 685} 686; CHECK-LABEL: atomic16_xor_acq_rel 687; CHECK: call i16 @__tsan_atomic16_fetch_xor(i16* %a, i16 0, i32 4), !dbg 688 689define void @atomic16_nand_acq_rel(i16* %a) nounwind uwtable { 690entry: 691 atomicrmw nand i16* %a, i16 0 acq_rel, !dbg !7 692 ret void, !dbg !7 693} 694; CHECK-LABEL: atomic16_nand_acq_rel 695; CHECK: call i16 @__tsan_atomic16_fetch_nand(i16* %a, i16 0, i32 4), !dbg 696 697define void @atomic16_xchg_seq_cst(i16* %a) nounwind uwtable { 698entry: 699 atomicrmw xchg i16* %a, i16 0 seq_cst, !dbg !7 700 ret void, !dbg !7 701} 702; CHECK-LABEL: atomic16_xchg_seq_cst 703; CHECK: call i16 @__tsan_atomic16_exchange(i16* %a, i16 0, i32 5), !dbg 704 705define void @atomic16_add_seq_cst(i16* %a) nounwind uwtable { 706entry: 707 atomicrmw add i16* %a, i16 0 seq_cst, !dbg !7 708 ret void, !dbg !7 709} 710; CHECK-LABEL: atomic16_add_seq_cst 711; CHECK: call i16 @__tsan_atomic16_fetch_add(i16* %a, i16 0, i32 5), !dbg 712 713define void @atomic16_sub_seq_cst(i16* %a) nounwind uwtable { 714entry: 715 atomicrmw sub i16* %a, i16 0 seq_cst, !dbg !7 716 ret void, !dbg !7 717} 718; CHECK-LABEL: atomic16_sub_seq_cst 719; CHECK: call i16 @__tsan_atomic16_fetch_sub(i16* %a, i16 0, i32 5), !dbg 720 721define void @atomic16_and_seq_cst(i16* %a) nounwind uwtable { 722entry: 723 atomicrmw and i16* %a, i16 0 seq_cst, !dbg !7 724 ret void, !dbg !7 725} 726; CHECK-LABEL: atomic16_and_seq_cst 727; CHECK: call i16 @__tsan_atomic16_fetch_and(i16* %a, i16 0, i32 5), !dbg 728 729define void @atomic16_or_seq_cst(i16* %a) nounwind uwtable { 730entry: 731 atomicrmw or i16* %a, i16 0 seq_cst, !dbg !7 732 ret void, !dbg !7 733} 734; CHECK-LABEL: atomic16_or_seq_cst 735; CHECK: call i16 @__tsan_atomic16_fetch_or(i16* %a, i16 0, i32 5), !dbg 736 737define void @atomic16_xor_seq_cst(i16* %a) nounwind uwtable { 738entry: 739 atomicrmw xor i16* %a, i16 0 seq_cst, !dbg !7 740 ret void, !dbg !7 741} 742; CHECK-LABEL: atomic16_xor_seq_cst 743; CHECK: call i16 @__tsan_atomic16_fetch_xor(i16* %a, i16 0, i32 5), !dbg 744 745define void @atomic16_nand_seq_cst(i16* %a) nounwind uwtable { 746entry: 747 atomicrmw nand i16* %a, i16 0 seq_cst, !dbg !7 748 ret void, !dbg !7 749} 750; CHECK-LABEL: atomic16_nand_seq_cst 751; CHECK: call i16 @__tsan_atomic16_fetch_nand(i16* %a, i16 0, i32 5), !dbg 752 753define void @atomic16_cas_monotonic(i16* %a) nounwind uwtable { 754entry: 755 cmpxchg i16* %a, i16 0, i16 1 monotonic monotonic, !dbg !7 756 cmpxchg i16* %a, i16 0, i16 1 monotonic acquire, !dbg !7 757 cmpxchg i16* %a, i16 0, i16 1 monotonic seq_cst, !dbg !7 758 ret void, !dbg !7 759} 760; CHECK-LABEL: atomic16_cas_monotonic 761; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 0, i32 0), !dbg 762; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 0, i32 2), !dbg 763; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 0, i32 5), !dbg 764 765define void @atomic16_cas_acquire(i16* %a) nounwind uwtable { 766entry: 767 cmpxchg i16* %a, i16 0, i16 1 acquire monotonic, !dbg !7 768 cmpxchg i16* %a, i16 0, i16 1 acquire acquire, !dbg !7 769 cmpxchg i16* %a, i16 0, i16 1 acquire seq_cst, !dbg !7 770 ret void, !dbg !7 771} 772; CHECK-LABEL: atomic16_cas_acquire 773; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 2, i32 0), !dbg 774; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 2, i32 2), !dbg 775; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 2, i32 5), !dbg 776 777define void @atomic16_cas_release(i16* %a) nounwind uwtable { 778entry: 779 cmpxchg i16* %a, i16 0, i16 1 release monotonic, !dbg !7 780 cmpxchg i16* %a, i16 0, i16 1 release acquire, !dbg !7 781 cmpxchg i16* %a, i16 0, i16 1 release seq_cst, !dbg !7 782 ret void, !dbg !7 783} 784; CHECK-LABEL: atomic16_cas_release 785; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 3, i32 0), !dbg 786; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 3, i32 2), !dbg 787; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 3, i32 5), !dbg 788 789define void @atomic16_cas_acq_rel(i16* %a) nounwind uwtable { 790entry: 791 cmpxchg i16* %a, i16 0, i16 1 acq_rel monotonic, !dbg !7 792 cmpxchg i16* %a, i16 0, i16 1 acq_rel acquire, !dbg !7 793 cmpxchg i16* %a, i16 0, i16 1 acq_rel seq_cst, !dbg !7 794 ret void, !dbg !7 795} 796; CHECK-LABEL: atomic16_cas_acq_rel 797; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 4, i32 0), !dbg 798; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 4, i32 2), !dbg 799; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 4, i32 5), !dbg 800 801define void @atomic16_cas_seq_cst(i16* %a) nounwind uwtable { 802entry: 803 cmpxchg i16* %a, i16 0, i16 1 seq_cst monotonic, !dbg !7 804 cmpxchg i16* %a, i16 0, i16 1 seq_cst acquire, !dbg !7 805 cmpxchg i16* %a, i16 0, i16 1 seq_cst seq_cst, !dbg !7 806 ret void, !dbg !7 807} 808; CHECK-LABEL: atomic16_cas_seq_cst 809; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 5, i32 0), !dbg 810; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 5, i32 2), !dbg 811; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 5, i32 5), !dbg 812 813define i32 @atomic32_load_unordered(i32* %a) nounwind uwtable { 814entry: 815 %0 = load atomic i32, i32* %a unordered, align 4, !dbg !7 816 ret i32 %0, !dbg !7 817} 818; CHECK-LABEL: atomic32_load_unordered 819; CHECK: call i32 @__tsan_atomic32_load(i32* %a, i32 0), !dbg 820 821define i32 @atomic32_load_monotonic(i32* %a) nounwind uwtable { 822entry: 823 %0 = load atomic i32, i32* %a monotonic, align 4, !dbg !7 824 ret i32 %0, !dbg !7 825} 826; CHECK-LABEL: atomic32_load_monotonic 827; CHECK: call i32 @__tsan_atomic32_load(i32* %a, i32 0), !dbg 828 829define i32 @atomic32_load_acquire(i32* %a) nounwind uwtable { 830entry: 831 %0 = load atomic i32, i32* %a acquire, align 4, !dbg !7 832 ret i32 %0, !dbg !7 833} 834; CHECK-LABEL: atomic32_load_acquire 835; CHECK: call i32 @__tsan_atomic32_load(i32* %a, i32 2), !dbg 836 837define i32 @atomic32_load_seq_cst(i32* %a) nounwind uwtable { 838entry: 839 %0 = load atomic i32, i32* %a seq_cst, align 4, !dbg !7 840 ret i32 %0, !dbg !7 841} 842; CHECK-LABEL: atomic32_load_seq_cst 843; CHECK: call i32 @__tsan_atomic32_load(i32* %a, i32 5), !dbg 844 845define void @atomic32_store_unordered(i32* %a) nounwind uwtable { 846entry: 847 store atomic i32 0, i32* %a unordered, align 4, !dbg !7 848 ret void, !dbg !7 849} 850; CHECK-LABEL: atomic32_store_unordered 851; CHECK: call void @__tsan_atomic32_store(i32* %a, i32 0, i32 0), !dbg 852 853define void @atomic32_store_monotonic(i32* %a) nounwind uwtable { 854entry: 855 store atomic i32 0, i32* %a monotonic, align 4, !dbg !7 856 ret void, !dbg !7 857} 858; CHECK-LABEL: atomic32_store_monotonic 859; CHECK: call void @__tsan_atomic32_store(i32* %a, i32 0, i32 0), !dbg 860 861define void @atomic32_store_release(i32* %a) nounwind uwtable { 862entry: 863 store atomic i32 0, i32* %a release, align 4, !dbg !7 864 ret void, !dbg !7 865} 866; CHECK-LABEL: atomic32_store_release 867; CHECK: call void @__tsan_atomic32_store(i32* %a, i32 0, i32 3), !dbg 868 869define void @atomic32_store_seq_cst(i32* %a) nounwind uwtable { 870entry: 871 store atomic i32 0, i32* %a seq_cst, align 4, !dbg !7 872 ret void, !dbg !7 873} 874; CHECK-LABEL: atomic32_store_seq_cst 875; CHECK: call void @__tsan_atomic32_store(i32* %a, i32 0, i32 5), !dbg 876 877define void @atomic32_xchg_monotonic(i32* %a) nounwind uwtable { 878entry: 879 atomicrmw xchg i32* %a, i32 0 monotonic, !dbg !7 880 ret void, !dbg !7 881} 882; CHECK-LABEL: atomic32_xchg_monotonic 883; CHECK: call i32 @__tsan_atomic32_exchange(i32* %a, i32 0, i32 0), !dbg 884 885define void @atomic32_add_monotonic(i32* %a) nounwind uwtable { 886entry: 887 atomicrmw add i32* %a, i32 0 monotonic, !dbg !7 888 ret void, !dbg !7 889} 890; CHECK-LABEL: atomic32_add_monotonic 891; CHECK: call i32 @__tsan_atomic32_fetch_add(i32* %a, i32 0, i32 0), !dbg 892 893define void @atomic32_sub_monotonic(i32* %a) nounwind uwtable { 894entry: 895 atomicrmw sub i32* %a, i32 0 monotonic, !dbg !7 896 ret void, !dbg !7 897} 898; CHECK-LABEL: atomic32_sub_monotonic 899; CHECK: call i32 @__tsan_atomic32_fetch_sub(i32* %a, i32 0, i32 0), !dbg 900 901define void @atomic32_and_monotonic(i32* %a) nounwind uwtable { 902entry: 903 atomicrmw and i32* %a, i32 0 monotonic, !dbg !7 904 ret void, !dbg !7 905} 906; CHECK-LABEL: atomic32_and_monotonic 907; CHECK: call i32 @__tsan_atomic32_fetch_and(i32* %a, i32 0, i32 0), !dbg 908 909define void @atomic32_or_monotonic(i32* %a) nounwind uwtable { 910entry: 911 atomicrmw or i32* %a, i32 0 monotonic, !dbg !7 912 ret void, !dbg !7 913} 914; CHECK-LABEL: atomic32_or_monotonic 915; CHECK: call i32 @__tsan_atomic32_fetch_or(i32* %a, i32 0, i32 0), !dbg 916 917define void @atomic32_xor_monotonic(i32* %a) nounwind uwtable { 918entry: 919 atomicrmw xor i32* %a, i32 0 monotonic, !dbg !7 920 ret void, !dbg !7 921} 922; CHECK-LABEL: atomic32_xor_monotonic 923; CHECK: call i32 @__tsan_atomic32_fetch_xor(i32* %a, i32 0, i32 0), !dbg 924 925define void @atomic32_nand_monotonic(i32* %a) nounwind uwtable { 926entry: 927 atomicrmw nand i32* %a, i32 0 monotonic, !dbg !7 928 ret void, !dbg !7 929} 930; CHECK-LABEL: atomic32_nand_monotonic 931; CHECK: call i32 @__tsan_atomic32_fetch_nand(i32* %a, i32 0, i32 0), !dbg 932 933define void @atomic32_xchg_acquire(i32* %a) nounwind uwtable { 934entry: 935 atomicrmw xchg i32* %a, i32 0 acquire, !dbg !7 936 ret void, !dbg !7 937} 938; CHECK-LABEL: atomic32_xchg_acquire 939; CHECK: call i32 @__tsan_atomic32_exchange(i32* %a, i32 0, i32 2), !dbg 940 941define void @atomic32_add_acquire(i32* %a) nounwind uwtable { 942entry: 943 atomicrmw add i32* %a, i32 0 acquire, !dbg !7 944 ret void, !dbg !7 945} 946; CHECK-LABEL: atomic32_add_acquire 947; CHECK: call i32 @__tsan_atomic32_fetch_add(i32* %a, i32 0, i32 2), !dbg 948 949define void @atomic32_sub_acquire(i32* %a) nounwind uwtable { 950entry: 951 atomicrmw sub i32* %a, i32 0 acquire, !dbg !7 952 ret void, !dbg !7 953} 954; CHECK-LABEL: atomic32_sub_acquire 955; CHECK: call i32 @__tsan_atomic32_fetch_sub(i32* %a, i32 0, i32 2), !dbg 956 957define void @atomic32_and_acquire(i32* %a) nounwind uwtable { 958entry: 959 atomicrmw and i32* %a, i32 0 acquire, !dbg !7 960 ret void, !dbg !7 961} 962; CHECK-LABEL: atomic32_and_acquire 963; CHECK: call i32 @__tsan_atomic32_fetch_and(i32* %a, i32 0, i32 2), !dbg 964 965define void @atomic32_or_acquire(i32* %a) nounwind uwtable { 966entry: 967 atomicrmw or i32* %a, i32 0 acquire, !dbg !7 968 ret void, !dbg !7 969} 970; CHECK-LABEL: atomic32_or_acquire 971; CHECK: call i32 @__tsan_atomic32_fetch_or(i32* %a, i32 0, i32 2), !dbg 972 973define void @atomic32_xor_acquire(i32* %a) nounwind uwtable { 974entry: 975 atomicrmw xor i32* %a, i32 0 acquire, !dbg !7 976 ret void, !dbg !7 977} 978; CHECK-LABEL: atomic32_xor_acquire 979; CHECK: call i32 @__tsan_atomic32_fetch_xor(i32* %a, i32 0, i32 2), !dbg 980 981define void @atomic32_nand_acquire(i32* %a) nounwind uwtable { 982entry: 983 atomicrmw nand i32* %a, i32 0 acquire, !dbg !7 984 ret void, !dbg !7 985} 986; CHECK-LABEL: atomic32_nand_acquire 987; CHECK: call i32 @__tsan_atomic32_fetch_nand(i32* %a, i32 0, i32 2), !dbg 988 989define void @atomic32_xchg_release(i32* %a) nounwind uwtable { 990entry: 991 atomicrmw xchg i32* %a, i32 0 release, !dbg !7 992 ret void, !dbg !7 993} 994; CHECK-LABEL: atomic32_xchg_release 995; CHECK: call i32 @__tsan_atomic32_exchange(i32* %a, i32 0, i32 3), !dbg 996 997define void @atomic32_add_release(i32* %a) nounwind uwtable { 998entry: 999 atomicrmw add i32* %a, i32 0 release, !dbg !7 1000 ret void, !dbg !7 1001} 1002; CHECK-LABEL: atomic32_add_release 1003; CHECK: call i32 @__tsan_atomic32_fetch_add(i32* %a, i32 0, i32 3), !dbg 1004 1005define void @atomic32_sub_release(i32* %a) nounwind uwtable { 1006entry: 1007 atomicrmw sub i32* %a, i32 0 release, !dbg !7 1008 ret void, !dbg !7 1009} 1010; CHECK-LABEL: atomic32_sub_release 1011; CHECK: call i32 @__tsan_atomic32_fetch_sub(i32* %a, i32 0, i32 3), !dbg 1012 1013define void @atomic32_and_release(i32* %a) nounwind uwtable { 1014entry: 1015 atomicrmw and i32* %a, i32 0 release, !dbg !7 1016 ret void, !dbg !7 1017} 1018; CHECK-LABEL: atomic32_and_release 1019; CHECK: call i32 @__tsan_atomic32_fetch_and(i32* %a, i32 0, i32 3), !dbg 1020 1021define void @atomic32_or_release(i32* %a) nounwind uwtable { 1022entry: 1023 atomicrmw or i32* %a, i32 0 release, !dbg !7 1024 ret void, !dbg !7 1025} 1026; CHECK-LABEL: atomic32_or_release 1027; CHECK: call i32 @__tsan_atomic32_fetch_or(i32* %a, i32 0, i32 3), !dbg 1028 1029define void @atomic32_xor_release(i32* %a) nounwind uwtable { 1030entry: 1031 atomicrmw xor i32* %a, i32 0 release, !dbg !7 1032 ret void, !dbg !7 1033} 1034; CHECK-LABEL: atomic32_xor_release 1035; CHECK: call i32 @__tsan_atomic32_fetch_xor(i32* %a, i32 0, i32 3), !dbg 1036 1037define void @atomic32_nand_release(i32* %a) nounwind uwtable { 1038entry: 1039 atomicrmw nand i32* %a, i32 0 release, !dbg !7 1040 ret void, !dbg !7 1041} 1042; CHECK-LABEL: atomic32_nand_release 1043; CHECK: call i32 @__tsan_atomic32_fetch_nand(i32* %a, i32 0, i32 3), !dbg 1044 1045define void @atomic32_xchg_acq_rel(i32* %a) nounwind uwtable { 1046entry: 1047 atomicrmw xchg i32* %a, i32 0 acq_rel, !dbg !7 1048 ret void, !dbg !7 1049} 1050; CHECK-LABEL: atomic32_xchg_acq_rel 1051; CHECK: call i32 @__tsan_atomic32_exchange(i32* %a, i32 0, i32 4), !dbg 1052 1053define void @atomic32_add_acq_rel(i32* %a) nounwind uwtable { 1054entry: 1055 atomicrmw add i32* %a, i32 0 acq_rel, !dbg !7 1056 ret void, !dbg !7 1057} 1058; CHECK-LABEL: atomic32_add_acq_rel 1059; CHECK: call i32 @__tsan_atomic32_fetch_add(i32* %a, i32 0, i32 4), !dbg 1060 1061define void @atomic32_sub_acq_rel(i32* %a) nounwind uwtable { 1062entry: 1063 atomicrmw sub i32* %a, i32 0 acq_rel, !dbg !7 1064 ret void, !dbg !7 1065} 1066; CHECK-LABEL: atomic32_sub_acq_rel 1067; CHECK: call i32 @__tsan_atomic32_fetch_sub(i32* %a, i32 0, i32 4), !dbg 1068 1069define void @atomic32_and_acq_rel(i32* %a) nounwind uwtable { 1070entry: 1071 atomicrmw and i32* %a, i32 0 acq_rel, !dbg !7 1072 ret void, !dbg !7 1073} 1074; CHECK-LABEL: atomic32_and_acq_rel 1075; CHECK: call i32 @__tsan_atomic32_fetch_and(i32* %a, i32 0, i32 4), !dbg 1076 1077define void @atomic32_or_acq_rel(i32* %a) nounwind uwtable { 1078entry: 1079 atomicrmw or i32* %a, i32 0 acq_rel, !dbg !7 1080 ret void, !dbg !7 1081} 1082; CHECK-LABEL: atomic32_or_acq_rel 1083; CHECK: call i32 @__tsan_atomic32_fetch_or(i32* %a, i32 0, i32 4), !dbg 1084 1085define void @atomic32_xor_acq_rel(i32* %a) nounwind uwtable { 1086entry: 1087 atomicrmw xor i32* %a, i32 0 acq_rel, !dbg !7 1088 ret void, !dbg !7 1089} 1090; CHECK-LABEL: atomic32_xor_acq_rel 1091; CHECK: call i32 @__tsan_atomic32_fetch_xor(i32* %a, i32 0, i32 4), !dbg 1092 1093define void @atomic32_nand_acq_rel(i32* %a) nounwind uwtable { 1094entry: 1095 atomicrmw nand i32* %a, i32 0 acq_rel, !dbg !7 1096 ret void, !dbg !7 1097} 1098; CHECK-LABEL: atomic32_nand_acq_rel 1099; CHECK: call i32 @__tsan_atomic32_fetch_nand(i32* %a, i32 0, i32 4), !dbg 1100 1101define void @atomic32_xchg_seq_cst(i32* %a) nounwind uwtable { 1102entry: 1103 atomicrmw xchg i32* %a, i32 0 seq_cst, !dbg !7 1104 ret void, !dbg !7 1105} 1106; CHECK-LABEL: atomic32_xchg_seq_cst 1107; CHECK: call i32 @__tsan_atomic32_exchange(i32* %a, i32 0, i32 5), !dbg 1108 1109define void @atomic32_add_seq_cst(i32* %a) nounwind uwtable { 1110entry: 1111 atomicrmw add i32* %a, i32 0 seq_cst, !dbg !7 1112 ret void, !dbg !7 1113} 1114; CHECK-LABEL: atomic32_add_seq_cst 1115; CHECK: call i32 @__tsan_atomic32_fetch_add(i32* %a, i32 0, i32 5), !dbg 1116 1117define void @atomic32_sub_seq_cst(i32* %a) nounwind uwtable { 1118entry: 1119 atomicrmw sub i32* %a, i32 0 seq_cst, !dbg !7 1120 ret void, !dbg !7 1121} 1122; CHECK-LABEL: atomic32_sub_seq_cst 1123; CHECK: call i32 @__tsan_atomic32_fetch_sub(i32* %a, i32 0, i32 5), !dbg 1124 1125define void @atomic32_and_seq_cst(i32* %a) nounwind uwtable { 1126entry: 1127 atomicrmw and i32* %a, i32 0 seq_cst, !dbg !7 1128 ret void, !dbg !7 1129} 1130; CHECK-LABEL: atomic32_and_seq_cst 1131; CHECK: call i32 @__tsan_atomic32_fetch_and(i32* %a, i32 0, i32 5), !dbg 1132 1133define void @atomic32_or_seq_cst(i32* %a) nounwind uwtable { 1134entry: 1135 atomicrmw or i32* %a, i32 0 seq_cst, !dbg !7 1136 ret void, !dbg !7 1137} 1138; CHECK-LABEL: atomic32_or_seq_cst 1139; CHECK: call i32 @__tsan_atomic32_fetch_or(i32* %a, i32 0, i32 5), !dbg 1140 1141define void @atomic32_xor_seq_cst(i32* %a) nounwind uwtable { 1142entry: 1143 atomicrmw xor i32* %a, i32 0 seq_cst, !dbg !7 1144 ret void, !dbg !7 1145} 1146; CHECK-LABEL: atomic32_xor_seq_cst 1147; CHECK: call i32 @__tsan_atomic32_fetch_xor(i32* %a, i32 0, i32 5), !dbg 1148 1149define void @atomic32_nand_seq_cst(i32* %a) nounwind uwtable { 1150entry: 1151 atomicrmw nand i32* %a, i32 0 seq_cst, !dbg !7 1152 ret void, !dbg !7 1153} 1154; CHECK-LABEL: atomic32_nand_seq_cst 1155; CHECK: call i32 @__tsan_atomic32_fetch_nand(i32* %a, i32 0, i32 5), !dbg 1156 1157define void @atomic32_cas_monotonic(i32* %a) nounwind uwtable { 1158entry: 1159 cmpxchg i32* %a, i32 0, i32 1 monotonic monotonic, !dbg !7 1160 cmpxchg i32* %a, i32 0, i32 1 monotonic acquire, !dbg !7 1161 cmpxchg i32* %a, i32 0, i32 1 monotonic seq_cst, !dbg !7 1162 ret void, !dbg !7 1163} 1164; CHECK-LABEL: atomic32_cas_monotonic 1165; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 0, i32 0), !dbg 1166; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 0, i32 2), !dbg 1167; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 0, i32 5), !dbg 1168 1169define void @atomic32_cas_acquire(i32* %a) nounwind uwtable { 1170entry: 1171 cmpxchg i32* %a, i32 0, i32 1 acquire monotonic, !dbg !7 1172 cmpxchg i32* %a, i32 0, i32 1 acquire acquire, !dbg !7 1173 cmpxchg i32* %a, i32 0, i32 1 acquire seq_cst, !dbg !7 1174 ret void, !dbg !7 1175} 1176; CHECK-LABEL: atomic32_cas_acquire 1177; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 2, i32 0), !dbg 1178; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 2, i32 2), !dbg 1179; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 2, i32 5), !dbg 1180 1181define void @atomic32_cas_release(i32* %a) nounwind uwtable { 1182entry: 1183 cmpxchg i32* %a, i32 0, i32 1 release monotonic, !dbg !7 1184 cmpxchg i32* %a, i32 0, i32 1 release acquire, !dbg !7 1185 cmpxchg i32* %a, i32 0, i32 1 release seq_cst, !dbg !7 1186 ret void, !dbg !7 1187} 1188; CHECK-LABEL: atomic32_cas_release 1189; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 3, i32 0), !dbg 1190; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 3, i32 2), !dbg 1191; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 3, i32 5), !dbg 1192 1193define void @atomic32_cas_acq_rel(i32* %a) nounwind uwtable { 1194entry: 1195 cmpxchg i32* %a, i32 0, i32 1 acq_rel monotonic, !dbg !7 1196 cmpxchg i32* %a, i32 0, i32 1 acq_rel acquire, !dbg !7 1197 cmpxchg i32* %a, i32 0, i32 1 acq_rel seq_cst, !dbg !7 1198 ret void, !dbg !7 1199} 1200; CHECK-LABEL: atomic32_cas_acq_rel 1201; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 4, i32 0), !dbg 1202; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 4, i32 2), !dbg 1203; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 4, i32 5), !dbg 1204 1205define void @atomic32_cas_seq_cst(i32* %a) nounwind uwtable { 1206entry: 1207 cmpxchg i32* %a, i32 0, i32 1 seq_cst monotonic, !dbg !7 1208 cmpxchg i32* %a, i32 0, i32 1 seq_cst acquire, !dbg !7 1209 cmpxchg i32* %a, i32 0, i32 1 seq_cst seq_cst, !dbg !7 1210 ret void, !dbg !7 1211} 1212; CHECK-LABEL: atomic32_cas_seq_cst 1213; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 5, i32 0), !dbg 1214; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 5, i32 2), !dbg 1215; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 5, i32 5), !dbg 1216 1217define i64 @atomic64_load_unordered(i64* %a) nounwind uwtable { 1218entry: 1219 %0 = load atomic i64, i64* %a unordered, align 8, !dbg !7 1220 ret i64 %0, !dbg !7 1221} 1222; CHECK-LABEL: atomic64_load_unordered 1223; CHECK: call i64 @__tsan_atomic64_load(i64* %a, i32 0), !dbg 1224 1225define i64 @atomic64_load_monotonic(i64* %a) nounwind uwtable { 1226entry: 1227 %0 = load atomic i64, i64* %a monotonic, align 8, !dbg !7 1228 ret i64 %0, !dbg !7 1229} 1230; CHECK-LABEL: atomic64_load_monotonic 1231; CHECK: call i64 @__tsan_atomic64_load(i64* %a, i32 0), !dbg 1232 1233define i64 @atomic64_load_acquire(i64* %a) nounwind uwtable { 1234entry: 1235 %0 = load atomic i64, i64* %a acquire, align 8, !dbg !7 1236 ret i64 %0, !dbg !7 1237} 1238; CHECK-LABEL: atomic64_load_acquire 1239; CHECK: call i64 @__tsan_atomic64_load(i64* %a, i32 2), !dbg 1240 1241define i64 @atomic64_load_seq_cst(i64* %a) nounwind uwtable { 1242entry: 1243 %0 = load atomic i64, i64* %a seq_cst, align 8, !dbg !7 1244 ret i64 %0, !dbg !7 1245} 1246; CHECK-LABEL: atomic64_load_seq_cst 1247; CHECK: call i64 @__tsan_atomic64_load(i64* %a, i32 5), !dbg 1248 1249define i8* @atomic64_load_seq_cst_ptr_ty(i8** %a) nounwind uwtable { 1250entry: 1251 %0 = load atomic i8*, i8** %a seq_cst, align 8, !dbg !7 1252 ret i8* %0, !dbg !7 1253} 1254; CHECK-LABEL: atomic64_load_seq_cst 1255; CHECK: bitcast i8** %{{.+}} to i64* 1256; CHECK-NEXT: call i64 @__tsan_atomic64_load(i64* %{{.+}}, i32 5), !dbg 1257; CHECK-NEXT: inttoptr i64 %{{.+}} to i8* 1258 1259define void @atomic64_store_unordered(i64* %a) nounwind uwtable { 1260entry: 1261 store atomic i64 0, i64* %a unordered, align 8, !dbg !7 1262 ret void, !dbg !7 1263} 1264; CHECK-LABEL: atomic64_store_unordered 1265; CHECK: call void @__tsan_atomic64_store(i64* %a, i64 0, i32 0), !dbg 1266 1267define void @atomic64_store_monotonic(i64* %a) nounwind uwtable { 1268entry: 1269 store atomic i64 0, i64* %a monotonic, align 8, !dbg !7 1270 ret void, !dbg !7 1271} 1272; CHECK-LABEL: atomic64_store_monotonic 1273; CHECK: call void @__tsan_atomic64_store(i64* %a, i64 0, i32 0), !dbg 1274 1275define void @atomic64_store_release(i64* %a) nounwind uwtable { 1276entry: 1277 store atomic i64 0, i64* %a release, align 8, !dbg !7 1278 ret void, !dbg !7 1279} 1280; CHECK-LABEL: atomic64_store_release 1281; CHECK: call void @__tsan_atomic64_store(i64* %a, i64 0, i32 3), !dbg 1282 1283define void @atomic64_store_seq_cst(i64* %a) nounwind uwtable { 1284entry: 1285 store atomic i64 0, i64* %a seq_cst, align 8, !dbg !7 1286 ret void, !dbg !7 1287} 1288; CHECK-LABEL: atomic64_store_seq_cst 1289; CHECK: call void @__tsan_atomic64_store(i64* %a, i64 0, i32 5), !dbg 1290 1291define void @atomic64_store_seq_cst_ptr_ty(i8** %a, i8* %v) nounwind uwtable { 1292entry: 1293 store atomic i8* %v, i8** %a seq_cst, align 8, !dbg !7 1294 ret void, !dbg !7 1295} 1296; CHECK-LABEL: atomic64_store_seq_cst 1297; CHECK: %{{.*}} = bitcast i8** %{{.*}} to i64* 1298; CHECK-NEXT: %{{.*}} = ptrtoint i8* %{{.*}} to i64 1299; CHECK-NEXT: call void @__tsan_atomic64_store(i64* %{{.*}}, i64 %{{.*}}, i32 5), !dbg 1300 1301define void @atomic64_xchg_monotonic(i64* %a) nounwind uwtable { 1302entry: 1303 atomicrmw xchg i64* %a, i64 0 monotonic, !dbg !7 1304 ret void, !dbg !7 1305} 1306; CHECK-LABEL: atomic64_xchg_monotonic 1307; CHECK: call i64 @__tsan_atomic64_exchange(i64* %a, i64 0, i32 0), !dbg 1308 1309define void @atomic64_add_monotonic(i64* %a) nounwind uwtable { 1310entry: 1311 atomicrmw add i64* %a, i64 0 monotonic, !dbg !7 1312 ret void, !dbg !7 1313} 1314; CHECK-LABEL: atomic64_add_monotonic 1315; CHECK: call i64 @__tsan_atomic64_fetch_add(i64* %a, i64 0, i32 0), !dbg 1316 1317define void @atomic64_sub_monotonic(i64* %a) nounwind uwtable { 1318entry: 1319 atomicrmw sub i64* %a, i64 0 monotonic, !dbg !7 1320 ret void, !dbg !7 1321} 1322; CHECK-LABEL: atomic64_sub_monotonic 1323; CHECK: call i64 @__tsan_atomic64_fetch_sub(i64* %a, i64 0, i32 0), !dbg 1324 1325define void @atomic64_and_monotonic(i64* %a) nounwind uwtable { 1326entry: 1327 atomicrmw and i64* %a, i64 0 monotonic, !dbg !7 1328 ret void, !dbg !7 1329} 1330; CHECK-LABEL: atomic64_and_monotonic 1331; CHECK: call i64 @__tsan_atomic64_fetch_and(i64* %a, i64 0, i32 0), !dbg 1332 1333define void @atomic64_or_monotonic(i64* %a) nounwind uwtable { 1334entry: 1335 atomicrmw or i64* %a, i64 0 monotonic, !dbg !7 1336 ret void, !dbg !7 1337} 1338; CHECK-LABEL: atomic64_or_monotonic 1339; CHECK: call i64 @__tsan_atomic64_fetch_or(i64* %a, i64 0, i32 0), !dbg 1340 1341define void @atomic64_xor_monotonic(i64* %a) nounwind uwtable { 1342entry: 1343 atomicrmw xor i64* %a, i64 0 monotonic, !dbg !7 1344 ret void, !dbg !7 1345} 1346; CHECK-LABEL: atomic64_xor_monotonic 1347; CHECK: call i64 @__tsan_atomic64_fetch_xor(i64* %a, i64 0, i32 0), !dbg 1348 1349define void @atomic64_nand_monotonic(i64* %a) nounwind uwtable { 1350entry: 1351 atomicrmw nand i64* %a, i64 0 monotonic, !dbg !7 1352 ret void, !dbg !7 1353} 1354; CHECK-LABEL: atomic64_nand_monotonic 1355; CHECK: call i64 @__tsan_atomic64_fetch_nand(i64* %a, i64 0, i32 0), !dbg 1356 1357define void @atomic64_xchg_acquire(i64* %a) nounwind uwtable { 1358entry: 1359 atomicrmw xchg i64* %a, i64 0 acquire, !dbg !7 1360 ret void, !dbg !7 1361} 1362; CHECK-LABEL: atomic64_xchg_acquire 1363; CHECK: call i64 @__tsan_atomic64_exchange(i64* %a, i64 0, i32 2), !dbg 1364 1365define void @atomic64_add_acquire(i64* %a) nounwind uwtable { 1366entry: 1367 atomicrmw add i64* %a, i64 0 acquire, !dbg !7 1368 ret void, !dbg !7 1369} 1370; CHECK-LABEL: atomic64_add_acquire 1371; CHECK: call i64 @__tsan_atomic64_fetch_add(i64* %a, i64 0, i32 2), !dbg 1372 1373define void @atomic64_sub_acquire(i64* %a) nounwind uwtable { 1374entry: 1375 atomicrmw sub i64* %a, i64 0 acquire, !dbg !7 1376 ret void, !dbg !7 1377} 1378; CHECK-LABEL: atomic64_sub_acquire 1379; CHECK: call i64 @__tsan_atomic64_fetch_sub(i64* %a, i64 0, i32 2), !dbg 1380 1381define void @atomic64_and_acquire(i64* %a) nounwind uwtable { 1382entry: 1383 atomicrmw and i64* %a, i64 0 acquire, !dbg !7 1384 ret void, !dbg !7 1385} 1386; CHECK-LABEL: atomic64_and_acquire 1387; CHECK: call i64 @__tsan_atomic64_fetch_and(i64* %a, i64 0, i32 2), !dbg 1388 1389define void @atomic64_or_acquire(i64* %a) nounwind uwtable { 1390entry: 1391 atomicrmw or i64* %a, i64 0 acquire, !dbg !7 1392 ret void, !dbg !7 1393} 1394; CHECK-LABEL: atomic64_or_acquire 1395; CHECK: call i64 @__tsan_atomic64_fetch_or(i64* %a, i64 0, i32 2), !dbg 1396 1397define void @atomic64_xor_acquire(i64* %a) nounwind uwtable { 1398entry: 1399 atomicrmw xor i64* %a, i64 0 acquire, !dbg !7 1400 ret void, !dbg !7 1401} 1402; CHECK-LABEL: atomic64_xor_acquire 1403; CHECK: call i64 @__tsan_atomic64_fetch_xor(i64* %a, i64 0, i32 2), !dbg 1404 1405define void @atomic64_nand_acquire(i64* %a) nounwind uwtable { 1406entry: 1407 atomicrmw nand i64* %a, i64 0 acquire, !dbg !7 1408 ret void, !dbg !7 1409} 1410; CHECK-LABEL: atomic64_nand_acquire 1411; CHECK: call i64 @__tsan_atomic64_fetch_nand(i64* %a, i64 0, i32 2), !dbg 1412 1413define void @atomic64_xchg_release(i64* %a) nounwind uwtable { 1414entry: 1415 atomicrmw xchg i64* %a, i64 0 release, !dbg !7 1416 ret void, !dbg !7 1417} 1418; CHECK-LABEL: atomic64_xchg_release 1419; CHECK: call i64 @__tsan_atomic64_exchange(i64* %a, i64 0, i32 3), !dbg 1420 1421define void @atomic64_add_release(i64* %a) nounwind uwtable { 1422entry: 1423 atomicrmw add i64* %a, i64 0 release, !dbg !7 1424 ret void, !dbg !7 1425} 1426; CHECK-LABEL: atomic64_add_release 1427; CHECK: call i64 @__tsan_atomic64_fetch_add(i64* %a, i64 0, i32 3), !dbg 1428 1429define void @atomic64_sub_release(i64* %a) nounwind uwtable { 1430entry: 1431 atomicrmw sub i64* %a, i64 0 release, !dbg !7 1432 ret void, !dbg !7 1433} 1434; CHECK-LABEL: atomic64_sub_release 1435; CHECK: call i64 @__tsan_atomic64_fetch_sub(i64* %a, i64 0, i32 3), !dbg 1436 1437define void @atomic64_and_release(i64* %a) nounwind uwtable { 1438entry: 1439 atomicrmw and i64* %a, i64 0 release, !dbg !7 1440 ret void, !dbg !7 1441} 1442; CHECK-LABEL: atomic64_and_release 1443; CHECK: call i64 @__tsan_atomic64_fetch_and(i64* %a, i64 0, i32 3), !dbg 1444 1445define void @atomic64_or_release(i64* %a) nounwind uwtable { 1446entry: 1447 atomicrmw or i64* %a, i64 0 release, !dbg !7 1448 ret void, !dbg !7 1449} 1450; CHECK-LABEL: atomic64_or_release 1451; CHECK: call i64 @__tsan_atomic64_fetch_or(i64* %a, i64 0, i32 3), !dbg 1452 1453define void @atomic64_xor_release(i64* %a) nounwind uwtable { 1454entry: 1455 atomicrmw xor i64* %a, i64 0 release, !dbg !7 1456 ret void, !dbg !7 1457} 1458; CHECK-LABEL: atomic64_xor_release 1459; CHECK: call i64 @__tsan_atomic64_fetch_xor(i64* %a, i64 0, i32 3), !dbg 1460 1461define void @atomic64_nand_release(i64* %a) nounwind uwtable { 1462entry: 1463 atomicrmw nand i64* %a, i64 0 release, !dbg !7 1464 ret void, !dbg !7 1465} 1466; CHECK-LABEL: atomic64_nand_release 1467; CHECK: call i64 @__tsan_atomic64_fetch_nand(i64* %a, i64 0, i32 3), !dbg 1468 1469define void @atomic64_xchg_acq_rel(i64* %a) nounwind uwtable { 1470entry: 1471 atomicrmw xchg i64* %a, i64 0 acq_rel, !dbg !7 1472 ret void, !dbg !7 1473} 1474; CHECK-LABEL: atomic64_xchg_acq_rel 1475; CHECK: call i64 @__tsan_atomic64_exchange(i64* %a, i64 0, i32 4), !dbg 1476 1477define void @atomic64_add_acq_rel(i64* %a) nounwind uwtable { 1478entry: 1479 atomicrmw add i64* %a, i64 0 acq_rel, !dbg !7 1480 ret void, !dbg !7 1481} 1482; CHECK-LABEL: atomic64_add_acq_rel 1483; CHECK: call i64 @__tsan_atomic64_fetch_add(i64* %a, i64 0, i32 4), !dbg 1484 1485define void @atomic64_sub_acq_rel(i64* %a) nounwind uwtable { 1486entry: 1487 atomicrmw sub i64* %a, i64 0 acq_rel, !dbg !7 1488 ret void, !dbg !7 1489} 1490; CHECK-LABEL: atomic64_sub_acq_rel 1491; CHECK: call i64 @__tsan_atomic64_fetch_sub(i64* %a, i64 0, i32 4), !dbg 1492 1493define void @atomic64_and_acq_rel(i64* %a) nounwind uwtable { 1494entry: 1495 atomicrmw and i64* %a, i64 0 acq_rel, !dbg !7 1496 ret void, !dbg !7 1497} 1498; CHECK-LABEL: atomic64_and_acq_rel 1499; CHECK: call i64 @__tsan_atomic64_fetch_and(i64* %a, i64 0, i32 4), !dbg 1500 1501define void @atomic64_or_acq_rel(i64* %a) nounwind uwtable { 1502entry: 1503 atomicrmw or i64* %a, i64 0 acq_rel, !dbg !7 1504 ret void, !dbg !7 1505} 1506; CHECK-LABEL: atomic64_or_acq_rel 1507; CHECK: call i64 @__tsan_atomic64_fetch_or(i64* %a, i64 0, i32 4), !dbg 1508 1509define void @atomic64_xor_acq_rel(i64* %a) nounwind uwtable { 1510entry: 1511 atomicrmw xor i64* %a, i64 0 acq_rel, !dbg !7 1512 ret void, !dbg !7 1513} 1514; CHECK-LABEL: atomic64_xor_acq_rel 1515; CHECK: call i64 @__tsan_atomic64_fetch_xor(i64* %a, i64 0, i32 4), !dbg 1516 1517define void @atomic64_nand_acq_rel(i64* %a) nounwind uwtable { 1518entry: 1519 atomicrmw nand i64* %a, i64 0 acq_rel, !dbg !7 1520 ret void, !dbg !7 1521} 1522; CHECK-LABEL: atomic64_nand_acq_rel 1523; CHECK: call i64 @__tsan_atomic64_fetch_nand(i64* %a, i64 0, i32 4), !dbg 1524 1525define void @atomic64_xchg_seq_cst(i64* %a) nounwind uwtable { 1526entry: 1527 atomicrmw xchg i64* %a, i64 0 seq_cst, !dbg !7 1528 ret void, !dbg !7 1529} 1530; CHECK-LABEL: atomic64_xchg_seq_cst 1531; CHECK: call i64 @__tsan_atomic64_exchange(i64* %a, i64 0, i32 5), !dbg 1532 1533define void @atomic64_add_seq_cst(i64* %a) nounwind uwtable { 1534entry: 1535 atomicrmw add i64* %a, i64 0 seq_cst, !dbg !7 1536 ret void, !dbg !7 1537} 1538; CHECK-LABEL: atomic64_add_seq_cst 1539; CHECK: call i64 @__tsan_atomic64_fetch_add(i64* %a, i64 0, i32 5), !dbg 1540 1541define void @atomic64_sub_seq_cst(i64* %a) nounwind uwtable { 1542entry: 1543 atomicrmw sub i64* %a, i64 0 seq_cst, !dbg !7 1544 ret void, !dbg !7 1545} 1546; CHECK-LABEL: atomic64_sub_seq_cst 1547; CHECK: call i64 @__tsan_atomic64_fetch_sub(i64* %a, i64 0, i32 5), !dbg 1548 1549define void @atomic64_and_seq_cst(i64* %a) nounwind uwtable { 1550entry: 1551 atomicrmw and i64* %a, i64 0 seq_cst, !dbg !7 1552 ret void, !dbg !7 1553} 1554; CHECK-LABEL: atomic64_and_seq_cst 1555; CHECK: call i64 @__tsan_atomic64_fetch_and(i64* %a, i64 0, i32 5), !dbg 1556 1557define void @atomic64_or_seq_cst(i64* %a) nounwind uwtable { 1558entry: 1559 atomicrmw or i64* %a, i64 0 seq_cst, !dbg !7 1560 ret void, !dbg !7 1561} 1562; CHECK-LABEL: atomic64_or_seq_cst 1563; CHECK: call i64 @__tsan_atomic64_fetch_or(i64* %a, i64 0, i32 5), !dbg 1564 1565define void @atomic64_xor_seq_cst(i64* %a) nounwind uwtable { 1566entry: 1567 atomicrmw xor i64* %a, i64 0 seq_cst, !dbg !7 1568 ret void, !dbg !7 1569} 1570; CHECK-LABEL: atomic64_xor_seq_cst 1571; CHECK: call i64 @__tsan_atomic64_fetch_xor(i64* %a, i64 0, i32 5), !dbg 1572 1573define void @atomic64_nand_seq_cst(i64* %a) nounwind uwtable { 1574entry: 1575 atomicrmw nand i64* %a, i64 0 seq_cst, !dbg !7 1576 ret void, !dbg !7 1577} 1578; CHECK-LABEL: atomic64_nand_seq_cst 1579; CHECK: call i64 @__tsan_atomic64_fetch_nand(i64* %a, i64 0, i32 5), !dbg 1580 1581define void @atomic64_cas_monotonic(i64* %a) nounwind uwtable { 1582entry: 1583 cmpxchg i64* %a, i64 0, i64 1 monotonic monotonic, !dbg !7 1584 cmpxchg i64* %a, i64 0, i64 1 monotonic acquire, !dbg !7 1585 cmpxchg i64* %a, i64 0, i64 1 monotonic seq_cst, !dbg !7 1586 ret void, !dbg !7 1587} 1588; CHECK-LABEL: atomic64_cas_monotonic 1589; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 0, i32 0), !dbg 1590; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 0, i32 2), !dbg 1591; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 0, i32 5), !dbg 1592 1593define void @atomic64_cas_acquire(i64* %a) nounwind uwtable { 1594entry: 1595 cmpxchg i64* %a, i64 0, i64 1 acquire monotonic, !dbg !7 1596 cmpxchg i64* %a, i64 0, i64 1 acquire acquire, !dbg !7 1597 cmpxchg i64* %a, i64 0, i64 1 acquire seq_cst, !dbg !7 1598 ret void, !dbg !7 1599} 1600; CHECK-LABEL: atomic64_cas_acquire 1601; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 2, i32 0), !dbg 1602; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 2, i32 2), !dbg 1603; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 2, i32 5), !dbg 1604 1605define void @atomic64_cas_release(i64* %a) nounwind uwtable { 1606entry: 1607 cmpxchg i64* %a, i64 0, i64 1 release monotonic, !dbg !7 1608 cmpxchg i64* %a, i64 0, i64 1 release acquire, !dbg !7 1609 cmpxchg i64* %a, i64 0, i64 1 release seq_cst, !dbg !7 1610 ret void, !dbg !7 1611} 1612; CHECK-LABEL: atomic64_cas_release 1613; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 3, i32 0), !dbg 1614; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 3, i32 2), !dbg 1615; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 3, i32 5), !dbg 1616 1617define void @atomic64_cas_acq_rel(i64* %a) nounwind uwtable { 1618entry: 1619 cmpxchg i64* %a, i64 0, i64 1 acq_rel monotonic, !dbg !7 1620 cmpxchg i64* %a, i64 0, i64 1 acq_rel acquire, !dbg !7 1621 cmpxchg i64* %a, i64 0, i64 1 acq_rel seq_cst, !dbg !7 1622 ret void, !dbg !7 1623} 1624; CHECK-LABEL: atomic64_cas_acq_rel 1625; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 4, i32 0), !dbg 1626; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 4, i32 2), !dbg 1627; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 4, i32 5), !dbg 1628 1629define void @atomic64_cas_seq_cst(i64* %a) nounwind uwtable { 1630entry: 1631 cmpxchg i64* %a, i64 0, i64 1 seq_cst monotonic, !dbg !7 1632 cmpxchg i64* %a, i64 0, i64 1 seq_cst acquire, !dbg !7 1633 cmpxchg i64* %a, i64 0, i64 1 seq_cst seq_cst, !dbg !7 1634 ret void, !dbg !7 1635} 1636; CHECK-LABEL: atomic64_cas_seq_cst 1637; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 5, i32 0), !dbg 1638; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 5, i32 2), !dbg 1639; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 5, i32 5), !dbg 1640 1641define void @atomic64_cas_seq_cst_ptr_ty(i8** %a, i8* %v1, i8* %v2) nounwind uwtable { 1642entry: 1643 cmpxchg i8** %a, i8* %v1, i8* %v2 seq_cst seq_cst, !dbg !7 1644 ret void 1645} 1646; CHECK-LABEL: atomic64_cas_seq_cst 1647; CHECK: {{.*}} = ptrtoint i8* %v1 to i64 1648; CHECK-NEXT: {{.*}} = ptrtoint i8* %v2 to i64 1649; CHECK-NEXT: {{.*}} = bitcast i8** %a to i64* 1650; CHECK-NEXT: {{.*}} = call i64 @__tsan_atomic64_compare_exchange_val(i64* {{.*}}, i64 {{.*}}, i64 {{.*}}, i32 5, i32 5), !dbg 1651; CHECK-NEXT: {{.*}} = icmp eq i64 1652; CHECK-NEXT: {{.*}} = inttoptr i64 {{.*}} to i8* 1653; CHECK-NEXT: {{.*}} = insertvalue { i8*, i1 } undef, i8* {{.*}}, 0 1654; CHECK-NEXT: {{.*}} = insertvalue { i8*, i1 } {{.*}}, i1 {{.*}}, 1 1655 1656define i128 @atomic128_load_unordered(i128* %a) nounwind uwtable { 1657entry: 1658 %0 = load atomic i128, i128* %a unordered, align 16, !dbg !7 1659 ret i128 %0, !dbg !7 1660} 1661; CHECK-LABEL: atomic128_load_unordered 1662; CHECK: call i128 @__tsan_atomic128_load(i128* %a, i32 0), !dbg 1663 1664define i128 @atomic128_load_monotonic(i128* %a) nounwind uwtable { 1665entry: 1666 %0 = load atomic i128, i128* %a monotonic, align 16, !dbg !7 1667 ret i128 %0, !dbg !7 1668} 1669; CHECK-LABEL: atomic128_load_monotonic 1670; CHECK: call i128 @__tsan_atomic128_load(i128* %a, i32 0), !dbg 1671 1672define i128 @atomic128_load_acquire(i128* %a) nounwind uwtable { 1673entry: 1674 %0 = load atomic i128, i128* %a acquire, align 16, !dbg !7 1675 ret i128 %0, !dbg !7 1676} 1677; CHECK-LABEL: atomic128_load_acquire 1678; CHECK: call i128 @__tsan_atomic128_load(i128* %a, i32 2), !dbg 1679 1680define i128 @atomic128_load_seq_cst(i128* %a) nounwind uwtable { 1681entry: 1682 %0 = load atomic i128, i128* %a seq_cst, align 16, !dbg !7 1683 ret i128 %0, !dbg !7 1684} 1685; CHECK-LABEL: atomic128_load_seq_cst 1686; CHECK: call i128 @__tsan_atomic128_load(i128* %a, i32 5), !dbg 1687 1688define void @atomic128_store_unordered(i128* %a) nounwind uwtable { 1689entry: 1690 store atomic i128 0, i128* %a unordered, align 16, !dbg !7 1691 ret void, !dbg !7 1692} 1693; CHECK-LABEL: atomic128_store_unordered 1694; CHECK: call void @__tsan_atomic128_store(i128* %a, i128 0, i32 0), !dbg 1695 1696define void @atomic128_store_monotonic(i128* %a) nounwind uwtable { 1697entry: 1698 store atomic i128 0, i128* %a monotonic, align 16, !dbg !7 1699 ret void, !dbg !7 1700} 1701; CHECK-LABEL: atomic128_store_monotonic 1702; CHECK: call void @__tsan_atomic128_store(i128* %a, i128 0, i32 0), !dbg 1703 1704define void @atomic128_store_release(i128* %a) nounwind uwtable { 1705entry: 1706 store atomic i128 0, i128* %a release, align 16, !dbg !7 1707 ret void, !dbg !7 1708} 1709; CHECK-LABEL: atomic128_store_release 1710; CHECK: call void @__tsan_atomic128_store(i128* %a, i128 0, i32 3), !dbg 1711 1712define void @atomic128_store_seq_cst(i128* %a) nounwind uwtable { 1713entry: 1714 store atomic i128 0, i128* %a seq_cst, align 16, !dbg !7 1715 ret void, !dbg !7 1716} 1717; CHECK-LABEL: atomic128_store_seq_cst 1718; CHECK: call void @__tsan_atomic128_store(i128* %a, i128 0, i32 5), !dbg 1719 1720define void @atomic128_xchg_monotonic(i128* %a) nounwind uwtable { 1721entry: 1722 atomicrmw xchg i128* %a, i128 0 monotonic, !dbg !7 1723 ret void, !dbg !7 1724} 1725; CHECK-LABEL: atomic128_xchg_monotonic 1726; CHECK: call i128 @__tsan_atomic128_exchange(i128* %a, i128 0, i32 0), !dbg 1727 1728define void @atomic128_add_monotonic(i128* %a) nounwind uwtable { 1729entry: 1730 atomicrmw add i128* %a, i128 0 monotonic, !dbg !7 1731 ret void, !dbg !7 1732} 1733; CHECK-LABEL: atomic128_add_monotonic 1734; CHECK: call i128 @__tsan_atomic128_fetch_add(i128* %a, i128 0, i32 0), !dbg 1735 1736define void @atomic128_sub_monotonic(i128* %a) nounwind uwtable { 1737entry: 1738 atomicrmw sub i128* %a, i128 0 monotonic, !dbg !7 1739 ret void, !dbg !7 1740} 1741; CHECK-LABEL: atomic128_sub_monotonic 1742; CHECK: call i128 @__tsan_atomic128_fetch_sub(i128* %a, i128 0, i32 0), !dbg 1743 1744define void @atomic128_and_monotonic(i128* %a) nounwind uwtable { 1745entry: 1746 atomicrmw and i128* %a, i128 0 monotonic, !dbg !7 1747 ret void, !dbg !7 1748} 1749; CHECK-LABEL: atomic128_and_monotonic 1750; CHECK: call i128 @__tsan_atomic128_fetch_and(i128* %a, i128 0, i32 0), !dbg 1751 1752define void @atomic128_or_monotonic(i128* %a) nounwind uwtable { 1753entry: 1754 atomicrmw or i128* %a, i128 0 monotonic, !dbg !7 1755 ret void, !dbg !7 1756} 1757; CHECK-LABEL: atomic128_or_monotonic 1758; CHECK: call i128 @__tsan_atomic128_fetch_or(i128* %a, i128 0, i32 0), !dbg 1759 1760define void @atomic128_xor_monotonic(i128* %a) nounwind uwtable { 1761entry: 1762 atomicrmw xor i128* %a, i128 0 monotonic, !dbg !7 1763 ret void, !dbg !7 1764} 1765; CHECK-LABEL: atomic128_xor_monotonic 1766; CHECK: call i128 @__tsan_atomic128_fetch_xor(i128* %a, i128 0, i32 0), !dbg 1767 1768define void @atomic128_nand_monotonic(i128* %a) nounwind uwtable { 1769entry: 1770 atomicrmw nand i128* %a, i128 0 monotonic, !dbg !7 1771 ret void, !dbg !7 1772} 1773; CHECK-LABEL: atomic128_nand_monotonic 1774; CHECK: call i128 @__tsan_atomic128_fetch_nand(i128* %a, i128 0, i32 0), !dbg 1775 1776define void @atomic128_xchg_acquire(i128* %a) nounwind uwtable { 1777entry: 1778 atomicrmw xchg i128* %a, i128 0 acquire, !dbg !7 1779 ret void, !dbg !7 1780} 1781; CHECK-LABEL: atomic128_xchg_acquire 1782; CHECK: call i128 @__tsan_atomic128_exchange(i128* %a, i128 0, i32 2), !dbg 1783 1784define void @atomic128_add_acquire(i128* %a) nounwind uwtable { 1785entry: 1786 atomicrmw add i128* %a, i128 0 acquire, !dbg !7 1787 ret void, !dbg !7 1788} 1789; CHECK-LABEL: atomic128_add_acquire 1790; CHECK: call i128 @__tsan_atomic128_fetch_add(i128* %a, i128 0, i32 2), !dbg 1791 1792define void @atomic128_sub_acquire(i128* %a) nounwind uwtable { 1793entry: 1794 atomicrmw sub i128* %a, i128 0 acquire, !dbg !7 1795 ret void, !dbg !7 1796} 1797; CHECK-LABEL: atomic128_sub_acquire 1798; CHECK: call i128 @__tsan_atomic128_fetch_sub(i128* %a, i128 0, i32 2), !dbg 1799 1800define void @atomic128_and_acquire(i128* %a) nounwind uwtable { 1801entry: 1802 atomicrmw and i128* %a, i128 0 acquire, !dbg !7 1803 ret void, !dbg !7 1804} 1805; CHECK-LABEL: atomic128_and_acquire 1806; CHECK: call i128 @__tsan_atomic128_fetch_and(i128* %a, i128 0, i32 2), !dbg 1807 1808define void @atomic128_or_acquire(i128* %a) nounwind uwtable { 1809entry: 1810 atomicrmw or i128* %a, i128 0 acquire, !dbg !7 1811 ret void, !dbg !7 1812} 1813; CHECK-LABEL: atomic128_or_acquire 1814; CHECK: call i128 @__tsan_atomic128_fetch_or(i128* %a, i128 0, i32 2), !dbg 1815 1816define void @atomic128_xor_acquire(i128* %a) nounwind uwtable { 1817entry: 1818 atomicrmw xor i128* %a, i128 0 acquire, !dbg !7 1819 ret void, !dbg !7 1820} 1821; CHECK-LABEL: atomic128_xor_acquire 1822; CHECK: call i128 @__tsan_atomic128_fetch_xor(i128* %a, i128 0, i32 2), !dbg 1823 1824define void @atomic128_nand_acquire(i128* %a) nounwind uwtable { 1825entry: 1826 atomicrmw nand i128* %a, i128 0 acquire, !dbg !7 1827 ret void, !dbg !7 1828} 1829; CHECK-LABEL: atomic128_nand_acquire 1830; CHECK: call i128 @__tsan_atomic128_fetch_nand(i128* %a, i128 0, i32 2), !dbg 1831 1832define void @atomic128_xchg_release(i128* %a) nounwind uwtable { 1833entry: 1834 atomicrmw xchg i128* %a, i128 0 release, !dbg !7 1835 ret void, !dbg !7 1836} 1837; CHECK-LABEL: atomic128_xchg_release 1838; CHECK: call i128 @__tsan_atomic128_exchange(i128* %a, i128 0, i32 3), !dbg 1839 1840define void @atomic128_add_release(i128* %a) nounwind uwtable { 1841entry: 1842 atomicrmw add i128* %a, i128 0 release, !dbg !7 1843 ret void, !dbg !7 1844} 1845; CHECK-LABEL: atomic128_add_release 1846; CHECK: call i128 @__tsan_atomic128_fetch_add(i128* %a, i128 0, i32 3), !dbg 1847 1848define void @atomic128_sub_release(i128* %a) nounwind uwtable { 1849entry: 1850 atomicrmw sub i128* %a, i128 0 release, !dbg !7 1851 ret void, !dbg !7 1852} 1853; CHECK-LABEL: atomic128_sub_release 1854; CHECK: call i128 @__tsan_atomic128_fetch_sub(i128* %a, i128 0, i32 3), !dbg 1855 1856define void @atomic128_and_release(i128* %a) nounwind uwtable { 1857entry: 1858 atomicrmw and i128* %a, i128 0 release, !dbg !7 1859 ret void, !dbg !7 1860} 1861; CHECK-LABEL: atomic128_and_release 1862; CHECK: call i128 @__tsan_atomic128_fetch_and(i128* %a, i128 0, i32 3), !dbg 1863 1864define void @atomic128_or_release(i128* %a) nounwind uwtable { 1865entry: 1866 atomicrmw or i128* %a, i128 0 release, !dbg !7 1867 ret void, !dbg !7 1868} 1869; CHECK-LABEL: atomic128_or_release 1870; CHECK: call i128 @__tsan_atomic128_fetch_or(i128* %a, i128 0, i32 3), !dbg 1871 1872define void @atomic128_xor_release(i128* %a) nounwind uwtable { 1873entry: 1874 atomicrmw xor i128* %a, i128 0 release, !dbg !7 1875 ret void, !dbg !7 1876} 1877; CHECK-LABEL: atomic128_xor_release 1878; CHECK: call i128 @__tsan_atomic128_fetch_xor(i128* %a, i128 0, i32 3), !dbg 1879 1880define void @atomic128_nand_release(i128* %a) nounwind uwtable { 1881entry: 1882 atomicrmw nand i128* %a, i128 0 release, !dbg !7 1883 ret void, !dbg !7 1884} 1885; CHECK-LABEL: atomic128_nand_release 1886; CHECK: call i128 @__tsan_atomic128_fetch_nand(i128* %a, i128 0, i32 3), !dbg 1887 1888define void @atomic128_xchg_acq_rel(i128* %a) nounwind uwtable { 1889entry: 1890 atomicrmw xchg i128* %a, i128 0 acq_rel, !dbg !7 1891 ret void, !dbg !7 1892} 1893; CHECK-LABEL: atomic128_xchg_acq_rel 1894; CHECK: call i128 @__tsan_atomic128_exchange(i128* %a, i128 0, i32 4), !dbg 1895 1896define void @atomic128_add_acq_rel(i128* %a) nounwind uwtable { 1897entry: 1898 atomicrmw add i128* %a, i128 0 acq_rel, !dbg !7 1899 ret void, !dbg !7 1900} 1901; CHECK-LABEL: atomic128_add_acq_rel 1902; CHECK: call i128 @__tsan_atomic128_fetch_add(i128* %a, i128 0, i32 4), !dbg 1903 1904define void @atomic128_sub_acq_rel(i128* %a) nounwind uwtable { 1905entry: 1906 atomicrmw sub i128* %a, i128 0 acq_rel, !dbg !7 1907 ret void, !dbg !7 1908} 1909; CHECK-LABEL: atomic128_sub_acq_rel 1910; CHECK: call i128 @__tsan_atomic128_fetch_sub(i128* %a, i128 0, i32 4), !dbg 1911 1912define void @atomic128_and_acq_rel(i128* %a) nounwind uwtable { 1913entry: 1914 atomicrmw and i128* %a, i128 0 acq_rel, !dbg !7 1915 ret void, !dbg !7 1916} 1917; CHECK-LABEL: atomic128_and_acq_rel 1918; CHECK: call i128 @__tsan_atomic128_fetch_and(i128* %a, i128 0, i32 4), !dbg 1919 1920define void @atomic128_or_acq_rel(i128* %a) nounwind uwtable { 1921entry: 1922 atomicrmw or i128* %a, i128 0 acq_rel, !dbg !7 1923 ret void, !dbg !7 1924} 1925; CHECK-LABEL: atomic128_or_acq_rel 1926; CHECK: call i128 @__tsan_atomic128_fetch_or(i128* %a, i128 0, i32 4), !dbg 1927 1928define void @atomic128_xor_acq_rel(i128* %a) nounwind uwtable { 1929entry: 1930 atomicrmw xor i128* %a, i128 0 acq_rel, !dbg !7 1931 ret void, !dbg !7 1932} 1933; CHECK-LABEL: atomic128_xor_acq_rel 1934; CHECK: call i128 @__tsan_atomic128_fetch_xor(i128* %a, i128 0, i32 4), !dbg 1935 1936define void @atomic128_nand_acq_rel(i128* %a) nounwind uwtable { 1937entry: 1938 atomicrmw nand i128* %a, i128 0 acq_rel, !dbg !7 1939 ret void, !dbg !7 1940} 1941; CHECK-LABEL: atomic128_nand_acq_rel 1942; CHECK: call i128 @__tsan_atomic128_fetch_nand(i128* %a, i128 0, i32 4), !dbg 1943 1944define void @atomic128_xchg_seq_cst(i128* %a) nounwind uwtable { 1945entry: 1946 atomicrmw xchg i128* %a, i128 0 seq_cst, !dbg !7 1947 ret void, !dbg !7 1948} 1949; CHECK-LABEL: atomic128_xchg_seq_cst 1950; CHECK: call i128 @__tsan_atomic128_exchange(i128* %a, i128 0, i32 5), !dbg 1951 1952define void @atomic128_add_seq_cst(i128* %a) nounwind uwtable { 1953entry: 1954 atomicrmw add i128* %a, i128 0 seq_cst, !dbg !7 1955 ret void, !dbg !7 1956} 1957; CHECK-LABEL: atomic128_add_seq_cst 1958; CHECK: call i128 @__tsan_atomic128_fetch_add(i128* %a, i128 0, i32 5), !dbg 1959 1960define void @atomic128_sub_seq_cst(i128* %a) nounwind uwtable { 1961entry: 1962 atomicrmw sub i128* %a, i128 0 seq_cst, !dbg !7 1963 ret void, !dbg !7 1964} 1965; CHECK-LABEL: atomic128_sub_seq_cst 1966; CHECK: call i128 @__tsan_atomic128_fetch_sub(i128* %a, i128 0, i32 5), !dbg 1967 1968define void @atomic128_and_seq_cst(i128* %a) nounwind uwtable { 1969entry: 1970 atomicrmw and i128* %a, i128 0 seq_cst, !dbg !7 1971 ret void, !dbg !7 1972} 1973; CHECK-LABEL: atomic128_and_seq_cst 1974; CHECK: call i128 @__tsan_atomic128_fetch_and(i128* %a, i128 0, i32 5), !dbg 1975 1976define void @atomic128_or_seq_cst(i128* %a) nounwind uwtable { 1977entry: 1978 atomicrmw or i128* %a, i128 0 seq_cst, !dbg !7 1979 ret void, !dbg !7 1980} 1981; CHECK-LABEL: atomic128_or_seq_cst 1982; CHECK: call i128 @__tsan_atomic128_fetch_or(i128* %a, i128 0, i32 5), !dbg 1983 1984define void @atomic128_xor_seq_cst(i128* %a) nounwind uwtable { 1985entry: 1986 atomicrmw xor i128* %a, i128 0 seq_cst, !dbg !7 1987 ret void, !dbg !7 1988} 1989; CHECK-LABEL: atomic128_xor_seq_cst 1990; CHECK: call i128 @__tsan_atomic128_fetch_xor(i128* %a, i128 0, i32 5), !dbg 1991 1992define void @atomic128_nand_seq_cst(i128* %a) nounwind uwtable { 1993entry: 1994 atomicrmw nand i128* %a, i128 0 seq_cst, !dbg !7 1995 ret void, !dbg !7 1996} 1997; CHECK-LABEL: atomic128_nand_seq_cst 1998; CHECK: call i128 @__tsan_atomic128_fetch_nand(i128* %a, i128 0, i32 5), !dbg 1999 2000define void @atomic128_cas_monotonic(i128* %a) nounwind uwtable { 2001entry: 2002 cmpxchg i128* %a, i128 0, i128 1 monotonic monotonic, !dbg !7 2003 ret void, !dbg !7 2004} 2005; CHECK-LABEL: atomic128_cas_monotonic 2006; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 0, i32 0), !dbg 2007 2008define void @atomic128_cas_acquire(i128* %a) nounwind uwtable { 2009entry: 2010 cmpxchg i128* %a, i128 0, i128 1 acquire acquire, !dbg !7 2011 ret void, !dbg !7 2012} 2013; CHECK-LABEL: atomic128_cas_acquire 2014; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 2, i32 2), !dbg 2015 2016define void @atomic128_cas_release(i128* %a) nounwind uwtable { 2017entry: 2018 cmpxchg i128* %a, i128 0, i128 1 release monotonic, !dbg !7 2019 ret void, !dbg !7 2020} 2021; CHECK-LABEL: atomic128_cas_release 2022; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 3, i32 0), !dbg 2023 2024define void @atomic128_cas_acq_rel(i128* %a) nounwind uwtable { 2025entry: 2026 cmpxchg i128* %a, i128 0, i128 1 acq_rel acquire, !dbg !7 2027 ret void, !dbg !7 2028} 2029; CHECK-LABEL: atomic128_cas_acq_rel 2030; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 4, i32 2), !dbg 2031 2032define void @atomic128_cas_seq_cst(i128* %a) nounwind uwtable { 2033entry: 2034 cmpxchg i128* %a, i128 0, i128 1 seq_cst seq_cst, !dbg !7 2035 ret void, !dbg !7 2036} 2037; CHECK-LABEL: atomic128_cas_seq_cst 2038; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 5, i32 5), !dbg 2039 2040define void @atomic_signal_fence_acquire() nounwind uwtable { 2041entry: 2042 fence syncscope("singlethread") acquire, !dbg !7 2043 ret void, !dbg !7 2044} 2045; CHECK-LABEL: atomic_signal_fence_acquire 2046; CHECK: call void @__tsan_atomic_signal_fence(i32 2), !dbg 2047 2048define void @atomic_thread_fence_acquire() nounwind uwtable { 2049entry: 2050 fence acquire, !dbg !7 2051 ret void, !dbg !7 2052} 2053; CHECK-LABEL: atomic_thread_fence_acquire 2054; CHECK: call void @__tsan_atomic_thread_fence(i32 2), !dbg 2055 2056define void @atomic_signal_fence_release() nounwind uwtable { 2057entry: 2058 fence syncscope("singlethread") release, !dbg !7 2059 ret void, !dbg !7 2060} 2061; CHECK-LABEL: atomic_signal_fence_release 2062; CHECK: call void @__tsan_atomic_signal_fence(i32 3), !dbg 2063 2064define void @atomic_thread_fence_release() nounwind uwtable { 2065entry: 2066 fence release, !dbg !7 2067 ret void, !dbg !7 2068} 2069; CHECK-LABEL: atomic_thread_fence_release 2070; CHECK: call void @__tsan_atomic_thread_fence(i32 3), !dbg 2071 2072define void @atomic_signal_fence_acq_rel() nounwind uwtable { 2073entry: 2074 fence syncscope("singlethread") acq_rel, !dbg !7 2075 ret void, !dbg !7 2076} 2077; CHECK-LABEL: atomic_signal_fence_acq_rel 2078; CHECK: call void @__tsan_atomic_signal_fence(i32 4), !dbg 2079 2080define void @atomic_thread_fence_acq_rel() nounwind uwtable { 2081entry: 2082 fence acq_rel, !dbg !7 2083 ret void, !dbg !7 2084} 2085; CHECK-LABEL: atomic_thread_fence_acq_rel 2086; CHECK: call void @__tsan_atomic_thread_fence(i32 4), !dbg 2087 2088define void @atomic_signal_fence_seq_cst() nounwind uwtable { 2089entry: 2090 fence syncscope("singlethread") seq_cst, !dbg !7 2091 ret void, !dbg !7 2092} 2093; CHECK-LABEL: atomic_signal_fence_seq_cst 2094; CHECK: call void @__tsan_atomic_signal_fence(i32 5), !dbg 2095 2096define void @atomic_thread_fence_seq_cst() nounwind uwtable { 2097entry: 2098 fence seq_cst, !dbg !7 2099 ret void, !dbg !7 2100} 2101; CHECK-LABEL: atomic_thread_fence_seq_cst 2102; CHECK: call void @__tsan_atomic_thread_fence(i32 5), !dbg 2103 2104!llvm.module.flags = !{!0, !1, !2} 2105!llvm.dbg.cu = !{!8} 2106!0 = !{i32 2, !"Dwarf Version", i32 4} 2107!1 = !{i32 2, !"Debug Info Version", i32 3} 2108!2 = !{i32 1, !"PIC Level", i32 2} 2109 2110!3 = !{} 2111!4 = !DISubroutineType(types: !3) 2112!5 = !DIFile(filename: "atomic.cpp", directory: "/tmp") 2113!6 = distinct !DISubprogram(name: "test", scope: !5, file: !5, line: 99, type: !4, isLocal: false, isDefinition: true, scopeLine: 100, flags: DIFlagPrototyped, isOptimized: false, unit: !8, retainedNodes: !3) 2114!7 = !DILocation(line: 100, column: 1, scope: !6) 2115 2116!8 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang", 2117 file: !5, 2118 isOptimized: true, flags: "-O2", 2119 splitDebugFilename: "abc.debug", emissionKind: 2) 2120