1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-23 13:02:52 +02:00
llvm-mirror/test/Transforms/LoopVectorize/pr31190.ll
Michael Kuperstein 8718b01fcb [LV] Run loop-simplify and LCSSA explicitly instead of "requiring" them
This changes the vectorizer to explicitly use the loopsimplify and lcssa utils,
instead of "requiring" the transformations as if they were analyses.

This is not NFC, since it changes the LCSSA behavior - we no longer run LCSSA
for all loops, but rather only for the loops we expect to modify.

Differential Revision: https://reviews.llvm.org/D28868

llvm-svn: 292456
2017-01-19 00:42:28 +00:00

61 lines
2.2 KiB
LLVM

; RUN: opt -passes='loop-vectorize' -debug -S < %s 2>&1 | FileCheck %s
; REQUIRES: asserts
; This checks we don't crash when the inner loop we're trying to vectorize
; is a SCEV AddRec with respect to an outer loop.
; In this case, the problematic PHI is:
; %0 = phi i32 [ undef, %for.cond1.preheader ], [ %inc54, %for.body3 ]
; Since %inc54 is the IV of the outer loop, and %0 equivalent to it,
; we get the situation described above.
; Code that leads to this situation can look something like:
;
; int a, b[1], c;
; void fn1 ()
; {
; for (; c; c++)
; for (a = 0; a; a++)
; b[c] = 4;
; }
;
; The PHI is an artifact of the register promotion of c.
; Note that we can no longer get the vectorizer to actually see such PHIs,
; because LV now simplifies the loop internally, but the test is still
; useful as a regression test, and in case loop-simplify behavior changes.
@c = external global i32, align 4
@a = external global i32, align 4
@b = external global [1 x i32], align 4
; CHECK: LV: Not vectorizing: Cannot prove legality.
; CHECK-LABEL: @test
define void @test() {
entry:
%a.promoted2 = load i32, i32* @a, align 1
%c.promoted = load i32, i32* @c, align 1
br label %for.cond1.preheader
for.cond1.preheader: ; preds = %for.cond1.for.inc4_crit_edge, %entry
%inc54 = phi i32 [ %inc5, %for.cond1.for.inc4_crit_edge ], [ %c.promoted, %entry ]
%inc.lcssa3 = phi i32 [ %inc.lcssa, %for.cond1.for.inc4_crit_edge ], [ %a.promoted2, %entry ]
br label %for.body3
for.body3: ; preds = %for.body3, %for.cond1.preheader
%inc1 = phi i32 [ %inc.lcssa3, %for.cond1.preheader ], [ %inc, %for.body3 ]
%0 = phi i32 [ undef, %for.cond1.preheader ], [ %inc54, %for.body3 ]
%idxprom = sext i32 %0 to i64
%arrayidx = getelementptr inbounds [1 x i32], [1 x i32]* @b, i64 0, i64 %idxprom
store i32 4, i32* %arrayidx, align 4
%inc = add nsw i32 %inc1, 1
%tobool2 = icmp eq i32 %inc, 0
br i1 %tobool2, label %for.cond1.for.inc4_crit_edge, label %for.body3
for.cond1.for.inc4_crit_edge: ; preds = %for.body3
%inc.lcssa = phi i32 [ %inc, %for.body3 ]
%.lcssa = phi i32 [ %inc54, %for.body3 ]
%inc5 = add nsw i32 %.lcssa, 1
br label %for.cond1.preheader
}