@@ -1932,6 +1932,169 @@ define void @foo(i8 %arg0, i8 %arg1, float %farg0, float %farg1) {
19321932 }
19331933}
19341934
1935+ TEST_F (SandboxIRTest, AtomicRMWInst) {
1936+ parseIR (C, R"IR(
1937+ define void @foo(ptr %ptr, i8 %arg) {
1938+ %atomicrmw = atomicrmw add ptr %ptr, i8 %arg acquire, align 128
1939+ ret void
1940+ }
1941+ )IR" );
1942+ llvm::Function &LLVMF = *M->getFunction (" foo" );
1943+ llvm::BasicBlock *LLVMBB = &*LLVMF.begin ();
1944+ auto LLVMIt = LLVMBB->begin ();
1945+ auto *LLVMRMW = cast<llvm::AtomicRMWInst>(&*LLVMIt++);
1946+
1947+ sandboxir::Context Ctx (C);
1948+ sandboxir::Function *F = Ctx.createFunction (&LLVMF);
1949+ auto *Ptr = F->getArg (0 );
1950+ auto *Arg = F->getArg (1 );
1951+ auto *BB = &*F->begin ();
1952+ auto It = BB->begin ();
1953+ auto *RMW = cast<sandboxir::AtomicRMWInst>(&*It++);
1954+ auto *Ret = cast<sandboxir::ReturnInst>(&*It++);
1955+
1956+ // Check getOperationName().
1957+ EXPECT_EQ (
1958+ sandboxir::AtomicRMWInst::getOperationName (
1959+ sandboxir::AtomicRMWInst::BinOp::Add),
1960+ llvm::AtomicRMWInst::getOperationName (llvm::AtomicRMWInst::BinOp::Add));
1961+ // Check isFPOperation().
1962+ EXPECT_EQ (
1963+ sandboxir::AtomicRMWInst::isFPOperation (
1964+ sandboxir::AtomicRMWInst::BinOp::Add),
1965+ llvm::AtomicRMWInst::isFPOperation (llvm::AtomicRMWInst::BinOp::Add));
1966+ EXPECT_FALSE (sandboxir::AtomicRMWInst::isFPOperation (
1967+ sandboxir::AtomicRMWInst::BinOp::Add));
1968+ EXPECT_TRUE (sandboxir::AtomicRMWInst::isFPOperation (
1969+ sandboxir::AtomicRMWInst::BinOp::FAdd));
1970+ // Check setOperation(), getOperation().
1971+ EXPECT_EQ (RMW->getOperation (), LLVMRMW->getOperation ());
1972+ RMW->setOperation (sandboxir::AtomicRMWInst::BinOp::Sub);
1973+ EXPECT_EQ (RMW->getOperation (), sandboxir::AtomicRMWInst::BinOp::Sub);
1974+ RMW->setOperation (sandboxir::AtomicRMWInst::BinOp::Add);
1975+ // Check getAlign().
1976+ EXPECT_EQ (RMW->getAlign (), LLVMRMW->getAlign ());
1977+ auto OrigAlign = RMW->getAlign ();
1978+ Align NewAlign (256 );
1979+ EXPECT_NE (NewAlign, OrigAlign);
1980+ RMW->setAlignment (NewAlign);
1981+ EXPECT_EQ (RMW->getAlign (), NewAlign);
1982+ RMW->setAlignment (OrigAlign);
1983+ EXPECT_EQ (RMW->getAlign (), OrigAlign);
1984+ // Check isVolatile(), setVolatile().
1985+ EXPECT_EQ (RMW->isVolatile (), LLVMRMW->isVolatile ());
1986+ bool OrigV = RMW->isVolatile ();
1987+ bool NewV = true ;
1988+ EXPECT_NE (NewV, OrigV);
1989+ RMW->setVolatile (NewV);
1990+ EXPECT_EQ (RMW->isVolatile (), NewV);
1991+ RMW->setVolatile (OrigV);
1992+ EXPECT_EQ (RMW->isVolatile (), OrigV);
1993+ // Check getOrdering(), setOrdering().
1994+ EXPECT_EQ (RMW->getOrdering (), LLVMRMW->getOrdering ());
1995+ auto OldOrdering = RMW->getOrdering ();
1996+ auto NewOrdering = AtomicOrdering::Monotonic;
1997+ EXPECT_NE (NewOrdering, OldOrdering);
1998+ RMW->setOrdering (NewOrdering);
1999+ EXPECT_EQ (RMW->getOrdering (), NewOrdering);
2000+ RMW->setOrdering (OldOrdering);
2001+ EXPECT_EQ (RMW->getOrdering (), OldOrdering);
2002+ // Check getSyncScopeID(), setSyncScopeID().
2003+ EXPECT_EQ (RMW->getSyncScopeID (), LLVMRMW->getSyncScopeID ());
2004+ auto OrigSSID = RMW->getSyncScopeID ();
2005+ SyncScope::ID NewSSID = SyncScope::SingleThread;
2006+ EXPECT_NE (NewSSID, OrigSSID);
2007+ RMW->setSyncScopeID (NewSSID);
2008+ EXPECT_EQ (RMW->getSyncScopeID (), NewSSID);
2009+ RMW->setSyncScopeID (OrigSSID);
2010+ EXPECT_EQ (RMW->getSyncScopeID (), OrigSSID);
2011+ // Check getPointerOperand().
2012+ EXPECT_EQ (RMW->getPointerOperand (),
2013+ Ctx.getValue (LLVMRMW->getPointerOperand ()));
2014+ // Check getValOperand().
2015+ EXPECT_EQ (RMW->getValOperand (), Ctx.getValue (LLVMRMW->getValOperand ()));
2016+ // Check getPointerAddressSpace().
2017+ EXPECT_EQ (RMW->getPointerAddressSpace (), LLVMRMW->getPointerAddressSpace ());
2018+ // Check isFloatingPointOperation().
2019+ EXPECT_EQ (RMW->isFloatingPointOperation (),
2020+ LLVMRMW->isFloatingPointOperation ());
2021+
2022+ Align Align (1024 );
2023+ auto Ordering = AtomicOrdering::Acquire;
2024+ auto SSID = SyncScope::System;
2025+ {
2026+ // Check create() WhereIt, WhereBB.
2027+ auto *NewI =
2028+ cast<sandboxir::AtomicRMWInst>(sandboxir::AtomicRMWInst::create (
2029+ sandboxir::AtomicRMWInst::BinOp::Sub, Ptr, Arg, Align, Ordering,
2030+ /* WhereIt=*/ Ret->getIterator (),
2031+ /* WhereBB=*/ Ret->getParent (), Ctx, SSID, " NewAtomicRMW1" ));
2032+ // Check getOpcode().
2033+ EXPECT_EQ (NewI->getOpcode (), sandboxir::Instruction::Opcode::AtomicRMW);
2034+ // Check getAlign().
2035+ EXPECT_EQ (NewI->getAlign (), Align);
2036+ // Check getSuccessOrdering().
2037+ EXPECT_EQ (NewI->getOrdering (), Ordering);
2038+ // Check instr position.
2039+ EXPECT_EQ (NewI->getNextNode (), Ret);
2040+ // Check getPointerOperand().
2041+ EXPECT_EQ (NewI->getPointerOperand (), Ptr);
2042+ // Check getValOperand().
2043+ EXPECT_EQ (NewI->getValOperand (), Arg);
2044+ #ifndef NDEBUG
2045+ // Check getName().
2046+ EXPECT_EQ (NewI->getName (), " NewAtomicRMW1" );
2047+ #endif // NDEBUG
2048+ }
2049+ {
2050+ // Check create() InsertBefore.
2051+ auto *NewI =
2052+ cast<sandboxir::AtomicRMWInst>(sandboxir::AtomicRMWInst::create (
2053+ sandboxir::AtomicRMWInst::BinOp::Sub, Ptr, Arg, Align, Ordering,
2054+ /* InsertBefore=*/ Ret, Ctx, SSID, " NewAtomicRMW2" ));
2055+ // Check getOpcode().
2056+ EXPECT_EQ (NewI->getOpcode (), sandboxir::Instruction::Opcode::AtomicRMW);
2057+ // Check getAlign().
2058+ EXPECT_EQ (NewI->getAlign (), Align);
2059+ // Check getSuccessOrdering().
2060+ EXPECT_EQ (NewI->getOrdering (), Ordering);
2061+ // Check instr position.
2062+ EXPECT_EQ (NewI->getNextNode (), Ret);
2063+ // Check getPointerOperand().
2064+ EXPECT_EQ (NewI->getPointerOperand (), Ptr);
2065+ // Check getValOperand().
2066+ EXPECT_EQ (NewI->getValOperand (), Arg);
2067+ #ifndef NDEBUG
2068+ // Check getName().
2069+ EXPECT_EQ (NewI->getName (), " NewAtomicRMW2" );
2070+ #endif // NDEBUG
2071+ }
2072+ {
2073+ // Check create() InsertAtEnd.
2074+ auto *NewI =
2075+ cast<sandboxir::AtomicRMWInst>(sandboxir::AtomicRMWInst::create (
2076+ sandboxir::AtomicRMWInst::BinOp::Sub, Ptr, Arg, Align, Ordering,
2077+ /* InsertAtEnd=*/ BB, Ctx, SSID, " NewAtomicRMW3" ));
2078+ // Check getOpcode().
2079+ EXPECT_EQ (NewI->getOpcode (), sandboxir::Instruction::Opcode::AtomicRMW);
2080+ // Check getAlign().
2081+ EXPECT_EQ (NewI->getAlign (), Align);
2082+ // Check getSuccessOrdering().
2083+ EXPECT_EQ (NewI->getOrdering (), Ordering);
2084+ // Check instr position.
2085+ EXPECT_EQ (NewI->getParent (), BB);
2086+ EXPECT_EQ (NewI->getNextNode (), nullptr );
2087+ // Check getPointerOperand().
2088+ EXPECT_EQ (NewI->getPointerOperand (), Ptr);
2089+ // Check getValOperand().
2090+ EXPECT_EQ (NewI->getValOperand (), Arg);
2091+ #ifndef NDEBUG
2092+ // Check getName().
2093+ EXPECT_EQ (NewI->getName (), " NewAtomicRMW3" );
2094+ #endif // NDEBUG
2095+ }
2096+ }
2097+
19352098TEST_F (SandboxIRTest, AtomicCmpXchgInst) {
19362099 parseIR (C, R"IR(
19372100define void @foo(ptr %ptr, i8 %cmp, i8 %new) {
0 commit comments