@@ -1932,6 +1932,169 @@ define void @foo(i8 %arg0, i8 %arg1, float %farg0, float %farg1) {
1932
1932
}
1933
1933
}
1934
1934
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
+
1935
2098
TEST_F (SandboxIRTest, AtomicCmpXchgInst) {
1936
2099
parseIR (C, R"IR(
1937
2100
define void @foo(ptr %ptr, i8 %cmp, i8 %new) {
0 commit comments