1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.r600.read.tidig.x() #0 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_test_smed3_r_i_i_i32: 7*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, v{{[0-9]+}}, 12, 17 8*9880d681SAndroid Build Coastguard Workerdefine void @v_test_smed3_r_i_i_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr) #1 { 9*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() 10*9880d681SAndroid Build Coastguard Worker %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid 11*9880d681SAndroid Build Coastguard Worker %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 12*9880d681SAndroid Build Coastguard Worker %a = load i32, i32 addrspace(1)* %gep0 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp sgt i32 %a, 12 15*9880d681SAndroid Build Coastguard Worker %i0 = select i1 %icmp0, i32 %a, i32 12 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp slt i32 %i0, 17 18*9880d681SAndroid Build Coastguard Worker %i1 = select i1 %icmp1, i32 %i0, i32 17 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker store i32 %i1, i32 addrspace(1)* %outgep 21*9880d681SAndroid Build Coastguard Worker ret void 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_test_smed3_multi_use_r_i_i_i32: 25*9880d681SAndroid Build Coastguard Worker; GCN: v_max_i32 26*9880d681SAndroid Build Coastguard Worker; GCN: v_min_i32 27*9880d681SAndroid Build Coastguard Workerdefine void @v_test_smed3_multi_use_r_i_i_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr) #1 { 28*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() 29*9880d681SAndroid Build Coastguard Worker %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid 30*9880d681SAndroid Build Coastguard Worker %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 31*9880d681SAndroid Build Coastguard Worker %a = load i32, i32 addrspace(1)* %gep0 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp sgt i32 %a, 12 34*9880d681SAndroid Build Coastguard Worker %i0 = select i1 %icmp0, i32 %a, i32 12 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp slt i32 %i0, 17 37*9880d681SAndroid Build Coastguard Worker %i1 = select i1 %icmp1, i32 %i0, i32 17 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker store volatile i32 %i0, i32 addrspace(1)* %outgep 40*9880d681SAndroid Build Coastguard Worker store volatile i32 %i1, i32 addrspace(1)* %outgep 41*9880d681SAndroid Build Coastguard Worker ret void 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_test_smed3_r_i_i_constant_order_i32: 45*9880d681SAndroid Build Coastguard Worker; GCN: v_max_i32_e32 v{{[0-9]+}}, 17, v{{[0-9]+}} 46*9880d681SAndroid Build Coastguard Worker; GCN: v_min_i32_e32 v{{[0-9]+}}, 12, v{{[0-9]+}} 47*9880d681SAndroid Build Coastguard Workerdefine void @v_test_smed3_r_i_i_constant_order_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr) #1 { 48*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() 49*9880d681SAndroid Build Coastguard Worker %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid 50*9880d681SAndroid Build Coastguard Worker %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 51*9880d681SAndroid Build Coastguard Worker %a = load i32, i32 addrspace(1)* %gep0 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp sgt i32 %a, 17 54*9880d681SAndroid Build Coastguard Worker %i0 = select i1 %icmp0, i32 %a, i32 17 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp slt i32 %i0, 12 57*9880d681SAndroid Build Coastguard Worker %i1 = select i1 %icmp1, i32 %i0, i32 12 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker store i32 %i1, i32 addrspace(1)* %outgep 60*9880d681SAndroid Build Coastguard Worker ret void 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_test_smed3_r_i_i_sign_mismatch_i32: 64*9880d681SAndroid Build Coastguard Worker; GCN: v_max_u32_e32 v{{[0-9]+}}, 12, v{{[0-9]+}} 65*9880d681SAndroid Build Coastguard Worker; GCN: v_min_i32_e32 v{{[0-9]+}}, 17, v{{[0-9]+}} 66*9880d681SAndroid Build Coastguard Workerdefine void @v_test_smed3_r_i_i_sign_mismatch_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr) #1 { 67*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() 68*9880d681SAndroid Build Coastguard Worker %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid 69*9880d681SAndroid Build Coastguard Worker %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 70*9880d681SAndroid Build Coastguard Worker %a = load i32, i32 addrspace(1)* %gep0 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp ugt i32 %a, 12 73*9880d681SAndroid Build Coastguard Worker %i0 = select i1 %icmp0, i32 %a, i32 12 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp slt i32 %i0, 17 76*9880d681SAndroid Build Coastguard Worker %i1 = select i1 %icmp1, i32 %i0, i32 17 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker store i32 %i1, i32 addrspace(1)* %outgep 79*9880d681SAndroid Build Coastguard Worker ret void 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_test_smed3_r_i_i_i64: 83*9880d681SAndroid Build Coastguard Worker; GCN: v_cmp_lt_i64 84*9880d681SAndroid Build Coastguard Worker; GCN: v_cmp_gt_i64 85*9880d681SAndroid Build Coastguard Workerdefine void @v_test_smed3_r_i_i_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr) #1 { 86*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() 87*9880d681SAndroid Build Coastguard Worker %gep0 = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid 88*9880d681SAndroid Build Coastguard Worker %outgep = getelementptr i64, i64 addrspace(1)* %out, i32 %tid 89*9880d681SAndroid Build Coastguard Worker %a = load i64, i64 addrspace(1)* %gep0 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp sgt i64 %a, 12 92*9880d681SAndroid Build Coastguard Worker %i0 = select i1 %icmp0, i64 %a, i64 12 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp slt i64 %i0, 17 95*9880d681SAndroid Build Coastguard Worker %i1 = select i1 %icmp1, i64 %i0, i64 17 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker store i64 %i1, i64 addrspace(1)* %outgep 98*9880d681SAndroid Build Coastguard Worker ret void 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}v_test_smed3_r_i_i_i16: 102*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, v{{[0-9]+}}, 12, 17 103*9880d681SAndroid Build Coastguard Workerdefine void @v_test_smed3_r_i_i_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %aptr) #1 { 104*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() 105*9880d681SAndroid Build Coastguard Worker %gep0 = getelementptr i16, i16 addrspace(1)* %aptr, i32 %tid 106*9880d681SAndroid Build Coastguard Worker %outgep = getelementptr i16, i16 addrspace(1)* %out, i32 %tid 107*9880d681SAndroid Build Coastguard Worker %a = load i16, i16 addrspace(1)* %gep0 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker %icmp0 = icmp sgt i16 %a, 12 110*9880d681SAndroid Build Coastguard Worker %i0 = select i1 %icmp0, i16 %a, i16 12 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker %icmp1 = icmp slt i16 %i0, 17 113*9880d681SAndroid Build Coastguard Worker %i1 = select i1 %icmp1, i16 %i0, i16 17 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker store i16 %i1, i16 addrspace(1)* %outgep 116*9880d681SAndroid Build Coastguard Worker ret void 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerdefine internal i32 @smin(i32 %x, i32 %y) #2 { 121*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %x, %y 122*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, i32 %x, i32 %y 123*9880d681SAndroid Build Coastguard Worker ret i32 %sel 124*9880d681SAndroid Build Coastguard Worker} 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerdefine internal i32 @smax(i32 %x, i32 %y) #2 { 127*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %x, %y 128*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, i32 %x, i32 %y 129*9880d681SAndroid Build Coastguard Worker ret i32 %sel 130*9880d681SAndroid Build Coastguard Worker} 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Workerdefine internal i16 @smin16(i16 %x, i16 %y) #2 { 133*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i16 %x, %y 134*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, i16 %x, i16 %y 135*9880d681SAndroid Build Coastguard Worker ret i16 %sel 136*9880d681SAndroid Build Coastguard Worker} 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Workerdefine internal i16 @smax16(i16 %x, i16 %y) #2 { 139*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i16 %x, %y 140*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, i16 %x, i16 %y 141*9880d681SAndroid Build Coastguard Worker ret i16 %sel 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerdefine internal i8 @smin8(i8 %x, i8 %y) #2 { 145*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i8 %x, %y 146*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, i8 %x, i8 %y 147*9880d681SAndroid Build Coastguard Worker ret i8 %sel 148*9880d681SAndroid Build Coastguard Worker} 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Workerdefine internal i8 @smax8(i8 %x, i8 %y) #2 { 151*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i8 %x, %y 152*9880d681SAndroid Build Coastguard Worker %sel = select i1 %cmp, i8 %x, i8 %y 153*9880d681SAndroid Build Coastguard Worker ret i8 %sel 154*9880d681SAndroid Build Coastguard Worker} 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Worker; 16 combinations 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Worker; 0: max(min(x, y), min(max(x, y), z)) 159*9880d681SAndroid Build Coastguard Worker; 1: max(min(x, y), min(max(y, x), z)) 160*9880d681SAndroid Build Coastguard Worker; 2: max(min(x, y), min(z, max(x, y))) 161*9880d681SAndroid Build Coastguard Worker; 3: max(min(x, y), min(z, max(y, x))) 162*9880d681SAndroid Build Coastguard Worker; 4: max(min(y, x), min(max(x, y), z)) 163*9880d681SAndroid Build Coastguard Worker; 5: max(min(y, x), min(max(y, x), z)) 164*9880d681SAndroid Build Coastguard Worker; 6: max(min(y, x), min(z, max(x, y))) 165*9880d681SAndroid Build Coastguard Worker; 7: max(min(y, x), min(z, max(y, x))) 166*9880d681SAndroid Build Coastguard Worker; 167*9880d681SAndroid Build Coastguard Worker; + commute outermost max 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Worker; FIXME: In these cases we probably should have used scalar operations 171*9880d681SAndroid Build Coastguard Worker; instead. 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0: 174*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 175*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 176*9880d681SAndroid Build Coastguard Workerbb: 177*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %x, i32 %y) 178*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %x, i32 %y) 179*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 180*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 181*9880d681SAndroid Build Coastguard Worker store i32 %tmp3, i32 addrspace(1)* %arg 182*9880d681SAndroid Build Coastguard Worker ret void 183*9880d681SAndroid Build Coastguard Worker} 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_1: 186*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 187*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 188*9880d681SAndroid Build Coastguard Workerbb: 189*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %x, i32 %y) 190*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %y, i32 %x) 191*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 192*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 193*9880d681SAndroid Build Coastguard Worker store i32 %tmp3, i32 addrspace(1)* %arg 194*9880d681SAndroid Build Coastguard Worker ret void 195*9880d681SAndroid Build Coastguard Worker} 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_2: 198*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 199*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 200*9880d681SAndroid Build Coastguard Workerbb: 201*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %x, i32 %y) 202*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %x, i32 %y) 203*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %z, i32 %tmp1) 204*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 205*9880d681SAndroid Build Coastguard Worker store i32 %tmp3, i32 addrspace(1)* %arg 206*9880d681SAndroid Build Coastguard Worker ret void 207*9880d681SAndroid Build Coastguard Worker} 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_3: 210*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 211*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_3(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 212*9880d681SAndroid Build Coastguard Workerbb: 213*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %x, i32 %y) 214*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %y, i32 %x) 215*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %z, i32 %tmp1) 216*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 217*9880d681SAndroid Build Coastguard Worker store i32 %tmp3, i32 addrspace(1)* %arg 218*9880d681SAndroid Build Coastguard Worker ret void 219*9880d681SAndroid Build Coastguard Worker} 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_4: 222*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 223*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_4(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 224*9880d681SAndroid Build Coastguard Workerbb: 225*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %y, i32 %x) 226*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %x, i32 %y) 227*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 228*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 229*9880d681SAndroid Build Coastguard Worker store i32 %tmp3, i32 addrspace(1)* %arg 230*9880d681SAndroid Build Coastguard Worker ret void 231*9880d681SAndroid Build Coastguard Worker} 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_5: 234*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 235*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_5(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 236*9880d681SAndroid Build Coastguard Workerbb: 237*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %y, i32 %x) 238*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %y, i32 %x) 239*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 240*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 241*9880d681SAndroid Build Coastguard Worker store i32 %tmp3, i32 addrspace(1)* %arg 242*9880d681SAndroid Build Coastguard Worker ret void 243*9880d681SAndroid Build Coastguard Worker} 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_6: 246*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 247*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_6(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 248*9880d681SAndroid Build Coastguard Workerbb: 249*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %y, i32 %x) 250*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %x, i32 %y) 251*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %z, i32 %tmp1) 252*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 253*9880d681SAndroid Build Coastguard Worker store i32 %tmp3, i32 addrspace(1)* %arg 254*9880d681SAndroid Build Coastguard Worker ret void 255*9880d681SAndroid Build Coastguard Worker} 256*9880d681SAndroid Build Coastguard Worker 257*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_7: 258*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 259*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_7(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 260*9880d681SAndroid Build Coastguard Workerbb: 261*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %y, i32 %x) 262*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %y, i32 %x) 263*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %z, i32 %tmp1) 264*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 265*9880d681SAndroid Build Coastguard Worker store i32 %tmp3, i32 addrspace(1)* %arg 266*9880d681SAndroid Build Coastguard Worker ret void 267*9880d681SAndroid Build Coastguard Worker} 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_8: 270*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 271*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_8(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 272*9880d681SAndroid Build Coastguard Workerbb: 273*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %x, i32 %y) 274*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %x, i32 %y) 275*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 276*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0) 277*9880d681SAndroid Build Coastguard Worker store i32 %tmp3, i32 addrspace(1)* %arg 278*9880d681SAndroid Build Coastguard Worker ret void 279*9880d681SAndroid Build Coastguard Worker} 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_9: 282*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 283*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_9(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 284*9880d681SAndroid Build Coastguard Workerbb: 285*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %x, i32 %y) 286*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %y, i32 %x) 287*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 288*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0) 289*9880d681SAndroid Build Coastguard Worker store i32 %tmp3, i32 addrspace(1)* %arg 290*9880d681SAndroid Build Coastguard Worker ret void 291*9880d681SAndroid Build Coastguard Worker} 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_10: 294*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 295*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_10(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 296*9880d681SAndroid Build Coastguard Workerbb: 297*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %x, i32 %y) 298*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %x, i32 %y) 299*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %z, i32 %tmp1) 300*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0) 301*9880d681SAndroid Build Coastguard Worker store i32 %tmp3, i32 addrspace(1)* %arg 302*9880d681SAndroid Build Coastguard Worker ret void 303*9880d681SAndroid Build Coastguard Worker} 304*9880d681SAndroid Build Coastguard Worker 305*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_11: 306*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 307*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_11(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 308*9880d681SAndroid Build Coastguard Workerbb: 309*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %x, i32 %y) 310*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %y, i32 %x) 311*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %z, i32 %tmp1) 312*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0) 313*9880d681SAndroid Build Coastguard Worker store i32 %tmp3, i32 addrspace(1)* %arg 314*9880d681SAndroid Build Coastguard Worker ret void 315*9880d681SAndroid Build Coastguard Worker} 316*9880d681SAndroid Build Coastguard Worker 317*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_12: 318*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 319*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_12(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 320*9880d681SAndroid Build Coastguard Workerbb: 321*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %y, i32 %x) 322*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %x, i32 %y) 323*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 324*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0) 325*9880d681SAndroid Build Coastguard Worker store i32 %tmp3, i32 addrspace(1)* %arg 326*9880d681SAndroid Build Coastguard Worker ret void 327*9880d681SAndroid Build Coastguard Worker} 328*9880d681SAndroid Build Coastguard Worker 329*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_13: 330*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 331*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_13(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 332*9880d681SAndroid Build Coastguard Workerbb: 333*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %y, i32 %x) 334*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %y, i32 %x) 335*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 336*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0) 337*9880d681SAndroid Build Coastguard Worker store i32 %tmp3, i32 addrspace(1)* %arg 338*9880d681SAndroid Build Coastguard Worker ret void 339*9880d681SAndroid Build Coastguard Worker} 340*9880d681SAndroid Build Coastguard Worker 341*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_14: 342*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 343*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_14(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 344*9880d681SAndroid Build Coastguard Workerbb: 345*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %y, i32 %x) 346*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %x, i32 %y) 347*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %z, i32 %tmp1) 348*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0) 349*9880d681SAndroid Build Coastguard Worker store i32 %tmp3, i32 addrspace(1)* %arg 350*9880d681SAndroid Build Coastguard Worker ret void 351*9880d681SAndroid Build Coastguard Worker} 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_15: 354*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 355*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_15(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 356*9880d681SAndroid Build Coastguard Workerbb: 357*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %y, i32 %x) 358*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %y, i32 %x) 359*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %z, i32 %tmp1) 360*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0) 361*9880d681SAndroid Build Coastguard Worker store i32 %tmp3, i32 addrspace(1)* %arg 362*9880d681SAndroid Build Coastguard Worker ret void 363*9880d681SAndroid Build Coastguard Worker} 364*9880d681SAndroid Build Coastguard Worker 365*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i16_pat_0: 366*9880d681SAndroid Build Coastguard Worker; GCN: s_sext_i32_i16 367*9880d681SAndroid Build Coastguard Worker; GCN: s_sext_i32_i16 368*9880d681SAndroid Build Coastguard Worker; GCN: s_sext_i32_i16 369*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 370*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i16_pat_0(i16 addrspace(1)* %arg, i16 %x, i16 %y, i16 %z) #1 { 371*9880d681SAndroid Build Coastguard Workerbb: 372*9880d681SAndroid Build Coastguard Worker %tmp0 = call i16 @smin16(i16 %x, i16 %y) 373*9880d681SAndroid Build Coastguard Worker %tmp1 = call i16 @smax16(i16 %x, i16 %y) 374*9880d681SAndroid Build Coastguard Worker %tmp2 = call i16 @smin16(i16 %tmp1, i16 %z) 375*9880d681SAndroid Build Coastguard Worker %tmp3 = call i16 @smax16(i16 %tmp0, i16 %tmp2) 376*9880d681SAndroid Build Coastguard Worker store i16 %tmp3, i16 addrspace(1)* %arg 377*9880d681SAndroid Build Coastguard Worker ret void 378*9880d681SAndroid Build Coastguard Worker} 379*9880d681SAndroid Build Coastguard Worker 380*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i8_pat_0: 381*9880d681SAndroid Build Coastguard Worker; GCN: s_sext_i32_i8 382*9880d681SAndroid Build Coastguard Worker; GCN: s_sext_i32_i8 383*9880d681SAndroid Build Coastguard Worker; GCN: s_sext_i32_i8 384*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 385*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i8_pat_0(i8 addrspace(1)* %arg, i8 %x, i8 %y, i8 %z) #1 { 386*9880d681SAndroid Build Coastguard Workerbb: 387*9880d681SAndroid Build Coastguard Worker %tmp0 = call i8 @smin8(i8 %x, i8 %y) 388*9880d681SAndroid Build Coastguard Worker %tmp1 = call i8 @smax8(i8 %x, i8 %y) 389*9880d681SAndroid Build Coastguard Worker %tmp2 = call i8 @smin8(i8 %tmp1, i8 %z) 390*9880d681SAndroid Build Coastguard Worker %tmp3 = call i8 @smax8(i8 %tmp0, i8 %tmp2) 391*9880d681SAndroid Build Coastguard Worker store i8 %tmp3, i8 addrspace(1)* %arg 392*9880d681SAndroid Build Coastguard Worker ret void 393*9880d681SAndroid Build Coastguard Worker} 394*9880d681SAndroid Build Coastguard Worker 395*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0_multi_use_0: 396*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_med3_i32 397*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_0_multi_use_0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 398*9880d681SAndroid Build Coastguard Workerbb: 399*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %x, i32 %y) 400*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %x, i32 %y) 401*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 402*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 403*9880d681SAndroid Build Coastguard Worker store volatile i32 %tmp0, i32 addrspace(1)* %arg 404*9880d681SAndroid Build Coastguard Worker store volatile i32 %tmp3, i32 addrspace(1)* %arg 405*9880d681SAndroid Build Coastguard Worker ret void 406*9880d681SAndroid Build Coastguard Worker} 407*9880d681SAndroid Build Coastguard Worker 408*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0_multi_use_1: 409*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_med3_i32 410*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_0_multi_use_1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 411*9880d681SAndroid Build Coastguard Workerbb: 412*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %x, i32 %y) 413*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %x, i32 %y) 414*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 415*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 416*9880d681SAndroid Build Coastguard Worker store volatile i32 %tmp1, i32 addrspace(1)* %arg 417*9880d681SAndroid Build Coastguard Worker store volatile i32 %tmp3, i32 addrspace(1)* %arg 418*9880d681SAndroid Build Coastguard Worker ret void 419*9880d681SAndroid Build Coastguard Worker} 420*9880d681SAndroid Build Coastguard Worker 421*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0_multi_use_2: 422*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_med3_i32 423*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_0_multi_use_2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 424*9880d681SAndroid Build Coastguard Workerbb: 425*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %x, i32 %y) 426*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %x, i32 %y) 427*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 428*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 429*9880d681SAndroid Build Coastguard Worker store volatile i32 %tmp2, i32 addrspace(1)* %arg 430*9880d681SAndroid Build Coastguard Worker store volatile i32 %tmp3, i32 addrspace(1)* %arg 431*9880d681SAndroid Build Coastguard Worker ret void 432*9880d681SAndroid Build Coastguard Worker} 433*9880d681SAndroid Build Coastguard Worker 434*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0_multi_use_result: 435*9880d681SAndroid Build Coastguard Worker; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 436*9880d681SAndroid Build Coastguard Workerdefine void @s_test_smed3_i32_pat_0_multi_use_result(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 437*9880d681SAndroid Build Coastguard Workerbb: 438*9880d681SAndroid Build Coastguard Worker %tmp0 = call i32 @smin(i32 %x, i32 %y) 439*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @smax(i32 %x, i32 %y) 440*9880d681SAndroid Build Coastguard Worker %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 441*9880d681SAndroid Build Coastguard Worker %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 442*9880d681SAndroid Build Coastguard Worker store volatile i32 %tmp3, i32 addrspace(1)* %arg 443*9880d681SAndroid Build Coastguard Worker store volatile i32 %tmp3, i32 addrspace(1)* %arg 444*9880d681SAndroid Build Coastguard Worker ret void 445*9880d681SAndroid Build Coastguard Worker} 446*9880d681SAndroid Build Coastguard Worker 447*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind readnone } 448*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind } 449*9880d681SAndroid Build Coastguard Workerattributes #2 = { nounwind readnone alwaysinline } 450