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