mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-10 20:33:15 +00:00
When building local graphs, clone the initializer for constant globals into each
local graph that uses the global. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11850 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e3fcabe068
commit
c420ab6c25
@ -177,6 +177,18 @@ DSGraph::DSGraph(const TargetData &td, Function &F, DSGraph *GG)
|
|||||||
else
|
else
|
||||||
++I;
|
++I;
|
||||||
|
|
||||||
|
// If there are any constant globals referenced in this function, merge their
|
||||||
|
// initializers into the local graph from the globals graph.
|
||||||
|
if (ScalarMap.global_begin() != ScalarMap.global_end()) {
|
||||||
|
ReachabilityCloner RC(*this, *GG, 0);
|
||||||
|
|
||||||
|
for (DSScalarMap::global_iterator I = ScalarMap.global_begin();
|
||||||
|
I != ScalarMap.global_end(); ++I)
|
||||||
|
if (GlobalVariable *GV = dyn_cast<GlobalVariable>(*I))
|
||||||
|
if (GV->isConstant())
|
||||||
|
RC.merge(ScalarMap[GV], GG->ScalarMap[GV]);
|
||||||
|
}
|
||||||
|
|
||||||
markIncompleteNodes(DSGraph::MarkFormalArgs);
|
markIncompleteNodes(DSGraph::MarkFormalArgs);
|
||||||
|
|
||||||
// Remove any nodes made dead due to merging...
|
// Remove any nodes made dead due to merging...
|
||||||
@ -894,18 +906,20 @@ bool LocalDataStructures::run(Module &M) {
|
|||||||
|
|
||||||
const TargetData &TD = getAnalysis<TargetData>();
|
const TargetData &TD = getAnalysis<TargetData>();
|
||||||
|
|
||||||
|
{
|
||||||
|
GraphBuilder GGB(*GlobalsGraph);
|
||||||
|
|
||||||
|
// Add initializers for all of the globals to the globals graph...
|
||||||
|
for (Module::giterator I = M.gbegin(), E = M.gend(); I != E; ++I)
|
||||||
|
if (!I->isExternal())
|
||||||
|
GGB.mergeInGlobalInitializer(I);
|
||||||
|
}
|
||||||
|
|
||||||
// Calculate all of the graphs...
|
// Calculate all of the graphs...
|
||||||
for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
|
for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
|
||||||
if (!I->isExternal())
|
if (!I->isExternal())
|
||||||
DSInfo.insert(std::make_pair(I, new DSGraph(TD, *I, GlobalsGraph)));
|
DSInfo.insert(std::make_pair(I, new DSGraph(TD, *I, GlobalsGraph)));
|
||||||
|
|
||||||
GraphBuilder GGB(*GlobalsGraph);
|
|
||||||
|
|
||||||
// Add initializers for all of the globals to the globals graph...
|
|
||||||
for (Module::giterator I = M.gbegin(), E = M.gend(); I != E; ++I)
|
|
||||||
if (!I->isExternal())
|
|
||||||
GGB.mergeInGlobalInitializer(I);
|
|
||||||
|
|
||||||
GlobalsGraph->removeTriviallyDeadNodes();
|
GlobalsGraph->removeTriviallyDeadNodes();
|
||||||
GlobalsGraph->markIncompleteNodes(DSGraph::MarkFormalArgs);
|
GlobalsGraph->markIncompleteNodes(DSGraph::MarkFormalArgs);
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user