1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=GCN -check-prefix=FUNC %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=VI -check-prefix=GCN -check-prefix=FUNC %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=r600 -mcpu=cypress -verify-machineinstrs < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_bool_icmp_eq_0: 6*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_cmp 7*9880d681SAndroid Build Coastguard Worker; GCN: v_cmp_ne_i32_e32 vcc, 8*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, vcc 9*9880d681SAndroid Build Coastguard Worker; GCN-NEXT:buffer_store_byte [[RESULT]] 10*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: s_endpgm 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; EG: SETNE_INT * [[CMP:T[0-9]+]].[[CMPCHAN:[XYZW]]], KC0[2].Z, KC0[2].W 13*9880d681SAndroid Build Coastguard Worker; EG: AND_INT T{{[0-9]+.[XYZW]}}, PS, 1 14*9880d681SAndroid Build Coastguard Workerdefine void @sext_bool_icmp_eq_0(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 15*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp eq i32 %a, %b 16*9880d681SAndroid Build Coastguard Worker %ext = sext i1 %icmp0 to i32 17*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp eq i32 %ext, 0 18*9880d681SAndroid Build Coastguard Worker store i1 %icmp1, i1 addrspace(1)* %out 19*9880d681SAndroid Build Coastguard Worker ret void 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_bool_icmp_ne_0: 23*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_cmp 24*9880d681SAndroid Build Coastguard Worker; GCN: v_cmp_ne_i32_e32 vcc, 25*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, vcc 26*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: buffer_store_byte [[RESULT]] 27*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: s_endpgm 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker; EG: SETNE_INT * [[CMP:T[0-9]+]].[[CMPCHAN:[XYZW]]], KC0[2].Z, KC0[2].W 30*9880d681SAndroid Build Coastguard Worker; EG: AND_INT T{{[0-9]+.[XYZW]}}, PS, 1 31*9880d681SAndroid Build Coastguard Workerdefine void @sext_bool_icmp_ne_0(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 32*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp ne i32 %a, %b 33*9880d681SAndroid Build Coastguard Worker %ext = sext i1 %icmp0 to i32 34*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp ne i32 %ext, 0 35*9880d681SAndroid Build Coastguard Worker store i1 %icmp1, i1 addrspace(1)* %out 36*9880d681SAndroid Build Coastguard Worker ret void 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_bool_icmp_eq_neg1: 40*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_cmp 41*9880d681SAndroid Build Coastguard Worker; GCN: v_cmp_eq_i32_e32 vcc, 42*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, vcc 43*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: buffer_store_byte [[RESULT]] 44*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: s_endpgm 45*9880d681SAndroid Build Coastguard Workerdefine void @sext_bool_icmp_eq_neg1(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 46*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp eq i32 %a, %b 47*9880d681SAndroid Build Coastguard Worker %ext = sext i1 %icmp0 to i32 48*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp eq i32 %ext, -1 49*9880d681SAndroid Build Coastguard Worker store i1 %icmp1, i1 addrspace(1)* %out 50*9880d681SAndroid Build Coastguard Worker ret void 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_bool_icmp_ne_neg1: 54*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_cmp 55*9880d681SAndroid Build Coastguard Worker; GCN: v_cmp_eq_i32_e32 vcc, 56*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, vcc 57*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: buffer_store_byte [[RESULT]] 58*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: s_endpgm 59*9880d681SAndroid Build Coastguard Workerdefine void @sext_bool_icmp_ne_neg1(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 60*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp ne i32 %a, %b 61*9880d681SAndroid Build Coastguard Worker %ext = sext i1 %icmp0 to i32 62*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp ne i32 %ext, -1 63*9880d681SAndroid Build Coastguard Worker store i1 %icmp1, i1 addrspace(1)* %out 64*9880d681SAndroid Build Coastguard Worker ret void 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}zext_bool_icmp_eq_0: 68*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_cmp 69*9880d681SAndroid Build Coastguard Worker; GCN: v_cmp_ne_i32_e32 vcc, 70*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, vcc 71*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: buffer_store_byte [[RESULT]] 72*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: s_endpgm 73*9880d681SAndroid Build Coastguard Workerdefine void @zext_bool_icmp_eq_0(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 74*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp eq i32 %a, %b 75*9880d681SAndroid Build Coastguard Worker %ext = zext i1 %icmp0 to i32 76*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp eq i32 %ext, 0 77*9880d681SAndroid Build Coastguard Worker store i1 %icmp1, i1 addrspace(1)* %out 78*9880d681SAndroid Build Coastguard Worker ret void 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}zext_bool_icmp_ne_0: 82*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_cmp 83*9880d681SAndroid Build Coastguard Worker; GCN: v_cmp_ne_i32_e32 vcc, 84*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, vcc 85*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: buffer_store_byte [[RESULT]] 86*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: s_endpgm 87*9880d681SAndroid Build Coastguard Workerdefine void @zext_bool_icmp_ne_0(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 88*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp ne i32 %a, %b 89*9880d681SAndroid Build Coastguard Worker %ext = zext i1 %icmp0 to i32 90*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp ne i32 %ext, 0 91*9880d681SAndroid Build Coastguard Worker store i1 %icmp1, i1 addrspace(1)* %out 92*9880d681SAndroid Build Coastguard Worker ret void 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}zext_bool_icmp_eq_1: 96*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_cmp 97*9880d681SAndroid Build Coastguard Worker; GCN: v_cmp_eq_i32_e32 vcc, 98*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, vcc 99*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: buffer_store_byte [[RESULT]] 100*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: s_endpgm 101*9880d681SAndroid Build Coastguard Workerdefine void @zext_bool_icmp_eq_1(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 102*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp eq i32 %a, %b 103*9880d681SAndroid Build Coastguard Worker %ext = zext i1 %icmp0 to i32 104*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp eq i32 %ext, 1 105*9880d681SAndroid Build Coastguard Worker store i1 %icmp1, i1 addrspace(1)* %out 106*9880d681SAndroid Build Coastguard Worker ret void 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}zext_bool_icmp_ne_1: 110*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_cmp 111*9880d681SAndroid Build Coastguard Worker; GCN: v_cmp_eq_i32_e32 vcc, 112*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, vcc 113*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: buffer_store_byte [[RESULT]] 114*9880d681SAndroid Build Coastguard Workerdefine void @zext_bool_icmp_ne_1(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 115*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp ne i32 %a, %b 116*9880d681SAndroid Build Coastguard Worker %ext = zext i1 %icmp0 to i32 117*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp ne i32 %ext, 1 118*9880d681SAndroid Build Coastguard Worker store i1 %icmp1, i1 addrspace(1)* %out 119*9880d681SAndroid Build Coastguard Worker ret void 120*9880d681SAndroid Build Coastguard Worker} 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker; Reduces to false: 123*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}zext_bool_icmp_eq_neg1: 124*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[TMP:v[0-9]+]], 0{{$}} 125*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_byte [[TMP]] 126*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: s_endpgm 127*9880d681SAndroid Build Coastguard Workerdefine void @zext_bool_icmp_eq_neg1(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 128*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp eq i32 %a, %b 129*9880d681SAndroid Build Coastguard Worker %ext = zext i1 %icmp0 to i32 130*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp eq i32 %ext, -1 131*9880d681SAndroid Build Coastguard Worker store i1 %icmp1, i1 addrspace(1)* %out 132*9880d681SAndroid Build Coastguard Worker ret void 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker; Reduces to true: 136*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}zext_bool_icmp_ne_neg1: 137*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[TMP:v[0-9]+]], 1{{$}} 138*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_byte [[TMP]] 139*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: s_endpgm 140*9880d681SAndroid Build Coastguard Workerdefine void @zext_bool_icmp_ne_neg1(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 141*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp ne i32 %a, %b 142*9880d681SAndroid Build Coastguard Worker %ext = zext i1 %icmp0 to i32 143*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp ne i32 %ext, -1 144*9880d681SAndroid Build Coastguard Worker store i1 %icmp1, i1 addrspace(1)* %out 145*9880d681SAndroid Build Coastguard Worker ret void 146*9880d681SAndroid Build Coastguard Worker} 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}cmp_zext_k_i8max: 149*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword [[VALUE:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb 150*9880d681SAndroid Build Coastguard Worker; VI: s_load_dword [[VALUE:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x2c 151*9880d681SAndroid Build Coastguard Worker; GCN: s_movk_i32 [[K255:s[0-9]+]], 0xff 152*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_and_b32 [[B:s[0-9]+]], [[VALUE]], [[K255]] 153*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 [[VK255:v[0-9]+]], [[K255]] 154*9880d681SAndroid Build Coastguard Worker; GCN: v_cmp_ne_i32_e32 vcc, [[B]], [[VK255]] 155*9880d681SAndroid Build Coastguard Worker; GCN: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, vcc 156*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_byte [[RESULT]] 157*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 158*9880d681SAndroid Build Coastguard Workerdefine void @cmp_zext_k_i8max(i1 addrspace(1)* %out, i8 %b) nounwind { 159*9880d681SAndroid Build Coastguard Worker %b.ext = zext i8 %b to i32 160*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp ne i32 %b.ext, 255 161*9880d681SAndroid Build Coastguard Worker store i1 %icmp0, i1 addrspace(1)* %out 162*9880d681SAndroid Build Coastguard Worker ret void 163*9880d681SAndroid Build Coastguard Worker} 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}cmp_sext_k_neg1: 166*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_sbyte [[B:v[0-9]+]] 167*9880d681SAndroid Build Coastguard Worker; GCN: v_cmp_ne_i32_e32 vcc, -1, [[B]]{{$}} 168*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, vcc 169*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_byte [[RESULT]] 170*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 171*9880d681SAndroid Build Coastguard Workerdefine void @cmp_sext_k_neg1(i1 addrspace(1)* %out, i8 addrspace(1)* %b.ptr) nounwind { 172*9880d681SAndroid Build Coastguard Worker %b = load i8, i8 addrspace(1)* %b.ptr 173*9880d681SAndroid Build Coastguard Worker %b.ext = sext i8 %b to i32 174*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp ne i32 %b.ext, -1 175*9880d681SAndroid Build Coastguard Worker store i1 %icmp0, i1 addrspace(1)* %out 176*9880d681SAndroid Build Coastguard Worker ret void 177*9880d681SAndroid Build Coastguard Worker} 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}cmp_sext_k_neg1_i8_sext_arg: 180*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword [[B:s[0-9]+]] 181*9880d681SAndroid Build Coastguard Worker; GCN: v_cmp_ne_i32_e64 [[CMP:s\[[0-9]+:[0-9]+\]]], -1, [[B]] 182*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, [[CMP]] 183*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: buffer_store_byte [[RESULT]] 184*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 185*9880d681SAndroid Build Coastguard Workerdefine void @cmp_sext_k_neg1_i8_sext_arg(i1 addrspace(1)* %out, i8 signext %b) nounwind { 186*9880d681SAndroid Build Coastguard Worker %b.ext = sext i8 %b to i32 187*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp ne i32 %b.ext, -1 188*9880d681SAndroid Build Coastguard Worker store i1 %icmp0, i1 addrspace(1)* %out 189*9880d681SAndroid Build Coastguard Worker ret void 190*9880d681SAndroid Build Coastguard Worker} 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker; FIXME: This ends up doing a buffer_load_ubyte, and and compare to 193*9880d681SAndroid Build Coastguard Worker; 255. Seems to be because of ordering problems when not allowing load widths to be reduced. 194*9880d681SAndroid Build Coastguard Worker; Should do a buffer_load_sbyte and compare with -1 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}cmp_sext_k_neg1_i8_arg: 197*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword [[VAL:s[0-9]+]], s[{{[0-9]+:[0-9]+}}], 0xb 198*9880d681SAndroid Build Coastguard Worker; VI: s_load_dword [[VAL:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x2c 199*9880d681SAndroid Build Coastguard Worker; GCN: s_movk_i32 [[K:s[0-9]+]], 0xff 200*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_and_b32 [[B:s[0-9]+]], [[VAL]], [[K]] 201*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 [[VK:v[0-9]+]], [[K]] 202*9880d681SAndroid Build Coastguard Worker; GCN: v_cmp_ne_i32_e32 vcc, [[B]], [[VK]]{{$}} 203*9880d681SAndroid Build Coastguard Worker; GCN: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, vcc 204*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_byte [[RESULT]] 205*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 206*9880d681SAndroid Build Coastguard Workerdefine void @cmp_sext_k_neg1_i8_arg(i1 addrspace(1)* %out, i8 %b) nounwind { 207*9880d681SAndroid Build Coastguard Worker %b.ext = sext i8 %b to i32 208*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp ne i32 %b.ext, -1 209*9880d681SAndroid Build Coastguard Worker store i1 %icmp0, i1 addrspace(1)* %out 210*9880d681SAndroid Build Coastguard Worker ret void 211*9880d681SAndroid Build Coastguard Worker} 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}cmp_zext_k_neg1: 214*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[RESULT:v[0-9]+]], 1{{$}} 215*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_byte [[RESULT]] 216*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 217*9880d681SAndroid Build Coastguard Workerdefine void @cmp_zext_k_neg1(i1 addrspace(1)* %out, i8 %b) nounwind { 218*9880d681SAndroid Build Coastguard Worker %b.ext = zext i8 %b to i32 219*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp ne i32 %b.ext, -1 220*9880d681SAndroid Build Coastguard Worker store i1 %icmp0, i1 addrspace(1)* %out 221*9880d681SAndroid Build Coastguard Worker ret void 222*9880d681SAndroid Build Coastguard Worker} 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}zext_bool_icmp_ne_k: 225*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[RESULT:v[0-9]+]], 1{{$}} 226*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_byte [[RESULT]] 227*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: s_endpgm 228*9880d681SAndroid Build Coastguard Workerdefine void @zext_bool_icmp_ne_k(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 229*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp ne i32 %a, %b 230*9880d681SAndroid Build Coastguard Worker %ext = zext i1 %icmp0 to i32 231*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp ne i32 %ext, 2 232*9880d681SAndroid Build Coastguard Worker store i1 %icmp1, i1 addrspace(1)* %out 233*9880d681SAndroid Build Coastguard Worker ret void 234*9880d681SAndroid Build Coastguard Worker} 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}zext_bool_icmp_eq_k: 237*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[RESULT:v[0-9]+]], 0{{$}} 238*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_byte [[RESULT]] 239*9880d681SAndroid Build Coastguard Worker; GCN-NEXT: s_endpgm 240*9880d681SAndroid Build Coastguard Workerdefine void @zext_bool_icmp_eq_k(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 241*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp ne i32 %a, %b 242*9880d681SAndroid Build Coastguard Worker %ext = zext i1 %icmp0 to i32 243*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp eq i32 %ext, 2 244*9880d681SAndroid Build Coastguard Worker store i1 %icmp1, i1 addrspace(1)* %out 245*9880d681SAndroid Build Coastguard Worker ret void 246*9880d681SAndroid Build Coastguard Worker} 247*9880d681SAndroid Build Coastguard Worker 248*9880d681SAndroid Build Coastguard Worker; FIXME: These cases should really be able fold to true/false in 249*9880d681SAndroid Build Coastguard Worker; DAGCombiner 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Worker; This really folds away to false 252*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_bool_icmp_eq_1: 253*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 0{{$}} 254*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_byte [[K]] 255*9880d681SAndroid Build Coastguard Workerdefine void @sext_bool_icmp_eq_1(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 256*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp eq i32 %a, %b 257*9880d681SAndroid Build Coastguard Worker %ext = sext i1 %icmp0 to i32 258*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp eq i32 %ext, 1 259*9880d681SAndroid Build Coastguard Worker store i1 %icmp1, i1 addrspace(1)* %out 260*9880d681SAndroid Build Coastguard Worker ret void 261*9880d681SAndroid Build Coastguard Worker} 262*9880d681SAndroid Build Coastguard Worker 263*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_bool_icmp_ne_1: 264*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 1{{$}} 265*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_byte [[K]] 266*9880d681SAndroid Build Coastguard Workerdefine void @sext_bool_icmp_ne_1(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 267*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp ne i32 %a, %b 268*9880d681SAndroid Build Coastguard Worker %ext = sext i1 %icmp0 to i32 269*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp ne i32 %ext, 1 270*9880d681SAndroid Build Coastguard Worker store i1 %icmp1, i1 addrspace(1)* %out 271*9880d681SAndroid Build Coastguard Worker ret void 272*9880d681SAndroid Build Coastguard Worker} 273*9880d681SAndroid Build Coastguard Worker 274*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}sext_bool_icmp_ne_k: 275*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 1{{$}} 276*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_byte [[K]] 277*9880d681SAndroid Build Coastguard Workerdefine void @sext_bool_icmp_ne_k(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 278*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp ne i32 %a, %b 279*9880d681SAndroid Build Coastguard Worker %ext = sext i1 %icmp0 to i32 280*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp ne i32 %ext, 2 281*9880d681SAndroid Build Coastguard Worker store i1 %icmp1, i1 addrspace(1)* %out 282*9880d681SAndroid Build Coastguard Worker ret void 283*9880d681SAndroid Build Coastguard Worker} 284