Changeset View
Changeset View
Standalone View
Standalone View
devel/llvm60/files/patch-head-r331065.diff
- This file was added.
Property | Old Value | New Value |
---|---|---|
fbsd:nokeywords | null | yes \ No newline at end of property |
svn:eol-style | null | native \ No newline at end of property |
svn:mime-type | null | text/plain \ No newline at end of property |
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; |