diff options
| author | Changpeng Fang <changpeng.fang@gmail.com> | 2016-02-12 17:11:04 +0000 |
|---|---|---|
| committer | Changpeng Fang <changpeng.fang@gmail.com> | 2016-02-12 17:11:04 +0000 |
| commit | e07f1aa8faffa4cbd71ec48b0f1de550c7f29816 (patch) | |
| tree | 3dc8ff090d3b2ec9592f9bb10f81c3f8af59875a /llvm | |
| parent | 7ce3dbcb574c43e9d1dbb77958ca9c4ab187cffe (diff) | |
| download | bcm5719-llvm-e07f1aa8faffa4cbd71ec48b0f1de550c7f29816.tar.gz bcm5719-llvm-e07f1aa8faffa4cbd71ec48b0f1de550c7f29816.zip | |
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
llvm-svn: 260692
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp | 14 | ||||
| -rw-r--r-- | llvm/test/CodeGen/AMDGPU/si-annotate-cfg-loop-assert.ll | 24 |
2 files changed, 34 insertions, 4 deletions
diff --git a/llvm/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp b/llvm/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp index 5348300959c..d028edaf986 100644 --- a/llvm/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp +++ b/llvm/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp @@ -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) { diff --git a/llvm/test/CodeGen/AMDGPU/si-annotate-cfg-loop-assert.ll b/llvm/test/CodeGen/AMDGPU/si-annotate-cfg-loop-assert.ll new file mode 100644 index 00000000000..484e3f05f32 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/si-annotate-cfg-loop-assert.ll @@ -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 +} |

