mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-30 23:42:52 +01:00
c5e08120a4
The primary advantage is that loop optimizations will be applied in a stable order. This helps debugging and unit test creation. It is also a better overall implementation without pathologically bad performance on deep functions. On large functions (llvm-stress --size=200000 | opt -loops) Before: 0.1263s After: 0.0225s On deep functions (after tweaking llvm-stress, thanks Nadav): Before: 0.2281s After: 0.0227s See r158790 for more comments. The loop tree is now consistently generated in forward order, but loop passes are applied in reverse order over the program. If we have a loop optimization that prefers forward order, that can easily be achieved by adding a different type of LoopPassManager. llvm-svn: 159183
39 lines
672 B
LLVM
39 lines
672 B
LLVM
; RUN: opt < %s -lcssa -S | FileCheck %s
|
|
; CHECK: exit1:
|
|
; CHECK: .lcssa =
|
|
; CHECK: exit2:
|
|
; CHECK: .lcssa1 =
|
|
; CHECK: exit3:
|
|
; CHECK-NOT: .lcssa
|
|
|
|
; Test to ensure that when there are multiple exit blocks, PHI nodes are
|
|
; only inserted by LCSSA when there is a use dominated by a given exit
|
|
; block.
|
|
|
|
declare void @printf(i32 %i)
|
|
|
|
define i32 @unused_phis() nounwind {
|
|
entry:
|
|
br label %loop
|
|
|
|
loop:
|
|
%i = phi i32 [0, %entry], [1, %then2]
|
|
br i1 undef, label %exit1, label %then1
|
|
|
|
then1:
|
|
br i1 undef, label %exit2, label %then2
|
|
|
|
then2:
|
|
br i1 undef, label %exit3, label %loop
|
|
|
|
exit1:
|
|
call void @printf(i32 %i)
|
|
ret i32 %i
|
|
|
|
exit2:
|
|
ret i32 %i
|
|
|
|
exit3:
|
|
ret i32 0
|
|
}
|