[llvm] r260692 - AMDGPU/SI: Annotate Loops with Constant Condition in SIAnnotateControlFlow pass.

Changpeng Fang via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 12 09:11:04 PST 2016


Author: chfang
Date: Fri Feb 12 11:11:04 2016
New Revision: 260692

URL: http://llvm.org/viewvc/llvm-project?rev=260692&view=rev
Log:
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

Added:
    llvm/trunk/test/CodeGen/AMDGPU/si-annotate-cfg-loop-assert.ll
Modified:
    llvm/trunk/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp

Modified: llvm/trunk/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp?rev=260692&r1=260691&r2=260692&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp (original)
+++ llvm/trunk/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp Fri Feb 12 11:11:04 2016
@@ -81,7 +81,8 @@ class SIAnnotateControlFlow : public Fun
 
   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(B
 
 /// \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::handleLoop
       }
 
       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::handleLoop
     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(B
 
   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) {

Added: llvm/trunk/test/CodeGen/AMDGPU/si-annotate-cfg-loop-assert.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/si-annotate-cfg-loop-assert.ll?rev=260692&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/AMDGPU/si-annotate-cfg-loop-assert.ll (added)
+++ llvm/trunk/test/CodeGen/AMDGPU/si-annotate-cfg-loop-assert.ll Fri Feb 12 11:11:04 2016
@@ -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
+}




More information about the llvm-commits mailing list