[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