[llvm] [GVN] Look through select/phi when determining underlying object (PR #99509)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 18 08:57:11 PDT 2024
================
@@ -6609,6 +6609,48 @@ void llvm::getUnderlyingObjects(const Value *V,
} while (!Worklist.empty());
}
+const Value *
+llvm::getUnderlyingObjectThroughPhisAndSelects(const Value *V,
+ unsigned MaxLookup) {
+ const unsigned MaxVisited = 8;
+
+ SmallPtrSet<const Value *, 8> Visited;
+ SmallVector<const Value *, 8> Worklist;
+ Worklist.push_back(V);
+ const Value *Object = nullptr, *FirstObject = nullptr;
+ do {
+ const Value *P = Worklist.pop_back_val();
+ P = getUnderlyingObject(P, MaxLookup);
+
+ if (!FirstObject)
+ FirstObject = P;
+
+ if (!Visited.insert(P).second)
+ continue;
+
+ if (Visited.size() == MaxVisited)
+ return FirstObject;
+
+ if (auto *SI = dyn_cast<SelectInst>(P)) {
+ Worklist.push_back(SI->getTrueValue());
+ Worklist.push_back(SI->getFalseValue());
+ continue;
+ }
+
+ if (auto *PN = dyn_cast<PHINode>(P)) {
----------------
fhahn wrote:
For the loop case, there's also a variant of ` llvm::getUnderlyingObjects(` that tries to identify PHIs that track the same underlying object I think (https://github.com/llvm/llvm-project/blob/main/llvm/lib/Analysis/ValueTracking.cpp#L6589)
Would that help/Should this be unified?
https://github.com/llvm/llvm-project/pull/99509
More information about the llvm-commits
mailing list