mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-17 21:29:20 +00:00
Fix conservative assumption, which was quite broken. Also, notice that
functions known to not access memory (like sin/cos) don't access memory! :) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15264 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
eaa243039b
commit
105d26acb4
@ -64,6 +64,8 @@ namespace {
|
||||
/// FunctionEffect - Capture whether or not this function reads or writes to
|
||||
/// ANY memory. If not, we can do a lot of aggressive analysis on it.
|
||||
unsigned FunctionEffect;
|
||||
|
||||
FunctionRecord() : FunctionEffect(0) {}
|
||||
};
|
||||
|
||||
/// GlobalsModRef - The actual analysis pass.
|
||||
@ -232,9 +234,27 @@ void GlobalsModRef::AnalyzeCallGraph(CallGraph &CG, Module &M) {
|
||||
// We do a bottom-up SCC traversal of the call graph. In other words, we
|
||||
// visit all callees before callers (leaf-first).
|
||||
for (scc_iterator<CallGraph*> I = scc_begin(&CG), E = scc_end(&CG); I!=E; ++I)
|
||||
// Do not call AnalyzeSCC on the external function node.
|
||||
if ((*I).size() != 1 || (*I)[0]->getFunction())
|
||||
if ((*I).size() != 1) {
|
||||
AnalyzeSCC(*I);
|
||||
} else if (Function *F = (*I)[0]->getFunction()) {
|
||||
if (!F->isExternal()) {
|
||||
// Nonexternal function.
|
||||
AnalyzeSCC(*I);
|
||||
} else {
|
||||
// Otherwise external function. Handle intrinsics and other special
|
||||
// cases here.
|
||||
if (getAnalysis<AliasAnalysis>().doesNotAccessMemory(F))
|
||||
// If it does not access memory, process the function, causing us to
|
||||
// realize it doesn't do anything (the body is empty).
|
||||
AnalyzeSCC(*I);
|
||||
else {
|
||||
// Otherwise, don't process it. This will cause us to conservatively
|
||||
// assume the worst.
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Do not process the external node, assume the worst.
|
||||
}
|
||||
}
|
||||
|
||||
void GlobalsModRef::AnalyzeSCC(std::vector<CallGraphNode *> &SCC) {
|
||||
|
Loading…
Reference in New Issue
Block a user