diff options
Diffstat (limited to 'llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp')
-rw-r--r-- | llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp b/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp index f6d811240f4..92d1c46d355 100644 --- a/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp +++ b/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp @@ -278,3 +278,33 @@ TEST_F(GISelMITest, BuildMinMax) { EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } + +TEST_F(GISelMITest, BuildAtomicRMW) { + if (!TM) + return; + + LLT S64 = LLT::scalar(64); + LLT P0 = LLT::pointer(0, 64); + SmallVector<Register, 4> Copies; + collectCopies(Copies, MF); + + MachineMemOperand *MMO = + MF->getMachineMemOperand( + MachinePointerInfo(), + MachineMemOperand::MOLoad | MachineMemOperand::MOStore, + 8, 8, AAMDNodes(), nullptr, SyncScope::System, AtomicOrdering::Unordered); + + auto Ptr = B.buildUndef(P0); + B.buildAtomicRMWFAdd(S64, Ptr, Copies[0], *MMO); + B.buildAtomicRMWFSub(S64, Ptr, Copies[0], *MMO); + + auto CheckStr = R"( + ; CHECK: [[COPY0:%[0-9]+]]:_(s64) = COPY $x0 + ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1 + ; CHECK: [[PTR:%[0-9]+]]:_(p0) = G_IMPLICIT_DEF + ; CHECK: [[FADD:%[0-9]+]]:_(s64) = G_ATOMICRMW_FADD [[PTR]]:_(p0), [[COPY0]]:_ :: (load store unordered 8) + ; CHECK: [[FSUB:%[0-9]+]]:_(s64) = G_ATOMICRMW_FSUB [[PTR]]:_(p0), [[COPY0]]:_ :: (load store unordered 8) + )"; + + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; +} |