[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

llvm-svn: 260729
This commit is contained in:
Justin Lebar 2016-02-12 21:01:33 +00:00
parent 144c5a6c15
commit df04d2a1f1
2 changed files with 36 additions and 0 deletions

View File

@ -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;
}

View 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
}