CFLAndersAAResult::FunctionInfo::FunctionInfo(const ReachabilitySet &ReachSet, AliasAttrMap AMap) { // Populate AttrMap for (const auto &Mapping : AMap.mappings()) { auto IVal = Mapping.first; // AttrMap only cares about top-level values if (IVal.DerefLevel == 0) AttrMap[IVal.Val] = Mapping.second; } // Populate AliasMap for (const auto &OuterMapping : ReachSet.value_mappings()) { // AliasMap only cares about top-level values if (OuterMapping.first.DerefLevel > 0) continue; auto Val = OuterMapping.first.Val; auto &AliasList = AliasMap[Val]; for (const auto &InnerMapping : OuterMapping.second) { // Again, AliasMap only cares about top-level values if (InnerMapping.first.DerefLevel == 0) AliasList.push_back(InnerMapping.first.Val); } // Sort AliasList for faster lookup std::sort(AliasList.begin(), AliasList.end(), std::less<const Value *>()); } // TODO: Populate function summary here }
static AliasAttrMap buildAttrMap(const CFLGraph &Graph, const ReachabilitySet &ReachSet) { AliasAttrMap AttrMap; std::vector<InstantiatedValue> WorkList, NextList; // Initialize each node with its original AliasAttrs in CFLGraph for (const auto &Mapping : Graph.value_mappings()) { auto Val = Mapping.first; auto &ValueInfo = Mapping.second; for (unsigned I = 0, E = ValueInfo.getNumLevels(); I < E; ++I) { auto Node = InstantiatedValue{Val, I}; AttrMap.add(Node, ValueInfo.getNodeInfoAtLevel(I).Attr); WorkList.push_back(Node); } } while (!WorkList.empty()) { for (const auto &Dst : WorkList) { auto DstAttr = AttrMap.getAttrs(Dst); if (DstAttr.none()) continue; // Propagate attr on the same level for (const auto &Mapping : ReachSet.reachableValueAliases(Dst)) { auto Src = Mapping.first; if (AttrMap.add(Src, DstAttr)) NextList.push_back(Src); } // Propagate attr to the levels below auto DstBelow = getNodeBelow(Graph, Dst); while (DstBelow) { if (AttrMap.add(*DstBelow, DstAttr)) { NextList.push_back(*DstBelow); break; } DstBelow = getNodeBelow(Graph, *DstBelow); } } WorkList.swap(NextList); NextList.clear(); } return AttrMap; }
static void populateExternalAttributes( SmallVectorImpl<ExternalAttribute> &ExtAttributes, const Function &Fn, const SmallVectorImpl<Value *> &RetVals, const AliasAttrMap &AMap) { for (const auto &Mapping : AMap.mappings()) { if (auto IVal = getInterfaceValue(Mapping.first, RetVals)) { auto Attr = getExternallyVisibleAttrs(Mapping.second); if (Attr.any()) ExtAttributes.push_back(ExternalAttribute{*IVal, Attr}); } } }
static void populateAttrMap(DenseMap<const Value *, AliasAttrs> &AttrMap, const AliasAttrMap &AMap) { for (const auto &Mapping : AMap.mappings()) { auto IVal = Mapping.first; // Insert IVal into the map auto &Attr = AttrMap[IVal.Val]; // AttrMap only cares about top-level values if (IVal.DerefLevel == 0) Attr |= Mapping.second; } }