1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -run-pass=amdgpu-prelegalizer-combiner -simplify-mir -verify-machineinstrs -o - %s | FileCheck %s 3 4--- 5name: no_fold_add_into_select_s32_0_multi_use 6tracksRegLiveness: true 7body: | 8 bb.0: 9 liveins: $vgpr0 10 ; CHECK-LABEL: name: no_fold_add_into_select_s32_0_multi_use 11 ; CHECK: liveins: $vgpr0 12 ; CHECK-NEXT: {{ $}} 13 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 14 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 15 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 16 ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10 17 ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 18 ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty 19 ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30 20 ; CHECK-NEXT: %add:_(s32) = G_ADD %select, %thirty 21 ; CHECK-NEXT: S_ENDPGM 0, implicit %add(s32), implicit %select(s32) 22 %reg:_(s32) = COPY $vgpr0 23 %zero:_(s32) = G_CONSTANT i32 0 24 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 25 %ten:_(s32) = G_CONSTANT i32 10 26 %twenty:_(s32) = G_CONSTANT i32 20 27 %select:_(s32) = G_SELECT %cond, %ten, %twenty 28 %thirty:_(s32) = G_CONSTANT i32 30 29 %add:_(s32) = G_ADD %select, %thirty 30 S_ENDPGM 0, implicit %add, implicit %select 31... 32 33--- 34name: no_fold_add_into_select_s32_1_multi_use 35tracksRegLiveness: true 36body: | 37 bb.0: 38 liveins: $vgpr0 39 ; CHECK-LABEL: name: no_fold_add_into_select_s32_1_multi_use 40 ; CHECK: liveins: $vgpr0 41 ; CHECK-NEXT: {{ $}} 42 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 43 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 44 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 45 ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10 46 ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 47 ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty 48 ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30 49 ; CHECK-NEXT: %add:_(s32) = G_ADD %select, %thirty 50 ; CHECK-NEXT: S_ENDPGM 0, implicit %add(s32), implicit %select(s32) 51 %reg:_(s32) = COPY $vgpr0 52 %zero:_(s32) = G_CONSTANT i32 0 53 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 54 %ten:_(s32) = G_CONSTANT i32 10 55 %twenty:_(s32) = G_CONSTANT i32 20 56 %select:_(s32) = G_SELECT %cond, %ten, %twenty 57 %thirty:_(s32) = G_CONSTANT i32 30 58 %add:_(s32) = G_ADD %thirty, %select 59 S_ENDPGM 0, implicit %add, implicit %select 60... 61 62--- 63name: no_fold_sub_into_select_s32_nonconst_rhs 64tracksRegLiveness: true 65body: | 66 bb.0: 67 liveins: $vgpr0, $vgpr1 68 ; CHECK-LABEL: name: no_fold_sub_into_select_s32_nonconst_rhs 69 ; CHECK: liveins: $vgpr0, $vgpr1 70 ; CHECK-NEXT: {{ $}} 71 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 72 ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 73 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 74 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 75 ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10 76 ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 77 ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty 78 ; CHECK-NEXT: %sub:_(s32) = G_SUB %select, %variable 79 ; CHECK-NEXT: S_ENDPGM 0, implicit %sub(s32) 80 %reg:_(s32) = COPY $vgpr0 81 %variable:_(s32) = COPY $vgpr0 82 %zero:_(s32) = G_CONSTANT i32 0 83 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 84 %ten:_(s32) = G_CONSTANT i32 10 85 %twenty:_(s32) = G_CONSTANT i32 20 86 %select:_(s32) = G_SELECT %cond, %ten, %twenty 87 %thirty:_(s32) = G_CONSTANT i32 30 88 %sub:_(s32) = G_SUB %select, %variable 89 S_ENDPGM 0, implicit %sub 90... 91 92--- 93name: no_fold_sub_into_select_s32_nonconst_lhs 94tracksRegLiveness: true 95body: | 96 bb.0: 97 liveins: $vgpr0, $vgpr1 98 ; CHECK-LABEL: name: no_fold_sub_into_select_s32_nonconst_lhs 99 ; CHECK: liveins: $vgpr0, $vgpr1 100 ; CHECK-NEXT: {{ $}} 101 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 102 ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 103 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 104 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 105 ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10 106 ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 107 ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty 108 ; CHECK-NEXT: %sub:_(s32) = G_SUB %variable, %select 109 ; CHECK-NEXT: S_ENDPGM 0, implicit %sub(s32) 110 %reg:_(s32) = COPY $vgpr0 111 %variable:_(s32) = COPY $vgpr0 112 %zero:_(s32) = G_CONSTANT i32 0 113 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 114 %ten:_(s32) = G_CONSTANT i32 10 115 %twenty:_(s32) = G_CONSTANT i32 20 116 %select:_(s32) = G_SELECT %cond, %ten, %twenty 117 %thirty:_(s32) = G_CONSTANT i32 30 118 %sub:_(s32) = G_SUB %variable, %select 119 S_ENDPGM 0, implicit %sub 120... 121 122--- 123name: fold_add_into_select_s32_0 124tracksRegLiveness: true 125body: | 126 bb.0: 127 liveins: $vgpr0 128 ; CHECK-LABEL: name: fold_add_into_select_s32_0 129 ; CHECK: liveins: $vgpr0 130 ; CHECK-NEXT: {{ $}} 131 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 132 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 133 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 134 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 40 135 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 50 136 ; CHECK-NEXT: %add:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]] 137 ; CHECK-NEXT: S_ENDPGM 0, implicit %add(s32) 138 %reg:_(s32) = COPY $vgpr0 139 %zero:_(s32) = G_CONSTANT i32 0 140 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 141 %ten:_(s32) = G_CONSTANT i32 10 142 %twenty:_(s32) = G_CONSTANT i32 20 143 %select:_(s32) = G_SELECT %cond, %ten, %twenty 144 %thirty:_(s32) = G_CONSTANT i32 30 145 %add:_(s32) = G_ADD %select, %thirty 146 S_ENDPGM 0, implicit %add 147... 148 149--- 150name: fold_add_into_select_s32_1 151tracksRegLiveness: true 152body: | 153 bb.0: 154 liveins: $vgpr0 155 ; CHECK-LABEL: name: fold_add_into_select_s32_1 156 ; CHECK: liveins: $vgpr0 157 ; CHECK-NEXT: {{ $}} 158 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 159 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 160 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 161 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 40 162 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 50 163 ; CHECK-NEXT: %add:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]] 164 ; CHECK-NEXT: S_ENDPGM 0, implicit %add(s32) 165 %reg:_(s32) = COPY $vgpr0 166 %zero:_(s32) = G_CONSTANT i32 0 167 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 168 %ten:_(s32) = G_CONSTANT i32 10 169 %twenty:_(s32) = G_CONSTANT i32 20 170 %select:_(s32) = G_SELECT %cond, %ten, %twenty 171 %thirty:_(s32) = G_CONSTANT i32 30 172 %add:_(s32) = G_ADD %thirty, %select 173 S_ENDPGM 0, implicit %add 174... 175 176--- 177name: fold_add_into_select_v2s32_splat 178tracksRegLiveness: true 179body: | 180 bb.0: 181 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 182 ; CHECK-LABEL: name: fold_add_into_select_v2s32_splat 183 ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 184 ; CHECK-NEXT: {{ $}} 185 ; CHECK-NEXT: %reg0:_(<2 x s32>) = COPY $vgpr0_vgpr1 186 ; CHECK-NEXT: %reg1:_(<2 x s32>) = COPY $vgpr2_vgpr3 187 ; CHECK-NEXT: %cond:_(<2 x s1>) = G_ICMP intpred(eq), %reg0(<2 x s32>), %reg1 188 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 40 189 ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32) 190 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 50 191 ; CHECK-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C1]](s32), [[C1]](s32) 192 ; CHECK-NEXT: %add:_(<2 x s32>) = G_SELECT %cond(<2 x s1>), [[BUILD_VECTOR]], [[BUILD_VECTOR1]] 193 ; CHECK-NEXT: S_ENDPGM 0, implicit %add(<2 x s32>) 194 %reg0:_(<2 x s32>) = COPY $vgpr0_vgpr1 195 %reg1:_(<2 x s32>) = COPY $vgpr2_vgpr3 196 %cond:_(<2 x s1>) = G_ICMP intpred(eq), %reg0, %reg1 197 %ten:_(s32) = G_CONSTANT i32 10 198 %twenty:_(s32) = G_CONSTANT i32 20 199 %ten_vec:_(<2 x s32>) = G_BUILD_VECTOR %ten, %ten 200 %twenty_vec:_(<2 x s32>) = G_BUILD_VECTOR %twenty, %twenty 201 %select:_(<2 x s32>) = G_SELECT %cond, %ten_vec, %twenty_vec 202 %thirty:_(s32) = G_CONSTANT i32 30 203 %thirty_vec:_(<2 x s32>) = G_BUILD_VECTOR %thirty, %thirty 204 %add:_(<2 x s32>) = G_ADD %select, %thirty_vec 205 S_ENDPGM 0, implicit %add 206... 207 208--- 209name: fold_add_into_select_v2s32_nonsplat 210tracksRegLiveness: true 211body: | 212 bb.0: 213 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 214 ; CHECK-LABEL: name: fold_add_into_select_v2s32_nonsplat 215 ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 216 ; CHECK-NEXT: {{ $}} 217 ; CHECK-NEXT: %reg0:_(<2 x s32>) = COPY $vgpr0_vgpr1 218 ; CHECK-NEXT: %reg1:_(<2 x s32>) = COPY $vgpr2_vgpr3 219 ; CHECK-NEXT: %cond:_(<2 x s1>) = G_ICMP intpred(eq), %reg0(<2 x s32>), %reg1 220 ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 221 ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30 222 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 40 223 ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C]](s32), %thirty(s32) 224 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 50 225 ; CHECK-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C1]](s32), %twenty(s32) 226 ; CHECK-NEXT: %add:_(<2 x s32>) = G_SELECT %cond(<2 x s1>), [[BUILD_VECTOR]], [[BUILD_VECTOR1]] 227 ; CHECK-NEXT: S_ENDPGM 0, implicit %add(<2 x s32>) 228 %reg0:_(<2 x s32>) = COPY $vgpr0_vgpr1 229 %reg1:_(<2 x s32>) = COPY $vgpr2_vgpr3 230 %cond:_(<2 x s1>) = G_ICMP intpred(eq), %reg0, %reg1 231 %ten:_(s32) = G_CONSTANT i32 10 232 %twenty:_(s32) = G_CONSTANT i32 20 233 %const_vec0:_(<2 x s32>) = G_BUILD_VECTOR %ten, %twenty 234 %const_vec1:_(<2 x s32>) = G_BUILD_VECTOR %twenty, %ten 235 %select:_(<2 x s32>) = G_SELECT %cond, %const_vec0, %const_vec1 236 %thirty:_(s32) = G_CONSTANT i32 30 237 %const_vec3:_(<2 x s32>) = G_BUILD_VECTOR %thirty, %ten 238 %add:_(<2 x s32>) = G_ADD %select, %const_vec3 239 S_ENDPGM 0, implicit %add 240... 241 242--- 243name: fold_add_into_select_v2s32_nonsplat_undef 244tracksRegLiveness: true 245body: | 246 bb.0: 247 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 248 ; CHECK-LABEL: name: fold_add_into_select_v2s32_nonsplat_undef 249 ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 250 ; CHECK-NEXT: {{ $}} 251 ; CHECK-NEXT: %reg0:_(<2 x s32>) = COPY $vgpr0_vgpr1 252 ; CHECK-NEXT: %reg1:_(<2 x s32>) = COPY $vgpr2_vgpr3 253 ; CHECK-NEXT: %cond:_(<2 x s1>) = G_ICMP intpred(eq), %reg0(<2 x s32>), %reg1 254 ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 255 ; CHECK-NEXT: %undef:_(s32) = G_IMPLICIT_DEF 256 ; CHECK-NEXT: %const_vec0:_(<2 x s32>) = G_BUILD_VECTOR %undef(s32), %twenty(s32) 257 ; CHECK-NEXT: %const_vec1:_(<2 x s32>) = G_BUILD_VECTOR %twenty(s32), %undef(s32) 258 ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30 259 ; CHECK-NEXT: %const_vec3:_(<2 x s32>) = G_BUILD_VECTOR %thirty(s32), %undef(s32) 260 ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(<2 x s32>) = G_ADD %const_vec0, %const_vec3 261 ; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(<2 x s32>) = G_ADD %const_vec1, %const_vec3 262 ; CHECK-NEXT: %add:_(<2 x s32>) = G_SELECT %cond(<2 x s1>), [[ADD]], [[ADD1]] 263 ; CHECK-NEXT: S_ENDPGM 0, implicit %add(<2 x s32>) 264 %reg0:_(<2 x s32>) = COPY $vgpr0_vgpr1 265 %reg1:_(<2 x s32>) = COPY $vgpr2_vgpr3 266 %cond:_(<2 x s1>) = G_ICMP intpred(eq), %reg0, %reg1 267 %ten:_(s32) = G_CONSTANT i32 10 268 %twenty:_(s32) = G_CONSTANT i32 20 269 %undef:_(s32) = G_IMPLICIT_DEF 270 %const_vec0:_(<2 x s32>) = G_BUILD_VECTOR %undef, %twenty 271 %const_vec1:_(<2 x s32>) = G_BUILD_VECTOR %twenty, %undef 272 %select:_(<2 x s32>) = G_SELECT %cond, %const_vec0, %const_vec1 273 %thirty:_(s32) = G_CONSTANT i32 30 274 %const_vec3:_(<2 x s32>) = G_BUILD_VECTOR %thirty, %undef 275 %add:_(<2 x s32>) = G_ADD %select, %const_vec3 276 S_ENDPGM 0, implicit %add 277... 278 279--- 280name: fold_sub_into_select_s32_0 281tracksRegLiveness: true 282body: | 283 bb.0: 284 liveins: $vgpr0 285 ; CHECK-LABEL: name: fold_sub_into_select_s32_0 286 ; CHECK: liveins: $vgpr0 287 ; CHECK-NEXT: {{ $}} 288 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 289 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 290 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 291 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 -20 292 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 -10 293 ; CHECK-NEXT: %sub:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]] 294 ; CHECK-NEXT: S_ENDPGM 0, implicit %sub(s32) 295 %reg:_(s32) = COPY $vgpr0 296 %zero:_(s32) = G_CONSTANT i32 0 297 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 298 %ten:_(s32) = G_CONSTANT i32 10 299 %twenty:_(s32) = G_CONSTANT i32 20 300 %select:_(s32) = G_SELECT %cond, %ten, %twenty 301 %thirty:_(s32) = G_CONSTANT i32 30 302 %sub:_(s32) = G_SUB %select, %thirty 303 S_ENDPGM 0, implicit %sub 304... 305 306--- 307name: fold_sub_into_select_s32_1 308tracksRegLiveness: true 309body: | 310 bb.0: 311 liveins: $vgpr0 312 ; CHECK-LABEL: name: fold_sub_into_select_s32_1 313 ; CHECK: liveins: $vgpr0 314 ; CHECK-NEXT: {{ $}} 315 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 316 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 317 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 318 ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10 319 ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 320 ; CHECK-NEXT: %sub:_(s32) = G_SELECT %cond(s1), %twenty, %ten 321 ; CHECK-NEXT: S_ENDPGM 0, implicit %sub(s32) 322 %reg:_(s32) = COPY $vgpr0 323 %zero:_(s32) = G_CONSTANT i32 0 324 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 325 %ten:_(s32) = G_CONSTANT i32 10 326 %twenty:_(s32) = G_CONSTANT i32 20 327 %select:_(s32) = G_SELECT %cond, %ten, %twenty 328 %thirty:_(s32) = G_CONSTANT i32 30 329 %sub:_(s32) = G_SUB %thirty, %select 330 S_ENDPGM 0, implicit %sub 331... 332 333--- 334name: fold_ptr_add_into_select_p3_0 335tracksRegLiveness: true 336body: | 337 bb.0: 338 liveins: $vgpr0 339 ; CHECK-LABEL: name: fold_ptr_add_into_select_p3_0 340 ; CHECK: liveins: $vgpr0 341 ; CHECK-NEXT: {{ $}} 342 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 343 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 344 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 345 ; CHECK-NEXT: [[C:%[0-9]+]]:_(p3) = G_CONSTANT i32 40 346 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(p3) = G_CONSTANT i32 50 347 ; CHECK-NEXT: %ptr_add:_(p3) = G_SELECT %cond(s1), [[C]], [[C1]] 348 ; CHECK-NEXT: S_ENDPGM 0, implicit %ptr_add(p3) 349 %reg:_(s32) = COPY $vgpr0 350 %zero:_(s32) = G_CONSTANT i32 0 351 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 352 %ten:_(p3) = G_CONSTANT i32 10 353 %twenty:_(p3) = G_CONSTANT i32 20 354 %select:_(p3) = G_SELECT %cond, %ten, %twenty 355 %thirty:_(s32) = G_CONSTANT i32 30 356 %ptr_add:_(p3) = G_PTR_ADD %select, %thirty 357 S_ENDPGM 0, implicit %ptr_add 358... 359 360--- 361name: fold_ptr_add_into_select_p3_1 362tracksRegLiveness: true 363body: | 364 bb.0: 365 liveins: $vgpr0 366 ; CHECK-LABEL: name: fold_ptr_add_into_select_p3_1 367 ; CHECK: liveins: $vgpr0 368 ; CHECK-NEXT: {{ $}} 369 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 370 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 371 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 372 ; CHECK-NEXT: [[C:%[0-9]+]]:_(p3) = G_CONSTANT i32 40 373 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(p3) = G_CONSTANT i32 50 374 ; CHECK-NEXT: %ptr_add:_(p3) = G_SELECT %cond(s1), [[C]], [[C1]] 375 ; CHECK-NEXT: S_ENDPGM 0, implicit %ptr_add(p3) 376 %reg:_(s32) = COPY $vgpr0 377 %zero:_(s32) = G_CONSTANT i32 0 378 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 379 %ten:_(s32) = G_CONSTANT i32 10 380 %twenty:_(s32) = G_CONSTANT i32 20 381 %select:_(s32) = G_SELECT %cond, %ten, %twenty 382 %thirty:_(p3) = G_CONSTANT i32 30 383 %ptr_add:_(p3) = G_PTR_ADD %thirty, %select 384 S_ENDPGM 0, implicit %ptr_add 385... 386 387--- 388name: fold_shl_into_select_s64_0 389tracksRegLiveness: true 390body: | 391 bb.0: 392 liveins: $vgpr0 393 ; CHECK-LABEL: name: fold_shl_into_select_s64_0 394 ; CHECK: liveins: $vgpr0 395 ; CHECK-NEXT: {{ $}} 396 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 397 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 398 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 399 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1280 400 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2560 401 ; CHECK-NEXT: %shl:_(s64) = G_SELECT %cond(s1), [[C]], [[C1]] 402 ; CHECK-NEXT: S_ENDPGM 0, implicit %shl(s64) 403 %reg:_(s32) = COPY $vgpr0 404 %zero:_(s32) = G_CONSTANT i32 0 405 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 406 %ten:_(s64) = G_CONSTANT i64 10 407 %twenty:_(s64) = G_CONSTANT i64 20 408 %select:_(s64) = G_SELECT %cond, %ten, %twenty 409 %seven:_(s32) = G_CONSTANT i32 7 410 %shl:_(s64) = G_SHL %select, %seven 411 S_ENDPGM 0, implicit %shl 412... 413 414--- 415name: fold_shl_into_select_s64_1 416tracksRegLiveness: true 417body: | 418 bb.0: 419 liveins: $vgpr0 420 ; CHECK-LABEL: name: fold_shl_into_select_s64_1 421 ; CHECK: liveins: $vgpr0 422 ; CHECK-NEXT: {{ $}} 423 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 424 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 425 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 426 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 8192 427 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 524288 428 ; CHECK-NEXT: %shl:_(s64) = G_SELECT %cond(s1), [[C]], [[C1]] 429 ; CHECK-NEXT: S_ENDPGM 0, implicit %shl(s64) 430 %reg:_(s32) = COPY $vgpr0 431 %zero:_(s32) = G_CONSTANT i32 0 432 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 433 %ten:_(s32) = G_CONSTANT i32 10 434 %sixteen:_(s32) = G_CONSTANT i32 16 435 %select:_(s32) = G_SELECT %cond, %ten, %sixteen 436 %eight:_(s64) = G_CONSTANT i64 8 437 %shl:_(s64) = G_SHL %eight, %select 438 S_ENDPGM 0, implicit %shl 439... 440 441--- 442name: fold_and_variable_into_select_zero_neg1_s32 443tracksRegLiveness: true 444body: | 445 bb.0: 446 liveins: $vgpr0, $vgpr1 447 ; CHECK-LABEL: name: fold_and_variable_into_select_zero_neg1_s32 448 ; CHECK: liveins: $vgpr0, $vgpr1 449 ; CHECK-NEXT: {{ $}} 450 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 451 ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 452 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 453 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(ne), %reg(s32), %zero 454 ; CHECK-NEXT: %select:_(s32) = G_SEXT %cond(s1) 455 ; CHECK-NEXT: %and:_(s32) = G_AND %select, %variable 456 ; CHECK-NEXT: S_ENDPGM 0, implicit %and(s32) 457 %reg:_(s32) = COPY $vgpr0 458 %variable:_(s32) = COPY $vgpr0 459 %zero:_(s32) = G_CONSTANT i32 0 460 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 461 %neg1:_(s32) = G_CONSTANT i32 -1 462 %select:_(s32) = G_SELECT %cond, %zero, %neg1 463 %and:_(s32) = G_AND %select, %variable 464 S_ENDPGM 0, implicit %and 465... 466 467--- 468name: fold_and_variable_into_select_neg1_zero_s32 469tracksRegLiveness: true 470body: | 471 bb.0: 472 liveins: $vgpr0, $vgpr1 473 ; CHECK-LABEL: name: fold_and_variable_into_select_neg1_zero_s32 474 ; CHECK: liveins: $vgpr0, $vgpr1 475 ; CHECK-NEXT: {{ $}} 476 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 477 ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 478 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 479 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 480 ; CHECK-NEXT: %select:_(s32) = G_SEXT %cond(s1) 481 ; CHECK-NEXT: %and:_(s32) = G_AND %select, %variable 482 ; CHECK-NEXT: S_ENDPGM 0, implicit %and(s32) 483 %reg:_(s32) = COPY $vgpr0 484 %variable:_(s32) = COPY $vgpr0 485 %zero:_(s32) = G_CONSTANT i32 0 486 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 487 %neg1:_(s32) = G_CONSTANT i32 -1 488 %select:_(s32) = G_SELECT %cond, %neg1, %zero 489 %and:_(s32) = G_AND %select, %variable 490 S_ENDPGM 0, implicit %and 491... 492 493--- 494name: fold_or_variable_into_select_zero_neg1_s32 495tracksRegLiveness: true 496body: | 497 bb.0: 498 liveins: $vgpr0, $vgpr1 499 ; CHECK-LABEL: name: fold_or_variable_into_select_zero_neg1_s32 500 ; CHECK: liveins: $vgpr0, $vgpr1 501 ; CHECK-NEXT: {{ $}} 502 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 503 ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 504 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 505 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(ne), %reg(s32), %zero 506 ; CHECK-NEXT: %select:_(s32) = G_SEXT %cond(s1) 507 ; CHECK-NEXT: %or:_(s32) = G_OR %select, %variable 508 ; CHECK-NEXT: S_ENDPGM 0, implicit %or(s32) 509 %reg:_(s32) = COPY $vgpr0 510 %variable:_(s32) = COPY $vgpr0 511 %zero:_(s32) = G_CONSTANT i32 0 512 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 513 %neg1:_(s32) = G_CONSTANT i32 -1 514 %select:_(s32) = G_SELECT %cond, %zero, %neg1 515 %or:_(s32) = G_OR %select, %variable 516 S_ENDPGM 0, implicit %or 517... 518 519--- 520name: fold_or_variable_into_select_neg1_zero_s32 521tracksRegLiveness: true 522body: | 523 bb.0: 524 liveins: $vgpr0, $vgpr1 525 ; CHECK-LABEL: name: fold_or_variable_into_select_neg1_zero_s32 526 ; CHECK: liveins: $vgpr0, $vgpr1 527 ; CHECK-NEXT: {{ $}} 528 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 529 ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 530 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 531 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 532 ; CHECK-NEXT: %select:_(s32) = G_SEXT %cond(s1) 533 ; CHECK-NEXT: %or:_(s32) = G_OR %select, %variable 534 ; CHECK-NEXT: S_ENDPGM 0, implicit %or(s32) 535 %reg:_(s32) = COPY $vgpr0 536 %variable:_(s32) = COPY $vgpr0 537 %zero:_(s32) = G_CONSTANT i32 0 538 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 539 %neg1:_(s32) = G_CONSTANT i32 -1 540 %select:_(s32) = G_SELECT %cond, %neg1, %zero 541 %or:_(s32) = G_OR %select, %variable 542 S_ENDPGM 0, implicit %or 543... 544 545--- 546name: fold_and_variable_into_select_undef_neg1_s32 547tracksRegLiveness: true 548body: | 549 bb.0: 550 liveins: $vgpr0, $vgpr1 551 ; CHECK-LABEL: name: fold_and_variable_into_select_undef_neg1_s32 552 ; CHECK: liveins: $vgpr0, $vgpr1 553 ; CHECK-NEXT: {{ $}} 554 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 555 ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 556 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 557 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 558 ; CHECK-NEXT: %undef:_(s32) = G_IMPLICIT_DEF 559 ; CHECK-NEXT: %neg1:_(s32) = G_CONSTANT i32 -1 560 ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %undef, %neg1 561 ; CHECK-NEXT: %and:_(s32) = G_AND %select, %variable 562 ; CHECK-NEXT: S_ENDPGM 0, implicit %and(s32) 563 %reg:_(s32) = COPY $vgpr0 564 %variable:_(s32) = COPY $vgpr0 565 %zero:_(s32) = G_CONSTANT i32 0 566 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 567 %undef:_(s32) = G_IMPLICIT_DEF 568 %neg1:_(s32) = G_CONSTANT i32 -1 569 %select:_(s32) = G_SELECT %cond, %undef, %neg1 570 %and:_(s32) = G_AND %select, %variable 571 S_ENDPGM 0, implicit %and 572... 573 574--- 575name: fold_and_variable_into_select_undef_zero_s32 576tracksRegLiveness: true 577body: | 578 bb.0: 579 liveins: $vgpr0, $vgpr1 580 ; CHECK-LABEL: name: fold_and_variable_into_select_undef_zero_s32 581 ; CHECK: liveins: $vgpr0, $vgpr1 582 ; CHECK-NEXT: {{ $}} 583 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 584 ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 585 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 586 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 587 ; CHECK-NEXT: %undef:_(s32) = G_IMPLICIT_DEF 588 ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %undef, %zero 589 ; CHECK-NEXT: %and:_(s32) = G_AND %select, %variable 590 ; CHECK-NEXT: S_ENDPGM 0, implicit %and(s32) 591 %reg:_(s32) = COPY $vgpr0 592 %variable:_(s32) = COPY $vgpr0 593 %zero:_(s32) = G_CONSTANT i32 0 594 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 595 %undef:_(s32) = G_IMPLICIT_DEF 596 %select:_(s32) = G_SELECT %cond, %undef, %zero 597 %and:_(s32) = G_AND %select, %variable 598 S_ENDPGM 0, implicit %and 599... 600 601--- 602name: fold_or_variable_into_select_neg1_fpzero_s32 603tracksRegLiveness: true 604body: | 605 bb.0: 606 liveins: $vgpr0, $vgpr1 607 ; CHECK-LABEL: name: fold_or_variable_into_select_neg1_fpzero_s32 608 ; CHECK: liveins: $vgpr0, $vgpr1 609 ; CHECK-NEXT: {{ $}} 610 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 611 ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 612 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 613 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 614 ; CHECK-NEXT: %neg1:_(s32) = G_CONSTANT i32 -1 615 ; CHECK-NEXT: %fpzero:_(s32) = G_FCONSTANT float 0.000000e+00 616 ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR %fpzero, %variable 617 ; CHECK-NEXT: %or:_(s32) = G_SELECT %cond(s1), %neg1, [[OR]] 618 ; CHECK-NEXT: S_ENDPGM 0, implicit %or(s32) 619 %reg:_(s32) = COPY $vgpr0 620 %variable:_(s32) = COPY $vgpr0 621 %zero:_(s32) = G_CONSTANT i32 0 622 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 623 %neg1:_(s32) = G_CONSTANT i32 -1 624 %fpzero:_(s32) = G_FCONSTANT float 0.0 625 %select:_(s32) = G_SELECT %cond, %neg1, %fpzero 626 %or:_(s32) = G_OR %select, %variable 627 S_ENDPGM 0, implicit %or 628... 629 630--- 631name: no_fold_or_variable_into_select_neg1_fpnegzero_s32 632tracksRegLiveness: true 633body: | 634 bb.0: 635 liveins: $vgpr0, $vgpr1 636 ; CHECK-LABEL: name: no_fold_or_variable_into_select_neg1_fpnegzero_s32 637 ; CHECK: liveins: $vgpr0, $vgpr1 638 ; CHECK-NEXT: {{ $}} 639 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 640 ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 641 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 642 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 643 ; CHECK-NEXT: %neg1:_(s32) = G_CONSTANT i32 -1 644 ; CHECK-NEXT: %fpzero:_(s32) = G_FCONSTANT float -0.000000e+00 645 ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %neg1, %fpzero 646 ; CHECK-NEXT: %or:_(s32) = G_OR %select, %variable 647 ; CHECK-NEXT: S_ENDPGM 0, implicit %or(s32) 648 %reg:_(s32) = COPY $vgpr0 649 %variable:_(s32) = COPY $vgpr0 650 %zero:_(s32) = G_CONSTANT i32 0 651 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 652 %neg1:_(s32) = G_CONSTANT i32 -1 653 %fpzero:_(s32) = G_FCONSTANT float -0.0 654 %select:_(s32) = G_SELECT %cond, %neg1, %fpzero 655 %or:_(s32) = G_OR %select, %variable 656 S_ENDPGM 0, implicit %or 657... 658 659--- 660name: no_fold_or_variable_into_select_neg1_other_const_s32 661tracksRegLiveness: true 662body: | 663 bb.0: 664 liveins: $vgpr0, $vgpr1 665 ; CHECK-LABEL: name: no_fold_or_variable_into_select_neg1_other_const_s32 666 ; CHECK: liveins: $vgpr0, $vgpr1 667 ; CHECK-NEXT: {{ $}} 668 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 669 ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 670 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 671 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 672 ; CHECK-NEXT: %otherconst:_(s32) = G_CONSTANT i32 123 673 ; CHECK-NEXT: [[SEXT:%[0-9]+]]:_(s32) = G_SEXT %cond(s1) 674 ; CHECK-NEXT: %select:_(s32) = G_OR [[SEXT]], %otherconst 675 ; CHECK-NEXT: %or:_(s32) = G_OR %select, %variable 676 ; CHECK-NEXT: S_ENDPGM 0, implicit %or(s32) 677 %reg:_(s32) = COPY $vgpr0 678 %variable:_(s32) = COPY $vgpr0 679 %zero:_(s32) = G_CONSTANT i32 0 680 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 681 %neg1:_(s32) = G_CONSTANT i32 -1 682 %otherconst:_(s32) = G_CONSTANT i32 123 683 %select:_(s32) = G_SELECT %cond, %neg1, %otherconst 684 %or:_(s32) = G_OR %select, %variable 685 S_ENDPGM 0, implicit %or 686... 687 688--- 689name: fold_xor_into_select_s32_0 690tracksRegLiveness: true 691body: | 692 bb.0: 693 liveins: $vgpr0 694 ; CHECK-LABEL: name: fold_xor_into_select_s32_0 695 ; CHECK: liveins: $vgpr0 696 ; CHECK-NEXT: {{ $}} 697 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 698 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 699 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 700 ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10 701 ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 702 ; CHECK-NEXT: %xor:_(s32) = G_SELECT %cond(s1), %twenty, %ten 703 ; CHECK-NEXT: S_ENDPGM 0, implicit %xor(s32) 704 %reg:_(s32) = COPY $vgpr0 705 %zero:_(s32) = G_CONSTANT i32 0 706 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 707 %ten:_(s32) = G_CONSTANT i32 10 708 %twenty:_(s32) = G_CONSTANT i32 20 709 %select:_(s32) = G_SELECT %cond, %ten, %twenty 710 %thirty:_(s32) = G_CONSTANT i32 30 711 %xor:_(s32) = G_XOR %select, %thirty 712 S_ENDPGM 0, implicit %xor 713... 714 715--- 716name: fold_sdiv_into_select_s32_0 717tracksRegLiveness: true 718body: | 719 bb.0: 720 liveins: $vgpr0 721 ; CHECK-LABEL: name: fold_sdiv_into_select_s32_0 722 ; CHECK: liveins: $vgpr0 723 ; CHECK-NEXT: {{ $}} 724 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 725 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 726 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 727 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 50 728 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 21 729 ; CHECK-NEXT: %sdiv:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]] 730 ; CHECK-NEXT: S_ENDPGM 0, implicit %sdiv(s32) 731 %reg:_(s32) = COPY $vgpr0 732 %zero:_(s32) = G_CONSTANT i32 0 733 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 734 %hundred:_(s32) = G_CONSTANT i32 100 735 %fortytwo:_(s32) = G_CONSTANT i32 42 736 %select:_(s32) = G_SELECT %cond, %hundred, %fortytwo 737 %two:_(s32) = G_CONSTANT i32 2 738 %sdiv:_(s32) = G_SDIV %select, %two 739 S_ENDPGM 0, implicit %sdiv 740... 741 742--- 743name: fold_srem_into_select_s32_0 744tracksRegLiveness: true 745body: | 746 bb.0: 747 liveins: $vgpr0 748 ; CHECK-LABEL: name: fold_srem_into_select_s32_0 749 ; CHECK: liveins: $vgpr0 750 ; CHECK-NEXT: {{ $}} 751 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 752 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 753 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 754 ; CHECK-NEXT: %srem:_(s32) = G_ZEXT %cond(s1) 755 ; CHECK-NEXT: S_ENDPGM 0, implicit %srem(s32) 756 %reg:_(s32) = COPY $vgpr0 757 %zero:_(s32) = G_CONSTANT i32 0 758 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 759 %hundred:_(s32) = G_CONSTANT i32 100 760 %fortytwo:_(s32) = G_CONSTANT i32 42 761 %select:_(s32) = G_SELECT %cond, %hundred, %fortytwo 762 %three:_(s32) = G_CONSTANT i32 3 763 %srem:_(s32) = G_SREM %select, %three 764 S_ENDPGM 0, implicit %srem 765... 766 767--- 768name: fold_udiv_into_select_s32_0 769tracksRegLiveness: true 770body: | 771 bb.0: 772 liveins: $vgpr0 773 ; CHECK-LABEL: name: fold_udiv_into_select_s32_0 774 ; CHECK: liveins: $vgpr0 775 ; CHECK-NEXT: {{ $}} 776 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 777 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 778 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 779 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 50 780 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 21 781 ; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]] 782 ; CHECK-NEXT: S_ENDPGM 0, implicit [[SELECT]](s32) 783 %reg:_(s32) = COPY $vgpr0 784 %zero:_(s32) = G_CONSTANT i32 0 785 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 786 %hundred:_(s32) = G_CONSTANT i32 100 787 %fortytwo:_(s32) = G_CONSTANT i32 42 788 %select:_(s32) = G_SELECT %cond, %hundred, %fortytwo 789 %two:_(s32) = G_CONSTANT i32 2 790 %udiv:_(s32) = G_UDIV %select, %two 791 S_ENDPGM 0, implicit %udiv 792... 793 794--- 795name: fold_urem_into_select_s32_0 796tracksRegLiveness: true 797body: | 798 bb.0: 799 liveins: $vgpr0 800 ; CHECK-LABEL: name: fold_urem_into_select_s32_0 801 ; CHECK: liveins: $vgpr0 802 ; CHECK-NEXT: {{ $}} 803 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 804 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 805 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 806 ; CHECK-NEXT: %udiv:_(s32) = G_ZEXT %cond(s1) 807 ; CHECK-NEXT: S_ENDPGM 0, implicit %udiv(s32) 808 %reg:_(s32) = COPY $vgpr0 809 %zero:_(s32) = G_CONSTANT i32 0 810 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 811 %hundred:_(s32) = G_CONSTANT i32 100 812 %fortytwo:_(s32) = G_CONSTANT i32 42 813 %select:_(s32) = G_SELECT %cond, %hundred, %fortytwo 814 %three:_(s32) = G_CONSTANT i32 3 815 %udiv:_(s32) = G_UREM %select, %three 816 S_ENDPGM 0, implicit %udiv 817... 818 819--- 820name: fold_lshr_into_select_s64_0 821tracksRegLiveness: true 822body: | 823 bb.0: 824 liveins: $vgpr0 825 ; CHECK-LABEL: name: fold_lshr_into_select_s64_0 826 ; CHECK: liveins: $vgpr0 827 ; CHECK-NEXT: {{ $}} 828 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 829 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 830 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 831 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 2 832 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 5 833 ; CHECK-NEXT: %lshr:_(s64) = G_SELECT %cond(s1), [[C]], [[C1]] 834 ; CHECK-NEXT: S_ENDPGM 0, implicit %lshr(s64) 835 %reg:_(s32) = COPY $vgpr0 836 %zero:_(s32) = G_CONSTANT i32 0 837 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 838 %ten:_(s64) = G_CONSTANT i64 10 839 %twenty:_(s64) = G_CONSTANT i64 20 840 %select:_(s64) = G_SELECT %cond, %ten, %twenty 841 %two:_(s32) = G_CONSTANT i32 2 842 %lshr:_(s64) = G_LSHR %select, %two 843 S_ENDPGM 0, implicit %lshr 844... 845 846--- 847name: fold_lshr_into_select_s64_1 848tracksRegLiveness: true 849body: | 850 bb.0: 851 liveins: $vgpr0 852 ; CHECK-LABEL: name: fold_lshr_into_select_s64_1 853 ; CHECK: liveins: $vgpr0 854 ; CHECK-NEXT: {{ $}} 855 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 856 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 857 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 858 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1012 859 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 253 860 ; CHECK-NEXT: %lshr:_(s64) = G_SELECT %cond(s1), [[C]], [[C1]] 861 ; CHECK-NEXT: S_ENDPGM 0, implicit %lshr(s64) 862 %reg:_(s32) = COPY $vgpr0 863 %zero:_(s32) = G_CONSTANT i32 0 864 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 865 %three:_(s32) = G_CONSTANT i32 3 866 %five:_(s32) = G_CONSTANT i32 5 867 %select:_(s32) = G_SELECT %cond, %three, %five 868 %val:_(s64) = G_CONSTANT i64 8096 869 %lshr:_(s64) = G_LSHR %val, %select 870 S_ENDPGM 0, implicit %lshr 871... 872 873--- 874name: fold_ashr_into_select_s64_0 875tracksRegLiveness: true 876body: | 877 bb.0: 878 liveins: $vgpr0 879 ; CHECK-LABEL: name: fold_ashr_into_select_s64_0 880 ; CHECK: liveins: $vgpr0 881 ; CHECK-NEXT: {{ $}} 882 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 883 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 884 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 885 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 2 886 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 5 887 ; CHECK-NEXT: %ashr:_(s64) = G_SELECT %cond(s1), [[C]], [[C1]] 888 ; CHECK-NEXT: S_ENDPGM 0, implicit %ashr(s64) 889 %reg:_(s32) = COPY $vgpr0 890 %zero:_(s32) = G_CONSTANT i32 0 891 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 892 %ten:_(s64) = G_CONSTANT i64 10 893 %twenty:_(s64) = G_CONSTANT i64 20 894 %select:_(s64) = G_SELECT %cond, %ten, %twenty 895 %two:_(s32) = G_CONSTANT i32 2 896 %ashr:_(s64) = G_ASHR %select, %two 897 S_ENDPGM 0, implicit %ashr 898... 899 900--- 901name: fold_ashr_into_select_s64_1 902tracksRegLiveness: true 903body: | 904 bb.0: 905 liveins: $vgpr0 906 ; CHECK-LABEL: name: fold_ashr_into_select_s64_1 907 ; CHECK: liveins: $vgpr0 908 ; CHECK-NEXT: {{ $}} 909 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 910 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 911 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 912 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 -1012 913 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 -253 914 ; CHECK-NEXT: %ashr:_(s64) = G_SELECT %cond(s1), [[C]], [[C1]] 915 ; CHECK-NEXT: S_ENDPGM 0, implicit %ashr(s64) 916 %reg:_(s32) = COPY $vgpr0 917 %zero:_(s32) = G_CONSTANT i32 0 918 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 919 %three:_(s32) = G_CONSTANT i32 3 920 %five:_(s32) = G_CONSTANT i32 5 921 %select:_(s32) = G_SELECT %cond, %three, %five 922 %val:_(s64) = G_CONSTANT i64 -8096 923 %ashr:_(s64) = G_ASHR %val, %select 924 S_ENDPGM 0, implicit %ashr 925... 926 927--- 928name: fold_smin_into_select_s32_0 929tracksRegLiveness: true 930body: | 931 bb.0: 932 liveins: $vgpr0 933 ; CHECK-LABEL: name: fold_smin_into_select_s32_0 934 ; CHECK: liveins: $vgpr0 935 ; CHECK-NEXT: {{ $}} 936 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 937 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 938 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 939 ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10 940 ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 941 ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty 942 ; CHECK-NEXT: S_ENDPGM 0, implicit %select(s32) 943 %reg:_(s32) = COPY $vgpr0 944 %zero:_(s32) = G_CONSTANT i32 0 945 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 946 %ten:_(s32) = G_CONSTANT i32 10 947 %twenty:_(s32) = G_CONSTANT i32 20 948 %select:_(s32) = G_SELECT %cond, %ten, %twenty 949 %thirty:_(s32) = G_CONSTANT i32 30 950 %smin:_(s32) = G_SMIN %select, %thirty 951 S_ENDPGM 0, implicit %smin 952... 953 954--- 955name: fold_smax_into_select_s32_0 956tracksRegLiveness: true 957body: | 958 bb.0: 959 liveins: $vgpr0 960 ; CHECK-LABEL: name: fold_smax_into_select_s32_0 961 ; CHECK: liveins: $vgpr0 962 ; CHECK-NEXT: {{ $}} 963 ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30 964 ; CHECK-NEXT: S_ENDPGM 0, implicit %thirty(s32) 965 %reg:_(s32) = COPY $vgpr0 966 %zero:_(s32) = G_CONSTANT i32 0 967 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 968 %ten:_(s32) = G_CONSTANT i32 10 969 %twenty:_(s32) = G_CONSTANT i32 20 970 %select:_(s32) = G_SELECT %cond, %ten, %twenty 971 %thirty:_(s32) = G_CONSTANT i32 30 972 %smax:_(s32) = G_SMAX %select, %thirty 973 S_ENDPGM 0, implicit %smax 974... 975 976--- 977name: fold_umin_into_select_s32_0 978tracksRegLiveness: true 979body: | 980 bb.0: 981 liveins: $vgpr0 982 ; CHECK-LABEL: name: fold_umin_into_select_s32_0 983 ; CHECK: liveins: $vgpr0 984 ; CHECK-NEXT: {{ $}} 985 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 986 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 987 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 988 ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10 989 ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 990 ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty 991 ; CHECK-NEXT: S_ENDPGM 0, implicit %select(s32) 992 %reg:_(s32) = COPY $vgpr0 993 %zero:_(s32) = G_CONSTANT i32 0 994 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 995 %ten:_(s32) = G_CONSTANT i32 10 996 %twenty:_(s32) = G_CONSTANT i32 20 997 %select:_(s32) = G_SELECT %cond, %ten, %twenty 998 %thirty:_(s32) = G_CONSTANT i32 30 999 %umin:_(s32) = G_UMIN %select, %thirty 1000 S_ENDPGM 0, implicit %umin 1001... 1002 1003--- 1004name: fold_umax_into_select_s32_0 1005tracksRegLiveness: true 1006body: | 1007 bb.0: 1008 liveins: $vgpr0 1009 ; CHECK-LABEL: name: fold_umax_into_select_s32_0 1010 ; CHECK: liveins: $vgpr0 1011 ; CHECK-NEXT: {{ $}} 1012 ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30 1013 ; CHECK-NEXT: S_ENDPGM 0, implicit %thirty(s32) 1014 %reg:_(s32) = COPY $vgpr0 1015 %zero:_(s32) = G_CONSTANT i32 0 1016 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 1017 %ten:_(s32) = G_CONSTANT i32 10 1018 %twenty:_(s32) = G_CONSTANT i32 20 1019 %select:_(s32) = G_SELECT %cond, %ten, %twenty 1020 %thirty:_(s32) = G_CONSTANT i32 30 1021 %umax:_(s32) = G_UMAX %select, %thirty 1022 S_ENDPGM 0, implicit %umax 1023... 1024 1025--- 1026name: fold_fadd_into_select_s32_0 1027tracksRegLiveness: true 1028body: | 1029 bb.0: 1030 liveins: $vgpr0 1031 ; CHECK-LABEL: name: fold_fadd_into_select_s32_0 1032 ; CHECK: liveins: $vgpr0 1033 ; CHECK-NEXT: {{ $}} 1034 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 1035 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 1036 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 1037 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.800000e+01 1038 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_FCONSTANT float 2.000000e+01 1039 ; CHECK-NEXT: %fadd:_(s32) = nnan G_SELECT %cond(s1), [[C]], [[C1]] 1040 ; CHECK-NEXT: S_ENDPGM 0, implicit %fadd(s32) 1041 %reg:_(s32) = COPY $vgpr0 1042 %zero:_(s32) = G_CONSTANT i32 0 1043 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 1044 %two:_(s32) = G_FCONSTANT float 2.0 1045 %four:_(s32) = G_FCONSTANT float 4.0 1046 %select:_(s32) = G_SELECT %cond, %two, %four 1047 %sixteen:_(s32) = G_FCONSTANT float 16.0 1048 %fadd:_(s32) = nnan G_FADD %select, %sixteen 1049 S_ENDPGM 0, implicit %fadd 1050... 1051 1052--- 1053name: fold_fadd_into_select_s32_1 1054tracksRegLiveness: true 1055body: | 1056 bb.0: 1057 liveins: $vgpr0 1058 ; CHECK-LABEL: name: fold_fadd_into_select_s32_1 1059 ; CHECK: liveins: $vgpr0 1060 ; CHECK-NEXT: {{ $}} 1061 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 1062 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 1063 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 1064 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.800000e+01 1065 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_FCONSTANT float 2.000000e+01 1066 ; CHECK-NEXT: %fadd:_(s32) = nnan G_SELECT %cond(s1), [[C]], [[C1]] 1067 ; CHECK-NEXT: S_ENDPGM 0, implicit %fadd(s32) 1068 %reg:_(s32) = COPY $vgpr0 1069 %zero:_(s32) = G_CONSTANT i32 0 1070 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 1071 %two:_(s32) = G_FCONSTANT float 2.0 1072 %four:_(s32) = G_FCONSTANT float 4.0 1073 %select:_(s32) = G_SELECT %cond, %two, %four 1074 %sixteen:_(s32) = G_FCONSTANT float 16.0 1075 %fadd:_(s32) = nnan G_FADD %sixteen, %select 1076 S_ENDPGM 0, implicit %fadd 1077... 1078 1079--- 1080name: fold_fsub_into_select_s32_0 1081tracksRegLiveness: true 1082body: | 1083 bb.0: 1084 liveins: $vgpr0 1085 ; CHECK-LABEL: name: fold_fsub_into_select_s32_0 1086 ; CHECK: liveins: $vgpr0 1087 ; CHECK-NEXT: {{ $}} 1088 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 1089 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 1090 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 1091 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float -1.400000e+01 1092 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_FCONSTANT float -1.200000e+01 1093 ; CHECK-NEXT: %fsub:_(s32) = nnan G_SELECT %cond(s1), [[C]], [[C1]] 1094 ; CHECK-NEXT: S_ENDPGM 0, implicit %fsub(s32) 1095 %reg:_(s32) = COPY $vgpr0 1096 %zero:_(s32) = G_CONSTANT i32 0 1097 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 1098 %two:_(s32) = G_FCONSTANT float 2.0 1099 %four:_(s32) = G_FCONSTANT float 4.0 1100 %select:_(s32) = G_SELECT %cond, %two, %four 1101 %sixteen:_(s32) = G_FCONSTANT float 16.0 1102 %fsub:_(s32) = nnan G_FSUB %select, %sixteen 1103 S_ENDPGM 0, implicit %fsub 1104... 1105 1106--- 1107name: fold_fmul_into_select_s32_0 1108tracksRegLiveness: true 1109body: | 1110 bb.0: 1111 liveins: $vgpr0 1112 ; CHECK-LABEL: name: fold_fmul_into_select_s32_0 1113 ; CHECK: liveins: $vgpr0 1114 ; CHECK-NEXT: {{ $}} 1115 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 1116 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 1117 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 1118 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 3.200000e+01 1119 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_FCONSTANT float 6.400000e+01 1120 ; CHECK-NEXT: %fmul:_(s32) = nnan G_SELECT %cond(s1), [[C]], [[C1]] 1121 ; CHECK-NEXT: S_ENDPGM 0, implicit %fmul(s32) 1122 %reg:_(s32) = COPY $vgpr0 1123 %zero:_(s32) = G_CONSTANT i32 0 1124 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 1125 %two:_(s32) = G_FCONSTANT float 2.0 1126 %four:_(s32) = G_FCONSTANT float 4.0 1127 %select:_(s32) = G_SELECT %cond, %two, %four 1128 %sixteen:_(s32) = G_FCONSTANT float 16.0 1129 %fmul:_(s32) = nnan G_FMUL %select, %sixteen 1130 S_ENDPGM 0, implicit %fmul 1131... 1132 1133--- 1134name: fold_fdiv_into_select_s32_0 1135tracksRegLiveness: true 1136body: | 1137 bb.0: 1138 liveins: $vgpr0 1139 ; CHECK-LABEL: name: fold_fdiv_into_select_s32_0 1140 ; CHECK: liveins: $vgpr0 1141 ; CHECK-NEXT: {{ $}} 1142 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 1143 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 1144 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 1145 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.250000e-01 1146 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_FCONSTANT float 2.500000e-01 1147 ; CHECK-NEXT: %fdiv:_(s32) = nnan G_SELECT %cond(s1), [[C]], [[C1]] 1148 ; CHECK-NEXT: S_ENDPGM 0, implicit %fdiv(s32) 1149 %reg:_(s32) = COPY $vgpr0 1150 %zero:_(s32) = G_CONSTANT i32 0 1151 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 1152 %two:_(s32) = G_FCONSTANT float 2.0 1153 %four:_(s32) = G_FCONSTANT float 4.0 1154 %select:_(s32) = G_SELECT %cond, %two, %four 1155 %sixteen:_(s32) = G_FCONSTANT float 16.0 1156 %fdiv:_(s32) = nnan G_FDIV %select, %sixteen 1157 S_ENDPGM 0, implicit %fdiv 1158... 1159 1160--- 1161name: fold_frem_into_select_s32_0 1162tracksRegLiveness: true 1163body: | 1164 bb.0: 1165 liveins: $vgpr0 1166 ; CHECK-LABEL: name: fold_frem_into_select_s32_0 1167 ; CHECK: liveins: $vgpr0 1168 ; CHECK-NEXT: {{ $}} 1169 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 1170 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 1171 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 1172 ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00 1173 ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 1174 ; CHECK-NEXT: %frem:_(s32) = nnan G_SELECT %cond(s1), %two, %four 1175 ; CHECK-NEXT: S_ENDPGM 0, implicit %frem(s32) 1176 %reg:_(s32) = COPY $vgpr0 1177 %zero:_(s32) = G_CONSTANT i32 0 1178 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 1179 %two:_(s32) = G_FCONSTANT float 2.0 1180 %four:_(s32) = G_FCONSTANT float 4.0 1181 %select:_(s32) = G_SELECT %cond, %two, %four 1182 %sixteen:_(s32) = G_FCONSTANT float 16.0 1183 %frem:_(s32) = nnan G_FREM %select, %sixteen 1184 S_ENDPGM 0, implicit %frem 1185... 1186 1187--- 1188name: fold_fpow_into_select_s32_0 1189tracksRegLiveness: true 1190body: | 1191 bb.0: 1192 liveins: $vgpr0 1193 ; CHECK-LABEL: name: fold_fpow_into_select_s32_0 1194 ; CHECK: liveins: $vgpr0 1195 ; CHECK-NEXT: {{ $}} 1196 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 1197 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 1198 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 1199 ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00 1200 ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 1201 ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %two, %four 1202 ; CHECK-NEXT: %sixteen:_(s32) = G_FCONSTANT float 1.600000e+01 1203 ; CHECK-NEXT: %fpow:_(s32) = nnan G_FPOW %select, %sixteen 1204 ; CHECK-NEXT: S_ENDPGM 0, implicit %fpow(s32) 1205 %reg:_(s32) = COPY $vgpr0 1206 %zero:_(s32) = G_CONSTANT i32 0 1207 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 1208 %two:_(s32) = G_FCONSTANT float 2.0 1209 %four:_(s32) = G_FCONSTANT float 4.0 1210 %select:_(s32) = G_SELECT %cond, %two, %four 1211 %sixteen:_(s32) = G_FCONSTANT float 16.0 1212 %fpow:_(s32) = nnan G_FPOW %select, %sixteen 1213 S_ENDPGM 0, implicit %fpow 1214... 1215 1216--- 1217name: fold_fminnum_into_select_s32_0 1218tracksRegLiveness: true 1219body: | 1220 bb.0: 1221 liveins: $vgpr0 1222 ; CHECK-LABEL: name: fold_fminnum_into_select_s32_0 1223 ; CHECK: liveins: $vgpr0 1224 ; CHECK-NEXT: {{ $}} 1225 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 1226 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 1227 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 1228 ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00 1229 ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 1230 ; CHECK-NEXT: %fminnum:_(s32) = nnan G_SELECT %cond(s1), %two, %four 1231 ; CHECK-NEXT: S_ENDPGM 0, implicit %fminnum(s32) 1232 %reg:_(s32) = COPY $vgpr0 1233 %zero:_(s32) = G_CONSTANT i32 0 1234 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 1235 %two:_(s32) = G_FCONSTANT float 2.0 1236 %four:_(s32) = G_FCONSTANT float 4.0 1237 %select:_(s32) = G_SELECT %cond, %two, %four 1238 %sixteen:_(s32) = G_FCONSTANT float 16.0 1239 %fminnum:_(s32) = nnan G_FMINNUM %select, %sixteen 1240 S_ENDPGM 0, implicit %fminnum 1241... 1242 1243--- 1244name: fold_fminnum_ieee_into_select_s32_0 1245tracksRegLiveness: true 1246body: | 1247 bb.0: 1248 liveins: $vgpr0 1249 ; CHECK-LABEL: name: fold_fminnum_ieee_into_select_s32_0 1250 ; CHECK: liveins: $vgpr0 1251 ; CHECK-NEXT: {{ $}} 1252 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 1253 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 1254 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 1255 ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00 1256 ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 1257 ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %two, %four 1258 ; CHECK-NEXT: %sixteen:_(s32) = G_FCONSTANT float 1.600000e+01 1259 ; CHECK-NEXT: %fminnum_ieee:_(s32) = nnan G_FMINNUM_IEEE %select, %sixteen 1260 ; CHECK-NEXT: S_ENDPGM 0, implicit %fminnum_ieee(s32) 1261 %reg:_(s32) = COPY $vgpr0 1262 %zero:_(s32) = G_CONSTANT i32 0 1263 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 1264 %two:_(s32) = G_FCONSTANT float 2.0 1265 %four:_(s32) = G_FCONSTANT float 4.0 1266 %select:_(s32) = G_SELECT %cond, %two, %four 1267 %sixteen:_(s32) = G_FCONSTANT float 16.0 1268 %fminnum_ieee:_(s32) = nnan G_FMINNUM_IEEE %select, %sixteen 1269 S_ENDPGM 0, implicit %fminnum_ieee 1270... 1271 1272--- 1273name: fold_fmaxnum_into_select_s32_0 1274tracksRegLiveness: true 1275body: | 1276 bb.0: 1277 liveins: $vgpr0 1278 ; CHECK-LABEL: name: fold_fmaxnum_into_select_s32_0 1279 ; CHECK: liveins: $vgpr0 1280 ; CHECK-NEXT: {{ $}} 1281 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 1282 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 1283 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 1284 ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 1285 ; CHECK-NEXT: %three:_(s32) = G_FCONSTANT float 3.000000e+00 1286 ; CHECK-NEXT: %fmaxnum:_(s32) = nnan G_SELECT %cond(s1), %three, %four 1287 ; CHECK-NEXT: S_ENDPGM 0, implicit %fmaxnum(s32) 1288 %reg:_(s32) = COPY $vgpr0 1289 %zero:_(s32) = G_CONSTANT i32 0 1290 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 1291 %two:_(s32) = G_FCONSTANT float 2.0 1292 %four:_(s32) = G_FCONSTANT float 4.0 1293 %select:_(s32) = G_SELECT %cond, %two, %four 1294 %three:_(s32) = G_FCONSTANT float 3.0 1295 %fmaxnum:_(s32) = nnan G_FMAXNUM %select, %three 1296 S_ENDPGM 0, implicit %fmaxnum 1297... 1298 1299--- 1300name: fold_fmaxnum_ieee_into_select_s32_0 1301tracksRegLiveness: true 1302body: | 1303 bb.0: 1304 liveins: $vgpr0 1305 ; CHECK-LABEL: name: fold_fmaxnum_ieee_into_select_s32_0 1306 ; CHECK: liveins: $vgpr0 1307 ; CHECK-NEXT: {{ $}} 1308 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 1309 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 1310 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 1311 ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00 1312 ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 1313 ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %two, %four 1314 ; CHECK-NEXT: %three:_(s32) = G_FCONSTANT float 3.000000e+00 1315 ; CHECK-NEXT: %fmaxnum_ieee:_(s32) = nnan G_FMAXNUM_IEEE %select, %three 1316 ; CHECK-NEXT: S_ENDPGM 0, implicit %fmaxnum_ieee(s32) 1317 %reg:_(s32) = COPY $vgpr0 1318 %zero:_(s32) = G_CONSTANT i32 0 1319 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 1320 %two:_(s32) = G_FCONSTANT float 2.0 1321 %four:_(s32) = G_FCONSTANT float 4.0 1322 %select:_(s32) = G_SELECT %cond, %two, %four 1323 %three:_(s32) = G_FCONSTANT float 3.0 1324 %fmaxnum_ieee:_(s32) = nnan G_FMAXNUM_IEEE %select, %three 1325 S_ENDPGM 0, implicit %fmaxnum_ieee 1326... 1327 1328--- 1329name: fold_fminimum_into_select_s32_0 1330tracksRegLiveness: true 1331body: | 1332 bb.0: 1333 liveins: $vgpr0 1334 ; CHECK-LABEL: name: fold_fminimum_into_select_s32_0 1335 ; CHECK: liveins: $vgpr0 1336 ; CHECK-NEXT: {{ $}} 1337 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 1338 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 1339 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 1340 ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00 1341 ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 1342 ; CHECK-NEXT: %fminimum:_(s32) = nnan G_SELECT %cond(s1), %two, %four 1343 ; CHECK-NEXT: S_ENDPGM 0, implicit %fminimum(s32) 1344 %reg:_(s32) = COPY $vgpr0 1345 %zero:_(s32) = G_CONSTANT i32 0 1346 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 1347 %two:_(s32) = G_FCONSTANT float 2.0 1348 %four:_(s32) = G_FCONSTANT float 4.0 1349 %select:_(s32) = G_SELECT %cond, %two, %four 1350 %sixteen:_(s32) = G_FCONSTANT float 16.0 1351 %fminimum:_(s32) = nnan G_FMINIMUM %select, %sixteen 1352 S_ENDPGM 0, implicit %fminimum 1353... 1354 1355--- 1356name: fold_fmaximum_into_select_s32_0 1357tracksRegLiveness: true 1358body: | 1359 bb.0: 1360 liveins: $vgpr0 1361 ; CHECK-LABEL: name: fold_fmaximum_into_select_s32_0 1362 ; CHECK: liveins: $vgpr0 1363 ; CHECK-NEXT: {{ $}} 1364 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 1365 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 1366 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 1367 ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 1368 ; CHECK-NEXT: %three:_(s32) = G_FCONSTANT float 3.000000e+00 1369 ; CHECK-NEXT: %fmaximum:_(s32) = nnan G_SELECT %cond(s1), %three, %four 1370 ; CHECK-NEXT: S_ENDPGM 0, implicit %fmaximum(s32) 1371 %reg:_(s32) = COPY $vgpr0 1372 %zero:_(s32) = G_CONSTANT i32 0 1373 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 1374 %two:_(s32) = G_FCONSTANT float 2.0 1375 %four:_(s32) = G_FCONSTANT float 4.0 1376 %select:_(s32) = G_SELECT %cond, %two, %four 1377 %three:_(s32) = G_FCONSTANT float 3.0 1378 %fmaximum:_(s32) = nnan G_FMAXIMUM %select, %three 1379 S_ENDPGM 0, implicit %fmaximum 1380... 1381 1382--- 1383name: fold_fcopysign_into_select_s32_0 1384tracksRegLiveness: true 1385body: | 1386 bb.0: 1387 liveins: $vgpr0 1388 ; CHECK-LABEL: name: fold_fcopysign_into_select_s32_0 1389 ; CHECK: liveins: $vgpr0 1390 ; CHECK-NEXT: {{ $}} 1391 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 1392 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 1393 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 1394 ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00 1395 ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 1396 ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %two, %four 1397 ; CHECK-NEXT: %sixteen:_(s32) = G_FCONSTANT float 1.600000e+01 1398 ; CHECK-NEXT: %fcopysign:_(s32) = nnan G_FCOPYSIGN %select, %sixteen(s32) 1399 ; CHECK-NEXT: S_ENDPGM 0, implicit %fcopysign(s32) 1400 %reg:_(s32) = COPY $vgpr0 1401 %zero:_(s32) = G_CONSTANT i32 0 1402 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 1403 %two:_(s32) = G_FCONSTANT float 2.0 1404 %four:_(s32) = G_FCONSTANT float 4.0 1405 %select:_(s32) = G_SELECT %cond, %two, %four 1406 %sixteen:_(s32) = G_FCONSTANT float 16.0 1407 %fcopysign:_(s32) = nnan G_FCOPYSIGN %select, %sixteen 1408 S_ENDPGM 0, implicit %fcopysign 1409... 1410 1411--- 1412name: fold_fcopysign_into_select_s32_s64_0 1413tracksRegLiveness: true 1414body: | 1415 bb.0: 1416 liveins: $vgpr0 1417 ; CHECK-LABEL: name: fold_fcopysign_into_select_s32_s64_0 1418 ; CHECK: liveins: $vgpr0 1419 ; CHECK-NEXT: {{ $}} 1420 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 1421 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 1422 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 1423 ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00 1424 ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 1425 ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %two, %four 1426 ; CHECK-NEXT: %sixteen:_(s64) = G_FCONSTANT double 1.600000e+01 1427 ; CHECK-NEXT: %fcopysign:_(s32) = nnan G_FCOPYSIGN %select, %sixteen(s64) 1428 ; CHECK-NEXT: S_ENDPGM 0, implicit %fcopysign(s32) 1429 %reg:_(s32) = COPY $vgpr0 1430 %zero:_(s32) = G_CONSTANT i32 0 1431 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 1432 %two:_(s32) = G_FCONSTANT float 2.0 1433 %four:_(s32) = G_FCONSTANT float 4.0 1434 %select:_(s32) = G_SELECT %cond, %two, %four 1435 %sixteen:_(s64) = G_FCONSTANT double 16.0 1436 %fcopysign:_(s32) = nnan G_FCOPYSIGN %select, %sixteen 1437 S_ENDPGM 0, implicit %fcopysign 1438... 1439 1440--- 1441name: fold_fcopysign_into_select_s64_s32_0 1442tracksRegLiveness: true 1443body: | 1444 bb.0: 1445 liveins: $vgpr0 1446 ; CHECK-LABEL: name: fold_fcopysign_into_select_s64_s32_0 1447 ; CHECK: liveins: $vgpr0 1448 ; CHECK-NEXT: {{ $}} 1449 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 1450 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 1451 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 1452 ; CHECK-NEXT: %two:_(s64) = G_FCONSTANT double 2.000000e+00 1453 ; CHECK-NEXT: %four:_(s64) = G_FCONSTANT double 4.000000e+00 1454 ; CHECK-NEXT: %select:_(s64) = G_SELECT %cond(s1), %two, %four 1455 ; CHECK-NEXT: %sixteen:_(s32) = G_FCONSTANT float 1.600000e+01 1456 ; CHECK-NEXT: %fcopysign:_(s64) = nnan G_FCOPYSIGN %select, %sixteen(s32) 1457 ; CHECK-NEXT: S_ENDPGM 0, implicit %fcopysign(s64) 1458 %reg:_(s32) = COPY $vgpr0 1459 %zero:_(s32) = G_CONSTANT i32 0 1460 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 1461 %two:_(s64) = G_FCONSTANT double 2.0 1462 %four:_(s64) = G_FCONSTANT double 4.0 1463 %select:_(s64) = G_SELECT %cond, %two, %four 1464 %sixteen:_(s32) = G_FCONSTANT float 16.0 1465 %fcopysign:_(s64) = nnan G_FCOPYSIGN %select, %sixteen 1466 S_ENDPGM 0, implicit %fcopysign 1467... 1468 1469# Test handling of intermediate copy between add and select. 1470--- 1471name: fold_add_copy_into_select_s32_0 1472tracksRegLiveness: true 1473body: | 1474 bb.0: 1475 liveins: $vgpr0 1476 ; CHECK-LABEL: name: fold_add_copy_into_select_s32_0 1477 ; CHECK: liveins: $vgpr0 1478 ; CHECK-NEXT: {{ $}} 1479 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 1480 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 1481 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 1482 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 40 1483 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 50 1484 ; CHECK-NEXT: %add:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]] 1485 ; CHECK-NEXT: S_ENDPGM 0, implicit %add(s32) 1486 %reg:_(s32) = COPY $vgpr0 1487 %zero:_(s32) = G_CONSTANT i32 0 1488 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 1489 %ten:_(s32) = G_CONSTANT i32 10 1490 %twenty:_(s32) = G_CONSTANT i32 20 1491 %select:_(s32) = G_SELECT %cond, %ten, %twenty 1492 %thirty:_(s32) = G_CONSTANT i32 30 1493 %copy_select:_(s32) = COPY %select 1494 %add:_(s32) = G_ADD %copy_select, %thirty 1495 S_ENDPGM 0, implicit %add 1496... 1497 1498--- 1499name: fold_add_copy_into_select_s32_1 1500tracksRegLiveness: true 1501body: | 1502 bb.0: 1503 liveins: $vgpr0 1504 ; CHECK-LABEL: name: fold_add_copy_into_select_s32_1 1505 ; CHECK: liveins: $vgpr0 1506 ; CHECK-NEXT: {{ $}} 1507 ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 1508 ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 1509 ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero 1510 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 40 1511 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 50 1512 ; CHECK-NEXT: %add:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]] 1513 ; CHECK-NEXT: S_ENDPGM 0, implicit %add(s32) 1514 %reg:_(s32) = COPY $vgpr0 1515 %zero:_(s32) = G_CONSTANT i32 0 1516 %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero 1517 %ten:_(s32) = G_CONSTANT i32 10 1518 %twenty:_(s32) = G_CONSTANT i32 20 1519 %select:_(s32) = G_SELECT %cond, %ten, %twenty 1520 %thirty:_(s32) = G_CONSTANT i32 30 1521 %copy_select:_(s32) = COPY %select 1522 %add:_(s32) = G_ADD %thirty, %copy_select 1523 S_ENDPGM 0, implicit %add 1524... 1525