[llvm] [ValueTracking] Support Array and Structure in contains* check (PR #226748)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Sun Sep 27 08:53:23 PDT 2026
================
@@ -309,19 +309,44 @@ bool Constant::isElementWiseEqual(Value *Y) const {
return CmpEq && (isa<PoisonValue>(CmpEq) || match(CmpEq, m_One()));
}
+static std::optional<unsigned> getNumWalkableElements(Type *Ty) {
+ if (auto *FVTy = dyn_cast<FixedVectorType>(Ty))
+ return FVTy->getNumElements();
+ if (auto *STy = dyn_cast<StructType>(Ty))
+ return STy->getNumElements();
+ if (auto *ATy = dyn_cast<ArrayType>(Ty))
+ return ATy->getNumElements();
+ return std::nullopt;
+}
+
+static bool
+containsMatchingElement(const Constant *C,
+ function_ref<bool(const Constant *)> PredFn) {
+ std::optional<unsigned> NumElts = getNumWalkableElements(C->getType());
+ if (!NumElts)
+ return false;
+
+ for (unsigned I = 0; I != *NumElts; ++I) {
+ Constant *Elt = C->getAggregateElement(I);
+ if (Elt && (PredFn(Elt) || containsMatchingElement(Elt, PredFn)))
+ return true;
+ }
+ return false;
+}
+
static bool
containsUndefinedElement(const Constant *C,
function_ref<bool(const Constant *)> HasFn) {
- if (C->getType()->isVectorTy()) {
- if (HasFn(C))
- return true;
- if (isa<ConstantAggregateZero>(C))
- return false;
+ Type *Ty = C->getType();
+ if (!Ty->isVectorTy() && !Ty->isStructTy())
----------------
nikic wrote:
> isGuaranteedNotToBeUndefOrPoison only use these two.
But why? If it supports structs, shouldn't it also support arrays?
https://github.com/llvm/llvm-project/pull/226748
More information about the llvm-commits
mailing list