[PATCH] D69627: [SLP]Fix PR43799: Crash on different sizes of GEP indices.
Alexey Bataev via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 30 13:16:09 PDT 2019
ABataev updated this revision to Diff 227167.
ABataev added a comment.
Added a check for GEP indexes greater than pointer size.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D69627/new/
https://reviews.llvm.org/D69627
Files:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
llvm/test/Transforms/SLPVectorizer/X86/crash_gep.ll
Index: llvm/test/Transforms/SLPVectorizer/X86/crash_gep.ll
===================================================================
--- llvm/test/Transforms/SLPVectorizer/X86/crash_gep.ll
+++ llvm/test/Transforms/SLPVectorizer/X86/crash_gep.ll
@@ -29,3 +29,26 @@
store i64 %2, i64* %add.ptr, align 8
ret i32 undef
}
+
+define void @PR43799() {
+; CHECK-LABEL: @PR43799(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br label [[BODY:%.*]]
+; CHECK: body:
+; CHECK-NEXT: br label [[BODY]]
+; CHECK: epilog:
+; CHECK-NEXT: ret void
+;
+entry:
+ br label %body
+
+body:
+ %p.1.i19 = phi i8* [ undef, %entry ], [ %incdec.ptr.i.7, %body ]
+ %lsr.iv17 = phi i8* [ undef, %entry ], [ %scevgep113.7, %body ]
+ %incdec.ptr.i.7 = getelementptr inbounds i8, i8* undef, i32 1
+ %scevgep113.7 = getelementptr i8, i8* undef, i64 1
+ br label %body
+
+epilog:
+ ret void
+}
Index: llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
===================================================================
--- llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -2638,9 +2638,12 @@
}
// We don't combine GEPs with non-constant indexes.
+ Type *Ty1 = VL0->getOperand(1)->getType();
for (Value *V : VL) {
auto Op = cast<Instruction>(V)->getOperand(1);
- if (!isa<ConstantInt>(Op)) {
+ if (!isa<ConstantInt>(Op) ||
+ (Op->getType() != Ty1 && Op->getType()->getScalarSizeInBits() >
+ DL->getPointerSizeInBits())) {
LLVM_DEBUG(dbgs()
<< "SLP: not-vectorizable GEP (non-constant indexes).\n");
BS.cancelScheduling(VL, VL0);
@@ -4156,7 +4159,20 @@
std::vector<Value *> OpVecs;
for (int j = 1, e = cast<GetElementPtrInst>(VL0)->getNumOperands(); j < e;
++j) {
- Value *OpVec = vectorizeTree(E->getOperand(j));
+ ValueList &VL = E->getOperand(j);
+ // Need to cast all elements to the same type before vectorization to
+ // avoid crash.
+ Type *VL0Ty = VL0->getOperand(j)->getType();
+ Type *Ty = llvm::all_of(
+ VL, [VL0Ty](Value *V) { return VL0Ty == V->getType(); })
+ ? VL0Ty
+ : DL->getIntPtrType(F->getContext());
+ for (Value *&V : VL) {
+ auto *CI = cast<ConstantInt>(V);
+ V = ConstantExpr::getIntegerCast(CI, Ty,
+ CI->getValue().isSignBitSet());
+ }
+ Value *OpVec = vectorizeTree(VL);
OpVecs.push_back(OpVec);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D69627.227167.patch
Type: text/x-patch
Size: 2642 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191030/2c358f75/attachment.bin>
More information about the llvm-commits
mailing list