diff options
author | Duncan Sands <baldrick@free.fr> | 2008-09-20 16:45:58 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2008-09-20 16:45:58 +0000 |
commit | f95f945fb00ea7fb33adab917ceb022451e9f2a5 (patch) | |
tree | f1f0e89f18b0e41e6e726e60df5160c577e15532 /lib/Transforms/IPO/AddReadAttrs.cpp | |
parent | 34d8f7559cfe3a416c400b863919dbc6e4f347f9 (diff) |
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/AddReadAttrs.cpp')
-rw-r--r-- | lib/Transforms/IPO/AddReadAttrs.cpp | 37 |
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(); } } |