1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

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

llvm-svn: 238762
This commit is contained in:
Owen Anderson 2015-06-01 17:20:31 +00:00
parent 342dea971f
commit b86a7d7ea4
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