Skip to content

Commit

Permalink
[SEH] Ignore EH pad check for internal intrinsics (#79694)
Browse files Browse the repository at this point in the history
Intrinsics like @llvm.seh.scope.begin and @llvm.seh.scope.end which do
not throw do not need funclets in catchpads or cleanuppads.

Fixes #69428

Co-authored-by: Robert Cox <robert.cox@intel.com>

---------

Co-authored-by: Robert Cox <robert.cox@intel.com>
  • Loading branch information
phoebewang and robertcox-github authored Apr 4, 2024
1 parent 417a068 commit a1f4ac7
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 0 deletions.
5 changes: 5 additions & 0 deletions llvm/lib/IR/Verifier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4343,6 +4343,11 @@ void Verifier::visitEHPadPredecessors(Instruction &I) {
if (auto *II = dyn_cast<InvokeInst>(TI)) {
Check(II->getUnwindDest() == BB && II->getNormalDest() != BB,
"EH pad must be jumped to via an unwind edge", ToPad, II);
auto *CalledFn =
dyn_cast<Function>(II->getCalledOperand()->stripPointerCasts());
if (CalledFn && CalledFn->isIntrinsic() && II->doesNotThrow() &&
!IntrinsicInst::mayLowerToFunctionCall(CalledFn->getIntrinsicID()))
continue;
if (auto Bundle = II->getOperandBundle(LLVMContext::OB_funclet))
FromPad = Bundle->Inputs[0];
else
Expand Down
48 changes: 48 additions & 0 deletions llvm/test/Verifier/pr69428.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
; RUN: llvm-as -disable-output %s

%struct._List_node_emplace_op2 = type { i8 }

@"?_List@@3HA" = global i32 0, align 4

define void @"?ExecutionEngineaddExecutableDependency@@YAXXZ"() personality ptr @__CxxFrameHandler3 {
entry:
%agg.tmp.ensured.i = alloca %struct._List_node_emplace_op2, align 1
%0 = load i32, ptr @"?_List@@3HA", align 4
%call.i = call noundef ptr @"??0?$_List_node_emplace_op2@H@@QEAA@H@Z"(ptr %agg.tmp.ensured.i, i32 %0)
invoke void @llvm.seh.scope.begin()
to label %invoke.cont.i unwind label %ehcleanup.i

invoke.cont.i: ; preds = %entry
invoke void @llvm.seh.scope.end()
to label %invoke.cont2.i unwind label %ehcleanup.i

invoke.cont2.i: ; preds = %invoke.cont.i
call void @"??1?$_List_node_emplace_op2@H@@QEAA@XZ"(ptr %agg.tmp.ensured.i) #6
unreachable

ehcleanup.i: ; preds = %invoke.cont.i, %entry
%1 = cleanuppad within none []
invoke void @llvm.seh.scope.begin()
to label %invoke.cont.i.i unwind label %ehcleanup.i.i

invoke.cont.i.i: ; preds = %ehcleanup.i
invoke void @llvm.seh.scope.end()
to label %"??1?$_List_node_emplace_op2@H@@QEAA@XZ.exit.i" unwind label %ehcleanup.i.i

ehcleanup.i.i: ; preds = %invoke.cont.i.i, %ehcleanup.i
%2 = cleanuppad within %1 []
call void @"??1_Alloc_construct_ptr@@QEAA@XZ"(ptr %agg.tmp.ensured.i) #6 [ "funclet"(token %2) ]
cleanupret from %2 unwind to caller

"??1?$_List_node_emplace_op2@H@@QEAA@XZ.exit.i": ; preds = %invoke.cont.i.i
call void @"??1_Alloc_construct_ptr@@QEAA@XZ"(ptr %agg.tmp.ensured.i) #6 [ "funclet"(token %1) ]
cleanupret from %1 unwind to caller
}

declare i32 @__CxxFrameHandler3(...)
declare void @llvm.seh.scope.begin()
declare void @llvm.seh.scope.end()

declare void @"??1?$_List_node_emplace_op2@H@@QEAA@XZ"(ptr)
declare void @"??1_Alloc_construct_ptr@@QEAA@XZ"(ptr)
declare ptr @"??0?$_List_node_emplace_op2@H@@QEAA@H@Z"(ptr, i32)

0 comments on commit a1f4ac7

Please sign in to comment.