summaryrefslogtreecommitdiff
path: root/lib/Transforms/IPO
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2008-09-20 16:45:58 +0000
committerDuncan Sands <baldrick@free.fr>2008-09-20 16:45:58 +0000
commitf95f945fb00ea7fb33adab917ceb022451e9f2a5 (patch)
treef1f0e89f18b0e41e6e726e60df5160c577e15532 /lib/Transforms/IPO
parent34d8f7559cfe3a416c400b863919dbc6e4f347f9 (diff)
downloadllvm-f95f945fb00ea7fb33adab917ceb022451e9f2a5.tar.gz
llvm-f95f945fb00ea7fb33adab917ceb022451e9f2a5.tar.bz2
llvm-f95f945fb00ea7fb33adab917ceb022451e9f2a5.tar.xz
Implement review feedback from Devang: make use
of mayReadFromMemory and mayWriteToMemory. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56387 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/IPO')
-rw-r--r--lib/Transforms/IPO/AddReadAttrs.cpp37
1 files changed, 11 insertions, 26 deletions
diff --git a/lib/Transforms/IPO/AddReadAttrs.cpp b/lib/Transforms/IPO/AddReadAttrs.cpp
index 1052e06b72..8f7fd6e6a8 100644
--- a/lib/Transforms/IPO/AddReadAttrs.cpp
+++ b/lib/Transforms/IPO/AddReadAttrs.cpp
@@ -54,7 +54,7 @@ bool AddReadAttrs::runOnSCC(const std::vector<CallGraphNode *> &SCC) {
Function *F = SCC[i]->getFunction();
if (F == 0)
- // May write memory.
+ // External node - may write memory.
return false;
if (F->doesNotAccessMemory())
@@ -72,34 +72,19 @@ bool AddReadAttrs::runOnSCC(const std::vector<CallGraphNode *> &SCC) {
continue;
}
- // Scan the function body for explicit loads and stores, or calls to
- // functions that may read or write memory.
+ // Scan the function body for instructions that may read or write memory.
for (inst_iterator II = inst_begin(F), E = inst_end(F); II != E; ++II) {
- Instruction *I = &*II;
- if (LoadInst *LI = dyn_cast<LoadInst>(I)) {
- if (LI->isVolatile())
- // Volatile loads may have side-effects, so treat them as writing
- // memory.
- return false;
- ReadsMemory = true;
- } else if (isa<StoreInst>(I) || isa<MallocInst>(I) || isa<FreeInst>(I)) {
- // Writes memory.
- return false;
- } else if (isa<CallInst>(I) || isa<InvokeInst>(I)) {
- CallSite CS(I);
-
- if (std::find(SCC.begin(), SCC.end(), CG[CS.getCalledFunction()]) !=
- SCC.end())
- // The callee is inside our current SCC - ignore it.
- continue;
+ CallSite CS = CallSite::get(&*II);
- if (!CS.onlyReadsMemory())
- // May write memory.
- return false;
+ // Ignore calls to functions in the same SCC.
+ if (CS.getInstruction() &&
+ std::find(SCC.begin(), SCC.end(), CG[CS.getCalledFunction()]) !=
+ SCC.end())
+ continue;
- if (!CS.doesNotAccessMemory())
- ReadsMemory = true;
- }
+ if (II->mayWriteToMemory())
+ return false;
+ ReadsMemory |= II->mayReadFromMemory();
}
}