@@ -1957,6 +1957,71 @@ define void @foo() {
1957
1957
#endif // NDEBUG
1958
1958
}
1959
1959
1960
+ TEST_F (SandboxIRTest, CatchReturnInst) {
1961
+ parseIR (C, R"IR(
1962
+ define void @foo() {
1963
+ dispatch:
1964
+ %cs = catchswitch within none [label %catch] unwind to caller
1965
+ catch:
1966
+ %catchpad = catchpad within %cs [ptr @foo]
1967
+ catchret from %catchpad to label %continue
1968
+ continue:
1969
+ ret void
1970
+ catch2:
1971
+ %catchpad2 = catchpad within %cs [ptr @foo]
1972
+ ret void
1973
+ }
1974
+ )IR" );
1975
+ Function &LLVMF = *M->getFunction (" foo" );
1976
+ BasicBlock *LLVMCatch = getBasicBlockByName (LLVMF, " catch" );
1977
+ auto LLVMIt = LLVMCatch->begin ();
1978
+ [[maybe_unused]] auto *LLVMCP = cast<llvm::CatchPadInst>(&*LLVMIt++);
1979
+ auto *LLVMCR = cast<llvm::CatchReturnInst>(&*LLVMIt++);
1980
+
1981
+ sandboxir::Context Ctx (C);
1982
+ [[maybe_unused]] auto &F = *Ctx.createFunction (&LLVMF);
1983
+ auto *Catch = cast<sandboxir::BasicBlock>(Ctx.getValue (LLVMCatch));
1984
+ auto *Catch2 = cast<sandboxir::BasicBlock>(
1985
+ Ctx.getValue (getBasicBlockByName (LLVMF, " catch2" )));
1986
+ auto It = Catch->begin ();
1987
+ [[maybe_unused]] auto *CP = cast<sandboxir::CatchPadInst>(&*It++);
1988
+ auto *CR = cast<sandboxir::CatchReturnInst>(&*It++);
1989
+ auto *CP2 = cast<sandboxir::CatchPadInst>(&*Catch2->begin ());
1990
+
1991
+ // Check getCatchPad().
1992
+ EXPECT_EQ (CR->getCatchPad (), Ctx.getValue (LLVMCR->getCatchPad ()));
1993
+ // Check setCatchPad().
1994
+ auto *OrigCP = CR->getCatchPad ();
1995
+ auto *NewCP = CP2;
1996
+ EXPECT_NE (NewCP, OrigCP);
1997
+ CR->setCatchPad (NewCP);
1998
+ EXPECT_EQ (CR->getCatchPad (), NewCP);
1999
+ CR->setCatchPad (OrigCP);
2000
+ EXPECT_EQ (CR->getCatchPad (), OrigCP);
2001
+ // Check getSuccessor().
2002
+ EXPECT_EQ (CR->getSuccessor (), Ctx.getValue (LLVMCR->getSuccessor ()));
2003
+ // Check setSuccessor().
2004
+ auto *OrigSucc = CR->getSuccessor ();
2005
+ auto *NewSucc = Catch;
2006
+ EXPECT_NE (NewSucc, OrigSucc);
2007
+ CR->setSuccessor (NewSucc);
2008
+ EXPECT_EQ (CR->getSuccessor (), NewSucc);
2009
+ CR->setSuccessor (OrigSucc);
2010
+ EXPECT_EQ (CR->getSuccessor (), OrigSucc);
2011
+ // Check getNumSuccessors().
2012
+ EXPECT_EQ (CR->getNumSuccessors (), LLVMCR->getNumSuccessors ());
2013
+ // Check getCatchSwitchParentPad().
2014
+ EXPECT_EQ (CR->getCatchSwitchParentPad (),
2015
+ Ctx.getValue (LLVMCR->getCatchSwitchParentPad ()));
2016
+ // Check create().
2017
+ auto *CRI =
2018
+ cast<sandboxir::CatchReturnInst>(sandboxir::CatchReturnInst::create (
2019
+ CP, Catch, CP->getIterator (), Catch, Ctx));
2020
+ EXPECT_EQ (CRI->getNextNode (), CP);
2021
+ EXPECT_EQ (CRI->getCatchPad (), CP);
2022
+ EXPECT_EQ (CRI->getSuccessor (), Catch);
2023
+ }
2024
+
1960
2025
TEST_F (SandboxIRTest, GetElementPtrInstruction) {
1961
2026
parseIR (C, R"IR(
1962
2027
define void @foo(ptr %ptr, <2 x ptr> %ptrs) {
0 commit comments