mirror of
https://github.com/RPCS3/llvm.git
synced 2025-05-22 13:26:03 +00:00

loops. We do this by reconstructing the newly added loops after the unroll completes to avoid threading pass manager details through all the mess of the unrolling infrastructure. I've enabled some extra assertions in the LPM to try and catch issues here and enabled a bunch of unroller tests to try and make sure this is sane. Currently, I'm manually running loop-simplify when needed. That should go away once it is folded into the LPM infrastructure. Differential Revision: https://reviews.llvm.org/D28848 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293011 91177308-0d34-0410-b5e6-96231b3b80d8
49 lines
1.3 KiB
LLVM
49 lines
1.3 KiB
LLVM
; RUN: opt < %s -loop-unroll -S | FileCheck %s
|
|
; RUN: opt < %s -passes='require<opt-remark-emit>,loop(unroll)' -S | FileCheck %s
|
|
|
|
|
|
; This should not unroll since the address of the loop header is taken.
|
|
|
|
; CHECK-LABEL: @test1(
|
|
; CHECK: store i8* blockaddress(@test1, %l1), i8** %P
|
|
; CHECK: l1:
|
|
; CHECK-NEXT: phi i32
|
|
; rdar://8287027
|
|
define i32 @test1(i8** %P) nounwind ssp {
|
|
entry:
|
|
store i8* blockaddress(@test1, %l1), i8** %P
|
|
br label %l1
|
|
|
|
l1: ; preds = %l1, %entry
|
|
%x.0 = phi i32 [ 0, %entry ], [ %inc, %l1 ]
|
|
%inc = add nsw i32 %x.0, 1
|
|
%exitcond = icmp eq i32 %inc, 3
|
|
br i1 %exitcond, label %l2, label %l1
|
|
|
|
l2: ; preds = %l1
|
|
ret i32 0
|
|
}
|
|
|
|
; This should not unroll since the call is 'noduplicate'.
|
|
|
|
; CHECK-LABEL: @test2(
|
|
define i32 @test2(i8** %P) nounwind ssp {
|
|
entry:
|
|
br label %l1
|
|
|
|
l1: ; preds = %l1, %entry
|
|
%x.0 = phi i32 [ 0, %entry ], [ %inc, %l1 ]
|
|
; CHECK: call void @f()
|
|
; CHECK-NOT: call void @f()
|
|
call void @f() noduplicate
|
|
%inc = add nsw i32 %x.0, 1
|
|
%exitcond = icmp eq i32 %inc, 3
|
|
br i1 %exitcond, label %l2, label %l1
|
|
|
|
l2: ; preds = %l1
|
|
ret i32 0
|
|
; CHECK: }
|
|
}
|
|
|
|
declare void @f()
|