From 4f27730eaf600aeeb855964de09b90ff168ae247 Mon Sep 17 00:00:00 2001 From: Warren Ristow Date: Fri, 21 Sep 2018 23:03:50 +0000 Subject: [PATCH] [Loop Vectorizer] Abandon vectorization when no integer IV found 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 change abandons that attempt when no integer IV is found. (Vectorizing FP-only cases like this, rather than bailing out, is discussed as possible future work in D52327.) See PR38800 for more information. Differential Revision: https://reviews.llvm.org/D52327 llvm-svn: 342786 --- .../Vectorize/LoopVectorizationLegality.cpp | 4 +++ llvm/lib/Transforms/Vectorize/LoopVectorize.cpp | 1 + llvm/test/Transforms/LoopVectorize/pr37515.ll | 20 +++++++++++++ llvm/test/Transforms/LoopVectorize/pr38800.ll | 34 ++++++++++++++++++++++ 4 files changed, 59 insertions(+) create mode 100644 llvm/test/Transforms/LoopVectorize/pr37515.ll create mode 100755 llvm/test/Transforms/LoopVectorize/pr38800.ll diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp index b77108d..9c81cdc 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp @@ -789,6 +789,10 @@ bool LoopVectorizationLegality::canVectorizeInstrs() { 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; } } diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp index d5708d0..e1795c5 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -2303,6 +2303,7 @@ Value *InnerLoopVectorizer::getOrCreateTripCount(Loop *L) { "Invalid loop count"); Type *IdxTy = Legal->getWidestInductionType(); + assert(IdxTy && "No type for induction"); // The exit count might have the type of i64 while the phi is i32. This can // happen if we have an induction variable that is sign extended before the diff --git a/llvm/test/Transforms/LoopVectorize/pr37515.ll b/llvm/test/Transforms/LoopVectorize/pr37515.ll new file mode 100644 index 0000000..b09e11f --- /dev/null +++ b/llvm/test/Transforms/LoopVectorize/pr37515.ll @@ -0,0 +1,20 @@ +; RUN: opt -passes='loop-vectorize' -S -pass-remarks-missed=loop-vectorize < %s 2>&1 | FileCheck %s +; +; FP primary induction is not supported in LV. Make sure Legal bails out. +; +; CHECK: loop not vectorized + +define void @PR37515() { +entry: + br label %loop + +loop: + %p = phi float [ 19.0, %entry ], [ %a, %loop ] + %a = fadd fast float %p, -1.0 + %m = fmul fast float %a, %a + %c = fcmp fast ugt float %a, 2.0 + br i1 %c, label %loop, label %exit + +exit: + unreachable +} diff --git a/llvm/test/Transforms/LoopVectorize/pr38800.ll b/llvm/test/Transforms/LoopVectorize/pr38800.ll new file mode 100755 index 0000000..d3e937b --- /dev/null +++ b/llvm/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: :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 +} -- 2.7.4