Home | History | Annotate | Download | only in AMDGPU
      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_umed3_r_i_i_i32:
      7 ; GCN: v_med3_u32 v{{[0-9]+}}, v{{[0-9]+}}, 12, 17
      8 define 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
     27 define 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]+}}
     47 define 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]+}}
     66 define 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
     85 define 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
    103 define 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 
    119 define 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 
    125 define 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 
    131 define 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 
    137 define 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 
    143 define 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 
    149 define 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]+}}
    174 define void @s_test_umed3_i32_pat_0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    175 bb:
    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]+}}
    186 define void @s_test_umed3_i32_pat_1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    187 bb:
    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]+}}
    198 define void @s_test_umed3_i32_pat_2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    199 bb:
    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]+}}
    210 define void @s_test_umed3_i32_pat_3(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    211 bb:
    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]+}}
    222 define void @s_test_umed3_i32_pat_4(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    223 bb:
    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]+}}
    234 define void @s_test_umed3_i32_pat_5(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    235 bb:
    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]+}}
    246 define void @s_test_umed3_i32_pat_6(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    247 bb:
    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]+}}
    258 define void @s_test_umed3_i32_pat_7(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    259 bb:
    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]+}}
    270 define void @s_test_umed3_i32_pat_8(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    271 bb:
    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]+}}
    282 define void @s_test_umed3_i32_pat_9(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    283 bb:
    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]+}}
    294 define void @s_test_umed3_i32_pat_10(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    295 bb:
    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]+}}
    306 define void @s_test_umed3_i32_pat_11(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    307 bb:
    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]+}}
    318 define void @s_test_umed3_i32_pat_12(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    319 bb:
    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]+}}
    330 define void @s_test_umed3_i32_pat_13(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    331 bb:
    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]+}}
    342 define void @s_test_umed3_i32_pat_14(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    343 bb:
    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]+}}
    354 define void @s_test_umed3_i32_pat_15(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    355 bb:
    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]+}}
    369 define void @s_test_umed3_i16_pat_0(i16 addrspace(1)* %arg, i16 %x, i16 %y, i16 %z) #1 {
    370 bb:
    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]+}}
    384 define void @s_test_umed3_i8_pat_0(i8 addrspace(1)* %arg, i8 %x, i8 %y, i8 %z) #1 {
    385 bb:
    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
    396 define void @s_test_umed3_i32_pat_0_multi_use_0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    397 bb:
    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
    409 define void @s_test_umed3_i32_pat_0_multi_use_1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    410 bb:
    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
    422 define void @s_test_umed3_i32_pat_0_multi_use_2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    423 bb:
    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]+}}
    435 define void @s_test_umed3_i32_pat_0_multi_use_result(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    436 bb:
    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]+}}
    448 define void @s_test_umed3_i32_pat_0_imm_src0(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    449 bb:
    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]+}}
    460 define void @s_test_umed3_i32_pat_0_imm_src1(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    461 bb:
    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
    472 define void @s_test_umed3_i32_pat_0_imm_src2(i32 addrspace(1)* %arg, i32 %x, i32 %y, i32 %z) #1 {
    473 bb:
    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 
    482 attributes #0 = { nounwind readnone }
    483 attributes #1 = { nounwind }
    484 attributes #2 = { nounwind readnone alwaysinline }
    485