1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=r600 -mcpu=cypress < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_test_imin_sle_i32: 7*9880d681SAndroid Build Coastguard Worker; SI: v_min_i32_e32 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 10*9880d681SAndroid Build Coastguard Workerdefine void @v_test_imin_sle_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr) nounwind { 11*9880d681SAndroid Build Coastguard Worker %a = load i32, i32 addrspace(1)* %aptr, align 4 12*9880d681SAndroid Build Coastguard Worker %b = load i32, i32 addrspace(1)* %bptr, align 4 13*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle i32 %a, %b 14*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, i32 %a, i32 %b 15*9880d681SAndroid Build Coastguard Worker store i32 %val, i32 addrspace(1)* %out, align 4 16*9880d681SAndroid Build Coastguard Worker ret void 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_test_imin_sle_i32: 20*9880d681SAndroid Build Coastguard Worker; SI: s_min_i32 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 23*9880d681SAndroid Build Coastguard Workerdefine void @s_test_imin_sle_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 24*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle i32 %a, %b 25*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, i32 %a, i32 %b 26*9880d681SAndroid Build Coastguard Worker store i32 %val, i32 addrspace(1)* %out, align 4 27*9880d681SAndroid Build Coastguard Worker ret void 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_test_imin_sle_v1i32: 31*9880d681SAndroid Build Coastguard Worker; SI: s_min_i32 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 34*9880d681SAndroid Build Coastguard Workerdefine void @s_test_imin_sle_v1i32(<1 x i32> addrspace(1)* %out, <1 x i32> %a, <1 x i32> %b) nounwind { 35*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle <1 x i32> %a, %b 36*9880d681SAndroid Build Coastguard Worker %val = select <1 x i1> %cmp, <1 x i32> %a, <1 x i32> %b 37*9880d681SAndroid Build Coastguard Worker store <1 x i32> %val, <1 x i32> addrspace(1)* %out 38*9880d681SAndroid Build Coastguard Worker ret void 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_test_imin_sle_v4i32: 42*9880d681SAndroid Build Coastguard Worker; SI: s_min_i32 43*9880d681SAndroid Build Coastguard Worker; SI: s_min_i32 44*9880d681SAndroid Build Coastguard Worker; SI: s_min_i32 45*9880d681SAndroid Build Coastguard Worker; SI: s_min_i32 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 48*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 49*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 50*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 51*9880d681SAndroid Build Coastguard Workerdefine void @s_test_imin_sle_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> %a, <4 x i32> %b) nounwind { 52*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle <4 x i32> %a, %b 53*9880d681SAndroid Build Coastguard Worker %val = select <4 x i1> %cmp, <4 x i32> %a, <4 x i32> %b 54*9880d681SAndroid Build Coastguard Worker store <4 x i32> %val, <4 x i32> addrspace(1)* %out 55*9880d681SAndroid Build Coastguard Worker ret void 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_test_imin_sle_i8: 59*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword 60*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword 61*9880d681SAndroid Build Coastguard Worker; SI: s_sext_i32_i8 62*9880d681SAndroid Build Coastguard Worker; SI: s_sext_i32_i8 63*9880d681SAndroid Build Coastguard Worker; SI: s_min_i32 64*9880d681SAndroid Build Coastguard Workerdefine void @s_test_imin_sle_i8(i8 addrspace(1)* %out, i8 %a, i8 %b) nounwind { 65*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle i8 %a, %b 66*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, i8 %a, i8 %b 67*9880d681SAndroid Build Coastguard Worker store i8 %val, i8 addrspace(1)* %out 68*9880d681SAndroid Build Coastguard Worker ret void 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker; XXX - should be able to use s_min if we stop unnecessarily doing 72*9880d681SAndroid Build Coastguard Worker; extloads with mubuf instructions. 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_test_imin_sle_v4i8: 75*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_sbyte 76*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_sbyte 77*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_sbyte 78*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_sbyte 79*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_sbyte 80*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_sbyte 81*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_sbyte 82*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_sbyte 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker; SI: v_min_i32 85*9880d681SAndroid Build Coastguard Worker; SI: v_min_i32 86*9880d681SAndroid Build Coastguard Worker; SI: v_min_i32 87*9880d681SAndroid Build Coastguard Worker; SI: v_min_i32 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 92*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 93*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 94*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 95*9880d681SAndroid Build Coastguard Workerdefine void @s_test_imin_sle_v4i8(<4 x i8> addrspace(1)* %out, <4 x i8> %a, <4 x i8> %b) nounwind { 96*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle <4 x i8> %a, %b 97*9880d681SAndroid Build Coastguard Worker %val = select <4 x i1> %cmp, <4 x i8> %a, <4 x i8> %b 98*9880d681SAndroid Build Coastguard Worker store <4 x i8> %val, <4 x i8> addrspace(1)* %out 99*9880d681SAndroid Build Coastguard Worker ret void 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_test_imin_sle_v4i16: 103*9880d681SAndroid Build Coastguard Worker; SI: v_min_i32 104*9880d681SAndroid Build Coastguard Worker; SI: v_min_i32 105*9880d681SAndroid Build Coastguard Worker; SI: v_min_i32 106*9880d681SAndroid Build Coastguard Worker; SI: v_min_i32 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 109*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 110*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 111*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 112*9880d681SAndroid Build Coastguard Workerdefine void @s_test_imin_sle_v4i16(<4 x i16> addrspace(1)* %out, <4 x i16> %a, <4 x i16> %b) nounwind { 113*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle <4 x i16> %a, %b 114*9880d681SAndroid Build Coastguard Worker %val = select <4 x i1> %cmp, <4 x i16> %a, <4 x i16> %b 115*9880d681SAndroid Build Coastguard Worker store <4 x i16> %val, <4 x i16> addrspace(1)* %out 116*9880d681SAndroid Build Coastguard Worker ret void 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @v_test_imin_slt_i32 120*9880d681SAndroid Build Coastguard Worker; SI: v_min_i32_e32 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 123*9880d681SAndroid Build Coastguard Workerdefine void @v_test_imin_slt_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr) nounwind { 124*9880d681SAndroid Build Coastguard Worker %a = load i32, i32 addrspace(1)* %aptr, align 4 125*9880d681SAndroid Build Coastguard Worker %b = load i32, i32 addrspace(1)* %bptr, align 4 126*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %a, %b 127*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, i32 %a, i32 %b 128*9880d681SAndroid Build Coastguard Worker store i32 %val, i32 addrspace(1)* %out, align 4 129*9880d681SAndroid Build Coastguard Worker ret void 130*9880d681SAndroid Build Coastguard Worker} 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @s_test_imin_slt_i32 133*9880d681SAndroid Build Coastguard Worker; SI: s_min_i32 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 136*9880d681SAndroid Build Coastguard Workerdefine void @s_test_imin_slt_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 137*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %a, %b 138*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, i32 %a, i32 %b 139*9880d681SAndroid Build Coastguard Worker store i32 %val, i32 addrspace(1)* %out, align 4 140*9880d681SAndroid Build Coastguard Worker ret void 141*9880d681SAndroid Build Coastguard Worker} 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_test_imin_slt_v2i32: 144*9880d681SAndroid Build Coastguard Worker; SI: s_min_i32 145*9880d681SAndroid Build Coastguard Worker; SI: s_min_i32 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 148*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 149*9880d681SAndroid Build Coastguard Workerdefine void @s_test_imin_slt_v2i32(<2 x i32> addrspace(1)* %out, <2 x i32> %a, <2 x i32> %b) nounwind { 150*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt <2 x i32> %a, %b 151*9880d681SAndroid Build Coastguard Worker %val = select <2 x i1> %cmp, <2 x i32> %a, <2 x i32> %b 152*9880d681SAndroid Build Coastguard Worker store <2 x i32> %val, <2 x i32> addrspace(1)* %out 153*9880d681SAndroid Build Coastguard Worker ret void 154*9880d681SAndroid Build Coastguard Worker} 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_test_imin_slt_imm_i32: 157*9880d681SAndroid Build Coastguard Worker; SI: s_min_i32 {{s[0-9]+}}, {{s[0-9]+}}, 8 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT {{.*}}literal.{{[xyzw]}} 160*9880d681SAndroid Build Coastguard Workerdefine void @s_test_imin_slt_imm_i32(i32 addrspace(1)* %out, i32 %a) nounwind { 161*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %a, 8 162*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, i32 %a, i32 8 163*9880d681SAndroid Build Coastguard Worker store i32 %val, i32 addrspace(1)* %out, align 4 164*9880d681SAndroid Build Coastguard Worker ret void 165*9880d681SAndroid Build Coastguard Worker} 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_test_imin_sle_imm_i32: 168*9880d681SAndroid Build Coastguard Worker; SI: s_min_i32 {{s[0-9]+}}, {{s[0-9]+}}, 8 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT {{.*}}literal.{{[xyzw]}} 171*9880d681SAndroid Build Coastguard Workerdefine void @s_test_imin_sle_imm_i32(i32 addrspace(1)* %out, i32 %a) nounwind { 172*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle i32 %a, 8 173*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, i32 %a, i32 8 174*9880d681SAndroid Build Coastguard Worker store i32 %val, i32 addrspace(1)* %out, align 4 175*9880d681SAndroid Build Coastguard Worker ret void 176*9880d681SAndroid Build Coastguard Worker} 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @v_test_umin_ule_i32 179*9880d681SAndroid Build Coastguard Worker; SI: v_min_u32_e32 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 182*9880d681SAndroid Build Coastguard Workerdefine void @v_test_umin_ule_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr) nounwind { 183*9880d681SAndroid Build Coastguard Worker %a = load i32, i32 addrspace(1)* %aptr, align 4 184*9880d681SAndroid Build Coastguard Worker %b = load i32, i32 addrspace(1)* %bptr, align 4 185*9880d681SAndroid Build Coastguard Worker %cmp = icmp ule i32 %a, %b 186*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, i32 %a, i32 %b 187*9880d681SAndroid Build Coastguard Worker store i32 %val, i32 addrspace(1)* %out, align 4 188*9880d681SAndroid Build Coastguard Worker ret void 189*9880d681SAndroid Build Coastguard Worker} 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @v_test_umin_ule_v3i32 192*9880d681SAndroid Build Coastguard Worker; SI: v_min_u32_e32 193*9880d681SAndroid Build Coastguard Worker; SI: v_min_u32_e32 194*9880d681SAndroid Build Coastguard Worker; SI: v_min_u32_e32 195*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_min_u32_e32 196*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 199*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 200*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 201*9880d681SAndroid Build Coastguard Workerdefine void @v_test_umin_ule_v3i32(<3 x i32> addrspace(1)* %out, <3 x i32> addrspace(1)* %aptr, <3 x i32> addrspace(1)* %bptr) nounwind { 202*9880d681SAndroid Build Coastguard Worker %a = load <3 x i32>, <3 x i32> addrspace(1)* %aptr 203*9880d681SAndroid Build Coastguard Worker %b = load <3 x i32>, <3 x i32> addrspace(1)* %bptr 204*9880d681SAndroid Build Coastguard Worker %cmp = icmp ule <3 x i32> %a, %b 205*9880d681SAndroid Build Coastguard Worker %val = select <3 x i1> %cmp, <3 x i32> %a, <3 x i32> %b 206*9880d681SAndroid Build Coastguard Worker store <3 x i32> %val, <3 x i32> addrspace(1)* %out 207*9880d681SAndroid Build Coastguard Worker ret void 208*9880d681SAndroid Build Coastguard Worker} 209*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @s_test_umin_ule_i32 210*9880d681SAndroid Build Coastguard Worker; SI: s_min_u32 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 213*9880d681SAndroid Build Coastguard Workerdefine void @s_test_umin_ule_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 214*9880d681SAndroid Build Coastguard Worker %cmp = icmp ule i32 %a, %b 215*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, i32 %a, i32 %b 216*9880d681SAndroid Build Coastguard Worker store i32 %val, i32 addrspace(1)* %out, align 4 217*9880d681SAndroid Build Coastguard Worker ret void 218*9880d681SAndroid Build Coastguard Worker} 219*9880d681SAndroid Build Coastguard Worker 220*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @v_test_umin_ult_i32 221*9880d681SAndroid Build Coastguard Worker; SI: v_min_u32_e32 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 224*9880d681SAndroid Build Coastguard Workerdefine void @v_test_umin_ult_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr) nounwind { 225*9880d681SAndroid Build Coastguard Worker %a = load i32, i32 addrspace(1)* %aptr, align 4 226*9880d681SAndroid Build Coastguard Worker %b = load i32, i32 addrspace(1)* %bptr, align 4 227*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i32 %a, %b 228*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, i32 %a, i32 %b 229*9880d681SAndroid Build Coastguard Worker store i32 %val, i32 addrspace(1)* %out, align 4 230*9880d681SAndroid Build Coastguard Worker ret void 231*9880d681SAndroid Build Coastguard Worker} 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_test_umin_ult_i8: 234*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_ubyte 235*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_ubyte 236*9880d681SAndroid Build Coastguard Worker; SI: v_min_u32_e32 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 239*9880d681SAndroid Build Coastguard Workerdefine void @v_test_umin_ult_i8(i8 addrspace(1)* %out, i8 addrspace(1)* %aptr, i8 addrspace(1)* %bptr) nounwind { 240*9880d681SAndroid Build Coastguard Worker %a = load i8, i8 addrspace(1)* %aptr, align 1 241*9880d681SAndroid Build Coastguard Worker %b = load i8, i8 addrspace(1)* %bptr, align 1 242*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i8 %a, %b 243*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, i8 %a, i8 %b 244*9880d681SAndroid Build Coastguard Worker store i8 %val, i8 addrspace(1)* %out, align 1 245*9880d681SAndroid Build Coastguard Worker ret void 246*9880d681SAndroid Build Coastguard Worker} 247*9880d681SAndroid Build Coastguard Worker 248*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @s_test_umin_ult_i32 249*9880d681SAndroid Build Coastguard Worker; SI: s_min_u32 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 252*9880d681SAndroid Build Coastguard Workerdefine void @s_test_umin_ult_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 253*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i32 %a, %b 254*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, i32 %a, i32 %b 255*9880d681SAndroid Build Coastguard Worker store i32 %val, i32 addrspace(1)* %out, align 4 256*9880d681SAndroid Build Coastguard Worker ret void 257*9880d681SAndroid Build Coastguard Worker} 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @v_test_umin_ult_i32_multi_use 260*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_min 261*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_lt_u32 262*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32 263*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_min 264*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 265*9880d681SAndroid Build Coastguard Worker 266*9880d681SAndroid Build Coastguard Worker; EG-NOT: MIN_UINT 267*9880d681SAndroid Build Coastguard Workerdefine void @v_test_umin_ult_i32_multi_use(i32 addrspace(1)* %out0, i1 addrspace(1)* %out1, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr) nounwind { 268*9880d681SAndroid Build Coastguard Worker %a = load i32, i32 addrspace(1)* %aptr, align 4 269*9880d681SAndroid Build Coastguard Worker %b = load i32, i32 addrspace(1)* %bptr, align 4 270*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i32 %a, %b 271*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, i32 %a, i32 %b 272*9880d681SAndroid Build Coastguard Worker store i32 %val, i32 addrspace(1)* %out0, align 4 273*9880d681SAndroid Build Coastguard Worker store i1 %cmp, i1 addrspace(1)* %out1 274*9880d681SAndroid Build Coastguard Worker ret void 275*9880d681SAndroid Build Coastguard Worker} 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @s_test_umin_ult_v1i32 279*9880d681SAndroid Build Coastguard Worker; SI: s_min_u32 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 282*9880d681SAndroid Build Coastguard Workerdefine void @s_test_umin_ult_v1i32(<1 x i32> addrspace(1)* %out, <1 x i32> %a, <1 x i32> %b) nounwind { 283*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult <1 x i32> %a, %b 284*9880d681SAndroid Build Coastguard Worker %val = select <1 x i1> %cmp, <1 x i32> %a, <1 x i32> %b 285*9880d681SAndroid Build Coastguard Worker store <1 x i32> %val, <1 x i32> addrspace(1)* %out 286*9880d681SAndroid Build Coastguard Worker ret void 287*9880d681SAndroid Build Coastguard Worker} 288*9880d681SAndroid Build Coastguard Worker 289*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_test_umin_ult_v8i32: 290*9880d681SAndroid Build Coastguard Worker; SI: s_min_u32 291*9880d681SAndroid Build Coastguard Worker; SI: s_min_u32 292*9880d681SAndroid Build Coastguard Worker; SI: s_min_u32 293*9880d681SAndroid Build Coastguard Worker; SI: s_min_u32 294*9880d681SAndroid Build Coastguard Worker; SI: s_min_u32 295*9880d681SAndroid Build Coastguard Worker; SI: s_min_u32 296*9880d681SAndroid Build Coastguard Worker; SI: s_min_u32 297*9880d681SAndroid Build Coastguard Worker; SI: s_min_u32 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 300*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 301*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 302*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 303*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 304*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 305*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 306*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 307*9880d681SAndroid Build Coastguard Workerdefine void @s_test_umin_ult_v8i32(<8 x i32> addrspace(1)* %out, <8 x i32> %a, <8 x i32> %b) nounwind { 308*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult <8 x i32> %a, %b 309*9880d681SAndroid Build Coastguard Worker %val = select <8 x i1> %cmp, <8 x i32> %a, <8 x i32> %b 310*9880d681SAndroid Build Coastguard Worker store <8 x i32> %val, <8 x i32> addrspace(1)* %out 311*9880d681SAndroid Build Coastguard Worker ret void 312*9880d681SAndroid Build Coastguard Worker} 313*9880d681SAndroid Build Coastguard Worker 314*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_test_umin_ult_v8i16: 315*9880d681SAndroid Build Coastguard Worker; SI: v_min_u32 316*9880d681SAndroid Build Coastguard Worker; SI: v_min_u32 317*9880d681SAndroid Build Coastguard Worker; SI: v_min_u32 318*9880d681SAndroid Build Coastguard Worker; SI: v_min_u32 319*9880d681SAndroid Build Coastguard Worker; SI: v_min_u32 320*9880d681SAndroid Build Coastguard Worker; SI: v_min_u32 321*9880d681SAndroid Build Coastguard Worker; SI: v_min_u32 322*9880d681SAndroid Build Coastguard Worker; SI: v_min_u32 323*9880d681SAndroid Build Coastguard Worker 324*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 325*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 326*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 327*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 328*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 329*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 330*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 331*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 332*9880d681SAndroid Build Coastguard Workerdefine void @s_test_umin_ult_v8i16(<8 x i16> addrspace(1)* %out, <8 x i16> %a, <8 x i16> %b) nounwind { 333*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult <8 x i16> %a, %b 334*9880d681SAndroid Build Coastguard Worker %val = select <8 x i1> %cmp, <8 x i16> %a, <8 x i16> %b 335*9880d681SAndroid Build Coastguard Worker store <8 x i16> %val, <8 x i16> addrspace(1)* %out 336*9880d681SAndroid Build Coastguard Worker ret void 337*9880d681SAndroid Build Coastguard Worker} 338*9880d681SAndroid Build Coastguard Worker 339*9880d681SAndroid Build Coastguard Worker; Make sure redundant and removed 340*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}simplify_demanded_bits_test_umin_ult_i16: 341*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[A:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xb 342*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[B:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xc 343*9880d681SAndroid Build Coastguard Worker; SI: s_min_u32 [[MIN:s[0-9]+]], [[A]], [[B]] 344*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VMIN:v[0-9]+]], [[MIN]] 345*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VMIN]] 346*9880d681SAndroid Build Coastguard Worker 347*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 348*9880d681SAndroid Build Coastguard Workerdefine void @simplify_demanded_bits_test_umin_ult_i16(i32 addrspace(1)* %out, i16 zeroext %a, i16 zeroext %b) nounwind { 349*9880d681SAndroid Build Coastguard Worker %a.ext = zext i16 %a to i32 350*9880d681SAndroid Build Coastguard Worker %b.ext = zext i16 %b to i32 351*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i32 %a.ext, %b.ext 352*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, i32 %a.ext, i32 %b.ext 353*9880d681SAndroid Build Coastguard Worker %mask = and i32 %val, 65535 354*9880d681SAndroid Build Coastguard Worker store i32 %mask, i32 addrspace(1)* %out 355*9880d681SAndroid Build Coastguard Worker ret void 356*9880d681SAndroid Build Coastguard Worker} 357*9880d681SAndroid Build Coastguard Worker 358*9880d681SAndroid Build Coastguard Worker; Make sure redundant sign_extend_inreg removed. 359*9880d681SAndroid Build Coastguard Worker 360*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}simplify_demanded_bits_test_min_slt_i16: 361*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[A:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xb 362*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[B:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xc 363*9880d681SAndroid Build Coastguard Worker; SI: s_min_i32 [[MIN:s[0-9]+]], [[A]], [[B]] 364*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VMIN:v[0-9]+]], [[MIN]] 365*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[VMIN]] 366*9880d681SAndroid Build Coastguard Worker 367*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 368*9880d681SAndroid Build Coastguard Workerdefine void @simplify_demanded_bits_test_min_slt_i16(i32 addrspace(1)* %out, i16 signext %a, i16 signext %b) nounwind { 369*9880d681SAndroid Build Coastguard Worker %a.ext = sext i16 %a to i32 370*9880d681SAndroid Build Coastguard Worker %b.ext = sext i16 %b to i32 371*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %a.ext, %b.ext 372*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, i32 %a.ext, i32 %b.ext 373*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %val, 16 374*9880d681SAndroid Build Coastguard Worker %sextinreg = ashr i32 %shl, 16 375*9880d681SAndroid Build Coastguard Worker store i32 %sextinreg, i32 addrspace(1)* %out 376*9880d681SAndroid Build Coastguard Worker ret void 377*9880d681SAndroid Build Coastguard Worker} 378*9880d681SAndroid Build Coastguard Worker 379*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_test_imin_sle_i16: 380*9880d681SAndroid Build Coastguard Worker; SI: s_min_i32 381*9880d681SAndroid Build Coastguard Worker 382*9880d681SAndroid Build Coastguard Worker; EG: MIN_INT 383*9880d681SAndroid Build Coastguard Workerdefine void @s_test_imin_sle_i16(i16 addrspace(1)* %out, i16 %a, i16 %b) nounwind { 384*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle i16 %a, %b 385*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, i16 %a, i16 %b 386*9880d681SAndroid Build Coastguard Worker store i16 %val, i16 addrspace(1)* %out 387*9880d681SAndroid Build Coastguard Worker ret void 388*9880d681SAndroid Build Coastguard Worker} 389*9880d681SAndroid Build Coastguard Worker 390*9880d681SAndroid Build Coastguard Worker; 64 bit 391*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_umin_ult_i64 392*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 393*9880d681SAndroid Build Coastguard Worker 394*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 395*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 396*9880d681SAndroid Build Coastguard Workerdefine void @test_umin_ult_i64(i64 addrspace(1)* %out, i64 %a, i64 %b) nounwind { 397*9880d681SAndroid Build Coastguard Worker %tmp = icmp ult i64 %a, %b 398*9880d681SAndroid Build Coastguard Worker %val = select i1 %tmp, i64 %a, i64 %b 399*9880d681SAndroid Build Coastguard Worker store i64 %val, i64 addrspace(1)* %out, align 8 400*9880d681SAndroid Build Coastguard Worker ret void 401*9880d681SAndroid Build Coastguard Worker} 402*9880d681SAndroid Build Coastguard Worker 403*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_umin_ule_i64 404*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 405*9880d681SAndroid Build Coastguard Worker 406*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 407*9880d681SAndroid Build Coastguard Worker; EG: MIN_UINT 408*9880d681SAndroid Build Coastguard Workerdefine void @test_umin_ule_i64(i64 addrspace(1)* %out, i64 %a, i64 %b) nounwind { 409*9880d681SAndroid Build Coastguard Worker %tmp = icmp ule i64 %a, %b 410*9880d681SAndroid Build Coastguard Worker %val = select i1 %tmp, i64 %a, i64 %b 411*9880d681SAndroid Build Coastguard Worker store i64 %val, i64 addrspace(1)* %out, align 8 412*9880d681SAndroid Build Coastguard Worker ret void 413*9880d681SAndroid Build Coastguard Worker} 414*9880d681SAndroid Build Coastguard Worker 415*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_imin_slt_i64 416*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 417*9880d681SAndroid Build Coastguard Worker 418*9880d681SAndroid Build Coastguard Worker; EG-DAG: MIN_UINT 419*9880d681SAndroid Build Coastguard Worker; EG-DAG: MIN_INT 420*9880d681SAndroid Build Coastguard Workerdefine void @test_imin_slt_i64(i64 addrspace(1)* %out, i64 %a, i64 %b) nounwind { 421*9880d681SAndroid Build Coastguard Worker %tmp = icmp slt i64 %a, %b 422*9880d681SAndroid Build Coastguard Worker %val = select i1 %tmp, i64 %a, i64 %b 423*9880d681SAndroid Build Coastguard Worker store i64 %val, i64 addrspace(1)* %out, align 8 424*9880d681SAndroid Build Coastguard Worker ret void 425*9880d681SAndroid Build Coastguard Worker} 426*9880d681SAndroid Build Coastguard Worker 427*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_imin_sle_i64 428*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 429*9880d681SAndroid Build Coastguard Worker 430*9880d681SAndroid Build Coastguard Worker; EG-DAG: MIN_UINT 431*9880d681SAndroid Build Coastguard Worker; EG-DAG: MIN_INT 432*9880d681SAndroid Build Coastguard Workerdefine void @test_imin_sle_i64(i64 addrspace(1)* %out, i64 %a, i64 %b) nounwind { 433*9880d681SAndroid Build Coastguard Worker %tmp = icmp sle i64 %a, %b 434*9880d681SAndroid Build Coastguard Worker %val = select i1 %tmp, i64 %a, i64 %b 435*9880d681SAndroid Build Coastguard Worker store i64 %val, i64 addrspace(1)* %out, align 8 436*9880d681SAndroid Build Coastguard Worker ret void 437*9880d681SAndroid Build Coastguard Worker} 438