mirror of
https://github.com/RPCS3/llvm.git
synced 2025-05-14 17:36:29 +00:00

change the set of uniform instructions in the loop causing an assert failure. The problem is that the legalization checking also builds data structures mapping various facts about the loop body. The immediate cause was the set of uniform instructions. If these then change when LCSSA is formed, the data structures would already have been built and become stale. The included test case triggered an assert in loop vectorize that was reduced out of the new PM's pipeline. The solution is to form LCSSA early enough that no information is cached across the changes made. The only really obvious position is outside of the main logic to vectorize the loop. This also has the advantage of removing one case where forming LCSSA could mutate the loop but we wouldn't track that as a "Changed" state. If it is significantly advantageous to do some legalization checking prior to this, we can do a more careful positioning but it seemed best to just back off to a safe position first. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293168 91177308-0d34-0410-b5e6-96231b3b80d8
63 lines
1.7 KiB
LLVM
63 lines
1.7 KiB
LLVM
; RUN: opt < %s -loop-vectorize -force-vector-interleave=1 -force-vector-width=4
|
|
|
|
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
|
|
|
|
%type1 = type { %type2 }
|
|
%type2 = type { [0 x i8*], i8**, i32, i32, i32 }
|
|
|
|
define void @test() nounwind uwtable align 2 {
|
|
br label %for.body.lr.ph.i.i.i
|
|
|
|
for.body.lr.ph.i.i.i:
|
|
br label %for.body.i.i.i
|
|
|
|
for.body.i.i.i:
|
|
%indvars.iv = phi i64 [ %indvars.iv.next, %for.inc.i.i.i ], [ 0, %for.body.lr.ph.i.i.i ]
|
|
br label %for.inc.i.i.i
|
|
|
|
for.inc.i.i.i:
|
|
%indvars.iv.next = add i64 %indvars.iv, 1
|
|
%lftr.wideiv = trunc i64 %indvars.iv.next to i32
|
|
%exitcond = icmp ne i32 %lftr.wideiv, undef
|
|
br i1 %exitcond, label %for.body.i.i.i, label %for.end.i.i.i
|
|
|
|
for.end.i.i.i:
|
|
%lcssa = phi %type1* [ undef, %for.inc.i.i.i ]
|
|
unreachable
|
|
}
|
|
|
|
; PR16139
|
|
define void @test2(i8* %x) {
|
|
entry:
|
|
indirectbr i8* %x, [ label %L0, label %L1 ]
|
|
|
|
L0:
|
|
br label %L0
|
|
|
|
L1:
|
|
ret void
|
|
}
|
|
|
|
; This loop has different uniform instructions before and after LCSSA.
|
|
define void @test3() {
|
|
entry:
|
|
%add41 = add i32 undef, undef
|
|
%idxprom4736 = zext i32 %add41 to i64
|
|
br label %while.body
|
|
|
|
while.body:
|
|
%idxprom4738 = phi i64 [ %idxprom47, %while.body ], [ %idxprom4736, %entry ]
|
|
%pos.337 = phi i32 [ %inc46, %while.body ], [ %add41, %entry ]
|
|
%inc46 = add i32 %pos.337, 1
|
|
%arrayidx48 = getelementptr inbounds [1024 x i8], [1024 x i8]* undef, i64 0, i64 %idxprom4738
|
|
store i8 0, i8* %arrayidx48, align 1
|
|
%and43 = and i32 %inc46, 3
|
|
%cmp44 = icmp eq i32 %and43, 0
|
|
%idxprom47 = zext i32 %inc46 to i64
|
|
br i1 %cmp44, label %while.end, label %while.body
|
|
|
|
while.end:
|
|
%add58 = add i32 %inc46, 4
|
|
ret void
|
|
}
|