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
This commit is contained in:
parent
1e39fd0d17
commit
18672e1082
@ -3697,7 +3697,7 @@ static Value *SimplifyGEPInst(Type *SrcTy, ArrayRef<Value *> Ops,
|
||||
|
||||
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, ArrayRef<Value *> Ops,
|
||||
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
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user