mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-30 23:20:54 +00:00
[LoopRotate] Don't perform loop rotation if the loop header calls a convergent function.
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260729 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9693e080e3
commit
2109a5cbf9
@ -165,6 +165,11 @@ static bool rotateLoop(Loop *L, unsigned MaxHeaderSize, LoopInfo *LI,
|
||||
<< " instructions: "; L->dump());
|
||||
return false;
|
||||
}
|
||||
if (Metrics.convergent) {
|
||||
DEBUG(dbgs() << "LoopRotation: NOT rotating - contains convergent "
|
||||
"instructions: "; L->dump());
|
||||
return false;
|
||||
}
|
||||
if (Metrics.NumInsts > MaxHeaderSize)
|
||||
return false;
|
||||
}
|
||||
|
31
test/Transforms/LoopRotate/convergent.ll
Normal file
31
test/Transforms/LoopRotate/convergent.ll
Normal file
@ -0,0 +1,31 @@
|
||||
; 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
|
||||
}
|
Loading…
Reference in New Issue
Block a user