mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-08 13:00:43 +00:00
32bf0088fb
merged into a loop that was subsequently unrolled (or otherwise nuked). In this case it can't merge in the ASTs for any remaining nested loops, it needs to re-add their instructions dircetly. The fix is very isolated, but I've pulled the code for merging blocks into the AST into a single place in the process. The only behavior change is in the case which would have crashed before. This fixes a crash reported by Mikael Holmen on the list after r261316 restored much of the loop pass pipelining and allowed us to actually do this kind of nested transformation sequenc. I've taken that test case and further reduced it into the somewhat twisty maze of loops in the included test case. This does in fact trigger the bug even in this reduced form. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@262108 91177308-0d34-0410-b5e6-96231b3b80d8
40 lines
876 B
LLVM
40 lines
876 B
LLVM
; RUN: opt -S -licm -loop-unroll < %s
|
|
;
|
|
; This test contains a carefully rotated set of three nested loops. The middle
|
|
; loop can be unrolled leaving one copy of the inner loop inside the outer
|
|
; loop. Because of how LICM works, when this middle loop is unrolled and
|
|
; removed, its alias set tracker is destroyed and no longer available when LICM
|
|
; runs on the outer loop.
|
|
|
|
define void @f() {
|
|
entry:
|
|
br label %l1
|
|
|
|
l2.l1.loopexit_crit_edge:
|
|
br label %l1.loopexit
|
|
|
|
l1.loopexit:
|
|
br label %l1.backedge
|
|
|
|
l1:
|
|
br i1 undef, label %l1.backedge, label %l2.preheader
|
|
|
|
l1.backedge:
|
|
br label %l1
|
|
|
|
l2.preheader:
|
|
br i1 true, label %l1.loopexit, label %l3.preheader.lr.ph
|
|
|
|
l3.preheader.lr.ph:
|
|
br label %l3.preheader
|
|
|
|
l2.loopexit:
|
|
br i1 true, label %l2.l1.loopexit_crit_edge, label %l3.preheader
|
|
|
|
l3.preheader:
|
|
br label %l3
|
|
|
|
l3:
|
|
br i1 true, label %l3, label %l2.loopexit
|
|
}
|