[llvm] IR: Fix verifier missing addrspace mismatch in vector GEPs (PR #114091)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 29 10:28:09 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-ir
Author: Matt Arsenault (arsenm)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/114091.diff
2 Files Affected:
- (modified) llvm/lib/IR/Verifier.cpp (+5-6)
- (modified) llvm/unittests/IR/VerifierTest.cpp (+30)
``````````diff
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index ee807ca13787d5..ffcab98db9aa02 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -4121,8 +4121,9 @@ void Verifier::visitGetElementPtrInst(GetElementPtrInst &GEP) {
GetElementPtrInst::getIndexedType(GEP.getSourceElementType(), Idxs);
Check(ElTy, "Invalid indices for GEP pointer type!", &GEP);
- Check(GEP.getType()->isPtrOrPtrVectorTy() &&
- GEP.getResultElementType() == ElTy,
+ PointerType *PtrTy = dyn_cast<PointerType>(GEP.getType()->getScalarType());
+
+ Check(PtrTy && GEP.getResultElementType() == ElTy,
"GEP is not of right type for indices!", &GEP, ElTy);
if (auto *GEPVTy = dyn_cast<VectorType>(GEP.getType())) {
@@ -4144,10 +4145,8 @@ void Verifier::visitGetElementPtrInst(GetElementPtrInst &GEP) {
}
}
- if (auto *PTy = dyn_cast<PointerType>(GEP.getType())) {
- Check(GEP.getAddressSpace() == PTy->getAddressSpace(),
- "GEP address space doesn't match type", &GEP);
- }
+ Check(GEP.getAddressSpace() == PtrTy->getAddressSpace(),
+ "GEP address space doesn't match type", &GEP);
visitInstruction(GEP);
}
diff --git a/llvm/unittests/IR/VerifierTest.cpp b/llvm/unittests/IR/VerifierTest.cpp
index 91cd35a10e9b92..462578a34da837 100644
--- a/llvm/unittests/IR/VerifierTest.cpp
+++ b/llvm/unittests/IR/VerifierTest.cpp
@@ -385,5 +385,35 @@ TEST(VerifierTest, AtomicRMW) {
<< Error;
}
+TEST(VerifierTest, GetElementPtrInst) {
+ LLVMContext C;
+ Module M("M", C);
+ FunctionType *FTy = FunctionType::get(Type::getVoidTy(C), /*isVarArg=*/false);
+ Function *F = Function::Create(FTy, Function::ExternalLinkage, "foo", M);
+ BasicBlock *Entry = BasicBlock::Create(C, "entry", F);
+ ReturnInst *RI = ReturnInst::Create(C, Entry);
+
+ FixedVectorType *V2P1Ty = FixedVectorType::get(PointerType::get(C, 1), 2);
+ FixedVectorType *V2P2Ty = FixedVectorType::get(PointerType::get(C, 2), 2);
+
+ Instruction *GEPVec = GetElementPtrInst::Create(
+ Type::getInt8Ty(C), ConstantAggregateZero::get(V2P1Ty),
+ {ConstantVector::getSplat(ElementCount::getFixed(2),
+ ConstantInt::get(Type::getInt64Ty(C), 0))},
+ Entry);
+
+ GEPVec->insertBefore(RI);
+
+ // Break the address space of the source value
+ GEPVec->getOperandUse(0).set(ConstantAggregateZero::get(V2P2Ty));
+
+ std::string Error;
+ raw_string_ostream ErrorOS(Error);
+ EXPECT_TRUE(verifyFunction(*F, &ErrorOS));
+ EXPECT_TRUE(
+ StringRef(Error).starts_with("GEP address space doesn't match type"))
+ << Error;
+}
+
} // end anonymous namespace
} // end namespace llvm
``````````
</details>
https://github.com/llvm/llvm-project/pull/114091
More information about the llvm-commits
mailing list