1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 -run-pass=legalizer %s -o - | FileCheck -check-prefix=GFX9 %s 3 4# The G_ZEXT and G_SHL will be scalarized, introducing a 5# G_UNMERGE_VALUES of G_BUILD_VECTOR. The artifact combiner should 6# eliminate the pair. 7--- 8name: revisit_build_vector_unmerge_user 9tracksRegLiveness: true 10body: | 11 bb.0: 12 liveins: $vgpr0_vgpr1 13 14 ; GFX9-LABEL: name: revisit_build_vector_unmerge_user 15 ; GFX9: liveins: $vgpr0_vgpr1 16 ; GFX9-NEXT: {{ $}} 17 ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 18 ; GFX9-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 2 19 ; GFX9-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>) 20 ; GFX9-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[UV]](s32) 21 ; GFX9-NEXT: [[ZEXT1:%[0-9]+]]:_(s64) = G_ZEXT [[UV1]](s32) 22 ; GFX9-NEXT: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[ZEXT]], [[C]](s32) 23 ; GFX9-NEXT: [[SHL1:%[0-9]+]]:_(s64) = G_SHL [[ZEXT1]], [[C]](s32) 24 ; GFX9-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s64>) = G_BUILD_VECTOR [[SHL]](s64), [[SHL1]](s64) 25 ; GFX9-NEXT: $vgpr0_vgpr1_vgpr2_vgpr3 = COPY [[BUILD_VECTOR]](<2 x s64>) 26 %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 27 %1:_(s32) = G_CONSTANT i32 2 28 %2:_(<2 x s32>) = G_BUILD_VECTOR %1, %1 29 %3:_(<2 x s64>) = G_ZEXT %0 30 %4:_(<2 x s64>) = G_SHL %3, %2 31 $vgpr0_vgpr1_vgpr2_vgpr3 = COPY %4 32... 33 34--- 35name: copy_scalar 36body: | 37 bb.0: 38 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 39 40 ; GFX9-LABEL: name: copy_scalar 41 ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 42 ; GFX9-NEXT: {{ $}} 43 ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1 44 ; GFX9-NEXT: $vgpr2_vgpr3 = COPY [[COPY]](s64) 45 %0:_(s64) = COPY $vgpr0_vgpr1 46 %1:_(s32), %2:_(s32) = G_UNMERGE_VALUES %0(s64) 47 %3:_(s64) = G_MERGE_VALUES %1, %2 48 $vgpr2_vgpr3= COPY %3 49... 50 51--- 52name: copy_vector_using_elements 53body: | 54 bb.0: 55 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 56 57 ; GFX9-LABEL: name: copy_vector_using_elements 58 ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 59 ; GFX9-NEXT: {{ $}} 60 ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 61 ; GFX9-NEXT: $vgpr2_vgpr3 = COPY [[COPY]](<2 x s32>) 62 %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 63 %1:_(s32), %2:_(s32) = G_UNMERGE_VALUES %0(<2 x s32>) 64 %3:_(<2 x s32>) = G_BUILD_VECTOR %1, %2 65 $vgpr2_vgpr3= COPY %3 66... 67 68--- 69name: copy_vector_using_subvectors 70body: | 71 bb.0: 72 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 73 74 ; GFX9-LABEL: name: copy_vector_using_subvectors 75 ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 76 ; GFX9-NEXT: {{ $}} 77 ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $vgpr0_vgpr1 78 ; GFX9-NEXT: $vgpr2_vgpr3 = COPY [[COPY]](<4 x s16>) 79 %0:_(<4 x s16>) = COPY $vgpr0_vgpr1 80 %1:_(<2 x s16>), %2:_(<2 x s16>) = G_UNMERGE_VALUES %0(<4 x s16>) 81 %3:_(<4 x s16>) = G_CONCAT_VECTORS %1, %2 82 $vgpr2_vgpr3= COPY %3 83... 84 85--- 86name: shuffle_vector_elements 87body: | 88 bb.0: 89 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 90 91 ; GFX9-LABEL: name: shuffle_vector_elements 92 ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 93 ; GFX9-NEXT: {{ $}} 94 ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 95 ; GFX9-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>) 96 ; GFX9-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[UV1]](s32), [[UV]](s32) 97 ; GFX9-NEXT: $vgpr2_vgpr3 = COPY [[BUILD_VECTOR]](<2 x s32>) 98 %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 99 %1:_(s32), %2:_(s32) = G_UNMERGE_VALUES %0(<2 x s32>) 100 %3:_(<2 x s32>) = G_BUILD_VECTOR %2, %1 101 $vgpr2_vgpr3= COPY %3 102... 103 104--- 105name: insert_element 106body: | 107 bb.0: 108 liveins: $vgpr0_vgpr1, $vgpr2, $vgpr3_vgpr4 109 110 ; GFX9-LABEL: name: insert_element 111 ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2, $vgpr3_vgpr4 112 ; GFX9-NEXT: {{ $}} 113 ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 114 ; GFX9-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr2 115 ; GFX9-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>) 116 ; GFX9-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[UV]](s32), [[COPY1]](s32) 117 ; GFX9-NEXT: $vgpr2_vgpr3 = COPY [[BUILD_VECTOR]](<2 x s32>) 118 %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 119 %1:_(s32) = COPY $vgpr2 120 %2:_(s32), %3:_(s32) = G_UNMERGE_VALUES %0(<2 x s32>) 121 %4:_(<2 x s32>) = G_BUILD_VECTOR %2, %1 122 $vgpr2_vgpr3= COPY %4 123... 124 125--- 126name: unmerge_to_sub_vectors 127body: | 128 bb.0: 129 liveins: $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 130 131 ; GFX9-LABEL: name: unmerge_to_sub_vectors 132 ; GFX9: liveins: $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 133 ; GFX9-NEXT: {{ $}} 134 ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3 135 ; GFX9-NEXT: [[UV:%[0-9]+]]:_(<2 x s32>), [[UV1:%[0-9]+]]:_(<2 x s32>) = G_UNMERGE_VALUES [[COPY]](<4 x s32>) 136 ; GFX9-NEXT: $vgpr4_vgpr5 = COPY [[UV]](<2 x s32>) 137 ; GFX9-NEXT: $vgpr6_vgpr7 = COPY [[UV1]](<2 x s32>) 138 %0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3 139 %1:_(s32), %2:_(s32), %3:_(s32), %4:_(s32) = G_UNMERGE_VALUES %0(<4 x s32>) 140 %5:_(<2 x s32>) = G_BUILD_VECTOR %1, %2 141 %6:_(<2 x s32>) = G_BUILD_VECTOR %3, %4 142 $vgpr4_vgpr5= COPY %5 143 $vgpr6_vgpr7= COPY %6 144... 145 146--- 147name: cant_unmerge_to_sub_vectors 148body: | 149 bb.0: 150 liveins: $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 151 152 ; GFX9-LABEL: name: cant_unmerge_to_sub_vectors 153 ; GFX9: liveins: $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 154 ; GFX9-NEXT: {{ $}} 155 ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3 156 ; GFX9-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32), [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<4 x s32>) 157 ; GFX9-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[UV]](s32), [[UV3]](s32) 158 ; GFX9-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[UV1]](s32), [[UV2]](s32) 159 ; GFX9-NEXT: $vgpr4_vgpr5 = COPY [[BUILD_VECTOR]](<2 x s32>) 160 ; GFX9-NEXT: $vgpr6_vgpr7 = COPY [[BUILD_VECTOR1]](<2 x s32>) 161 %0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3 162 %1:_(s32), %2:_(s32), %3:_(s32), %4:_(s32) = G_UNMERGE_VALUES %0(<4 x s32>) 163 %5:_(<2 x s32>) = G_BUILD_VECTOR %1, %4 164 %6:_(<2 x s32>) = G_BUILD_VECTOR %2, %3 165 $vgpr4_vgpr5= COPY %5 166 $vgpr6_vgpr7= COPY %6 167... 168 169--- 170name: concat 171body: | 172 bb.0: 173 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5_vgpr6_vgpr7 174 175 ; GFX9-LABEL: name: concat 176 ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5_vgpr6_vgpr7 177 ; GFX9-NEXT: {{ $}} 178 ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 179 ; GFX9-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr2_vgpr3 180 ; GFX9-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<4 x s32>) = G_CONCAT_VECTORS [[COPY]](<2 x s32>), [[COPY1]](<2 x s32>) 181 ; GFX9-NEXT: $vgpr4_vgpr5_vgpr6_vgpr7 = COPY [[CONCAT_VECTORS]](<4 x s32>) 182 %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 183 %1:_(<2 x s32>) = COPY $vgpr2_vgpr3 184 %2:_(s32), %3:_(s32) = G_UNMERGE_VALUES %0(<2 x s32>) 185 %4:_(s32), %5:_(s32) = G_UNMERGE_VALUES %1(<2 x s32>) 186 %6:_(<4 x s32>) = G_BUILD_VECTOR %2, %3, %4, %5 187 $vgpr4_vgpr5_vgpr6_vgpr7= COPY %6 188... 189 190--- 191name: concat_same_vector 192body: | 193 bb.0: 194 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3_vgpr4_vgpr5 195 196 ; GFX9-LABEL: name: concat_same_vector 197 ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3_vgpr4_vgpr5 198 ; GFX9-NEXT: {{ $}} 199 ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 200 ; GFX9-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<4 x s32>) = G_CONCAT_VECTORS [[COPY]](<2 x s32>), [[COPY]](<2 x s32>) 201 ; GFX9-NEXT: $vgpr2_vgpr3_vgpr4_vgpr5 = COPY [[CONCAT_VECTORS]](<4 x s32>) 202 %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 203 %1:_(s32), %2:_(s32) = G_UNMERGE_VALUES %0(<2 x s32>) 204 %3:_(<4 x s32>) = G_BUILD_VECTOR %1, %2, %1, %2 205 $vgpr2_vgpr3_vgpr4_vgpr5= COPY %3 206... 207 208--- 209name: shuffle_not_concat 210body: | 211 bb.0: 212 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5_vgpr6_vgpr7 213 214 ; GFX9-LABEL: name: shuffle_not_concat 215 ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5_vgpr6_vgpr7 216 ; GFX9-NEXT: {{ $}} 217 ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 218 ; GFX9-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr2_vgpr3 219 ; GFX9-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>) 220 ; GFX9-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](<2 x s32>) 221 ; GFX9-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[UV2]](s32), [[UV]](s32), [[UV1]](s32), [[UV3]](s32) 222 ; GFX9-NEXT: $vgpr4_vgpr5_vgpr6_vgpr7 = COPY [[BUILD_VECTOR]](<4 x s32>) 223 %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 224 %1:_(<2 x s32>) = COPY $vgpr2_vgpr3 225 %2:_(s32), %3:_(s32) = G_UNMERGE_VALUES %0(<2 x s32>) 226 %4:_(s32), %5:_(s32) = G_UNMERGE_VALUES %1(<2 x s32>) 227 %6:_(<4 x s32>) = G_BUILD_VECTOR %4, %2, %3, %5 228 $vgpr4_vgpr5_vgpr6_vgpr7= COPY %6 229... 230 231--- 232name: not_a_concat 233body: | 234 bb.0: 235 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4, $vgpr5_vgpr6_vgpr7_vgpr8_vgpr9 236 237 ; GFX9-LABEL: name: not_a_concat 238 ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4, $vgpr5_vgpr6_vgpr7_vgpr8_vgpr9 239 ; GFX9-NEXT: {{ $}} 240 ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 241 ; GFX9-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr2_vgpr3 242 ; GFX9-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr4 243 ; GFX9-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>) 244 ; GFX9-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](<2 x s32>) 245 ; GFX9-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<5 x s32>) = G_BUILD_VECTOR [[UV]](s32), [[UV1]](s32), [[UV2]](s32), [[UV3]](s32), [[COPY2]](s32) 246 ; GFX9-NEXT: $vgpr5_vgpr6_vgpr7_vgpr8_vgpr9 = COPY [[BUILD_VECTOR]](<5 x s32>) 247 %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 248 %1:_(<2 x s32>) = COPY $vgpr2_vgpr3 249 %2:_(s32) = COPY $vgpr4 250 %3:_(s32), %4:_(s32) = G_UNMERGE_VALUES %0(<2 x s32>) 251 %5:_(s32), %6:_(s32) = G_UNMERGE_VALUES %1(<2 x s32>) 252 %7:_(<5 x s32>) = G_BUILD_VECTOR %3, %4, %5, %6, %2 253 $vgpr5_vgpr6_vgpr7_vgpr8_vgpr9= COPY %7 254... 255 256--- 257name: value_finder_look_through_copy 258body: | 259 bb.0: 260 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 261 262 ; GFX9-LABEL: name: value_finder_look_through_copy 263 ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 264 ; GFX9-NEXT: {{ $}} 265 ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 266 ; GFX9-NEXT: $vgpr2_vgpr3 = COPY [[COPY]](<2 x s32>) 267 %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 268 %1:_(s32), %2:_(s32) = G_UNMERGE_VALUES %0(<2 x s32>) 269 %3:_(s32) = COPY %1 270 %4:_(<2 x s32>) = G_BUILD_VECTOR %3, %2 271 $vgpr2_vgpr3= COPY %4 272... 273