[PATCH] D52327: [Loop Vectorizer] Abandon vectorization when no integer IV found
Warren Ristow via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 20 15:36:16 PDT 2018
wristow created this revision.
wristow added reviewers: delena, mkuper.
Support for vectorizing loops with secondary floating-point induction variables was added in r276554. A primary integer IV is still required for vectorization to be done. If an FP IV was found, but no integer IV was found at all (primary or secondary), the attempt to vectorize still went forward, causing a compiler-crash.
This fixes PR38800.
https://reviews.llvm.org/D52327
Files:
lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
test/Transforms/LoopVectorize/pr38800.ll
Index: test/Transforms/LoopVectorize/pr38800.ll
===================================================================
--- test/Transforms/LoopVectorize/pr38800.ll
+++ test/Transforms/LoopVectorize/pr38800.ll
@@ -0,0 +1,34 @@
+; RUN: opt -loop-vectorize -force-vector-width=2 -pass-remarks-missed='loop-vectorize' -S < %s 2>&1 | FileCheck %s
+
+; CHECK: remark: <unknown>:0:0: loop not vectorized: integer loop induction variable could not be identified
+
+; Test-case ('-O2 -ffast-math') from PR38800.
+; (Set '-force-vector-width=2' to enable vector code generation.)
+;
+; No integral induction variable in the source-code caused a compiler-crash
+; when attempting to vectorize. With the fix, a remark indicating why it
+; wasn't vectorized is produced
+;
+;void foo(float *ptr, float val) {
+; float f;
+; for (f = 0.1f; f < 1.0f; f += 0.01f)
+; *ptr += val;
+;}
+
+define void @foo(float* nocapture %ptr, float %val) local_unnamed_addr {
+entry:
+ %ptr.promoted = load float, float* %ptr, align 4
+ br label %for.body
+
+for.body: ; preds = %entry, %for.body
+ %add5 = phi float [ %ptr.promoted, %entry ], [ %add, %for.body ]
+ %f.04 = phi float [ 0x3FB99999A0000000, %entry ], [ %add1, %for.body ]
+ %add = fadd fast float %add5, %val
+ %add1 = fadd fast float %f.04, 0x3F847AE140000000
+ %cmp = fcmp fast olt float %add1, 1.000000e+00
+ br i1 %cmp, label %for.body, label %for.end
+
+for.end: ; preds = %for.body
+ store float %add, float* %ptr, align 4
+ ret void
+}
Index: lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
===================================================================
--- lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
+++ lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
@@ -789,6 +789,10 @@
ORE->emit(createMissedAnalysis("NoInductionVariable")
<< "loop induction variable could not be identified");
return false;
+ } else if (!WidestIndTy) {
+ ORE->emit(createMissedAnalysis("NoIntegerInductionVariable")
+ << "integer loop induction variable could not be identified");
+ return false;
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D52327.166371.patch
Type: text/x-patch
Size: 2208 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180920/bbd75eae/attachment.bin>
More information about the llvm-commits
mailing list