[llvm] [Verifier] Make sure all constexprs in instructions are visited (PR #171643)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 10 08:47:43 PST 2025
https://github.com/nikic created https://github.com/llvm/llvm-project/pull/171643
Previously this only happened for constants of some types and missed incorrect ptrtoaddr.
>From 31657cb5804cc07ce12033b7e91391c8aba2c986 Mon Sep 17 00:00:00 2001
From: Nikita Popov <npopov at redhat.com>
Date: Wed, 10 Dec 2025 17:33:10 +0100
Subject: [PATCH] [Verifier] Make sure all constexprs in instructions are
visited
Previously this only happened for constants of some types.
---
llvm/lib/IR/Verifier.cpp | 13 +++++--------
.../Assembler/ptrtoaddr-invalid-constexpr.ll | 16 ++++++++++++++--
2 files changed, 19 insertions(+), 10 deletions(-)
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 040e6efe4c6e3..5a191615daa0b 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -2676,6 +2676,9 @@ void Verifier::verifyFunctionMetadata(
}
void Verifier::visitConstantExprsRecursively(const Constant *EntryC) {
+ if (EntryC->getNumOperands() == 0)
+ return;
+
if (!ConstantExprVisited.insert(EntryC).second)
return;
@@ -5610,14 +5613,8 @@ void Verifier::visitInstruction(Instruction &I) {
} else if (isa<InlineAsm>(I.getOperand(i))) {
Check(CBI && &CBI->getCalledOperandUse() == &I.getOperandUse(i),
"Cannot take the address of an inline asm!", &I);
- } else if (auto *CPA = dyn_cast<ConstantPtrAuth>(I.getOperand(i))) {
- visitConstantExprsRecursively(CPA);
- } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(I.getOperand(i))) {
- if (CE->getType()->isPtrOrPtrVectorTy()) {
- // If we have a ConstantExpr pointer, we need to see if it came from an
- // illegal bitcast.
- visitConstantExprsRecursively(CE);
- }
+ } else if (auto *C = dyn_cast<Constant>(I.getOperand(i))) {
+ visitConstantExprsRecursively(C);
}
}
diff --git a/llvm/test/Assembler/ptrtoaddr-invalid-constexpr.ll b/llvm/test/Assembler/ptrtoaddr-invalid-constexpr.ll
index 665deff4cd04b..2732ceaace38b 100644
--- a/llvm/test/Assembler/ptrtoaddr-invalid-constexpr.ll
+++ b/llvm/test/Assembler/ptrtoaddr-invalid-constexpr.ll
@@ -52,5 +52,17 @@
; DST_NOT_ADDR_SIZE-NEXT: PtrToAddr result must be address width
; DST_NOT_ADDR_SIZE-NEXT: i32 ptrtoaddr (ptr @g to i32)
@g_vec = global <4 x i32> ptrtoaddr (<4 x ptr> <ptr @g, ptr @g, ptr @g, ptr @g> to <4 x i32>)
-; TODO: Verifier.cpp does not visit ConstantVector/ConstantStruct values
-; TODO-DST_NOT_ADDR_SIZE: PtrToAddr result must be address width
+
+;--- dst_not_addr_size_in_inst.ll
+; RUN: not llvm-as %t/dst_not_addr_size_in_inst.ll -o /dev/null 2>&1 | FileCheck -check-prefix=DST_NOT_ADDR_SIZE_IN_INST %s --implicit-check-not="error:"
+; DST_NOT_ADDR_SIZE_IN_INST: PtrToAddr result must be address width
+; DST_NOT_ADDR_SIZE_IN_INST-NEXT: i32 ptrtoaddr (ptr @fn to i32)
+define i32 @fn() {
+ ret i32 ptrtoaddr (ptr @fn to i32)
+}
+
+; DST_NOT_ADDR_SIZE_IN_INST: PtrToAddr result must be address width
+; DST_NOT_ADDR_SIZE_IN_INST-NEXT: i32 ptrtoaddr (ptr @fn2 to i32)
+define <2 x i32> @fn2() {
+ ret <2 x i32> <i32 ptrtoaddr (ptr @fn2 to i32), i32 ptrtoaddr (ptr @fn2 to i32)>
+}
More information about the llvm-commits
mailing list