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 4 declare 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 8 define 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 27 define 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]+}} 47 define 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]+}} 66 define 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 85 define 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 103 define 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 120 define 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 126 define 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 132 define 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 138 define 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 144 define 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 150 define 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]+}} 175 define void @s_test_smed3_i32_pat_0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 176 bb: 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]+}} 187 define void @s_test_smed3_i32_pat_1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 188 bb: 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]+}} 199 define void @s_test_smed3_i32_pat_2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 200 bb: 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]+}} 211 define void @s_test_smed3_i32_pat_3(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 212 bb: 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]+}} 223 define void @s_test_smed3_i32_pat_4(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 224 bb: 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]+}} 235 define void @s_test_smed3_i32_pat_5(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 236 bb: 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]+}} 247 define void @s_test_smed3_i32_pat_6(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 248 bb: 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]+}} 259 define void @s_test_smed3_i32_pat_7(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 260 bb: 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]+}} 271 define void @s_test_smed3_i32_pat_8(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 272 bb: 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]+}} 283 define void @s_test_smed3_i32_pat_9(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 284 bb: 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]+}} 295 define void @s_test_smed3_i32_pat_10(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 296 bb: 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]+}} 307 define void @s_test_smed3_i32_pat_11(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 308 bb: 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]+}} 319 define void @s_test_smed3_i32_pat_12(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 320 bb: 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]+}} 331 define void @s_test_smed3_i32_pat_13(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 332 bb: 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]+}} 343 define void @s_test_smed3_i32_pat_14(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 344 bb: 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]+}} 355 define void @s_test_smed3_i32_pat_15(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 356 bb: 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]+}} 370 define void @s_test_smed3_i16_pat_0(i16 addrspace(1)* %arg, i16 %x, i16 %y, i16 %z) #1 { 371 bb: 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]+}} 385 define void @s_test_smed3_i8_pat_0(i8 addrspace(1)* %arg, i8 %x, i8 %y, i8 %z) #1 { 386 bb: 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 397 define void @s_test_smed3_i32_pat_0_multi_use_0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 398 bb: 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 410 define void @s_test_smed3_i32_pat_0_multi_use_1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 411 bb: 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 423 define void @s_test_smed3_i32_pat_0_multi_use_2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 424 bb: 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]+}} 436 define void @s_test_smed3_i32_pat_0_multi_use_result(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 { 437 bb: 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 447 attributes #0 = { nounwind readnone } 448 attributes #1 = { nounwind } 449 attributes #2 = { nounwind readnone alwaysinline } 450