[llvm] c9648d7 - [Verifier] Make sure all constexprs in instructions are visited (#171643)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 10 23:13:52 PST 2025
Author: Nikita Popov
Date: 2025-12-11T08:13:48+01:00
New Revision: c9648d7acd2686142a4f77a37ff225caed620ca8
URL: https://github.com/llvm/llvm-project/commit/c9648d7acd2686142a4f77a37ff225caed620ca8
DIFF: https://github.com/llvm/llvm-project/commit/c9648d7acd2686142a4f77a37ff225caed620ca8.diff
LOG: [Verifier] Make sure all constexprs in instructions are visited (#171643)
Previously this only happened for constants of some types and missed
incorrect ptrtoaddr.
Added:
Modified:
llvm/lib/IR/Verifier.cpp
llvm/test/Assembler/ptrtoaddr-invalid-constexpr.ll
Removed:
################################################################################
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..2857f77ff695b 100644
--- a/llvm/test/Assembler/ptrtoaddr-invalid-constexpr.ll
+++ b/llvm/test/Assembler/ptrtoaddr-invalid-constexpr.ll
@@ -51,6 +51,20 @@
@g = global i32 ptrtoaddr (ptr @g to i32)
; DST_NOT_ADDR_SIZE-NEXT: PtrToAddr result must be address width
; DST_NOT_ADDR_SIZE-NEXT: i32 ptrtoaddr (ptr @g to i32)
- at 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
+ at g_vec = global <4 x i32> ptrtoaddr (<4 x ptr> <ptr @g_vec, ptr @g_vec, ptr @g_vec, ptr @g_vec> to <4 x i32>)
+; DST_NOT_ADDR_SIZE-NEXT: PtrToAddr result must be address width
+; DST_NOT_ADDR_SIZE-NEXT: i32 ptrtoaddr (ptr @g_vec to i32)
+
+;--- 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