mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
9fd0bc5568
Summary: Calls to convergent functions can be duplicated, but only if the duplicates are not control-flow dependent on any additional values. Loop rotation doesn't meet the bar. Reviewers: jingyue Subscribers: mzolotukhin, llvm-commits, arsenm, joker.eph, resistor, tra, hfinkel, broune Differential Revision: http://reviews.llvm.org/D17127 llvm-svn: 260729
32 lines
619 B
LLVM
32 lines
619 B
LLVM
; RUN: opt -S -loop-rotate < %s | FileCheck %s
|
|
|
|
@e = global i32 10
|
|
|
|
declare void @f1(i32) convergent
|
|
declare void @f2(i32)
|
|
|
|
; The call to f1 in the loop header shouldn't be duplicated (meaning, loop
|
|
; rotation shouldn't occur), because f1 is convergent.
|
|
|
|
; CHECK: call void @f1
|
|
; CHECK-NOT: call void @f1
|
|
|
|
define void @test(i32 %x) {
|
|
entry:
|
|
br label %loop
|
|
|
|
loop:
|
|
%n.phi = phi i32 [ %n, %loop.fin ], [ 0, %entry ]
|
|
call void @f1(i32 %n.phi)
|
|
%cond = icmp eq i32 %n.phi, %x
|
|
br i1 %cond, label %exit, label %loop.fin
|
|
|
|
loop.fin:
|
|
%n = add i32 %n.phi, 1
|
|
call void @f2(i32 %n)
|
|
br label %loop
|
|
|
|
exit:
|
|
ret void
|
|
}
|