mirror of
https://github.com/RPCS3/llvm.git
synced 2025-05-15 09:56:02 +00:00

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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@292456 91177308-0d34-0410-b5e6-96231b3b80d8
61 lines
2.2 KiB
LLVM
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
|
|
}
|