aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <npopov@redhat.com>2025-04-30 09:07:55 +0200
committerGitHub <noreply@github.com>2025-04-30 09:07:55 +0200
commitc96f019fa3bc02bbc60343de606235c6e2cef4bd (patch)
treef860a4a155fed8cca943247b3643e0dddae716f9
parentaf497d9a658ebca437aff79cd9532cd93b7a58a0 (diff)
downloadllvm-c96f019fa3bc02bbc60343de606235c6e2cef4bd.zip
llvm-c96f019fa3bc02bbc60343de606235c6e2cef4bd.tar.gz
llvm-c96f019fa3bc02bbc60343de606235c6e2cef4bd.tar.bz2
[BasicBlockUtils] Remove broken support for eh pads in SplitEdge() (#137816)
d81d9e8b8604c85709de0a22bb8dd672a28f0401 changed SplitEdge() to make use of ehAwareSplitEdge() for critical edges where the target is an eh pad. However, the implementation is incorrect at least for landing pads. What is currently produced for the code in the modified unit test is something like this: continue: invoke void @sink() to label %normal unwind label %new_bb new_bb: %cp = cleanuppad within %exception [] cleanupret from %cp unwind label %exception exception: %cleanup = landingpad i8 cleanup br label %trivial-eh-handler This mixes different exception handling mechanisms in a nonsensical way, and is not well-formed IR. To actually "split" the landingpad edge (for a rather loose definition of "split"), I think we'd have to generate something along these lines: exception.split: %cleanup.split = landingpad i8 cleanup br label %exception.cont exception: %cleanup.orig = landingpad i8 cleanup br label %exception.cont exception.cont: %cleanup = phi i8 [ %cleanup.split, %exception_split ], [ %cleanup.orig, %exception ] I didn't bother actually implementing that, seeing as how nobody noticed the existing codegen being broken in the last four years, so clearly nobody actually needs this function to work with EH edges. Just return nullptr instead.
-rw-r--r--llvm/lib/Transforms/Utils/BasicBlockUtils.cpp5
-rw-r--r--llvm/unittests/Transforms/Utils/BasicBlockUtilsTest.cpp18
2 files changed, 2 insertions, 21 deletions
diff --git a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
index 429037a..dce10c0 100644
--- a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
+++ b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
@@ -768,11 +768,6 @@ BasicBlock *llvm::SplitEdge(BasicBlock *BB, BasicBlock *Succ, DominatorTree *DT,
CriticalEdgeSplittingOptions(DT, LI, MSSAU).setPreserveLCSSA();
if ((isCriticalEdge(LatchTerm, SuccNum, Options.MergeIdenticalEdges))) {
- // If it is a critical edge, and the succesor is an exception block, handle
- // the split edge logic in this specific function
- if (Succ->isEHPad())
- return ehAwareSplitEdge(BB, Succ, nullptr, nullptr, Options, BBName);
-
// If this is a critical edge, let SplitKnownCriticalEdge do it.
return SplitKnownCriticalEdge(LatchTerm, SuccNum, Options, BBName);
}
diff --git a/llvm/unittests/Transforms/Utils/BasicBlockUtilsTest.cpp b/llvm/unittests/Transforms/Utils/BasicBlockUtilsTest.cpp
index c9a6a32..e58daed8 100644
--- a/llvm/unittests/Transforms/Utils/BasicBlockUtilsTest.cpp
+++ b/llvm/unittests/Transforms/Utils/BasicBlockUtilsTest.cpp
@@ -285,22 +285,8 @@ declare void @sink_alt() cold
EXPECT_TRUE(Ehpad);
BasicBlock *NewBB = SplitEdge(SrcBlock, DestBlock, &DT, &LI, &MSSAU, "");
-
- MSSA.verifyMemorySSA();
- EXPECT_TRUE(DT.verify());
- EXPECT_NE(NewBB, nullptr);
- EXPECT_EQ(NewBB->getSinglePredecessor(), SrcBlock);
- EXPECT_EQ(NewBB, SrcBlock->getTerminator()->getSuccessor(SuccNum));
- EXPECT_EQ(NewBB->getParent(), F);
-
- bool BBFlag = false;
- for (BasicBlock &BB : *F) {
- if (BB.getName() == NewBB->getName()) {
- BBFlag = true;
- break;
- }
- }
- EXPECT_TRUE(BBFlag);
+ // SplitEdge cannot split an eh pad edge.
+ EXPECT_EQ(NewBB, nullptr);
}
TEST(BasicBlockUtils, splitBasicBlockBefore_ex1) {