+++ /dev/null
-; RUN: llc < %s -march=r600 -mcpu=redwood -mattr=disable-irstructurizer | FileCheck %s
-; Test case for a crash in the AMDILCFGStructurizer from a CFG like this:
-;
-; entry
-; / \
-; diamond_head branch_from
-; / \ |
-; diamond_false diamond_true
-; \ /
-; done
-;
-; When the diamond_true branch had more than 100 instructions.
-;
-;
-
-; CHECK-LABEL: {{^}}branch_into_diamond:
-; === entry block:
-; CHECK: ALU_PUSH_BEFORE
-; === Branch instruction (IF):
-; CHECK: JUMP
- ; === branch_from block
- ; CHECK: ALU
- ; === Duplicated diamond_true block (There can be more than one ALU clause):
- ; === XXX: We should be able to optimize this so the basic block is not
- ; === duplicated. See comments in
- ; === AMDGPUCFGStructurizer::improveSimpleJumpintoIf()
- ; CHECK: ALU
-; === Branch instruction (ELSE):
-; CHECK: ELSE
- ; === diamond_head block:
- ; CHECK: ALU_PUSH_BEFORE
- ; === Branch instruction (IF):
- ; CHECK: JUMP
- ; === diamond_true block (There can be more than one ALU clause):
- ; ALU
- ; === Branch instruction (ELSE):
- ; CHECK: ELSE
- ; === diamond_false block plus implicit ENDIF
- ; CHECK: ALU_POP_AFTER
-; === Branch instruction (ENDIF):
-; CHECK: POP
-; === done block:
-; CHECK: ALU
-; CHECK: MEM_RAT_CACHELESS
-; CHECK: CF_END
-
-
-define void @branch_into_diamond(i32 addrspace(1)* %out, i32 %a, i32 %b, i32 %c) {
-entry:
-%0 = icmp ne i32 %a, 0
- br i1 %0, label %diamond_head, label %branch_from
-
-diamond_head:
- %1 = icmp ne i32 %a, 1
- br i1 %1, label %diamond_true, label %diamond_false
-
-branch_from:
- %2 = add i32 %a, 1
- br label %diamond_true
-
-diamond_false:
- %3 = add i32 %a, 2
- br label %done
-
-diamond_true:
- %4 = phi i32 [%2, %branch_from], [%a, %diamond_head]
- ; This block needs to be > 100 ISA instructions to hit the bug,
- ; so we'll use udiv instructions.
- %div0 = udiv i32 %a, %b
- %div1 = udiv i32 %div0, %4
- %div2 = udiv i32 %div1, 11
- %div3 = udiv i32 %div2, %a
- %div4 = udiv i32 %div3, %b
- %div5 = udiv i32 %div4, %c
- %div6 = udiv i32 %div5, %div0
- %div7 = udiv i32 %div6, %div1
- br label %done
-
-done:
- %5 = phi i32 [%3, %diamond_false], [%div7, %diamond_true]
- store i32 %5, i32 addrspace(1)* %out
- ret void
-}