[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