Fix logical error in TD pass: we should clear Mod/Ref bits of each caller

before inlining their graphs into a function.  To support this,
added flags to CloneFlags to strip/keep Mod/Ref bits.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4836 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Vikram S. Adve 2002-11-27 17:41:13 +00:00
parent e127a14991
commit 61ff02982f
3 changed files with 17 additions and 8 deletions

View File

@ -344,8 +344,9 @@ DSGraph &BUDataStructures::calculateGraph(Function &F) {
#endif #endif
// Handle self recursion by resolving the arguments and return value // Handle self recursion by resolving the arguments and return value
Graph.mergeInGraph(CS, GI, DSGraph::StripAllocaBit | Graph.mergeInGraph(CS, GI,
DSGraph::DontCloneCallNodes); DSGraph::KeepModRefBits |
DSGraph::StripAllocaBit | DSGraph::DontCloneCallNodes);
#if 0 #if 0
Graph.writeGraphToFile(std::cerr, "bu_" + F.getName() + "_after_" + Graph.writeGraphToFile(std::cerr, "bu_" + F.getName() + "_after_" +
@ -424,7 +425,8 @@ DSGraph &BUDataStructures::inlineNonSCCGraphs(Function &F,
<< GI.getAuxFunctionCalls().size() << "]\n"); << GI.getAuxFunctionCalls().size() << "]\n");
// Handle self recursion by resolving the arguments and return value // Handle self recursion by resolving the arguments and return value
Graph.mergeInGraph(CS, GI, DSGraph::StripAllocaBit | Graph.mergeInGraph(CS, GI,
DSGraph::KeepModRefBits | DSGraph::StripAllocaBit |
DSGraph::DontCloneCallNodes); DSGraph::DontCloneCallNodes);
} }
} }
@ -508,7 +510,8 @@ DSGraph &BUDataStructures::calculateSCCGraph(Function &F,
<< GI.getAuxFunctionCalls().size() << "]\n"); << GI.getAuxFunctionCalls().size() << "]\n");
// Handle self recursion by resolving the arguments and return value // Handle self recursion by resolving the arguments and return value
Graph.mergeInGraph(CS, GI, DSGraph::StripAllocaBit | Graph.mergeInGraph(CS, GI,
DSGraph::KeepModRefBits | DSGraph::StripAllocaBit |
DSGraph::DontCloneCallNodes); DSGraph::DontCloneCallNodes);
if (SCCFunctions.count(Callee)) if (SCCFunctions.count(Callee))

View File

@ -598,9 +598,14 @@ DSNodeHandle DSGraph::cloneInto(const DSGraph &G,
Nodes[i]->remapLinks(OldNodeMap); Nodes[i]->remapLinks(OldNodeMap);
// Remove alloca markers as specified // Remove alloca markers as specified
if (CloneFlags & StripAllocaBit) if (CloneFlags & (StripAllocaBit | StripModRefBits)) {
unsigned short clearBits = (CloneFlags & StripAllocaBit
? DSNode::AllocaNode : 0)
| (CloneFlags & StripModRefBits
? (DSNode::Modified | DSNode::Read) : 0);
for (unsigned i = FN, e = Nodes.size(); i != e; ++i) for (unsigned i = FN, e = Nodes.size(); i != e; ++i)
Nodes[i]->NodeType &= ~DSNode::AllocaNode; Nodes[i]->NodeType &= ~clearBits;
}
// Copy the value map... and merge all of the global nodes... // Copy the value map... and merge all of the global nodes...
for (std::map<Value*, DSNodeHandle>::const_iterator I = G.ScalarMap.begin(), for (std::map<Value*, DSNodeHandle>::const_iterator I = G.ScalarMap.begin(),

View File

@ -100,7 +100,7 @@ void TDDataStructures::calculateGraph(Function &F) {
const std::vector<DSCallSite> &CallSites = Graph.getFunctionCalls(); const std::vector<DSCallSite> &CallSites = Graph.getFunctionCalls();
if (CallSites.empty()) { if (CallSites.empty()) {
DEBUG(std::cerr << " [TD] No callees for: " << F.getName() << "\n"); DEBUG(std::cerr << " [TD] No callees for: " << F.getName() << "\n");
return; // If no call sites, the graph is the same as the BU graph! return; // If no call sites, there is nothing more to do here
} }
// Loop over all of the call sites, building a multi-map from Callees to // Loop over all of the call sites, building a multi-map from Callees to
@ -143,9 +143,10 @@ void TDDataStructures::calculateGraph(Function &F) {
std::map<Value*, DSNodeHandle> OldValMap; std::map<Value*, DSNodeHandle> OldValMap;
std::map<const DSNode*, DSNodeHandle> OldNodeMap; std::map<const DSNode*, DSNodeHandle> OldNodeMap;
CG.cloneInto(Graph, OldValMap, OldNodeMap, CG.cloneInto(Graph, OldValMap, OldNodeMap,
DSGraph::StripModRefBits |
DSGraph::KeepAllocaBit | DSGraph::DontCloneCallNodes); DSGraph::KeepAllocaBit | DSGraph::DontCloneCallNodes);
OldValMap.clear(); // We don't care about the ValMap OldValMap.clear(); // We don't care about the ValMap
// Loop over all of the invocation sites of the callee, resolving // Loop over all of the invocation sites of the callee, resolving
// arguments to our graph. This loop may iterate multiple times if the // arguments to our graph. This loop may iterate multiple times if the
// current function calls this callee multiple times with different // current function calls this callee multiple times with different