Index: lib/Target/AMDGPU/SIAnnotateControlFlow.cpp =================================================================== --- lib/Target/AMDGPU/SIAnnotateControlFlow.cpp +++ lib/Target/AMDGPU/SIAnnotateControlFlow.cpp @@ -83,7 +83,8 @@ 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); @@ -208,7 +209,7 @@ /// \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 @@ -232,7 +233,7 @@ } Phi->setIncomingValue(i, BoolFalse); - Value *PhiArg = handleLoopCondition(Incoming, Broken, L); + Value *PhiArg = handleLoopCondition(Incoming, Broken, L, Term); NewPhi->addIncoming(PhiArg, From); } @@ -271,6 +272,11 @@ Value *Args[] = { Cond, Broken }; return CallInst::Create(IfBreak, Args, "", Insert); + // Insert IfBreak before TERM for constant COND. + } else if (isa(Cond)) { + Value *Args[] = { Cond, Broken }; + return CallInst::Create(IfBreak, Args, "", Term); + } else { llvm_unreachable("Unhandled loop condition!"); } @@ -286,7 +292,7 @@ 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) { Index: test/CodeGen/AMDGPU/si-annotate-cfg-loop-assert.ll =================================================================== --- /dev/null +++ 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 +}