mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 23:48:56 +00:00
AMDGPU/SI: Annotate Loops with Constant Condition in SIAnnotateControlFlow pass.
Summary: It is possible that the loop condition can be a boolean constant (infinite loop, for example). So we sould handle constant condition in annotating a loop. This patch adds this functionality to support annotating constant condition. Reviewers: tstellarAMD, arsenm Subscribers: llvm-commits, arsenm Differential Revision: http://reviews.llvm.org/D15093 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260692 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
626f833ad8
commit
3a0161ac77
@ -81,7 +81,8 @@ class SIAnnotateControlFlow : public FunctionPass {
|
||||
|
||||
void insertElse(BranchInst *Term);
|
||||
|
||||
Value *handleLoopCondition(Value *Cond, PHINode *Broken, llvm::Loop *L);
|
||||
Value *handleLoopCondition(Value *Cond, PHINode *Broken,
|
||||
llvm::Loop *L, BranchInst *Term);
|
||||
|
||||
void handleLoop(BranchInst *Term);
|
||||
|
||||
@ -213,7 +214,7 @@ void SIAnnotateControlFlow::insertElse(BranchInst *Term) {
|
||||
|
||||
/// \brief Recursively handle the condition leading to a loop
|
||||
Value *SIAnnotateControlFlow::handleLoopCondition(Value *Cond, PHINode *Broken,
|
||||
llvm::Loop *L) {
|
||||
llvm::Loop *L, BranchInst *Term) {
|
||||
|
||||
// Only search through PHI nodes which are inside the loop. If we try this
|
||||
// with PHI nodes that are outside of the loop, we end up inserting new PHI
|
||||
@ -237,7 +238,7 @@ Value *SIAnnotateControlFlow::handleLoopCondition(Value *Cond, PHINode *Broken,
|
||||
}
|
||||
|
||||
Phi->setIncomingValue(i, BoolFalse);
|
||||
Value *PhiArg = handleLoopCondition(Incoming, Broken, L);
|
||||
Value *PhiArg = handleLoopCondition(Incoming, Broken, L, Term);
|
||||
NewPhi->addIncoming(PhiArg, From);
|
||||
}
|
||||
|
||||
@ -276,6 +277,11 @@ Value *SIAnnotateControlFlow::handleLoopCondition(Value *Cond, PHINode *Broken,
|
||||
Value *Args[] = { Cond, Broken };
|
||||
return CallInst::Create(IfBreak, Args, "", Insert);
|
||||
|
||||
// Insert IfBreak before TERM for constant COND.
|
||||
} else if (isa<ConstantInt>(Cond)) {
|
||||
Value *Args[] = { Cond, Broken };
|
||||
return CallInst::Create(IfBreak, Args, "", Term);
|
||||
|
||||
} else {
|
||||
llvm_unreachable("Unhandled loop condition!");
|
||||
}
|
||||
@ -291,7 +297,7 @@ void SIAnnotateControlFlow::handleLoop(BranchInst *Term) {
|
||||
|
||||
Value *Cond = Term->getCondition();
|
||||
Term->setCondition(BoolTrue);
|
||||
Value *Arg = handleLoopCondition(Cond, Broken, L);
|
||||
Value *Arg = handleLoopCondition(Cond, Broken, L, Term);
|
||||
|
||||
for (pred_iterator PI = pred_begin(Target), PE = pred_end(Target);
|
||||
PI != PE; ++PI) {
|
||||
|
24
test/CodeGen/AMDGPU/si-annotate-cfg-loop-assert.ll
Normal file
24
test/CodeGen/AMDGPU/si-annotate-cfg-loop-assert.ll
Normal file
@ -0,0 +1,24 @@
|
||||
; RUN: llc -march=amdgcn -mcpu=kaveri < %s | FileCheck %s
|
||||
|
||||
; CHECK-LABEL: {{^}}test:
|
||||
; CHECK s_and_saveexec_b64
|
||||
; CHECK s_xor_b64
|
||||
; CHECK s_or_b64 exec, exec
|
||||
; CHECK s_andn2_b64 exec, exec
|
||||
; CHECK s_cbranch_execnz
|
||||
define spir_kernel void @test(i32 %arg, i32 %arg1, i32 addrspace(1)* nocapture %arg2, i32 %arg3, i32 %arg4, i32 %arg5, i32 %arg6) {
|
||||
bb:
|
||||
%tmp = icmp ne i32 %arg, 0
|
||||
%tmp7 = icmp ne i32 %arg1, 0
|
||||
%tmp8 = and i1 %tmp, %tmp7
|
||||
br i1 %tmp8, label %bb9, label %bb11
|
||||
|
||||
bb9: ; preds = %bb
|
||||
br label %bb10
|
||||
|
||||
bb10: ; preds = %bb10, %bb9
|
||||
br label %bb10
|
||||
|
||||
bb11: ; preds = %bb
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user