[llvm] r327638 - [ConstantFolding, InstSimplify] Handle more vector GEPs
Matthew Simpson via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 15 09:00:30 PDT 2018
Author: mssimpso
Date: Thu Mar 15 09:00:29 2018
New Revision: 327638
URL: http://llvm.org/viewvc/llvm-project?rev=327638&view=rev
Log:
[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
Modified:
llvm/trunk/lib/Analysis/InstructionSimplify.cpp
llvm/trunk/lib/IR/ConstantFold.cpp
llvm/trunk/test/Analysis/ConstantFolding/vectorgep-crash.ll
llvm/trunk/test/Transforms/InstSimplify/vector_gep.ll
Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=327638&r1=327637&r2=327638&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
+++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Thu Mar 15 09:00:29 2018
@@ -3723,7 +3723,7 @@ static Value *SimplifyGEPInst(Type *SrcT
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;
@@ -3732,7 +3732,7 @@ static Value *SimplifyGEPInst(Type *SrcT
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
Modified: llvm/trunk/lib/IR/ConstantFold.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/ConstantFold.cpp?rev=327638&r1=327637&r2=327638&view=diff
==============================================================================
--- llvm/trunk/lib/IR/ConstantFold.cpp (original)
+++ llvm/trunk/lib/IR/ConstantFold.cpp Thu Mar 15 09:00:29 2018
@@ -2027,8 +2027,16 @@ static bool isInBoundsIndices(ArrayRef<I
// 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;
@@ -2058,15 +2066,18 @@ Constant *llvm::ConstantFoldGetElementPt
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;
Modified: llvm/trunk/test/Analysis/ConstantFolding/vectorgep-crash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ConstantFolding/vectorgep-crash.ll?rev=327638&r1=327637&r2=327638&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/ConstantFolding/vectorgep-crash.ll (original)
+++ llvm/trunk/test/Analysis/ConstantFolding/vectorgep-crash.ll Thu Mar 15 09:00:29 2018
@@ -38,3 +38,29 @@ vector.body:
%VectorGep = getelementptr [65 x %struct.A], [65 x %struct.A]* @G, <16 x i32> zeroinitializer, <16 x i64> <i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15, i64 16>, <16 x i32> zeroinitializer
ret <16 x i32*> %VectorGep
}
+
+ at g = external global i8, align 1
+
+define <2 x i8*> @constant_zero_index() {
+; CHECK-LABEL: @constant_zero_index(
+; CHECK-NEXT: ret <2 x i8*> <i8* @g, i8* @g>
+;
+ %gep = getelementptr i8, i8* @g, <2 x i64> zeroinitializer
+ ret <2 x i8*> %gep
+}
+
+define <2 x i8*> @constant_undef_index() {
+; CHECK-LABEL: @constant_undef_index(
+; CHECK-NEXT: ret <2 x i8*> <i8* @g, i8* @g>
+;
+ %gep = getelementptr i8, i8* @g, <2 x i64> undef
+ ret <2 x i8*> %gep
+}
+
+define <2 x i8*> @constant_inbounds() {
+; CHECK-LABEL: @constant_inbounds(
+; CHECK-NEXT: ret <2 x i8*> getelementptr inbounds (i8, i8* @g, <2 x i64> <i64 1, i64 1>)
+;
+ %gep = getelementptr i8, i8* @g, <2 x i64> <i64 1, i64 1>
+ ret <2 x i8*> %gep
+}
Modified: llvm/trunk/test/Transforms/InstSimplify/vector_gep.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstSimplify/vector_gep.ll?rev=327638&r1=327637&r2=327638&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstSimplify/vector_gep.ll (original)
+++ llvm/trunk/test/Transforms/InstSimplify/vector_gep.ll Thu Mar 15 09:00:29 2018
@@ -86,3 +86,21 @@ define <4 x i8*> @laalaa() {
%patatino = getelementptr i8, <4 x i8 *> undef, i64 undef
ret <4 x i8*> %patatino
}
+
+define <2 x i8*> @zero_index(i8* %p) {
+; CHECK-LABEL: @zero_index(
+; CHECK-NEXT: %gep = getelementptr i8, i8* %p, <2 x i64> zeroinitializer
+; CHECK-NEXT: ret <2 x i8*> %gep
+;
+ %gep = getelementptr i8, i8* %p, <2 x i64> zeroinitializer
+ ret <2 x i8*> %gep
+}
+
+define <2 x {}*> @unsized({}* %p) {
+; CHECK-LABEL: @unsized(
+; CHECK-NEXT: %gep = getelementptr {}, {}* %p, <2 x i64> undef
+; CHECK-NEXT: ret <2 x {}*> %gep
+;
+ %gep = getelementptr {}, {}* %p, <2 x i64> undef
+ ret <2 x {}*> %gep
+}
More information about the llvm-commits
mailing list