diff options
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())); | 

