diff --git a/llvm/lib/Target/R600/SILowerControlFlow.cpp b/llvm/lib/Target/R600/SILowerControlFlow.cpp index 4b0952f721a5..f6f9016e7edf 100644 --- a/llvm/lib/Target/R600/SILowerControlFlow.cpp +++ b/llvm/lib/Target/R600/SILowerControlFlow.cpp @@ -283,8 +283,10 @@ void SILowerControlFlowPass::EndCf(MachineInstr &MI) { } void SILowerControlFlowPass::Branch(MachineInstr &MI) { - assert(MI.getOperand(0).getMBB() == MI.getParent()->getNextNode()); - MI.eraseFromParent(); + if (MI.getOperand(0).getMBB() == MI.getParent()->getNextNode()) + MI.eraseFromParent(); + + // If these aren't equal, this is probably an infinite loop. } void SILowerControlFlowPass::Kill(MachineInstr &MI) { diff --git a/llvm/test/CodeGen/R600/infinite-loop.ll b/llvm/test/CodeGen/R600/infinite-loop.ll new file mode 100644 index 000000000000..a60bc37d6599 --- /dev/null +++ b/llvm/test/CodeGen/R600/infinite-loop.ll @@ -0,0 +1,17 @@ +; RUN: llc -march=r600 -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s + +; SI-LABEL: @infinite_loop: +; SI: V_MOV_B32_e32 [[REG:v[0-9]+]], 999 +; SI: BB0_1: +; SI: BUFFER_STORE_DWORD [[REG]] +; SI: S_WAITCNT vmcnt(0) expcnt(0) +; SI: S_BRANCH BB0_1 +define void @infinite_loop(i32 addrspace(1)* %out) { +entry: + br label %for.body + +for.body: ; preds = %entry, %for.body + store i32 999, i32 addrspace(1)* %out, align 4 + br label %for.body +} +