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_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