[llvm] Fix assertion failure in PreISelIntrinsicLowering.cpp's lowerObjCCall (PR #187058)
Nuri Amari via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 18 07:31:11 PDT 2026
https://github.com/NuriAmari updated https://github.com/llvm/llvm-project/pull/187058
>From 57ffdfffb10f0773dc3b921b1fb658f92965929a Mon Sep 17 00:00:00 2001
From: Nuri Amari <nuriamari at fb.com>
Date: Tue, 17 Mar 2026 09:48:48 -0700
Subject: [PATCH 1/2] Fix assertion failure in PreISelIntrinsicLowering.cpp's
lowerObjCCall
PreISelIntrinsicLowering::lowerIntrinsics makes a call to lowerObjCCall
passing a objc_claimAutoreleasedReturnValue intrinsic, which will hit
assertion failure guaranteed. Clearly we are lowering this intrinsic to
a function call, so it should be added to this predicate.
---
llvm/lib/IR/IntrinsicInst.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/llvm/lib/IR/IntrinsicInst.cpp b/llvm/lib/IR/IntrinsicInst.cpp
index 281cbd4388b58..5b3e3cf45397f 100644
--- a/llvm/lib/IR/IntrinsicInst.cpp
+++ b/llvm/lib/IR/IntrinsicInst.cpp
@@ -39,6 +39,7 @@ bool IntrinsicInst::mayLowerToFunctionCall(Intrinsic::ID IID) {
case Intrinsic::objc_autoreleasePoolPop:
case Intrinsic::objc_autoreleasePoolPush:
case Intrinsic::objc_autoreleaseReturnValue:
+ case Intrinsic::objc_claimAutoreleasedReturnValue:
case Intrinsic::objc_copyWeak:
case Intrinsic::objc_destroyWeak:
case Intrinsic::objc_initWeak:
>From d946f9ee81fe4ecd915ccfd5492562c5f698e169 Mon Sep 17 00:00:00 2001
From: Nuri Amari <nuriamari at fb.com>
Date: Wed, 18 Mar 2026 07:15:32 -0700
Subject: [PATCH 2/2] Add regression test
---
.../PreISelIntrinsicLowering/X86/objc-arc.ll | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/llvm/test/Transforms/PreISelIntrinsicLowering/X86/objc-arc.ll b/llvm/test/Transforms/PreISelIntrinsicLowering/X86/objc-arc.ll
index 1bb6d2bb0061b..5ccd6c662194e 100644
--- a/llvm/test/Transforms/PreISelIntrinsicLowering/X86/objc-arc.ll
+++ b/llvm/test/Transforms/PreISelIntrinsicLowering/X86/objc-arc.ll
@@ -236,6 +236,16 @@ define void @test_objc_unsafeClaimAutoreleasedReturnValue_bundle() {
ret void
}
+define ptr @test_objc_claimAutoreleasedReturnValue(ptr %arg0) {
+; CHECK-LABEL: test_objc_claimAutoreleasedReturnValue
+; CHECK-NEXT: entry
+; CHECK-NEXT: %0 = call ptr @objc_claimAutoreleasedReturnValue(ptr %arg0)
+; CHECK-NEXT: ret ptr %0
+entry:
+ %0 = call ptr @llvm.objc.claimAutoreleasedReturnValue(ptr %arg0)
+ ret ptr %0
+}
+
define ptr @test_objc_retainedObject(ptr %arg0) {
; CHECK-LABEL: test_objc_retainedObject
; CHECK-NEXT: entry
@@ -300,6 +310,7 @@ declare ptr @llvm.objc.autorelease(ptr)
declare void @llvm.objc.autoreleasePoolPop(ptr)
declare ptr @llvm.objc.autoreleasePoolPush()
declare ptr @llvm.objc.autoreleaseReturnValue(ptr)
+declare ptr @llvm.objc.claimAutoreleasedReturnValue(ptr)
declare void @llvm.objc.copyWeak(ptr, ptr)
declare void @llvm.objc.destroyWeak(ptr)
declare extern_weak ptr @llvm.objc.initWeak(ptr, ptr)
@@ -328,6 +339,7 @@ attributes #0 = { nounwind }
; CHECK: declare void @objc_autoreleasePoolPop(ptr)
; CHECK: declare ptr @objc_autoreleasePoolPush()
; CHECK: declare ptr @objc_autoreleaseReturnValue(ptr)
+; CHECK: declare ptr @objc_claimAutoreleasedReturnValue(ptr)
; CHECK: declare void @objc_copyWeak(ptr, ptr)
; CHECK: declare void @objc_destroyWeak(ptr)
; CHECK: declare extern_weak ptr @objc_initWeak(ptr, ptr)
More information about the llvm-commits
mailing list