1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -mtriple=amdgcn -mcpu=fiji -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck -check-prefix=GFX8 %s 3# RUN: llc -mtriple=amdgcn -mcpu=gfx900 -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck -check-prefix=GFX9 %s 4# RUN: llc -mtriple=amdgcn -mcpu=gfx1010 -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck -check-prefix=GFX9 %s 5# RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck -check-prefix=GFX11 %s 6 7--- 8name: umed3_s16_vvv 9legalized: true 10regBankSelected: true 11 12body: | 13 bb.0: 14 liveins: $vgpr0, $vgpr1, $vgpr2 15 16 ; GFX8-LABEL: name: umed3_s16_vvv 17 ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2 18 ; GFX8-NEXT: {{ $}} 19 ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 20 ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 21 ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 22 ; GFX8-NEXT: [[V_MAX_U16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[COPY]], [[COPY1]], implicit $exec 23 ; GFX8-NEXT: [[V_MIN_U16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[COPY]], [[COPY1]], implicit $exec 24 ; GFX8-NEXT: [[V_MAX_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[V_MIN_U16_e64_]], [[COPY2]], implicit $exec 25 ; GFX8-NEXT: [[V_MIN_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[V_MAX_U16_e64_]], [[V_MAX_U16_e64_1]], implicit $exec 26 ; GFX8-NEXT: S_ENDPGM 0, implicit [[V_MIN_U16_e64_1]] 27 ; 28 ; GFX9-LABEL: name: umed3_s16_vvv 29 ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2 30 ; GFX9-NEXT: {{ $}} 31 ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 32 ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 33 ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 34 ; GFX9-NEXT: [[V_MED3_U16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_U16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec 35 ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_MED3_U16_e64_]] 36 ; 37 ; GFX11-LABEL: name: umed3_s16_vvv 38 ; GFX11: liveins: $vgpr0, $vgpr1, $vgpr2 39 ; GFX11-NEXT: {{ $}} 40 ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 41 ; GFX11-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 42 ; GFX11-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 43 ; GFX11-NEXT: [[V_MED3_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_U16_fake16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec 44 ; GFX11-NEXT: S_ENDPGM 0, implicit [[V_MED3_U16_fake16_e64_]] 45 %0:vgpr(s32) = COPY $vgpr0 46 %1:vgpr(s32) = COPY $vgpr1 47 %2:vgpr(s32) = COPY $vgpr2 48 %3:vgpr(s16) = G_TRUNC %0 49 %4:vgpr(s16) = G_TRUNC %1 50 %5:vgpr(s16) = G_TRUNC %2 51 52 %6:vgpr(s16) = G_UMAX %3, %4 53 %7:vgpr(s16) = G_UMIN %3, %4 54 %8:vgpr(s16) = G_UMAX %7, %5 55 %9:vgpr(s16) = G_UMIN %6, %8 56 57 S_ENDPGM 0, implicit %9 58... 59 60--- 61name: umed3_s16_vvv_multiuse0 62legalized: true 63regBankSelected: true 64 65body: | 66 bb.0: 67 liveins: $vgpr0, $vgpr1, $vgpr2 68 69 ; GFX8-LABEL: name: umed3_s16_vvv_multiuse0 70 ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2 71 ; GFX8-NEXT: {{ $}} 72 ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 73 ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 74 ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 75 ; GFX8-NEXT: [[V_MAX_U16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[COPY]], [[COPY1]], implicit $exec 76 ; GFX8-NEXT: [[V_MIN_U16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[COPY]], [[COPY1]], implicit $exec 77 ; GFX8-NEXT: [[V_MAX_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[V_MIN_U16_e64_]], [[COPY2]], implicit $exec 78 ; GFX8-NEXT: [[V_MIN_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[V_MAX_U16_e64_]], [[V_MAX_U16_e64_1]], implicit $exec 79 ; GFX8-NEXT: S_ENDPGM 0, implicit [[V_MIN_U16_e64_1]], implicit [[V_MAX_U16_e64_]] 80 ; 81 ; GFX9-LABEL: name: umed3_s16_vvv_multiuse0 82 ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2 83 ; GFX9-NEXT: {{ $}} 84 ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 85 ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 86 ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 87 ; GFX9-NEXT: [[V_MAX_U16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[COPY]], [[COPY1]], implicit $exec 88 ; GFX9-NEXT: [[V_MED3_U16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_U16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec 89 ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_MED3_U16_e64_]], implicit [[V_MAX_U16_e64_]] 90 ; 91 ; GFX11-LABEL: name: umed3_s16_vvv_multiuse0 92 ; GFX11: liveins: $vgpr0, $vgpr1, $vgpr2 93 ; GFX11-NEXT: {{ $}} 94 ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 95 ; GFX11-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 96 ; GFX11-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 97 ; GFX11-NEXT: [[V_MAX_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_fake16_e64 [[COPY]], [[COPY1]], implicit $exec 98 ; GFX11-NEXT: [[V_MED3_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_U16_fake16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec 99 ; GFX11-NEXT: S_ENDPGM 0, implicit [[V_MED3_U16_fake16_e64_]], implicit [[V_MAX_U16_fake16_e64_]] 100 %0:vgpr(s32) = COPY $vgpr0 101 %1:vgpr(s32) = COPY $vgpr1 102 %2:vgpr(s32) = COPY $vgpr2 103 %3:vgpr(s16) = G_TRUNC %0 104 %4:vgpr(s16) = G_TRUNC %1 105 %5:vgpr(s16) = G_TRUNC %2 106 107 %6:vgpr(s16) = G_UMAX %3, %4 108 %7:vgpr(s16) = G_UMIN %3, %4 109 %8:vgpr(s16) = G_UMAX %7, %5 110 %9:vgpr(s16) = G_UMIN %6, %8 111 112 S_ENDPGM 0, implicit %9, implicit %6 113... 114 115--- 116name: umed3_s16_vvv_multiuse1 117legalized: true 118regBankSelected: true 119 120body: | 121 bb.0: 122 liveins: $vgpr0, $vgpr1, $vgpr2 123 124 ; GFX8-LABEL: name: umed3_s16_vvv_multiuse1 125 ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2 126 ; GFX8-NEXT: {{ $}} 127 ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 128 ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 129 ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 130 ; GFX8-NEXT: [[V_MAX_U16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[COPY]], [[COPY1]], implicit $exec 131 ; GFX8-NEXT: [[V_MIN_U16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[COPY]], [[COPY1]], implicit $exec 132 ; GFX8-NEXT: [[V_MAX_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[V_MIN_U16_e64_]], [[COPY2]], implicit $exec 133 ; GFX8-NEXT: [[V_MIN_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[V_MAX_U16_e64_]], [[V_MAX_U16_e64_1]], implicit $exec 134 ; GFX8-NEXT: S_ENDPGM 0, implicit [[V_MIN_U16_e64_1]], implicit [[V_MIN_U16_e64_]] 135 ; 136 ; GFX9-LABEL: name: umed3_s16_vvv_multiuse1 137 ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2 138 ; GFX9-NEXT: {{ $}} 139 ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 140 ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 141 ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 142 ; GFX9-NEXT: [[V_MIN_U16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[COPY]], [[COPY1]], implicit $exec 143 ; GFX9-NEXT: [[V_MED3_U16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_U16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec 144 ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_MED3_U16_e64_]], implicit [[V_MIN_U16_e64_]] 145 ; 146 ; GFX11-LABEL: name: umed3_s16_vvv_multiuse1 147 ; GFX11: liveins: $vgpr0, $vgpr1, $vgpr2 148 ; GFX11-NEXT: {{ $}} 149 ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 150 ; GFX11-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 151 ; GFX11-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 152 ; GFX11-NEXT: [[V_MIN_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_fake16_e64 [[COPY]], [[COPY1]], implicit $exec 153 ; GFX11-NEXT: [[V_MED3_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_U16_fake16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec 154 ; GFX11-NEXT: S_ENDPGM 0, implicit [[V_MED3_U16_fake16_e64_]], implicit [[V_MIN_U16_fake16_e64_]] 155 %0:vgpr(s32) = COPY $vgpr0 156 %1:vgpr(s32) = COPY $vgpr1 157 %2:vgpr(s32) = COPY $vgpr2 158 %3:vgpr(s16) = G_TRUNC %0 159 %4:vgpr(s16) = G_TRUNC %1 160 %5:vgpr(s16) = G_TRUNC %2 161 162 %6:vgpr(s16) = G_UMAX %3, %4 163 %7:vgpr(s16) = G_UMIN %3, %4 164 %8:vgpr(s16) = G_UMAX %7, %5 165 %9:vgpr(s16) = G_UMIN %6, %8 166 167 S_ENDPGM 0, implicit %9, implicit %7 168... 169 170--- 171name: umed3_s16_vvv_multiuse2 172legalized: true 173regBankSelected: true 174 175body: | 176 bb.0: 177 liveins: $vgpr0, $vgpr1, $vgpr2 178 179 ; GFX8-LABEL: name: umed3_s16_vvv_multiuse2 180 ; GFX8: liveins: $vgpr0, $vgpr1, $vgpr2 181 ; GFX8-NEXT: {{ $}} 182 ; GFX8-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 183 ; GFX8-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 184 ; GFX8-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 185 ; GFX8-NEXT: [[V_MAX_U16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[COPY]], [[COPY1]], implicit $exec 186 ; GFX8-NEXT: [[V_MIN_U16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[COPY]], [[COPY1]], implicit $exec 187 ; GFX8-NEXT: [[V_MAX_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[V_MIN_U16_e64_]], [[COPY2]], implicit $exec 188 ; GFX8-NEXT: [[V_MIN_U16_e64_1:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[V_MAX_U16_e64_]], [[V_MAX_U16_e64_1]], implicit $exec 189 ; GFX8-NEXT: S_ENDPGM 0, implicit [[V_MIN_U16_e64_1]], implicit [[V_MAX_U16_e64_1]] 190 ; 191 ; GFX9-LABEL: name: umed3_s16_vvv_multiuse2 192 ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2 193 ; GFX9-NEXT: {{ $}} 194 ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 195 ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 196 ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 197 ; GFX9-NEXT: [[V_MIN_U16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_e64 [[COPY]], [[COPY1]], implicit $exec 198 ; GFX9-NEXT: [[V_MAX_U16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_e64 [[V_MIN_U16_e64_]], [[COPY2]], implicit $exec 199 ; GFX9-NEXT: [[V_MED3_U16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_U16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec 200 ; GFX9-NEXT: S_ENDPGM 0, implicit [[V_MED3_U16_e64_]], implicit [[V_MAX_U16_e64_]] 201 ; 202 ; GFX11-LABEL: name: umed3_s16_vvv_multiuse2 203 ; GFX11: liveins: $vgpr0, $vgpr1, $vgpr2 204 ; GFX11-NEXT: {{ $}} 205 ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 206 ; GFX11-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 207 ; GFX11-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 208 ; GFX11-NEXT: [[V_MIN_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_MIN_U16_fake16_e64 [[COPY]], [[COPY1]], implicit $exec 209 ; GFX11-NEXT: [[V_MAX_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_MAX_U16_fake16_e64 [[V_MIN_U16_fake16_e64_]], [[COPY2]], implicit $exec 210 ; GFX11-NEXT: [[V_MED3_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_MED3_U16_fake16_e64 0, [[COPY]], 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $exec 211 ; GFX11-NEXT: S_ENDPGM 0, implicit [[V_MED3_U16_fake16_e64_]], implicit [[V_MAX_U16_fake16_e64_]] 212 %0:vgpr(s32) = COPY $vgpr0 213 %1:vgpr(s32) = COPY $vgpr1 214 %2:vgpr(s32) = COPY $vgpr2 215 %3:vgpr(s16) = G_TRUNC %0 216 %4:vgpr(s16) = G_TRUNC %1 217 %5:vgpr(s16) = G_TRUNC %2 218 219 %6:vgpr(s16) = G_UMAX %3, %4 220 %7:vgpr(s16) = G_UMIN %3, %4 221 %8:vgpr(s16) = G_UMAX %7, %5 222 %9:vgpr(s16) = G_UMIN %6, %8 223 224 S_ENDPGM 0, implicit %9, implicit %8 225... 226