Teach the IR Sink pass to (conservatively) respect convergent annotations.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238762 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Owen Anderson 2015-06-01 17:20:31 +00:00
parent a509ef9a17
commit 57e487e92c
2 changed files with 30 additions and 0 deletions

View File

@ -172,6 +172,12 @@ static bool isSafeToMove(Instruction *Inst, AliasAnalysis *AA,
if (isa<TerminatorInst>(Inst) || isa<PHINode>(Inst))
return false;
// Convergent operations can only be moved to control equivalent blocks.
if (auto CS = CallSite(Inst)) {
if (CS.hasFnAttr(Attribute::Convergent))
return false;
}
return true;
}

View File

@ -0,0 +1,24 @@
; RUN: opt -sink -S < %s | FileCheck %s
; Verify that IR sinking does not move convergent operations to
; blocks that are not control equivalent.
; CHECK: define i32 @foo
; CHECK: entry
; CHECK-NEXT: call i32 @bar
; CHECK-NEXT: br i1 %arg
define i32 @foo(i1 %arg) {
entry:
%c = call i32 @bar() readonly convergent
br i1 %arg, label %then, label %end
then:
ret i32 %c
end:
ret i32 0
}
declare i32 @bar() readonly convergent