Fix PR2792: treat volatile loads as writing memory somewhere.

Treat stores as reading memory, just to play safe.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56188 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan Sands 2008-09-13 12:45:50 +00:00
parent 2aa0e649bf
commit b8ca4ff643
2 changed files with 20 additions and 3 deletions

View File

@ -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;

View File

@ -0,0 +1,9 @@
; RUN: llvm-as < %s | opt -globalsmodref-aa -markmodref | llvm-dis | not grep read
; PR2792
@g = global i32 0 ; <i32*> [#uses=1]
define i32 @f() {
%t = volatile load i32* @g ; <i32> [#uses=1]
ret i32 %t
}