From 8d4894e3fa1dcfb3cb22bdf04d3f8e208ca4b811 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 28 Mar 2002 19:33:00 +0000 Subject: [PATCH] Implement getEscapingAllocations & getNonEscapingAllocations llvm-svn: 2021 --- llvm/include/llvm/Analysis/DataStructure.h | 6 +- .../Analysis/DataStructure/EliminateNodes.cpp | 85 +++++++++++++------ 2 files changed, 65 insertions(+), 26 deletions(-) diff --git a/llvm/include/llvm/Analysis/DataStructure.h b/llvm/include/llvm/Analysis/DataStructure.h index 6a048276f1c4..3af030d32007 100644 --- a/llvm/include/llvm/Analysis/DataStructure.h +++ b/llvm/include/llvm/Analysis/DataStructure.h @@ -357,6 +357,8 @@ class FunctionDSGraph { PointerValSet cloneFunctionIntoSelf(const FunctionDSGraph &G, bool ValueMap); bool RemoveUnreachableNodes(); bool UnlinkUndistinguishableNodes(); + void MarkEscapeableNodesReachable(std::vector &RSN, + std::vector &RAN); private: // Define the interface only accessable to DataStructure @@ -375,8 +377,8 @@ public: // void getEscapingAllocations(std::vector &Allocs); - // getEscapingAllocations - Add all allocations that do not escape the current - // function to the specified vector. + // getNonEscapingAllocations - Add all allocations that do not escape the + // current function to the specified vector. // void getNonEscapingAllocations(std::vector &Allocs); diff --git a/llvm/lib/Analysis/DataStructure/EliminateNodes.cpp b/llvm/lib/Analysis/DataStructure/EliminateNodes.cpp index 471c6281df9d..ab94c60d6d8d 100644 --- a/llvm/lib/Analysis/DataStructure/EliminateNodes.cpp +++ b/llvm/lib/Analysis/DataStructure/EliminateNodes.cpp @@ -193,6 +193,34 @@ static void MarkReferredNodesReachable(DSNode *N, AllocNodes, ReachableAllocNodes); } +void FunctionDSGraph::MarkEscapeableNodesReachable( + vector &ReachableShadowNodes, + vector &ReachableAllocNodes) { + // Mark all shadow nodes that have edges from other nodes as reachable. + // Recursively mark any shadow nodes pointed to by the newly live shadow + // nodes as also alive. + // + for (unsigned i = 0, e = ArgNodes.size(); i != e; ++i) + MarkReferredNodesReachable(ArgNodes[i], + ShadowNodes, ReachableShadowNodes, + AllocNodes, ReachableAllocNodes); + + for (unsigned i = 0, e = GlobalNodes.size(); i != e; ++i) + MarkReferredNodesReachable(GlobalNodes[i], + ShadowNodes, ReachableShadowNodes, + AllocNodes, ReachableAllocNodes); + + for (unsigned i = 0, e = CallNodes.size(); i != e; ++i) + MarkReferredNodesReachable(CallNodes[i], + ShadowNodes, ReachableShadowNodes, + AllocNodes, ReachableAllocNodes); + + // Mark all nodes in the return set as being reachable... + MarkReferredNodeSetReachable(RetNode, + ShadowNodes, ReachableShadowNodes, + AllocNodes, ReachableAllocNodes); +} + bool FunctionDSGraph::RemoveUnreachableNodes() { bool Changed = false; @@ -202,30 +230,8 @@ bool FunctionDSGraph::RemoveUnreachableNodes() { // vector ReachableShadowNodes(ShadowNodes.size()); vector ReachableAllocNodes (AllocNodes.size()); - - // Mark all shadow nodes that have edges from other nodes as reachable. - // Recursively mark any shadow nodes pointed to by the newly live shadow - // nodes as also alive. - // - for (unsigned i = 0, e = ArgNodes.size(); i != e; ++i) - MarkReferredNodesReachable(ArgNodes[i], - ShadowNodes, ReachableShadowNodes, - AllocNodes, ReachableAllocNodes); - - for (unsigned i = 0, e = GlobalNodes.size(); i != e; ++i) - MarkReferredNodesReachable(GlobalNodes[i], - ShadowNodes, ReachableShadowNodes, - AllocNodes, ReachableAllocNodes); - - for (unsigned i = 0, e = CallNodes.size(); i != e; ++i) - MarkReferredNodesReachable(CallNodes[i], - ShadowNodes, ReachableShadowNodes, - AllocNodes, ReachableAllocNodes); - - // Mark all nodes in the return set as being reachable... - MarkReferredNodeSetReachable(RetNode, - ShadowNodes, ReachableShadowNodes, - AllocNodes, ReachableAllocNodes); + + MarkEscapeableNodesReachable(ReachableShadowNodes, ReachableAllocNodes); // Mark all nodes in the value map as being reachable... for (std::map::iterator I = ValueMap.begin(), @@ -280,3 +286,34 @@ bool FunctionDSGraph::RemoveUnreachableNodes() { Changed = true; } } + + + + +// getEscapingAllocations - Add all allocations that escape the current +// function to the specified vector. +// +void FunctionDSGraph::getEscapingAllocations(vector &Allocs) { + vector ReachableShadowNodes(ShadowNodes.size()); + vector ReachableAllocNodes (AllocNodes.size()); + + MarkEscapeableNodesReachable(ReachableShadowNodes, ReachableAllocNodes); + + for (unsigned i = 0, e = AllocNodes.size(); i != e; ++i) + if (ReachableAllocNodes[i]) + Allocs.push_back(AllocNodes[i]); +} + +// getNonEscapingAllocations - Add all allocations that do not escape the +// current function to the specified vector. +// +void FunctionDSGraph::getNonEscapingAllocations(vector &Allocs) { + vector ReachableShadowNodes(ShadowNodes.size()); + vector ReachableAllocNodes (AllocNodes.size()); + + MarkEscapeableNodesReachable(ReachableShadowNodes, ReachableAllocNodes); + + for (unsigned i = 0, e = AllocNodes.size(); i != e; ++i) + if (!ReachableAllocNodes[i]) + Allocs.push_back(AllocNodes[i]); +}