[llvm] [LowerTypeTests] Avoid null dereference on invalid branch funnel operand (PR #204951)

Arda Serdar Pektezol via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 14 22:56:14 PDT 2026


https://github.com/pektezol updated https://github.com/llvm/llvm-project/pull/204951

>From 3e12819f1d039013f8fbc35d6effd1da6bce9cc0 Mon Sep 17 00:00:00 2001
From: Arda Serdar Pektezol <arda at pektezol.dev>
Date: Sun, 21 Jun 2026 00:07:42 +0300
Subject: [PATCH 1/3] [LowerTypeTests] avoid null dereference on invalid branch
 funnel operand

---
 llvm/lib/Transforms/IPO/LowerTypeTests.cpp      |  6 +++++-
 .../icall-branch-funnel-invalid-operand.ll      | 17 +++++++++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/Transforms/LowerTypeTests/icall-branch-funnel-invalid-operand.ll

diff --git a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp
index 55accff3b148f..80c2ba6299b6f 100644
--- a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp
+++ b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp
@@ -2452,7 +2452,11 @@ bool LowerTypeTestsModule::lower() {
           report_fatal_error(
               "Expected branch funnel operand to be global value");
 
-        GlobalTypeMember *GTM = GlobalTypeMembers[Base];
+        auto It = GlobalTypeMembers.find(Base);
+        if (It == GlobalTypeMembers.end())
+            reportFatalUsageError(
+                "Expected branch funnel operand to be global value");
+        GlobalTypeMember *GTM = It->second;
         Targets.push_back(GTM);
         GlobalClassesTy::member_iterator NewSet =
             GlobalClasses.findLeader(GlobalClasses.insert(GTM));
diff --git a/llvm/test/Transforms/LowerTypeTests/icall-branch-funnel-invalid-operand.ll b/llvm/test/Transforms/LowerTypeTests/icall-branch-funnel-invalid-operand.ll
new file mode 100644
index 0000000000000..aa39dd43fd670
--- /dev/null
+++ b/llvm/test/Transforms/LowerTypeTests/icall-branch-funnel-invalid-operand.ll
@@ -0,0 +1,17 @@
+; RUN: not opt -S -passes=lowertypetests %s 2>&1 | FileCheck %s
+; CHECK: LLVM ERROR: Expected branch funnel operand to be global value
+
+target triple = "x86_64--"
+
+ at g1 = external constant i32
+ at g2 = external constant i32
+
+define void @jt2(...) {
+  musttail call void (...) @llvm.icall.branch.funnel(ptr null, ptr @g1, ptr null, ptr @g2, ptr null, ...)
+  ret void
+}
+
+; Function Attrs: nocallback nofree nosync nounwind willreturn
+declare void @llvm.icall.branch.funnel(...) #0
+
+attributes #0 = { nocallback nofree nosync nounwind willreturn }

>From 79827d7fdcab16639fab9ab32d6a75605aa45b95 Mon Sep 17 00:00:00 2001
From: Arda Serdar Pektezol <arda at pektezol.dev>
Date: Sun, 21 Jun 2026 00:30:34 +0300
Subject: [PATCH 2/3] clang-format

---
 llvm/lib/Transforms/IPO/LowerTypeTests.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp
index 80c2ba6299b6f..24a00bf6b9808 100644
--- a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp
+++ b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp
@@ -2454,8 +2454,8 @@ bool LowerTypeTestsModule::lower() {
 
         auto It = GlobalTypeMembers.find(Base);
         if (It == GlobalTypeMembers.end())
-            reportFatalUsageError(
-                "Expected branch funnel operand to be global value");
+          reportFatalUsageError(
+              "Expected branch funnel operand to be global value");
         GlobalTypeMember *GTM = It->second;
         Targets.push_back(GTM);
         GlobalClassesTy::member_iterator NewSet =

>From b9ccbba188de02f1a3c950b79d93a01317bd20e9 Mon Sep 17 00:00:00 2001
From: Arda Serdar Pektezol <arda at pektezol.dev>
Date: Wed, 15 Jul 2026 08:55:10 +0300
Subject: [PATCH 3/3] update message to be distinguishable

---
 llvm/lib/Transforms/IPO/LowerTypeTests.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp
index 80077d85d0412..e25451cd1f53d 100644
--- a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp
+++ b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp
@@ -2458,8 +2458,8 @@ bool LowerTypeTestsModule::lower() {
 
         auto It = GlobalTypeMembers.find(Base);
         if (It == GlobalTypeMembers.end())
-          reportFatalUsageError(
-              "Expected branch funnel operand to be global value");
+          reportFatalUsageError("Expected branch funnel operand to be a "
+                                "defined global value with type metadata");
         GlobalTypeMember *GTM = It->second;
         Targets.push_back(GTM);
         GlobalClassesTy::member_iterator NewSet =



More information about the llvm-commits mailing list