diff options
| author | Nick Lewycky <nicholas@mxc.ca> | 2011-05-29 18:41:56 +0000 | 
|---|---|---|
| committer | Nick Lewycky <nicholas@mxc.ca> | 2011-05-29 18:41:56 +0000 | 
| commit | a3bb03e400a9996f6719cbd3d9c5a8513a070ffa (patch) | |
| tree | 2c8280ecfa156d8d63ab2499ebe37e52f12b972a /llvm/lib/Transforms | |
| parent | 28d55e0745d06c24f0957f97c6f7517de27345be (diff) | |
| download | bcm5719-llvm-a3bb03e400a9996f6719cbd3d9c5a8513a070ffa.tar.gz bcm5719-llvm-a3bb03e400a9996f6719cbd3d9c5a8513a070ffa.zip | |
Obey the isVolatile bit on memory intrinsics when analyzing uses of a global
variable. Noticed by inspection.
Simulate memset in EvaluateFunction where the target of the memset and the
value we're setting are both the null value. Fixes PR10047!
llvm-svn: 132288
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/IPO/GlobalOpt.cpp | 24 | 
1 files changed, 19 insertions, 5 deletions
| diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp index 9d98bb156b4..371500bc786 100644 --- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp +++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp @@ -241,15 +241,15 @@ static bool AnalyzeGlobal(const Value *V, GlobalStatus &GS,          GS.HasPHIUser = true;        } else if (isa<CmpInst>(I)) {          GS.isCompared = true; -      } else if (isa<MemTransferInst>(I)) { -        const MemTransferInst *MTI = cast<MemTransferInst>(I); +      } else if (const MemTransferInst *MTI = dyn_cast<MemTransferInst>(I)) { +        if (MTI->isVolatile()) return true;          if (MTI->getArgOperand(0) == V)            GS.StoredType = GlobalStatus::isStored;          if (MTI->getArgOperand(1) == V)            GS.isLoaded = true; -      } else if (isa<MemSetInst>(I)) { -        assert(cast<MemSetInst>(I)->getArgOperand(0) == V && -               "Memset only takes one pointer!"); +      } else if (const MemSetInst *MSI = dyn_cast<MemSetInst>(I)) { +        assert(MSI->getArgOperand(0) == V && "Memset only takes one pointer!"); +        if (MSI->isVolatile()) return true;          GS.StoredType = GlobalStatus::isStored;        } else {          return true;  // Any other non-load instruction might take address! @@ -2438,6 +2438,20 @@ static bool EvaluateFunction(Function *F, Constant *&RetVal,        // Cannot handle inline asm.        if (isa<InlineAsm>(CI->getCalledValue())) return false; +      if (MemSetInst *MSI = dyn_cast<MemSetInst>(CI)) { +        if (MSI->isVolatile()) return false; +        Constant *Ptr = getVal(Values, MSI->getDest()); +        Constant *Val = getVal(Values, MSI->getValue()); +        Constant *DestVal = ComputeLoadResult(getVal(Values, Ptr), +                                              MutatedMemory); +        if (Val->isNullValue() && DestVal->isNullValue()) { +          // This memset is a no-op. +          ++CurInst; +          continue; +        } +        return false; +      } +        // Resolve function pointers.        Function *Callee = dyn_cast<Function>(getVal(Values,                                                     CI->getCalledValue())); | 

