diff options
Diffstat (limited to 'lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp')
| -rw-r--r-- | lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp | 48 | 
1 files changed, 29 insertions, 19 deletions
diff --git a/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp b/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp index d4f06e18b957..742caf649007 100644 --- a/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp +++ b/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp @@ -16,6 +16,7 @@  #include "llvm/ADT/SmallString.h"  #include "llvm/ADT/Statistic.h"  #include "llvm/Analysis/Loads.h" +#include "llvm/Transforms/Utils/Local.h"  #include "llvm/IR/ConstantRange.h"  #include "llvm/IR/DataLayout.h"  #include "llvm/IR/IntrinsicInst.h" @@ -23,7 +24,6 @@  #include "llvm/IR/MDBuilder.h"  #include "llvm/IR/PatternMatch.h"  #include "llvm/Transforms/Utils/BasicBlockUtils.h" -#include "llvm/Transforms/Utils/Local.h"  using namespace llvm;  using namespace PatternMatch; @@ -270,7 +270,7 @@ void PointerReplacer::findLoadAndReplace(Instruction &I) {      auto *Inst = dyn_cast<Instruction>(&*U);      if (!Inst)        return; -    DEBUG(dbgs() << "Found pointer user: " << *U << '\n'); +    LLVM_DEBUG(dbgs() << "Found pointer user: " << *U << '\n');      if (isa<LoadInst>(Inst)) {        for (auto P : Path)          replace(P); @@ -405,8 +405,8 @@ Instruction *InstCombiner::visitAllocaInst(AllocaInst &AI) {            Copy->getSource(), AI.getAlignment(), DL, &AI, &AC, &DT);        if (AI.getAlignment() <= SourceAlign &&            isDereferenceableForAllocaSize(Copy->getSource(), &AI, DL)) { -        DEBUG(dbgs() << "Found alloca equal to global: " << AI << '\n'); -        DEBUG(dbgs() << "  memcpy = " << *Copy << '\n'); +        LLVM_DEBUG(dbgs() << "Found alloca equal to global: " << AI << '\n'); +        LLVM_DEBUG(dbgs() << "  memcpy = " << *Copy << '\n');          for (unsigned i = 0, e = ToDelete.size(); i != e; ++i)            eraseInstFromFunction(*ToDelete[i]);          Constant *TheSrc = cast<Constant>(Copy->getSource()); @@ -437,10 +437,10 @@ Instruction *InstCombiner::visitAllocaInst(AllocaInst &AI) {  // Are we allowed to form a atomic load or store of this type?  static bool isSupportedAtomicType(Type *Ty) { -  return Ty->isIntegerTy() || Ty->isPointerTy() || Ty->isFloatingPointTy(); +  return Ty->isIntOrPtrTy() || Ty->isFloatingPointTy();  } -/// \brief Helper to combine a load to a new type. +/// Helper to combine a load to a new type.  ///  /// This just does the work of combining a load to a new type. It handles  /// metadata, etc., and returns the new instruction. The \c NewTy should be the @@ -453,15 +453,20 @@ static LoadInst *combineLoadToNewType(InstCombiner &IC, LoadInst &LI, Type *NewT                                        const Twine &Suffix = "") {    assert((!LI.isAtomic() || isSupportedAtomicType(NewTy)) &&           "can't fold an atomic load to requested type"); -   +    Value *Ptr = LI.getPointerOperand();    unsigned AS = LI.getPointerAddressSpace();    SmallVector<std::pair<unsigned, MDNode *>, 8> MD;    LI.getAllMetadata(MD); +  Value *NewPtr = nullptr; +  if (!(match(Ptr, m_BitCast(m_Value(NewPtr))) && +        NewPtr->getType()->getPointerElementType() == NewTy && +        NewPtr->getType()->getPointerAddressSpace() == AS)) +    NewPtr = IC.Builder.CreateBitCast(Ptr, NewTy->getPointerTo(AS)); +    LoadInst *NewLoad = IC.Builder.CreateAlignedLoad( -      IC.Builder.CreateBitCast(Ptr, NewTy->getPointerTo(AS)), -      LI.getAlignment(), LI.isVolatile(), LI.getName() + Suffix); +      NewPtr, LI.getAlignment(), LI.isVolatile(), LI.getName() + Suffix);    NewLoad->setAtomic(LI.getOrdering(), LI.getSyncScopeID());    MDBuilder MDB(NewLoad->getContext());    for (const auto &MDPair : MD) { @@ -507,7 +512,7 @@ static LoadInst *combineLoadToNewType(InstCombiner &IC, LoadInst &LI, Type *NewT    return NewLoad;  } -/// \brief Combine a store to a new type. +/// Combine a store to a new type.  ///  /// Returns the newly created store instruction.  static StoreInst *combineStoreToNewValue(InstCombiner &IC, StoreInst &SI, Value *V) { @@ -584,7 +589,7 @@ static bool isMinMaxWithLoads(Value *V) {            match(L2, m_Load(m_Specific(LHS))));  } -/// \brief Combine loads to match the type of their uses' value after looking +/// Combine loads to match the type of their uses' value after looking  /// through intervening bitcasts.  ///  /// The core idea here is that if the result of a load is used in an operation, @@ -959,23 +964,26 @@ static Instruction *replaceGEPIdxWithZero(InstCombiner &IC, Value *Ptr,  }  static bool canSimplifyNullStoreOrGEP(StoreInst &SI) { -  if (SI.getPointerAddressSpace() != 0) +  if (NullPointerIsDefined(SI.getFunction(), SI.getPointerAddressSpace()))      return false;    auto *Ptr = SI.getPointerOperand();    if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(Ptr))      Ptr = GEPI->getOperand(0); -  return isa<ConstantPointerNull>(Ptr); +  return (isa<ConstantPointerNull>(Ptr) && +          !NullPointerIsDefined(SI.getFunction(), SI.getPointerAddressSpace()));  }  static bool canSimplifyNullLoadOrGEP(LoadInst &LI, Value *Op) {    if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(Op)) {      const Value *GEPI0 = GEPI->getOperand(0); -    if (isa<ConstantPointerNull>(GEPI0) && GEPI->getPointerAddressSpace() == 0) +    if (isa<ConstantPointerNull>(GEPI0) && +        !NullPointerIsDefined(LI.getFunction(), GEPI->getPointerAddressSpace()))        return true;    }    if (isa<UndefValue>(Op) || -      (isa<ConstantPointerNull>(Op) && LI.getPointerAddressSpace() == 0)) +      (isa<ConstantPointerNull>(Op) && +       !NullPointerIsDefined(LI.getFunction(), LI.getPointerAddressSpace())))      return true;    return false;  } @@ -1071,14 +1079,16 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) {        // load (select (cond, null, P)) -> load P        if (isa<ConstantPointerNull>(SI->getOperand(1)) && -          LI.getPointerAddressSpace() == 0) { +          !NullPointerIsDefined(SI->getFunction(), +                                LI.getPointerAddressSpace())) {          LI.setOperand(0, SI->getOperand(2));          return &LI;        }        // load (select (cond, P, null)) -> load P        if (isa<ConstantPointerNull>(SI->getOperand(2)) && -          LI.getPointerAddressSpace() == 0) { +          !NullPointerIsDefined(SI->getFunction(), +                                LI.getPointerAddressSpace())) {          LI.setOperand(0, SI->getOperand(1));          return &LI;        } @@ -1087,7 +1097,7 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) {    return nullptr;  } -/// \brief Look for extractelement/insertvalue sequence that acts like a bitcast. +/// Look for extractelement/insertvalue sequence that acts like a bitcast.  ///  /// \returns underlying value that was "cast", or nullptr otherwise.  /// @@ -1142,7 +1152,7 @@ static Value *likeBitCastFromVector(InstCombiner &IC, Value *V) {    return U;  } -/// \brief Combine stores to match the type of value being stored. +/// Combine stores to match the type of value being stored.  ///  /// The core idea here is that the memory does not have any intrinsic type and  /// where we can we should match the type of a store to the type of value being  | 
