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