R600/SI: Fix assertion on infinite loops.

This isn't the most useful case to fix in the real world,
but bugpoint runs into this.

llvm-svn: 201177
This commit is contained in:
Matt Arsenault 2014-02-11 21:12:38 +00:00
parent 94fc18d040
commit 71b71d25eb
2 changed files with 21 additions and 2 deletions

View File

@ -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) {

View File

@ -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
}