138 lines · plain
1; RUN: opt < %s | opt -S | FileCheck %s2; RUN: verify-uselistorder %s3; Basic smoke test for atomic operations.4 5define void @f(ptr %x) {6 ; CHECK: load atomic i32, ptr %x unordered, align 47 load atomic i32, ptr %x unordered, align 48 ; CHECK: load atomic volatile i32, ptr %x syncscope("singlethread") acquire, align 49 load atomic volatile i32, ptr %x syncscope("singlethread") acquire, align 410 ; CHECK: load atomic volatile i32, ptr %x syncscope("agent") acquire, align 411 load atomic volatile i32, ptr %x syncscope("agent") acquire, align 412 ; CHECK: store atomic i32 3, ptr %x release, align 413 store atomic i32 3, ptr %x release, align 414 ; CHECK: store atomic volatile i32 3, ptr %x syncscope("singlethread") monotonic, align 415 store atomic volatile i32 3, ptr %x syncscope("singlethread") monotonic, align 416 ; CHECK: store atomic volatile i32 3, ptr %x syncscope("workgroup") monotonic, align 417 store atomic volatile i32 3, ptr %x syncscope("workgroup") monotonic, align 418 ; CHECK: cmpxchg ptr %x, i32 1, i32 0 syncscope("singlethread") monotonic monotonic19 cmpxchg ptr %x, i32 1, i32 0 syncscope("singlethread") monotonic monotonic20 ; CHECK: cmpxchg ptr %x, i32 1, i32 0 syncscope("workitem") monotonic monotonic21 cmpxchg ptr %x, i32 1, i32 0 syncscope("workitem") monotonic monotonic22 ; CHECK: cmpxchg volatile ptr %x, i32 0, i32 1 acq_rel acquire23 cmpxchg volatile ptr %x, i32 0, i32 1 acq_rel acquire24 ; CHECK: cmpxchg ptr %x, i32 42, i32 0 acq_rel monotonic25 cmpxchg ptr %x, i32 42, i32 0 acq_rel monotonic26 ; CHECK: cmpxchg weak ptr %x, i32 13, i32 0 seq_cst monotonic27 cmpxchg weak ptr %x, i32 13, i32 0 seq_cst monotonic28 ; CHECK: atomicrmw add ptr %x, i32 10 seq_cst29 atomicrmw add ptr %x, i32 10 seq_cst30 ; CHECK: atomicrmw volatile xchg ptr %x, i32 10 monotonic31 atomicrmw volatile xchg ptr %x, i32 10 monotonic32 ; CHECK: atomicrmw volatile xchg ptr %x, i32 10 syncscope("agent") monotonic33 atomicrmw volatile xchg ptr %x, i32 10 syncscope("agent") monotonic34 35 ; CHECK: atomicrmw volatile uinc_wrap ptr %x, i32 10 monotonic36 atomicrmw volatile uinc_wrap ptr %x, i32 10 monotonic37 ; CHECK: atomicrmw volatile uinc_wrap ptr %x, i32 10 syncscope("agent") monotonic38 atomicrmw volatile uinc_wrap ptr %x, i32 10 syncscope("agent") monotonic39 40 ; CHECK: atomicrmw volatile udec_wrap ptr %x, i32 10 monotonic41 atomicrmw volatile udec_wrap ptr %x, i32 10 monotonic42 ; CHECK: atomicrmw volatile udec_wrap ptr %x, i32 10 syncscope("agent") monotonic43 atomicrmw volatile udec_wrap ptr %x, i32 10 syncscope("agent") monotonic44 45 ; CHECK: atomicrmw volatile usub_cond ptr %x, i32 10 monotonic46 atomicrmw volatile usub_cond ptr %x, i32 10 monotonic47 ; CHECK: atomicrmw volatile usub_cond ptr %x, i32 10 syncscope("agent") monotonic48 atomicrmw volatile usub_cond ptr %x, i32 10 syncscope("agent") monotonic49 50 ; CHECK: atomicrmw volatile usub_sat ptr %x, i32 10 monotonic51 atomicrmw volatile usub_sat ptr %x, i32 10 monotonic52 ; CHECK: atomicrmw volatile usub_sat ptr %x, i32 10 syncscope("agent") monotonic53 atomicrmw volatile usub_sat ptr %x, i32 10 syncscope("agent") monotonic54 55 ; CHECK : load atomic <1 x i32>, ptr %x unordered, align 456 load atomic <1 x i32>, ptr %x unordered, align 457 ; CHECK : store atomic <1 x i32> splat (i32 3), ptr %x release, align 458 store atomic <1 x i32> <i32 3>, ptr %x release, align 459 ; CHECK : load atomic <2 x i32>, ptr %x unordered, align 460 load atomic <2 x i32>, ptr %x unordered, align 461 ; CHECK : store atomic <2 x i32> <i32 3, i32 4>, ptr %x release, align 462 store atomic <2 x i32> <i32 3, i32 4>, ptr %x release, align 463 64 ; CHECK : load atomic <2 x ptr>, ptr %x unordered, align 465 load atomic <2 x ptr>, ptr %x unordered, align 466 ; CHECK : store atomic <2 x ptr> zeroinitializer, ptr %x release, align 467 store atomic <2 x ptr> zeroinitializer, ptr %x release, align 468 69 ; CHECK : load atomic <2 x float>, ptr %x unordered, align 470 load atomic <2 x float>, ptr %x unordered, align 471 ; CHECK : store atomic <2 x float> <float 3.0, float 4.0>, ptr %x release, align 472 store atomic <2 x float> <float 3.0, float 4.0>, ptr %x release, align 473 74 ; CHECK: fence syncscope("singlethread") release75 fence syncscope("singlethread") release76 ; CHECK: fence seq_cst77 fence seq_cst78 ; CHECK: fence syncscope("device") seq_cst79 fence syncscope("device") seq_cst80 ret void81}82 83define void @fp_atomics(ptr %x) {84 ; CHECK: atomicrmw fadd ptr %x, float 1.000000e+00 seq_cst85 atomicrmw fadd ptr %x, float 1.0 seq_cst86 87 ; CHECK: atomicrmw volatile fadd ptr %x, float 1.000000e+00 seq_cst88 atomicrmw volatile fadd ptr %x, float 1.0 seq_cst89 90 ; CHECK: atomicrmw fmax ptr %x, float 1.000000e+00 seq_cst91 atomicrmw fmax ptr %x, float 1.0 seq_cst92 93 ; CHECK: atomicrmw volatile fmax ptr %x, float 1.000000e+00 seq_cst94 atomicrmw volatile fmax ptr %x, float 1.0 seq_cst95 96 ; CHECK: atomicrmw fmin ptr %x, float 1.000000e+00 seq_cst97 atomicrmw fmin ptr %x, float 1.0 seq_cst98 99 ; CHECK: atomicrmw volatile fmin ptr %x, float 1.000000e+00 seq_cst100 atomicrmw volatile fmin ptr %x, float 1.0 seq_cst101 102 ; CHECK: atomicrmw fmaximum ptr %x, float 1.000000e+00 seq_cst103 atomicrmw fmaximum ptr %x, float 1.0 seq_cst104 105 ; CHECK: atomicrmw volatile fmaximum ptr %x, float 1.000000e+00 seq_cst106 atomicrmw volatile fmaximum ptr %x, float 1.0 seq_cst107 108 ; CHECK: atomicrmw fminimum ptr %x, float 1.000000e+00 seq_cst109 atomicrmw fminimum ptr %x, float 1.0 seq_cst110 111 ; CHECK: atomicrmw volatile fminimum ptr %x, float 1.000000e+00 seq_cst112 atomicrmw volatile fminimum ptr %x, float 1.0 seq_cst113 114 ret void115}116 117define void @fp_vector_atomicrmw(ptr %x, <2 x half> %val) {118 ; CHECK: %atomic.fadd = atomicrmw fadd ptr %x, <2 x half> %val seq_cst119 %atomic.fadd = atomicrmw fadd ptr %x, <2 x half> %val seq_cst120 121 ; CHECK: %atomic.fsub = atomicrmw fsub ptr %x, <2 x half> %val seq_cst122 %atomic.fsub = atomicrmw fsub ptr %x, <2 x half> %val seq_cst123 124 ; CHECK: %atomic.fmax = atomicrmw fmax ptr %x, <2 x half> %val seq_cst125 %atomic.fmax = atomicrmw fmax ptr %x, <2 x half> %val seq_cst126 127 ; CHECK: %atomic.fmin = atomicrmw fmin ptr %x, <2 x half> %val seq_cst128 %atomic.fmin = atomicrmw fmin ptr %x, <2 x half> %val seq_cst129 130 ; CHECK: %atomic.fmaximum = atomicrmw fmaximum ptr %x, <2 x half> %val seq_cst131 %atomic.fmaximum = atomicrmw fmaximum ptr %x, <2 x half> %val seq_cst132 133 ; CHECK: %atomic.fminimum = atomicrmw fminimum ptr %x, <2 x half> %val seq_cst134 %atomic.fminimum = atomicrmw fminimum ptr %x, <2 x half> %val seq_cst135 136 ret void137}138