1 ; RUN: llc < %s -march=r600 -mcpu=redwood -mattr=disable-irstructurizer | FileCheck %s 2 ; Test case for a crash in the AMDILCFGStructurizer from a CFG like this: 3 ; 4 ; entry 5 ; / \ 6 ; diamond_head branch_from 7 ; / \ | 8 ; diamond_false diamond_true 9 ; \ / 10 ; done 11 ; 12 ; When the diamond_true branch had more than 100 instructions. 13 ; 14 ; 15 16 ; CHECK-LABEL: {{^}}branch_into_diamond: 17 ; === entry block: 18 ; CHECK: ALU_PUSH_BEFORE 19 ; === Branch instruction (IF): 20 ; CHECK: JUMP 21 ; === branch_from block 22 ; CHECK: ALU 23 ; === Duplicated diamond_true block (There can be more than one ALU clause): 24 ; === XXX: We should be able to optimize this so the basic block is not 25 ; === duplicated. See comments in 26 ; === AMDGPUCFGStructurizer::improveSimpleJumpintoIf() 27 ; CHECK: ALU 28 ; === Branch instruction (ELSE): 29 ; CHECK: ELSE 30 ; === diamond_head block: 31 ; CHECK: ALU_PUSH_BEFORE 32 ; === Branch instruction (IF): 33 ; CHECK: JUMP 34 ; === diamond_true block (There can be more than one ALU clause): 35 ; ALU 36 ; === Branch instruction (ELSE): 37 ; CHECK: ELSE 38 ; === diamond_false block plus implicit ENDIF 39 ; CHECK: ALU_POP_AFTER 40 ; === Branch instruction (ENDIF): 41 ; CHECK: POP 42 ; === done block: 43 ; CHECK: ALU 44 ; CHECK: MEM_RAT_CACHELESS 45 ; CHECK: CF_END 46 47 48 define void @branch_into_diamond(i32 addrspace(1)* %out, i32 %a, i32 %b, i32 %c) { 49 entry: 50 %0 = icmp ne i32 %a, 0 51 br i1 %0, label %diamond_head, label %branch_from 52 53 diamond_head: 54 %1 = icmp ne i32 %a, 1 55 br i1 %1, label %diamond_true, label %diamond_false 56 57 branch_from: 58 %2 = add i32 %a, 1 59 br label %diamond_true 60 61 diamond_false: 62 %3 = add i32 %a, 2 63 br label %done 64 65 diamond_true: 66 %4 = phi i32 [%2, %branch_from], [%a, %diamond_head] 67 ; This block needs to be > 100 ISA instructions to hit the bug, 68 ; so we'll use udiv instructions. 69 %div0 = udiv i32 %a, %b 70 %div1 = udiv i32 %div0, %4 71 %div2 = udiv i32 %div1, 11 72 %div3 = udiv i32 %div2, %a 73 %div4 = udiv i32 %div3, %b 74 %div5 = udiv i32 %div4, %c 75 %div6 = udiv i32 %div5, %div0 76 %div7 = udiv i32 %div6, %div1 77 br label %done 78 79 done: 80 %5 = phi i32 [%3, %diamond_false], [%div7, %diamond_true] 81 store i32 %5, i32 addrspace(1)* %out 82 ret void 83 } 84