diff options
| author | Duncan Sands <baldrick@free.fr> | 2008-09-13 12:45:50 +0000 |
|---|---|---|
| committer | Duncan Sands <baldrick@free.fr> | 2008-09-13 12:45:50 +0000 |
| commit | 9ddb3145aef88368e38d0719ad7d6edeb9a3bab3 (patch) | |
| tree | 20d8c18b055a3521f0fd53197723614d6481a322 /llvm/lib/Analysis/IPA/GlobalsModRef.cpp | |
| parent | 2d470fc0ba6ae4b0ab51fde2e823b3af1879deab (diff) | |
| download | bcm5719-llvm-9ddb3145aef88368e38d0719ad7d6edeb9a3bab3.tar.gz bcm5719-llvm-9ddb3145aef88368e38d0719ad7d6edeb9a3bab3.zip | |
Fix PR2792: treat volatile loads as writing memory somewhere.
Treat stores as reading memory, just to play safe.
llvm-svn: 56188
Diffstat (limited to 'llvm/lib/Analysis/IPA/GlobalsModRef.cpp')
| -rw-r--r-- | llvm/lib/Analysis/IPA/GlobalsModRef.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/IPA/GlobalsModRef.cpp b/llvm/lib/Analysis/IPA/GlobalsModRef.cpp index 390a6028eb4..74327d5c60b 100644 --- a/llvm/lib/Analysis/IPA/GlobalsModRef.cpp +++ b/llvm/lib/Analysis/IPA/GlobalsModRef.cpp @@ -431,12 +431,20 @@ void GlobalsModRef::AnalyzeCallGraph(CallGraph &CG, Module &M) { for (inst_iterator II = inst_begin(SCC[i]->getFunction()), E = inst_end(SCC[i]->getFunction()); II != E && FunctionEffect != ModRef; ++II) - if (isa<LoadInst>(*II)) + if (isa<LoadInst>(*II)) { FunctionEffect |= Ref; - else if (isa<StoreInst>(*II)) + if (cast<LoadInst>(*II).isVolatile()) + // Volatile loads may have side-effects, so mark them as writing + // memory (for example, a flag inside the processor). + FunctionEffect |= Mod; + } else if (isa<StoreInst>(*II)) { FunctionEffect |= Mod; - else if (isa<MallocInst>(*II) || isa<FreeInst>(*II)) + if (cast<StoreInst>(*II).isVolatile()) + // Treat volatile stores as reading memory somewhere. + FunctionEffect |= Ref; + } else if (isa<MallocInst>(*II) || isa<FreeInst>(*II)) { FunctionEffect |= ModRef; + } if ((FunctionEffect & Mod) == 0) ++NumReadMemFunctions; |

