[llvm] [Attributor]: AApointerInfo - store the full chain of instructions that make up the access (PR #96526)
Vidush Singhal via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 9 17:23:02 PDT 2024
================
@@ -926,10 +933,95 @@ struct AA::PointerInfo::State : public AbstractState {
BooleanState BS;
};
+AAPointerInfo::AccessPathSetTy *AA::PointerInfo::State::findAllAccessPaths(
+ AAPointerInfo::OffsetInfoMapTy &OffsetInfoMap, Instruction *LocalI) {
+ AAPointerInfo::AccessPathSetTy *AccessPathsSet =
+ new AAPointerInfo::AccessPathSetTy();
+
+ // Store the instruction and its storage (i.e, which path it belongs to)
+ // on the stack.
+ // We also store the visited map on the stack.
+ // Since we want to find new paths, we want to make sure an instruction is
+ // not visited twice on the same path. However, we can visit the same
+ // instruction more that once if it exists on different paths.
+ using VisitedTy = SmallPtrSet<Value *, 4>;
+ using StackElementTy =
+ std::tuple<Value *, AAPointerInfo::AccessPathTy *, VisitedTy>;
+
+ SmallVector<StackElementTy, 16> Stack;
+
+ // Populate the stack with elements.
+ for (auto *It = LocalI->op_begin(); It != LocalI->op_end(); It++) {
+ Value *V = cast<Value>(It);
+ if (!OffsetInfoMap.contains(V))
+ continue;
+
+ SmallPtrSet<Value *, 4> LocalVisitedMap;
+ AAPointerInfo::AccessPathTy *NewPath = new AAPointerInfo::AccessPathTy();
+ AccessPathsSet->insert(NewPath);
+ NewPath->push_back(LocalI);
+ Stack.push_back(std::make_tuple(V, NewPath, LocalVisitedMap));
+ }
+
+ while (!Stack.empty()) {
+ auto Entry = Stack.pop_back_val();
+ Value *Top = std::get<0>(Entry);
+ AAPointerInfo::AccessPathTy *CurrentChain = std::get<1>(Entry);
+ auto &Visited = std::get<2>(Entry);
+
+ if (!OffsetInfoMap.contains(Top))
+ continue;
+
+ if (!Visited.insert(Top).second)
+ continue;
+
+ CurrentChain->push_back(Top);
+ auto OI = OffsetInfoMap.lookup(Top);
+ auto &Origins = OI.Origins;
+
+ SmallPtrSet<Value *, 16> Successors;
+ for (auto &Origin : Origins) {
+ for (auto *Val : Origin) {
+ // Since we store depth 1 predecessors in our Origins map
+ // We can be sure that we hit termination condition if the
+ // Successor is the current instruction.
+ if (Val != Top)
+ Successors.insert(Val);
+ }
+ }
+
+ if (Successors.empty())
+ continue;
+
+ // Create new paths to be forked
+ SmallVector<AAPointerInfo::AccessPathTy *> NewPaths;
+ NewPaths.push_back(CurrentChain);
+ for (size_t Index = 1; Index < Successors.size(); Index++) {
+ AAPointerInfo::AccessPathTy *NewPath = new AAPointerInfo::AccessPathTy(
----------------
vidsinghal wrote:
I free them now in AA::PointerInfo::State, since we want to persist them in AApointerInfo's State.
I manually free them there.
https://github.com/llvm/llvm-project/pull/96526
More information about the llvm-commits
mailing list