[llvm] [WinEH] Fix asm in catchpad being turned into unreachable (PR #138392)
via llvm-commits
llvm-commits at lists.llvm.org
Thu May 8 09:07:55 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-platform-windows
Author: None (Ralender)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/138392.diff
2 Files Affected:
- (modified) llvm/lib/CodeGen/WinEHPrepare.cpp (+2-2)
- (added) llvm/test/CodeGen/WinEH/wineh-asm2.ll (+46)
``````````diff
diff --git a/llvm/lib/CodeGen/WinEHPrepare.cpp b/llvm/lib/CodeGen/WinEHPrepare.cpp
index 74cef6c134736..43dd651a686b9 100644
--- a/llvm/lib/CodeGen/WinEHPrepare.cpp
+++ b/llvm/lib/CodeGen/WinEHPrepare.cpp
@@ -1135,8 +1135,8 @@ void WinEHPrepareImpl::removeImplausibleInstructions(Function &F) {
// Skip call sites which are nounwind intrinsics or inline asm.
auto *CalledFn =
dyn_cast<Function>(CB->getCalledOperand()->stripPointerCasts());
- if (CalledFn && ((CalledFn->isIntrinsic() && CB->doesNotThrow()) ||
- CB->isInlineAsm()))
+ if (CB->isInlineAsm() ||
+ (CalledFn && CalledFn->isIntrinsic() && CB->doesNotThrow()))
continue;
// This call site was not part of this funclet, remove it.
diff --git a/llvm/test/CodeGen/WinEH/wineh-asm2.ll b/llvm/test/CodeGen/WinEH/wineh-asm2.ll
new file mode 100644
index 0000000000000..2c424536dca09
--- /dev/null
+++ b/llvm/test/CodeGen/WinEH/wineh-asm2.ll
@@ -0,0 +1,46 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt < %s -passes=win-eh-prepare -S | FileCheck %s
+
+target triple = "x86_64-unknown-windows-msvc"
+
+%rtti.TypeDescriptor2 = type { ptr, ptr, [3 x i8] }
+
+$"??_R0H at 8" = comdat any
+
+@"??_7type_info@@6B@" = external constant ptr
+@"??_R0H at 8" = linkonce_odr global %rtti.TypeDescriptor2 { ptr @"??_7type_info@@6B@", ptr null, [3 x i8] c".H\00" }, comdat
+
+declare dso_local i32 @test0(i32) local_unnamed_addr
+
+define dso_local i32 @test1(i32 %argc) local_unnamed_addr personality ptr @__CxxFrameHandler3 {
+; CHECK-LABEL: define dso_local i32 @test1(
+; CHECK-SAME: i32 [[ARGC:%.*]]) local_unnamed_addr personality ptr @__CxxFrameHandler3 {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[CALL:%.*]] = invoke i32 @test0(i32 [[ARGC]])
+; CHECK-NEXT: to label %[[RETURN:.*]] unwind label %[[CATCH_DISPATCH:.*]]
+; CHECK: [[CATCH_DISPATCH]]:
+; CHECK-NEXT: [[TMP0:%.*]] = catchswitch within none [label %catch] unwind to caller
+; CHECK: [[CATCH:.*:]]
+; CHECK-NEXT: [[TMP1:%.*]] = catchpad within [[TMP0]] [ptr @"??_R0H at 8", i32 0, ptr null]
+; CHECK-NEXT: call void asm "", ""()
+; CHECK-NEXT: catchret from [[TMP1]] to label %[[RETURN]]
+; CHECK: [[RETURN]]:
+; CHECK-NEXT: ret i32 0
+;
+entry:
+ %call = invoke i32 @test0(i32 %argc)
+ to label %return unwind label %catch.dispatch
+
+catch.dispatch: ; preds = %entry
+ %0 = catchswitch within none [label %catch] unwind to caller
+
+catch: ; preds = %catch.dispatch
+ %1 = catchpad within %0 [ptr @"??_R0H at 8", i32 0, ptr null]
+ call void asm "", ""()
+ catchret from %1 to label %return
+
+return: ; preds = %catch, %entry
+ ret i32 0
+}
+
+declare dso_local i32 @__CxxFrameHandler3(...)
``````````
</details>
https://github.com/llvm/llvm-project/pull/138392
More information about the llvm-commits
mailing list