From 94c8e5da4194fa483b0fb25705144cc61f6a90e4 Mon Sep 17 00:00:00 2001 From: "Vikram S. Adve" Date: Thu, 18 Jul 2002 16:13:52 +0000 Subject: [PATCH] Add support for a top-down propagation pass: -- Save a copy of the original call nodes in DSGraph before inlining bottom-up. -- Also, save a list of the callers of each function in DSGraph. llvm-svn: 2966 --- .../DataStructure/BottomUpClosure.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp b/llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp index ed468e31430f..841dd50f43dd 100644 --- a/llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp +++ b/llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp @@ -89,6 +89,9 @@ DSGraph &BUDataStructures::calculateGraph(Function &F) { // Copy the local version into DSInfo... Graph = new DSGraph(getAnalysis().getDSGraph(F)); + // Save a copy of the original call nodes for the top-down pass + Graph->saveOrigFunctionCalls(); + // Start resolving calls... std::vector > &FCs = Graph->getFunctionCalls(); @@ -129,7 +132,7 @@ DSGraph &BUDataStructures::calculateGraph(Function &F) { } else if (!FI.isExternal()) { DEBUG(std::cerr << "In " << F.getName() << " inlining: " << FI.getName() << "\n"); - + // Get the data structure graph for the called function, closing it // if possible (which is only impossible in the case of mutual // recursion... @@ -139,15 +142,19 @@ DSGraph &BUDataStructures::calculateGraph(Function &F) { DEBUG(cerr << "Got graph for " << FI.getName() << " in: " << F.getName() << "\n"); + // Remember the callers for each callee for use in the top-down + // pass so we don't have to compute this again + GI.addCaller(F); - - // Clone the called function's graph into the current graph, keeping - // track of where scalars in the old graph _used_ to point... - map OldValMap; + // Clone the callee's graph into the current graph, keeping + // track of where scalars in the old graph _used_ to point + // and of the new nodes matching nodes of the old graph ... + std::map OldValMap; + std::map OldNodeMap; // unused // The clone call may invalidate any of the vectors in the data // structure graph. - DSNode *RetVal = Graph->cloneInto(GI, OldValMap); + DSNode *RetVal = Graph->cloneInto(GI, OldValMap, OldNodeMap); ResolveArguments(Call, FI, OldValMap);