Skip to content

Commit

Permalink
Merging r260692:
Browse files Browse the repository at this point in the history
------------------------------------------------------------------------
r260692 | changpeng.fang | 2016-02-12 09:11:04 -0800 (Fri, 12 Feb 2016) | 13 lines

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/branches/release_38@271685 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
tstellarAMD committed Jun 3, 2016
1 parent b4989f0 commit 0113f5f
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 4 deletions.
14 changes: 10 additions & 4 deletions lib/Target/AMDGPU/SIAnnotateControlFlow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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
Expand All @@ -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);
}

Expand Down Expand Up @@ -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!");
}
Expand All @@ -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) {
Expand Down
24 changes: 24 additions & 0 deletions test/CodeGen/AMDGPU/si-annotate-cfg-loop-assert.ll
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit 0113f5f

Please sign in to comment.