diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2018-03-16 17:50:44 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2018-03-16 17:50:44 +0000 | 
| commit | 077d36ae021ca14b90042db269fb241024c20a5d (patch) | |
| tree | 77447dafe27c44f242260e4a4d9cf35ce5dda4e2 /contrib/llvm/lib/IR/ConstantFold.cpp | |
| parent | 29c29cbb402cc017f0724a13fa1a586bb51d3732 (diff) | |
Notes
Diffstat (limited to 'contrib/llvm/lib/IR/ConstantFold.cpp')
| -rw-r--r-- | contrib/llvm/lib/IR/ConstantFold.cpp | 25 | 
1 files changed, 18 insertions, 7 deletions
| diff --git a/contrib/llvm/lib/IR/ConstantFold.cpp b/contrib/llvm/lib/IR/ConstantFold.cpp index 59818a1425f1..adb6724fc9c0 100644 --- a/contrib/llvm/lib/IR/ConstantFold.cpp +++ b/contrib/llvm/lib/IR/ConstantFold.cpp @@ -2018,8 +2018,16 @@ static bool isInBoundsIndices(ArrayRef<IndexTy> Idxs) {    // If the first index is one and all the rest are zero, it's in bounds,    // by the one-past-the-end rule. -  if (!cast<ConstantInt>(Idxs[0])->isOne()) -    return false; +  if (auto *CI = dyn_cast<ConstantInt>(Idxs[0])) { +    if (!CI->isOne()) +      return false; +  } else { +    auto *CV = cast<ConstantDataVector>(Idxs[0]); +    CI = dyn_cast_or_null<ConstantInt>(CV->getSplatValue()); +    if (!CI || !CI->isOne()) +      return false; +  } +    for (unsigned i = 1, e = Idxs.size(); i != e; ++i)      if (!cast<Constant>(Idxs[i])->isNullValue())        return false; @@ -2049,15 +2057,18 @@ Constant *llvm::ConstantFoldGetElementPtr(Type *PointeeTy, Constant *C,                                            ArrayRef<Value *> Idxs) {    if (Idxs.empty()) return C; -  if (isa<UndefValue>(C)) { -    Type *GEPTy = GetElementPtrInst::getGEPReturnType( -        C, makeArrayRef((Value * const *)Idxs.data(), Idxs.size())); +  Type *GEPTy = GetElementPtrInst::getGEPReturnType( +      C, makeArrayRef((Value *const *)Idxs.data(), Idxs.size())); + +  if (isa<UndefValue>(C))      return UndefValue::get(GEPTy); -  }    Constant *Idx0 = cast<Constant>(Idxs[0]);    if (Idxs.size() == 1 && (Idx0->isNullValue() || isa<UndefValue>(Idx0))) -    return C; +    return GEPTy->isVectorTy() && !C->getType()->isVectorTy() +               ? ConstantVector::getSplat( +                     cast<VectorType>(GEPTy)->getNumElements(), C) +               : C;    if (C->isNullValue()) {      bool isNull = true; | 
