Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[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
- Loading branch information
Showing
4 changed files
with
59 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
} |