1*6454391bSMatt Arsenault; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*6454391bSMatt Arsenault; RUN: llc -global-isel -O0 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck -check-prefix=WAVE64 %s 3*6454391bSMatt Arsenault; RUN: llc -global-isel -O0 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1031 < %s | FileCheck -check-prefix=WAVE32 %s 4*6454391bSMatt Arsenault 5*6454391bSMatt Arsenault; This was mishandling the constant true and false values used as a 6*6454391bSMatt Arsenault; scalar branch condition. 7*6454391bSMatt Arsenault 8*6454391bSMatt Arsenaultdefine void @br_false() { 9*6454391bSMatt Arsenault; WAVE64-LABEL: br_false: 10*6454391bSMatt Arsenault; WAVE64: ; %bb.0: ; %.exit 11*6454391bSMatt Arsenault; WAVE64-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 12*6454391bSMatt Arsenault; WAVE64-NEXT: .LBB0_1: ; %bb0 13*6454391bSMatt Arsenault; WAVE64-NEXT: ; =>This Inner Loop Header: Depth=1 14*6454391bSMatt Arsenault; WAVE64-NEXT: s_mov_b32 s4, 1 15*6454391bSMatt Arsenault; WAVE64-NEXT: s_cmp_lg_u32 s4, 0 16*6454391bSMatt Arsenault; WAVE64-NEXT: s_cbranch_scc1 .LBB0_1 17*6454391bSMatt Arsenault; WAVE64-NEXT: ; %bb.2: ; %.exit5 18*6454391bSMatt Arsenault; WAVE64-NEXT: s_setpc_b64 s[30:31] 19*6454391bSMatt Arsenault; 20*6454391bSMatt Arsenault; WAVE32-LABEL: br_false: 21*6454391bSMatt Arsenault; WAVE32: ; %bb.0: ; %.exit 22*6454391bSMatt Arsenault; WAVE32-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 23*6454391bSMatt Arsenault; WAVE32-NEXT: .LBB0_1: ; %bb0 24*6454391bSMatt Arsenault; WAVE32-NEXT: ; =>This Inner Loop Header: Depth=1 25*6454391bSMatt Arsenault; WAVE32-NEXT: s_mov_b32 s4, 1 26*6454391bSMatt Arsenault; WAVE32-NEXT: s_cmp_lg_u32 s4, 0 27*6454391bSMatt Arsenault; WAVE32-NEXT: s_cbranch_scc1 .LBB0_1 28*6454391bSMatt Arsenault; WAVE32-NEXT: ; %bb.2: ; %.exit5 29*6454391bSMatt Arsenault; WAVE32-NEXT: s_setpc_b64 s[30:31] 30*6454391bSMatt Arsenault.exit: 31*6454391bSMatt Arsenault br label %bb0 32*6454391bSMatt Arsenault 33*6454391bSMatt Arsenaultbb0: 34*6454391bSMatt Arsenault br i1 false, label %.exit5, label %bb0 35*6454391bSMatt Arsenault 36*6454391bSMatt Arsenault.exit5: 37*6454391bSMatt Arsenault ret void 38*6454391bSMatt Arsenault} 39*6454391bSMatt Arsenault 40*6454391bSMatt Arsenaultdefine void @br_true() { 41*6454391bSMatt Arsenault; WAVE64-LABEL: br_true: 42*6454391bSMatt Arsenault; WAVE64: ; %bb.0: ; %.exit 43*6454391bSMatt Arsenault; WAVE64-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 44*6454391bSMatt Arsenault; WAVE64-NEXT: .LBB1_1: ; %bb0 45*6454391bSMatt Arsenault; WAVE64-NEXT: ; =>This Inner Loop Header: Depth=1 46*6454391bSMatt Arsenault; WAVE64-NEXT: s_mov_b32 s4, 0 47*6454391bSMatt Arsenault; WAVE64-NEXT: s_cmp_lg_u32 s4, 0 48*6454391bSMatt Arsenault; WAVE64-NEXT: s_cbranch_scc1 .LBB1_1 49*6454391bSMatt Arsenault; WAVE64-NEXT: ; %bb.2: ; %.exit5 50*6454391bSMatt Arsenault; WAVE64-NEXT: s_setpc_b64 s[30:31] 51*6454391bSMatt Arsenault; 52*6454391bSMatt Arsenault; WAVE32-LABEL: br_true: 53*6454391bSMatt Arsenault; WAVE32: ; %bb.0: ; %.exit 54*6454391bSMatt Arsenault; WAVE32-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 55*6454391bSMatt Arsenault; WAVE32-NEXT: .LBB1_1: ; %bb0 56*6454391bSMatt Arsenault; WAVE32-NEXT: ; =>This Inner Loop Header: Depth=1 57*6454391bSMatt Arsenault; WAVE32-NEXT: s_mov_b32 s4, 0 58*6454391bSMatt Arsenault; WAVE32-NEXT: s_cmp_lg_u32 s4, 0 59*6454391bSMatt Arsenault; WAVE32-NEXT: s_cbranch_scc1 .LBB1_1 60*6454391bSMatt Arsenault; WAVE32-NEXT: ; %bb.2: ; %.exit5 61*6454391bSMatt Arsenault; WAVE32-NEXT: s_setpc_b64 s[30:31] 62*6454391bSMatt Arsenault.exit: 63*6454391bSMatt Arsenault br label %bb0 64*6454391bSMatt Arsenault 65*6454391bSMatt Arsenaultbb0: 66*6454391bSMatt Arsenault br i1 true, label %.exit5, label %bb0 67*6454391bSMatt Arsenault 68*6454391bSMatt Arsenault.exit5: 69*6454391bSMatt Arsenault ret void 70*6454391bSMatt Arsenault} 71*6454391bSMatt Arsenault 72*6454391bSMatt Arsenaultdefine void @br_undef() { 73*6454391bSMatt Arsenault; WAVE64-LABEL: br_undef: 74*6454391bSMatt Arsenault; WAVE64: ; %bb.0: ; %.exit 75*6454391bSMatt Arsenault; WAVE64-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 76*6454391bSMatt Arsenault; WAVE64-NEXT: .LBB2_1: ; %bb0 77*6454391bSMatt Arsenault; WAVE64-NEXT: ; =>This Inner Loop Header: Depth=1 78*6454391bSMatt Arsenault; WAVE64-NEXT: ; implicit-def: $sgpr4 79*6454391bSMatt Arsenault; WAVE64-NEXT: s_and_b32 s4, s4, 1 80*6454391bSMatt Arsenault; WAVE64-NEXT: s_cmp_lg_u32 s4, 0 81*6454391bSMatt Arsenault; WAVE64-NEXT: s_cbranch_scc1 .LBB2_1 82*6454391bSMatt Arsenault; WAVE64-NEXT: ; %bb.2: ; %.exit5 83*6454391bSMatt Arsenault; WAVE64-NEXT: s_setpc_b64 s[30:31] 84*6454391bSMatt Arsenault; 85*6454391bSMatt Arsenault; WAVE32-LABEL: br_undef: 86*6454391bSMatt Arsenault; WAVE32: ; %bb.0: ; %.exit 87*6454391bSMatt Arsenault; WAVE32-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 88*6454391bSMatt Arsenault; WAVE32-NEXT: .LBB2_1: ; %bb0 89*6454391bSMatt Arsenault; WAVE32-NEXT: ; =>This Inner Loop Header: Depth=1 90*6454391bSMatt Arsenault; WAVE32-NEXT: ; implicit-def: $sgpr4 91*6454391bSMatt Arsenault; WAVE32-NEXT: s_and_b32 s4, s4, 1 92*6454391bSMatt Arsenault; WAVE32-NEXT: s_cmp_lg_u32 s4, 0 93*6454391bSMatt Arsenault; WAVE32-NEXT: s_cbranch_scc1 .LBB2_1 94*6454391bSMatt Arsenault; WAVE32-NEXT: ; %bb.2: ; %.exit5 95*6454391bSMatt Arsenault; WAVE32-NEXT: s_setpc_b64 s[30:31] 96*6454391bSMatt Arsenault.exit: 97*6454391bSMatt Arsenault br label %bb0 98*6454391bSMatt Arsenault 99*6454391bSMatt Arsenaultbb0: 100*6454391bSMatt Arsenault br i1 undef, label %.exit5, label %bb0 101*6454391bSMatt Arsenault 102*6454391bSMatt Arsenault.exit5: 103*6454391bSMatt Arsenault ret void 104*6454391bSMatt Arsenault} 105*6454391bSMatt Arsenault 106*6454391bSMatt Arsenaultdefine void @br_poison() { 107*6454391bSMatt Arsenault; WAVE64-LABEL: br_poison: 108*6454391bSMatt Arsenault; WAVE64: ; %bb.0: ; %.exit 109*6454391bSMatt Arsenault; WAVE64-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 110*6454391bSMatt Arsenault; WAVE64-NEXT: .LBB3_1: ; %bb0 111*6454391bSMatt Arsenault; WAVE64-NEXT: ; =>This Inner Loop Header: Depth=1 112*6454391bSMatt Arsenault; WAVE64-NEXT: ; implicit-def: $sgpr4 113*6454391bSMatt Arsenault; WAVE64-NEXT: s_and_b32 s4, s4, 1 114*6454391bSMatt Arsenault; WAVE64-NEXT: s_cmp_lg_u32 s4, 0 115*6454391bSMatt Arsenault; WAVE64-NEXT: s_cbranch_scc1 .LBB3_1 116*6454391bSMatt Arsenault; WAVE64-NEXT: ; %bb.2: ; %.exit5 117*6454391bSMatt Arsenault; WAVE64-NEXT: s_setpc_b64 s[30:31] 118*6454391bSMatt Arsenault; 119*6454391bSMatt Arsenault; WAVE32-LABEL: br_poison: 120*6454391bSMatt Arsenault; WAVE32: ; %bb.0: ; %.exit 121*6454391bSMatt Arsenault; WAVE32-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 122*6454391bSMatt Arsenault; WAVE32-NEXT: .LBB3_1: ; %bb0 123*6454391bSMatt Arsenault; WAVE32-NEXT: ; =>This Inner Loop Header: Depth=1 124*6454391bSMatt Arsenault; WAVE32-NEXT: ; implicit-def: $sgpr4 125*6454391bSMatt Arsenault; WAVE32-NEXT: s_and_b32 s4, s4, 1 126*6454391bSMatt Arsenault; WAVE32-NEXT: s_cmp_lg_u32 s4, 0 127*6454391bSMatt Arsenault; WAVE32-NEXT: s_cbranch_scc1 .LBB3_1 128*6454391bSMatt Arsenault; WAVE32-NEXT: ; %bb.2: ; %.exit5 129*6454391bSMatt Arsenault; WAVE32-NEXT: s_setpc_b64 s[30:31] 130*6454391bSMatt Arsenault.exit: 131*6454391bSMatt Arsenault br label %bb0 132*6454391bSMatt Arsenault 133*6454391bSMatt Arsenaultbb0: 134*6454391bSMatt Arsenault br i1 poison, label %.exit5, label %bb0 135*6454391bSMatt Arsenault 136*6454391bSMatt Arsenault.exit5: 137*6454391bSMatt Arsenault ret void 138*6454391bSMatt Arsenault} 139