@@ -1957,6 +1957,71 @@ define void @foo() {
19571957#endif // NDEBUG
19581958}
19591959
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+
19602025TEST_F (SandboxIRTest, GetElementPtrInstruction) {
19612026 parseIR (C, R"IR(
19622027define void @foo(ptr %ptr, <2 x ptr> %ptrs) {
0 commit comments