summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp3
-rw-r--r--llvm/test/Transforms/LoopVectorize/optsize.ll37
2 files changed, 39 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
index 9731abbb50a..0a20ab71dfa 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
@@ -409,7 +409,8 @@ int LoopVectorizationLegality::isConsecutivePtr(Value *Ptr) {
const ValueToValueMap &Strides =
getSymbolicStrides() ? *getSymbolicStrides() : ValueToValueMap();
- int Stride = getPtrStride(PSE, Ptr, TheLoop, Strides, true, false);
+ bool CanAddPredicate = !TheLoop->getHeader()->getParent()->hasOptSize();
+ int Stride = getPtrStride(PSE, Ptr, TheLoop, Strides, CanAddPredicate, false);
if (Stride == 1 || Stride == -1)
return Stride;
return 0;
diff --git a/llvm/test/Transforms/LoopVectorize/optsize.ll b/llvm/test/Transforms/LoopVectorize/optsize.ll
index 403c006eeb5..1991906494e 100644
--- a/llvm/test/Transforms/LoopVectorize/optsize.ll
+++ b/llvm/test/Transforms/LoopVectorize/optsize.ll
@@ -84,6 +84,43 @@ for.end: ; preds = %for.body
ret i32 0
}
+; PR43371: don't run into an assert due to emitting SCEV runtime checks
+; with OptForSize.
+;
+@cm_array = external global [2592 x i16], align 1
+
+define void @pr43371() optsize {
+;
+; CHECK-LABEL: @pr43371
+; CHECK-NOT: vector.scevcheck
+;
+; We do not want to generate SCEV predicates when optimising for size, because
+; that will lead to extra code generation such as the SCEV overflow runtime
+; checks. Not generating SCEV predicates can still result in vectorisation as
+; the non-consecutive loads/stores can be scalarized:
+;
+; CHECK: vector.body:
+; CHECK: store i16 0, i16* %{{.*}}, align 1
+; CHECK: store i16 0, i16* %{{.*}}, align 1
+; CHECK: br i1 {{.*}}, label %vector.body
+;
+entry:
+ br label %for.body29
+
+for.cond.cleanup28:
+ unreachable
+
+for.body29:
+ %i24.0170 = phi i16 [ 0, %entry], [ %inc37, %for.body29]
+ %add33 = add i16 undef, %i24.0170
+ %idxprom34 = zext i16 %add33 to i32
+ %arrayidx35 = getelementptr [2592 x i16], [2592 x i16] * @cm_array, i32 0, i32 %idxprom34
+ store i16 0, i16 * %arrayidx35, align 1
+ %inc37 = add i16 %i24.0170, 1
+ %cmp26 = icmp ult i16 %inc37, 756
+ br i1 %cmp26, label %for.body29, label %for.cond.cleanup28
+}
+
!llvm.module.flags = !{!0}
!0 = !{i32 1, !"ProfileSummary", !1}
!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}
OpenPOWER on IntegriCloud