CatchReturnInst has side-effects: it runs a destructor. This destructor
could conceivably run forever/call exit/etc. and should not be removed.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251461
91177308-0d34-0410-b5e6-
96231b3b80d8
isa<CatchEndPadInst>(TI) || isa<TerminatePadInst>(TI)) {
removeUnwindEdge(TI->getParent());
Changed = true;
isa<CatchEndPadInst>(TI) || isa<TerminatePadInst>(TI)) {
removeUnwindEdge(TI->getParent());
Changed = true;
- } else if (isa<CleanupReturnInst>(TI) || isa<CleanupEndPadInst>(TI) ||
- isa<CatchReturnInst>(TI)) {
+ } else if (isa<CleanupReturnInst>(TI) || isa<CleanupEndPadInst>(TI)) {
new UnreachableInst(TI->getContext(), TI);
TI->eraseFromParent();
Changed = true;
new UnreachableInst(TI->getContext(), TI);
TI->eraseFromParent();
Changed = true;
cleanuppad []
unreachable
}
cleanuppad []
unreachable
}
+
+; CHECK-LABEL: define void @test5()
+define void @test5() personality i8* bitcast (void ()* @Personality to i8*) {
+entry:
+ invoke void @f()
+ to label %exit unwind label %catch.pad
+
+catch.pad:
+ %catch = catchpad []
+ to label %catch.body unwind label %catch.end
+
+catch.body:
+ catchret %catch to label %exit
+
+catch.end:
+ catchendpad unwind to caller
+
+exit:
+ unreachable
+}