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_smed3_r_i_i_i32: 7; GCN: v_med3_i32 v{{[0-9]+}}, v{{[0-9]+}}, 12, 17 8define void @v_test_smed3_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 sgt i32 %a, 12 15 %i0 = select i1 %icmp0, i32 %a, i32 12 16 17 %icmp1 = icmp slt 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_smed3_multi_use_r_i_i_i32: 25; GCN: v_max_i32 26; GCN: v_min_i32 27define void @v_test_smed3_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 sgt i32 %a, 12 34 %i0 = select i1 %icmp0, i32 %a, i32 12 35 36 %icmp1 = icmp slt 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_smed3_r_i_i_constant_order_i32: 45; GCN: v_max_i32_e32 v{{[0-9]+}}, 17, v{{[0-9]+}} 46; GCN: v_min_i32_e32 v{{[0-9]+}}, 12, v{{[0-9]+}} 47define void @v_test_smed3_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 sgt i32 %a, 17 54 %i0 = select i1 %icmp0, i32 %a, i32 17 55 56 %icmp1 = icmp slt 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_smed3_r_i_i_sign_mismatch_i32: 64; GCN: v_max_u32_e32 v{{[0-9]+}}, 12, v{{[0-9]+}} 65; GCN: v_min_i32_e32 v{{[0-9]+}}, 17, v{{[0-9]+}} 66define void @v_test_smed3_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 ugt i32 %a, 12 73 %i0 = select i1 %icmp0, i32 %a, i32 12 74 75 %icmp1 = icmp slt 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_smed3_r_i_i_i64: 83; GCN: v_cmp_lt_i64 84; GCN: v_cmp_gt_i64 85define void @v_test_smed3_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 sgt i64 %a, 12 92 %i0 = select i1 %icmp0, i64 %a, i64 12 93 94 %icmp1 = icmp slt 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_smed3_r_i_i_i16: 102; GCN: v_med3_i32 v{{[0-9]+}}, v{{[0-9]+}}, 12, 17 103define void @v_test_smed3_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 sgt i16 %a, 12 110 %i0 = select i1 %icmp0, i16 %a, i16 12 111 112 %icmp1 = icmp slt 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 119 120define internal i32 @smin(i32 %x, i32 %y) #2 { 121 %cmp = icmp slt i32 %x, %y 122 %sel = select i1 %cmp, i32 %x, i32 %y 123 ret i32 %sel 124} 125 126define internal i32 @smax(i32 %x, i32 %y) #2 { 127 %cmp = icmp sgt i32 %x, %y 128 %sel = select i1 %cmp, i32 %x, i32 %y 129 ret i32 %sel 130} 131 132define internal i16 @smin16(i16 %x, i16 %y) #2 { 133 %cmp = icmp slt i16 %x, %y 134 %sel = select i1 %cmp, i16 %x, i16 %y 135 ret i16 %sel 136} 137 138define internal i16 @smax16(i16 %x, i16 %y) #2 { 139 %cmp = icmp sgt i16 %x, %y 140 %sel = select i1 %cmp, i16 %x, i16 %y 141 ret i16 %sel 142} 143 144define internal i8 @smin8(i8 %x, i8 %y) #2 { 145 %cmp = icmp slt i8 %x, %y 146 %sel = select i1 %cmp, i8 %x, i8 %y 147 ret i8 %sel 148} 149 150define internal i8 @smax8(i8 %x, i8 %y) #2 { 151 %cmp = icmp sgt i8 %x, %y 152 %sel = select i1 %cmp, i8 %x, i8 %y 153 ret i8 %sel 154} 155 156; 16 combinations 157 158; 0: max(min(x, y), min(max(x, y), z)) 159; 1: max(min(x, y), min(max(y, x), z)) 160; 2: max(min(x, y), min(z, max(x, y))) 161; 3: max(min(x, y), min(z, max(y, x))) 162; 4: max(min(y, x), min(max(x, y), z)) 163; 5: max(min(y, x), min(max(y, x), z)) 164; 6: max(min(y, x), min(z, max(x, y))) 165; 7: max(min(y, x), min(z, max(y, x))) 166; 167; + commute outermost max 168 169 170; FIXME: In these cases we probably should have used scalar operations 171; instead. 172 173; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0: 174; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 175define void @s_test_smed3_i32_pat_0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 176bb: 177 %tmp0 = call i32 @smin(i32 %x, i32 %y) 178 %tmp1 = call i32 @smax(i32 %x, i32 %y) 179 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 180 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 181 store i32 %tmp3, i32 addrspace(1)* %arg 182 ret void 183} 184 185; GCN-LABEL: {{^}}s_test_smed3_i32_pat_1: 186; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 187define void @s_test_smed3_i32_pat_1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 188bb: 189 %tmp0 = call i32 @smin(i32 %x, i32 %y) 190 %tmp1 = call i32 @smax(i32 %y, i32 %x) 191 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 192 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 193 store i32 %tmp3, i32 addrspace(1)* %arg 194 ret void 195} 196 197; GCN-LABEL: {{^}}s_test_smed3_i32_pat_2: 198; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 199define void @s_test_smed3_i32_pat_2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 200bb: 201 %tmp0 = call i32 @smin(i32 %x, i32 %y) 202 %tmp1 = call i32 @smax(i32 %x, i32 %y) 203 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1) 204 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 205 store i32 %tmp3, i32 addrspace(1)* %arg 206 ret void 207} 208 209; GCN-LABEL: {{^}}s_test_smed3_i32_pat_3: 210; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 211define void @s_test_smed3_i32_pat_3(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 212bb: 213 %tmp0 = call i32 @smin(i32 %x, i32 %y) 214 %tmp1 = call i32 @smax(i32 %y, i32 %x) 215 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1) 216 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 217 store i32 %tmp3, i32 addrspace(1)* %arg 218 ret void 219} 220 221; GCN-LABEL: {{^}}s_test_smed3_i32_pat_4: 222; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 223define void @s_test_smed3_i32_pat_4(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 224bb: 225 %tmp0 = call i32 @smin(i32 %y, i32 %x) 226 %tmp1 = call i32 @smax(i32 %x, i32 %y) 227 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 228 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 229 store i32 %tmp3, i32 addrspace(1)* %arg 230 ret void 231} 232 233; GCN-LABEL: {{^}}s_test_smed3_i32_pat_5: 234; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 235define void @s_test_smed3_i32_pat_5(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 236bb: 237 %tmp0 = call i32 @smin(i32 %y, i32 %x) 238 %tmp1 = call i32 @smax(i32 %y, i32 %x) 239 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 240 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 241 store i32 %tmp3, i32 addrspace(1)* %arg 242 ret void 243} 244 245; GCN-LABEL: {{^}}s_test_smed3_i32_pat_6: 246; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 247define void @s_test_smed3_i32_pat_6(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 248bb: 249 %tmp0 = call i32 @smin(i32 %y, i32 %x) 250 %tmp1 = call i32 @smax(i32 %x, i32 %y) 251 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1) 252 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 253 store i32 %tmp3, i32 addrspace(1)* %arg 254 ret void 255} 256 257; GCN-LABEL: {{^}}s_test_smed3_i32_pat_7: 258; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 259define void @s_test_smed3_i32_pat_7(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 260bb: 261 %tmp0 = call i32 @smin(i32 %y, i32 %x) 262 %tmp1 = call i32 @smax(i32 %y, i32 %x) 263 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1) 264 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 265 store i32 %tmp3, i32 addrspace(1)* %arg 266 ret void 267} 268 269; GCN-LABEL: {{^}}s_test_smed3_i32_pat_8: 270; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 271define void @s_test_smed3_i32_pat_8(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 272bb: 273 %tmp0 = call i32 @smin(i32 %x, i32 %y) 274 %tmp1 = call i32 @smax(i32 %x, i32 %y) 275 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 276 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0) 277 store i32 %tmp3, i32 addrspace(1)* %arg 278 ret void 279} 280 281; GCN-LABEL: {{^}}s_test_smed3_i32_pat_9: 282; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 283define void @s_test_smed3_i32_pat_9(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 284bb: 285 %tmp0 = call i32 @smin(i32 %x, i32 %y) 286 %tmp1 = call i32 @smax(i32 %y, i32 %x) 287 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 288 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0) 289 store i32 %tmp3, i32 addrspace(1)* %arg 290 ret void 291} 292 293; GCN-LABEL: {{^}}s_test_smed3_i32_pat_10: 294; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 295define void @s_test_smed3_i32_pat_10(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 296bb: 297 %tmp0 = call i32 @smin(i32 %x, i32 %y) 298 %tmp1 = call i32 @smax(i32 %x, i32 %y) 299 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1) 300 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0) 301 store i32 %tmp3, i32 addrspace(1)* %arg 302 ret void 303} 304 305; GCN-LABEL: {{^}}s_test_smed3_i32_pat_11: 306; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 307define void @s_test_smed3_i32_pat_11(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 308bb: 309 %tmp0 = call i32 @smin(i32 %x, i32 %y) 310 %tmp1 = call i32 @smax(i32 %y, i32 %x) 311 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1) 312 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0) 313 store i32 %tmp3, i32 addrspace(1)* %arg 314 ret void 315} 316 317; GCN-LABEL: {{^}}s_test_smed3_i32_pat_12: 318; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 319define void @s_test_smed3_i32_pat_12(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 320bb: 321 %tmp0 = call i32 @smin(i32 %y, i32 %x) 322 %tmp1 = call i32 @smax(i32 %x, i32 %y) 323 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 324 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0) 325 store i32 %tmp3, i32 addrspace(1)* %arg 326 ret void 327} 328 329; GCN-LABEL: {{^}}s_test_smed3_i32_pat_13: 330; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 331define void @s_test_smed3_i32_pat_13(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 332bb: 333 %tmp0 = call i32 @smin(i32 %y, i32 %x) 334 %tmp1 = call i32 @smax(i32 %y, i32 %x) 335 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 336 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0) 337 store i32 %tmp3, i32 addrspace(1)* %arg 338 ret void 339} 340 341; GCN-LABEL: {{^}}s_test_smed3_i32_pat_14: 342; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 343define void @s_test_smed3_i32_pat_14(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 344bb: 345 %tmp0 = call i32 @smin(i32 %y, i32 %x) 346 %tmp1 = call i32 @smax(i32 %x, i32 %y) 347 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1) 348 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0) 349 store i32 %tmp3, i32 addrspace(1)* %arg 350 ret void 351} 352 353; GCN-LABEL: {{^}}s_test_smed3_i32_pat_15: 354; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 355define void @s_test_smed3_i32_pat_15(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 356bb: 357 %tmp0 = call i32 @smin(i32 %y, i32 %x) 358 %tmp1 = call i32 @smax(i32 %y, i32 %x) 359 %tmp2 = call i32 @smin(i32 %z, i32 %tmp1) 360 %tmp3 = call i32 @smax(i32 %tmp2, i32 %tmp0) 361 store i32 %tmp3, i32 addrspace(1)* %arg 362 ret void 363} 364 365; GCN-LABEL: {{^}}s_test_smed3_i16_pat_0: 366; GCN: s_sext_i32_i16 367; GCN: s_sext_i32_i16 368; GCN: s_sext_i32_i16 369; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 370define void @s_test_smed3_i16_pat_0(i16 addrspace(1)* %arg, i16 %x, i16 %y, i16 %z) #1 { 371bb: 372 %tmp0 = call i16 @smin16(i16 %x, i16 %y) 373 %tmp1 = call i16 @smax16(i16 %x, i16 %y) 374 %tmp2 = call i16 @smin16(i16 %tmp1, i16 %z) 375 %tmp3 = call i16 @smax16(i16 %tmp0, i16 %tmp2) 376 store i16 %tmp3, i16 addrspace(1)* %arg 377 ret void 378} 379 380; GCN-LABEL: {{^}}s_test_smed3_i8_pat_0: 381; GCN: s_sext_i32_i8 382; GCN: s_sext_i32_i8 383; GCN: s_sext_i32_i8 384; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 385define void @s_test_smed3_i8_pat_0(i8 addrspace(1)* %arg, i8 %x, i8 %y, i8 %z) #1 { 386bb: 387 %tmp0 = call i8 @smin8(i8 %x, i8 %y) 388 %tmp1 = call i8 @smax8(i8 %x, i8 %y) 389 %tmp2 = call i8 @smin8(i8 %tmp1, i8 %z) 390 %tmp3 = call i8 @smax8(i8 %tmp0, i8 %tmp2) 391 store i8 %tmp3, i8 addrspace(1)* %arg 392 ret void 393} 394 395; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0_multi_use_0: 396; GCN-NOT: v_med3_i32 397define void @s_test_smed3_i32_pat_0_multi_use_0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 398bb: 399 %tmp0 = call i32 @smin(i32 %x, i32 %y) 400 %tmp1 = call i32 @smax(i32 %x, i32 %y) 401 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 402 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 403 store volatile i32 %tmp0, i32 addrspace(1)* %arg 404 store volatile i32 %tmp3, i32 addrspace(1)* %arg 405 ret void 406} 407 408; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0_multi_use_1: 409; GCN-NOT: v_med3_i32 410define void @s_test_smed3_i32_pat_0_multi_use_1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 411bb: 412 %tmp0 = call i32 @smin(i32 %x, i32 %y) 413 %tmp1 = call i32 @smax(i32 %x, i32 %y) 414 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 415 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 416 store volatile i32 %tmp1, i32 addrspace(1)* %arg 417 store volatile i32 %tmp3, i32 addrspace(1)* %arg 418 ret void 419} 420 421; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0_multi_use_2: 422; GCN-NOT: v_med3_i32 423define void @s_test_smed3_i32_pat_0_multi_use_2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 424bb: 425 %tmp0 = call i32 @smin(i32 %x, i32 %y) 426 %tmp1 = call i32 @smax(i32 %x, i32 %y) 427 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 428 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 429 store volatile i32 %tmp2, i32 addrspace(1)* %arg 430 store volatile i32 %tmp3, i32 addrspace(1)* %arg 431 ret void 432} 433 434; GCN-LABEL: {{^}}s_test_smed3_i32_pat_0_multi_use_result: 435; GCN: v_med3_i32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 436define void @s_test_smed3_i32_pat_0_multi_use_result(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 437bb: 438 %tmp0 = call i32 @smin(i32 %x, i32 %y) 439 %tmp1 = call i32 @smax(i32 %x, i32 %y) 440 %tmp2 = call i32 @smin(i32 %tmp1, i32 %z) 441 %tmp3 = call i32 @smax(i32 %tmp0, i32 %tmp2) 442 store volatile i32 %tmp3, i32 addrspace(1)* %arg 443 store volatile i32 %tmp3, i32 addrspace(1)* %arg 444 ret void 445} 446 447attributes #0 = { nounwind readnone } 448attributes #1 = { nounwind } 449attributes #2 = { nounwind readnone alwaysinline } 450