diff options
Diffstat (limited to 'contrib/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp')
| -rw-r--r-- | contrib/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp | 24 | 
1 files changed, 13 insertions, 11 deletions
diff --git a/contrib/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/contrib/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp index ced923d6973d..5a055139be4f 100644 --- a/contrib/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp +++ b/contrib/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp @@ -1,9 +1,8 @@  //===- MemCpyOptimizer.cpp - Optimize use of memcpy and friends -----------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception  //  //===----------------------------------------------------------------------===//  // @@ -279,8 +278,8 @@ void MemsetRanges::addRange(int64_t Start, int64_t Size, Value *Ptr,                              unsigned Alignment, Instruction *Inst) {    int64_t End = Start+Size; -  range_iterator I = std::lower_bound(Ranges.begin(), Ranges.end(), Start, -    [](const MemsetRange &LHS, int64_t RHS) { return LHS.End < RHS; }); +  range_iterator I = partition_point( +      Ranges, [=](const MemsetRange &O) { return O.End < Start; });    // We now know that I == E, in which case we didn't find anything to merge    // with, or that Start <= I->End.  If End < I->Start or I == E, then we need @@ -413,7 +412,7 @@ Instruction *MemCpyOptPass::tryMergingIntoMemset(Instruction *StartInst,        if (!NextStore->isSimple()) break;        // Check to see if this stored value is of the same byte-splattable value. -      Value *StoredByte = isBytewiseValue(NextStore->getOperand(0)); +      Value *StoredByte = isBytewiseValue(NextStore->getOperand(0), DL);        if (isa<UndefValue>(ByteVal) && StoredByte)          ByteVal = StoredByte;        if (ByteVal != StoredByte) @@ -750,7 +749,7 @@ bool MemCpyOptPass::processStore(StoreInst *SI, BasicBlock::iterator &BBI) {    // byte at a time like "0" or "-1" or any width, as well as things like    // 0xA0A0A0A0 and 0.0.    auto *V = SI->getOperand(0); -  if (Value *ByteVal = isBytewiseValue(V)) { +  if (Value *ByteVal = isBytewiseValue(V, DL)) {      if (Instruction *I = tryMergingIntoMemset(SI, SI->getPointerOperand(),                                                ByteVal)) {        BBI = I->getIterator(); // Don't invalidate iterator. @@ -1135,8 +1134,10 @@ bool MemCpyOptPass::processMemSetMemCpyDependence(MemCpyInst *MemCpy,    Value *SizeDiff = Builder.CreateSub(DestSize, SrcSize);    Value *MemsetLen = Builder.CreateSelect(        Ule, ConstantInt::getNullValue(DestSize->getType()), SizeDiff); -  Builder.CreateMemSet(Builder.CreateGEP(Dest, SrcSize), MemSet->getOperand(1), -                       MemsetLen, Align); +  Builder.CreateMemSet( +      Builder.CreateGEP(Dest->getType()->getPointerElementType(), Dest, +                        SrcSize), +      MemSet->getOperand(1), MemsetLen, Align);    MD->removeInstruction(MemSet);    MemSet->eraseFromParent(); @@ -1228,7 +1229,8 @@ bool MemCpyOptPass::processMemCpy(MemCpyInst *M) {    // If copying from a constant, try to turn the memcpy into a memset.    if (GlobalVariable *GV = dyn_cast<GlobalVariable>(M->getSource()))      if (GV->isConstant() && GV->hasDefinitiveInitializer()) -      if (Value *ByteVal = isBytewiseValue(GV->getInitializer())) { +      if (Value *ByteVal = isBytewiseValue(GV->getInitializer(), +                                           M->getModule()->getDataLayout())) {          IRBuilder<> Builder(M);          Builder.CreateMemSet(M->getRawDest(), ByteVal, M->getLength(),                               M->getDestAlignment(), false);  | 
