diff --git a/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp b/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp --- a/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp +++ b/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp @@ -94,10 +94,15 @@ auto *Term = BB.getTerminator(); - // Fow now only support `ret` function terminators. + // Fow now only support `ret`/`resume` function terminators. // FIXME: lift this restriction. - if (Term->getOpcode() != Instruction::Ret) + switch (Term->getOpcode()) { + case Instruction::Ret: + case Instruction::Resume: + break; + default: continue; + } // We can't tail-merge block that contains a musttail call. if (BB.getTerminatingMustTailCall()) diff --git a/llvm/test/Transforms/SimplifyCFG/tail-merge-resume.ll b/llvm/test/Transforms/SimplifyCFG/tail-merge-resume.ll --- a/llvm/test/Transforms/SimplifyCFG/tail-merge-resume.ll +++ b/llvm/test/Transforms/SimplifyCFG/tail-merge-resume.ll @@ -39,19 +39,20 @@ ; CHECK-NEXT: cleanup ; CHECK-NEXT: call void @baz() ; CHECK-NEXT: br label [[RESUME2]] +; CHECK: common.resume: +; CHECK-NEXT: [[COMMON_RESUME_OP:%.*]] = phi { i8*, i32 } [ [[LP]], [[RESUME0]] ], [ [[LP]], [[RESUME1]] ], [ [[SEMICOMMON_LP:%.*]], [[RESUME2]] ] +; CHECK-NEXT: call void @common() +; CHECK-NEXT: resume { i8*, i32 } [[COMMON_RESUME_OP]] ; CHECK: resume0: ; CHECK-NEXT: call void @qux() -; CHECK-NEXT: call void @common() -; CHECK-NEXT: resume { i8*, i32 } [[LP]] +; CHECK-NEXT: br label [[COMMON_RESUME:%.*]] ; CHECK: resume1: ; CHECK-NEXT: call void @quux() -; CHECK-NEXT: call void @common() -; CHECK-NEXT: resume { i8*, i32 } [[LP]] +; CHECK-NEXT: br label [[COMMON_RESUME]] ; CHECK: resume2: -; CHECK-NEXT: [[SEMICOMMON_LP:%.*]] = phi { i8*, i32 } [ [[LP2]], [[LPAD2]] ], [ [[LP3]], [[LPAD3]] ] +; CHECK-NEXT: [[SEMICOMMON_LP]] = phi { i8*, i32 } [ [[LP2]], [[LPAD2]] ], [ [[LP3]], [[LPAD3]] ] ; CHECK-NEXT: call void @quuz() -; CHECK-NEXT: call void @common() -; CHECK-NEXT: resume { i8*, i32 } [[SEMICOMMON_LP]] +; CHECK-NEXT: br label [[COMMON_RESUME]] ; invoke void @maybe_throws() to label %invoke.cont unwind label %lpad