diff options
Diffstat (limited to 'devel/llvm60/files/patch-head-r331065.diff')
-rw-r--r-- | devel/llvm60/files/patch-head-r331065.diff | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/devel/llvm60/files/patch-head-r331065.diff b/devel/llvm60/files/patch-head-r331065.diff new file mode 100644 index 000000000000..6976ee83460f --- /dev/null +++ b/devel/llvm60/files/patch-head-r331065.diff @@ -0,0 +1,88 @@ +r331065 | dim | 2018-03-16 18:50:44 +0100 (Fri, 16 Mar 2018) | 17 lines + +Pull in r327638 from upstream llvm trunk (by Matthew Simpson): + + [ConstantFolding, InstSimplify] Handle more vector GEPs + + This patch addresses some additional cases where the compiler crashes + upon encountering vector GEPs. This should fix PR36116. + + Differential Revision: https://reviews.llvm.org/D44219 + Reference: https://bugs.llvm.org/show_bug.cgi?id=36116 + +This fixes an assertion when building the emulators/snes9x port. + +Reported by: jbeich +PR: 225471 +MFC after: 3 months +X-MFC-With: r327952 + +Index: lib/Analysis/InstructionSimplify.cpp +=================================================================== +--- lib/Analysis/InstructionSimplify.cpp (revision 331064) ++++ lib/Analysis/InstructionSimplify.cpp (revision 331065) +@@ -3697,7 +3697,7 @@ static Value *SimplifyGEPInst(Type *SrcTy, ArrayRe + + if (Ops.size() == 2) { + // getelementptr P, 0 -> P. +- if (match(Ops[1], m_Zero())) ++ if (match(Ops[1], m_Zero()) && Ops[0]->getType() == GEPTy) + return Ops[0]; + + Type *Ty = SrcTy; +@@ -3706,7 +3706,7 @@ static Value *SimplifyGEPInst(Type *SrcTy, ArrayRe + uint64_t C; + uint64_t TyAllocSize = Q.DL.getTypeAllocSize(Ty); + // getelementptr P, N -> P if P points to a type of zero size. +- if (TyAllocSize == 0) ++ if (TyAllocSize == 0 && Ops[0]->getType() == GEPTy) + return Ops[0]; + + // The following transforms are only safe if the ptrtoint cast +Index: lib/IR/ConstantFold.cpp +=================================================================== +--- lib/IR/ConstantFold.cpp (revision 331064) ++++ lib/IR/ConstantFold.cpp (revision 331065) +@@ -2018,8 +2018,16 @@ static bool isInBoundsIndices(ArrayRef<IndexTy> Id + + // 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 *Po + 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; |