| # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py |
| # RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -run-pass=amdgpu-prelegalizer-combiner -simplify-mir -verify-machineinstrs -o - %s | FileCheck %s |
| |
| --- |
| name: no_fold_add_into_select_s32_0_multi_use |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: no_fold_add_into_select_s32_0_multi_use |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10 |
| ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 |
| ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty |
| ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30 |
| ; CHECK-NEXT: %add:_(s32) = G_ADD %select, %thirty |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %add(s32), implicit %select(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %twenty:_(s32) = G_CONSTANT i32 20 |
| %select:_(s32) = G_SELECT %cond, %ten, %twenty |
| %thirty:_(s32) = G_CONSTANT i32 30 |
| %add:_(s32) = G_ADD %select, %thirty |
| S_ENDPGM 0, implicit %add, implicit %select |
| ... |
| |
| --- |
| name: no_fold_add_into_select_s32_1_multi_use |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: no_fold_add_into_select_s32_1_multi_use |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10 |
| ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 |
| ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty |
| ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30 |
| ; CHECK-NEXT: %add:_(s32) = G_ADD %thirty, %select |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %add(s32), implicit %select(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %twenty:_(s32) = G_CONSTANT i32 20 |
| %select:_(s32) = G_SELECT %cond, %ten, %twenty |
| %thirty:_(s32) = G_CONSTANT i32 30 |
| %add:_(s32) = G_ADD %thirty, %select |
| S_ENDPGM 0, implicit %add, implicit %select |
| ... |
| |
| --- |
| name: no_fold_sub_into_select_s32_nonconst_rhs |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0, $vgpr1 |
| ; CHECK-LABEL: name: no_fold_sub_into_select_s32_nonconst_rhs |
| ; CHECK: liveins: $vgpr0, $vgpr1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10 |
| ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 |
| ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty |
| ; CHECK-NEXT: %sub:_(s32) = G_SUB %select, %variable |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %sub(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %variable:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %twenty:_(s32) = G_CONSTANT i32 20 |
| %select:_(s32) = G_SELECT %cond, %ten, %twenty |
| %thirty:_(s32) = G_CONSTANT i32 30 |
| %sub:_(s32) = G_SUB %select, %variable |
| S_ENDPGM 0, implicit %sub |
| ... |
| |
| --- |
| name: no_fold_sub_into_select_s32_nonconst_lhs |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0, $vgpr1 |
| ; CHECK-LABEL: name: no_fold_sub_into_select_s32_nonconst_lhs |
| ; CHECK: liveins: $vgpr0, $vgpr1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10 |
| ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 |
| ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty |
| ; CHECK-NEXT: %sub:_(s32) = G_SUB %variable, %select |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %sub(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %variable:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %twenty:_(s32) = G_CONSTANT i32 20 |
| %select:_(s32) = G_SELECT %cond, %ten, %twenty |
| %thirty:_(s32) = G_CONSTANT i32 30 |
| %sub:_(s32) = G_SUB %variable, %select |
| S_ENDPGM 0, implicit %sub |
| ... |
| |
| --- |
| name: fold_add_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_add_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 40 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 50 |
| ; CHECK-NEXT: %add:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %add(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %twenty:_(s32) = G_CONSTANT i32 20 |
| %select:_(s32) = G_SELECT %cond, %ten, %twenty |
| %thirty:_(s32) = G_CONSTANT i32 30 |
| %add:_(s32) = G_ADD %select, %thirty |
| S_ENDPGM 0, implicit %add |
| ... |
| |
| --- |
| name: fold_add_into_select_s32_1 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_add_into_select_s32_1 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 40 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 50 |
| ; CHECK-NEXT: %add:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %add(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %twenty:_(s32) = G_CONSTANT i32 20 |
| %select:_(s32) = G_SELECT %cond, %ten, %twenty |
| %thirty:_(s32) = G_CONSTANT i32 30 |
| %add:_(s32) = G_ADD %thirty, %select |
| S_ENDPGM 0, implicit %add |
| ... |
| |
| --- |
| name: fold_add_into_select_v2s32_splat |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 |
| ; CHECK-LABEL: name: fold_add_into_select_v2s32_splat |
| ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg0:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| ; CHECK-NEXT: %reg1:_(<2 x s32>) = COPY $vgpr2_vgpr3 |
| ; CHECK-NEXT: %cond:_(<2 x s1>) = G_ICMP intpred(eq), %reg0(<2 x s32>), %reg1 |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 40 |
| ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32) |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 50 |
| ; CHECK-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C1]](s32), [[C1]](s32) |
| ; CHECK-NEXT: %add:_(<2 x s32>) = G_SELECT %cond(<2 x s1>), [[BUILD_VECTOR]], [[BUILD_VECTOR1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %add(<2 x s32>) |
| %reg0:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| %reg1:_(<2 x s32>) = COPY $vgpr2_vgpr3 |
| %cond:_(<2 x s1>) = G_ICMP intpred(eq), %reg0, %reg1 |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %twenty:_(s32) = G_CONSTANT i32 20 |
| %ten_vec:_(<2 x s32>) = G_BUILD_VECTOR %ten, %ten |
| %twenty_vec:_(<2 x s32>) = G_BUILD_VECTOR %twenty, %twenty |
| %select:_(<2 x s32>) = G_SELECT %cond, %ten_vec, %twenty_vec |
| %thirty:_(s32) = G_CONSTANT i32 30 |
| %thirty_vec:_(<2 x s32>) = G_BUILD_VECTOR %thirty, %thirty |
| %add:_(<2 x s32>) = G_ADD %select, %thirty_vec |
| S_ENDPGM 0, implicit %add |
| ... |
| |
| --- |
| name: fold_add_into_select_v2s32_nonsplat |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 |
| ; CHECK-LABEL: name: fold_add_into_select_v2s32_nonsplat |
| ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg0:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| ; CHECK-NEXT: %reg1:_(<2 x s32>) = COPY $vgpr2_vgpr3 |
| ; CHECK-NEXT: %cond:_(<2 x s1>) = G_ICMP intpred(eq), %reg0(<2 x s32>), %reg1 |
| ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 |
| ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30 |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 40 |
| ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C]](s32), %thirty(s32) |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 50 |
| ; CHECK-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C1]](s32), %twenty(s32) |
| ; CHECK-NEXT: %add:_(<2 x s32>) = G_SELECT %cond(<2 x s1>), [[BUILD_VECTOR]], [[BUILD_VECTOR1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %add(<2 x s32>) |
| %reg0:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| %reg1:_(<2 x s32>) = COPY $vgpr2_vgpr3 |
| %cond:_(<2 x s1>) = G_ICMP intpred(eq), %reg0, %reg1 |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %twenty:_(s32) = G_CONSTANT i32 20 |
| %const_vec0:_(<2 x s32>) = G_BUILD_VECTOR %ten, %twenty |
| %const_vec1:_(<2 x s32>) = G_BUILD_VECTOR %twenty, %ten |
| %select:_(<2 x s32>) = G_SELECT %cond, %const_vec0, %const_vec1 |
| %thirty:_(s32) = G_CONSTANT i32 30 |
| %const_vec3:_(<2 x s32>) = G_BUILD_VECTOR %thirty, %ten |
| %add:_(<2 x s32>) = G_ADD %select, %const_vec3 |
| S_ENDPGM 0, implicit %add |
| ... |
| |
| --- |
| name: fold_add_into_select_v2s32_nonsplat_undef |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 |
| ; CHECK-LABEL: name: fold_add_into_select_v2s32_nonsplat_undef |
| ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg0:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| ; CHECK-NEXT: %reg1:_(<2 x s32>) = COPY $vgpr2_vgpr3 |
| ; CHECK-NEXT: %cond:_(<2 x s1>) = G_ICMP intpred(eq), %reg0(<2 x s32>), %reg1 |
| ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 |
| ; CHECK-NEXT: %undef:_(s32) = G_IMPLICIT_DEF |
| ; CHECK-NEXT: %const_vec0:_(<2 x s32>) = G_BUILD_VECTOR %undef(s32), %twenty(s32) |
| ; CHECK-NEXT: %const_vec1:_(<2 x s32>) = G_BUILD_VECTOR %twenty(s32), %undef(s32) |
| ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30 |
| ; CHECK-NEXT: %const_vec3:_(<2 x s32>) = G_BUILD_VECTOR %thirty(s32), %undef(s32) |
| ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(<2 x s32>) = G_ADD %const_vec0, %const_vec3 |
| ; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(<2 x s32>) = G_ADD %const_vec1, %const_vec3 |
| ; CHECK-NEXT: %add:_(<2 x s32>) = G_SELECT %cond(<2 x s1>), [[ADD]], [[ADD1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %add(<2 x s32>) |
| %reg0:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| %reg1:_(<2 x s32>) = COPY $vgpr2_vgpr3 |
| %cond:_(<2 x s1>) = G_ICMP intpred(eq), %reg0, %reg1 |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %twenty:_(s32) = G_CONSTANT i32 20 |
| %undef:_(s32) = G_IMPLICIT_DEF |
| %const_vec0:_(<2 x s32>) = G_BUILD_VECTOR %undef, %twenty |
| %const_vec1:_(<2 x s32>) = G_BUILD_VECTOR %twenty, %undef |
| %select:_(<2 x s32>) = G_SELECT %cond, %const_vec0, %const_vec1 |
| %thirty:_(s32) = G_CONSTANT i32 30 |
| %const_vec3:_(<2 x s32>) = G_BUILD_VECTOR %thirty, %undef |
| %add:_(<2 x s32>) = G_ADD %select, %const_vec3 |
| S_ENDPGM 0, implicit %add |
| ... |
| |
| --- |
| name: fold_sub_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_sub_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 -20 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 -10 |
| ; CHECK-NEXT: %sub:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %sub(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %twenty:_(s32) = G_CONSTANT i32 20 |
| %select:_(s32) = G_SELECT %cond, %ten, %twenty |
| %thirty:_(s32) = G_CONSTANT i32 30 |
| %sub:_(s32) = G_SUB %select, %thirty |
| S_ENDPGM 0, implicit %sub |
| ... |
| |
| --- |
| name: fold_sub_into_select_s32_1 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_sub_into_select_s32_1 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10 |
| ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 |
| ; CHECK-NEXT: %sub:_(s32) = G_SELECT %cond(s1), %twenty, %ten |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %sub(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %twenty:_(s32) = G_CONSTANT i32 20 |
| %select:_(s32) = G_SELECT %cond, %ten, %twenty |
| %thirty:_(s32) = G_CONSTANT i32 30 |
| %sub:_(s32) = G_SUB %thirty, %select |
| S_ENDPGM 0, implicit %sub |
| ... |
| |
| --- |
| name: fold_ptr_add_into_select_p3_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_ptr_add_into_select_p3_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(p3) = G_CONSTANT i32 40 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(p3) = G_CONSTANT i32 50 |
| ; CHECK-NEXT: %ptr_add:_(p3) = G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %ptr_add(p3) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(p3) = G_CONSTANT i32 10 |
| %twenty:_(p3) = G_CONSTANT i32 20 |
| %select:_(p3) = G_SELECT %cond, %ten, %twenty |
| %thirty:_(s32) = G_CONSTANT i32 30 |
| %ptr_add:_(p3) = G_PTR_ADD %select, %thirty |
| S_ENDPGM 0, implicit %ptr_add |
| ... |
| |
| --- |
| name: fold_ptr_add_into_select_p3_1 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_ptr_add_into_select_p3_1 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(p3) = G_CONSTANT i32 40 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(p3) = G_CONSTANT i32 50 |
| ; CHECK-NEXT: %ptr_add:_(p3) = G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %ptr_add(p3) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %twenty:_(s32) = G_CONSTANT i32 20 |
| %select:_(s32) = G_SELECT %cond, %ten, %twenty |
| %thirty:_(p3) = G_CONSTANT i32 30 |
| %ptr_add:_(p3) = G_PTR_ADD %thirty, %select |
| S_ENDPGM 0, implicit %ptr_add |
| ... |
| |
| --- |
| name: fold_shl_into_select_s64_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_shl_into_select_s64_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1280 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2560 |
| ; CHECK-NEXT: %shl:_(s64) = G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %shl(s64) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s64) = G_CONSTANT i64 10 |
| %twenty:_(s64) = G_CONSTANT i64 20 |
| %select:_(s64) = G_SELECT %cond, %ten, %twenty |
| %seven:_(s32) = G_CONSTANT i32 7 |
| %shl:_(s64) = G_SHL %select, %seven |
| S_ENDPGM 0, implicit %shl |
| ... |
| |
| --- |
| name: fold_shl_into_select_s64_1 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_shl_into_select_s64_1 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 8192 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 524288 |
| ; CHECK-NEXT: %shl:_(s64) = G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %shl(s64) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %sixteen:_(s32) = G_CONSTANT i32 16 |
| %select:_(s32) = G_SELECT %cond, %ten, %sixteen |
| %eight:_(s64) = G_CONSTANT i64 8 |
| %shl:_(s64) = G_SHL %eight, %select |
| S_ENDPGM 0, implicit %shl |
| ... |
| |
| --- |
| name: fold_and_variable_into_select_zero_neg1_s32 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0, $vgpr1 |
| ; CHECK-LABEL: name: fold_and_variable_into_select_zero_neg1_s32 |
| ; CHECK: liveins: $vgpr0, $vgpr1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %and:_(s32) = G_SELECT %cond(s1), %zero, %variable |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %and(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %variable:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %neg1:_(s32) = G_CONSTANT i32 -1 |
| %select:_(s32) = G_SELECT %cond, %zero, %neg1 |
| %and:_(s32) = G_AND %select, %variable |
| S_ENDPGM 0, implicit %and |
| ... |
| |
| --- |
| name: fold_and_variable_into_select_neg1_zero_s32 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0, $vgpr1 |
| ; CHECK-LABEL: name: fold_and_variable_into_select_neg1_zero_s32 |
| ; CHECK: liveins: $vgpr0, $vgpr1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %and:_(s32) = G_SELECT %cond(s1), %variable, %zero |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %and(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %variable:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %neg1:_(s32) = G_CONSTANT i32 -1 |
| %select:_(s32) = G_SELECT %cond, %neg1, %zero |
| %and:_(s32) = G_AND %select, %variable |
| S_ENDPGM 0, implicit %and |
| ... |
| |
| --- |
| name: fold_or_variable_into_select_zero_neg1_s32 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0, $vgpr1 |
| ; CHECK-LABEL: name: fold_or_variable_into_select_zero_neg1_s32 |
| ; CHECK: liveins: $vgpr0, $vgpr1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %neg1:_(s32) = G_CONSTANT i32 -1 |
| ; CHECK-NEXT: %or:_(s32) = G_SELECT %cond(s1), %variable, %neg1 |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %or(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %variable:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %neg1:_(s32) = G_CONSTANT i32 -1 |
| %select:_(s32) = G_SELECT %cond, %zero, %neg1 |
| %or:_(s32) = G_OR %select, %variable |
| S_ENDPGM 0, implicit %or |
| ... |
| |
| --- |
| name: fold_or_variable_into_select_neg1_zero_s32 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0, $vgpr1 |
| ; CHECK-LABEL: name: fold_or_variable_into_select_neg1_zero_s32 |
| ; CHECK: liveins: $vgpr0, $vgpr1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %neg1:_(s32) = G_CONSTANT i32 -1 |
| ; CHECK-NEXT: %or:_(s32) = G_SELECT %cond(s1), %neg1, %variable |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %or(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %variable:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %neg1:_(s32) = G_CONSTANT i32 -1 |
| %select:_(s32) = G_SELECT %cond, %neg1, %zero |
| %or:_(s32) = G_OR %select, %variable |
| S_ENDPGM 0, implicit %or |
| ... |
| |
| --- |
| name: fold_and_variable_into_select_undef_neg1_s32 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0, $vgpr1 |
| ; CHECK-LABEL: name: fold_and_variable_into_select_undef_neg1_s32 |
| ; CHECK: liveins: $vgpr0, $vgpr1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %undef:_(s32) = G_IMPLICIT_DEF |
| ; CHECK-NEXT: %neg1:_(s32) = G_CONSTANT i32 -1 |
| ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %undef, %neg1 |
| ; CHECK-NEXT: %and:_(s32) = G_AND %select, %variable |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %and(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %variable:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %undef:_(s32) = G_IMPLICIT_DEF |
| %neg1:_(s32) = G_CONSTANT i32 -1 |
| %select:_(s32) = G_SELECT %cond, %undef, %neg1 |
| %and:_(s32) = G_AND %select, %variable |
| S_ENDPGM 0, implicit %and |
| ... |
| |
| --- |
| name: fold_and_variable_into_select_undef_zero_s32 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0, $vgpr1 |
| ; CHECK-LABEL: name: fold_and_variable_into_select_undef_zero_s32 |
| ; CHECK: liveins: $vgpr0, $vgpr1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %undef:_(s32) = G_IMPLICIT_DEF |
| ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %undef, %zero |
| ; CHECK-NEXT: %and:_(s32) = G_AND %select, %variable |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %and(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %variable:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %undef:_(s32) = G_IMPLICIT_DEF |
| %select:_(s32) = G_SELECT %cond, %undef, %zero |
| %and:_(s32) = G_AND %select, %variable |
| S_ENDPGM 0, implicit %and |
| ... |
| |
| --- |
| name: fold_or_variable_into_select_neg1_fpzero_s32 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0, $vgpr1 |
| ; CHECK-LABEL: name: fold_or_variable_into_select_neg1_fpzero_s32 |
| ; CHECK: liveins: $vgpr0, $vgpr1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %neg1:_(s32) = G_CONSTANT i32 -1 |
| ; CHECK-NEXT: %fpzero:_(s32) = G_FCONSTANT float 0.000000e+00 |
| ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR %fpzero, %variable |
| ; CHECK-NEXT: %or:_(s32) = G_SELECT %cond(s1), %neg1, [[OR]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %or(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %variable:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %neg1:_(s32) = G_CONSTANT i32 -1 |
| %fpzero:_(s32) = G_FCONSTANT float 0.0 |
| %select:_(s32) = G_SELECT %cond, %neg1, %fpzero |
| %or:_(s32) = G_OR %select, %variable |
| S_ENDPGM 0, implicit %or |
| ... |
| |
| --- |
| name: no_fold_or_variable_into_select_neg1_fpnegzero_s32 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0, $vgpr1 |
| ; CHECK-LABEL: name: no_fold_or_variable_into_select_neg1_fpnegzero_s32 |
| ; CHECK: liveins: $vgpr0, $vgpr1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %neg1:_(s32) = G_CONSTANT i32 -1 |
| ; CHECK-NEXT: %fpzero:_(s32) = G_FCONSTANT float -0.000000e+00 |
| ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %neg1, %fpzero |
| ; CHECK-NEXT: %or:_(s32) = G_OR %select, %variable |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %or(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %variable:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %neg1:_(s32) = G_CONSTANT i32 -1 |
| %fpzero:_(s32) = G_FCONSTANT float -0.0 |
| %select:_(s32) = G_SELECT %cond, %neg1, %fpzero |
| %or:_(s32) = G_OR %select, %variable |
| S_ENDPGM 0, implicit %or |
| ... |
| |
| --- |
| name: no_fold_or_variable_into_select_neg1_other_const_s32 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0, $vgpr1 |
| ; CHECK-LABEL: name: no_fold_or_variable_into_select_neg1_other_const_s32 |
| ; CHECK: liveins: $vgpr0, $vgpr1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %neg1:_(s32) = G_CONSTANT i32 -1 |
| ; CHECK-NEXT: %otherconst:_(s32) = G_CONSTANT i32 123 |
| ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %neg1, %otherconst |
| ; CHECK-NEXT: %or:_(s32) = G_OR %select, %variable |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %or(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %variable:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %neg1:_(s32) = G_CONSTANT i32 -1 |
| %otherconst:_(s32) = G_CONSTANT i32 123 |
| %select:_(s32) = G_SELECT %cond, %neg1, %otherconst |
| %or:_(s32) = G_OR %select, %variable |
| S_ENDPGM 0, implicit %or |
| ... |
| |
| --- |
| name: fold_xor_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_xor_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10 |
| ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 |
| ; CHECK-NEXT: %xor:_(s32) = G_SELECT %cond(s1), %twenty, %ten |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %xor(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %twenty:_(s32) = G_CONSTANT i32 20 |
| %select:_(s32) = G_SELECT %cond, %ten, %twenty |
| %thirty:_(s32) = G_CONSTANT i32 30 |
| %xor:_(s32) = G_XOR %select, %thirty |
| S_ENDPGM 0, implicit %xor |
| ... |
| |
| --- |
| name: fold_sdiv_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_sdiv_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 50 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 21 |
| ; CHECK-NEXT: %sdiv:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %sdiv(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %hundred:_(s32) = G_CONSTANT i32 100 |
| %fortytwo:_(s32) = G_CONSTANT i32 42 |
| %select:_(s32) = G_SELECT %cond, %hundred, %fortytwo |
| %two:_(s32) = G_CONSTANT i32 2 |
| %sdiv:_(s32) = G_SDIV %select, %two |
| S_ENDPGM 0, implicit %sdiv |
| ... |
| |
| --- |
| name: fold_srem_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_srem_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 |
| ; CHECK-NEXT: %srem:_(s32) = G_SELECT %cond(s1), [[C]], %zero |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %srem(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %hundred:_(s32) = G_CONSTANT i32 100 |
| %fortytwo:_(s32) = G_CONSTANT i32 42 |
| %select:_(s32) = G_SELECT %cond, %hundred, %fortytwo |
| %three:_(s32) = G_CONSTANT i32 3 |
| %srem:_(s32) = G_SREM %select, %three |
| S_ENDPGM 0, implicit %srem |
| ... |
| |
| --- |
| name: fold_udiv_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_udiv_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 50 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 21 |
| ; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit [[SELECT]](s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %hundred:_(s32) = G_CONSTANT i32 100 |
| %fortytwo:_(s32) = G_CONSTANT i32 42 |
| %select:_(s32) = G_SELECT %cond, %hundred, %fortytwo |
| %two:_(s32) = G_CONSTANT i32 2 |
| %udiv:_(s32) = G_UDIV %select, %two |
| S_ENDPGM 0, implicit %udiv |
| ... |
| |
| --- |
| name: fold_urem_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_urem_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 |
| ; CHECK-NEXT: %udiv:_(s32) = G_SELECT %cond(s1), [[C]], %zero |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %udiv(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %hundred:_(s32) = G_CONSTANT i32 100 |
| %fortytwo:_(s32) = G_CONSTANT i32 42 |
| %select:_(s32) = G_SELECT %cond, %hundred, %fortytwo |
| %three:_(s32) = G_CONSTANT i32 3 |
| %udiv:_(s32) = G_UREM %select, %three |
| S_ENDPGM 0, implicit %udiv |
| ... |
| |
| --- |
| name: fold_lshr_into_select_s64_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_lshr_into_select_s64_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 2 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 5 |
| ; CHECK-NEXT: %lshr:_(s64) = G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %lshr(s64) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s64) = G_CONSTANT i64 10 |
| %twenty:_(s64) = G_CONSTANT i64 20 |
| %select:_(s64) = G_SELECT %cond, %ten, %twenty |
| %two:_(s32) = G_CONSTANT i32 2 |
| %lshr:_(s64) = G_LSHR %select, %two |
| S_ENDPGM 0, implicit %lshr |
| ... |
| |
| --- |
| name: fold_lshr_into_select_s64_1 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_lshr_into_select_s64_1 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1012 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 253 |
| ; CHECK-NEXT: %lshr:_(s64) = G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %lshr(s64) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %three:_(s32) = G_CONSTANT i32 3 |
| %five:_(s32) = G_CONSTANT i32 5 |
| %select:_(s32) = G_SELECT %cond, %three, %five |
| %val:_(s64) = G_CONSTANT i64 8096 |
| %lshr:_(s64) = G_LSHR %val, %select |
| S_ENDPGM 0, implicit %lshr |
| ... |
| |
| --- |
| name: fold_ashr_into_select_s64_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_ashr_into_select_s64_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 2 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 5 |
| ; CHECK-NEXT: %ashr:_(s64) = G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %ashr(s64) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s64) = G_CONSTANT i64 10 |
| %twenty:_(s64) = G_CONSTANT i64 20 |
| %select:_(s64) = G_SELECT %cond, %ten, %twenty |
| %two:_(s32) = G_CONSTANT i32 2 |
| %ashr:_(s64) = G_ASHR %select, %two |
| S_ENDPGM 0, implicit %ashr |
| ... |
| |
| --- |
| name: fold_ashr_into_select_s64_1 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_ashr_into_select_s64_1 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 -1012 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 -253 |
| ; CHECK-NEXT: %ashr:_(s64) = G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %ashr(s64) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %three:_(s32) = G_CONSTANT i32 3 |
| %five:_(s32) = G_CONSTANT i32 5 |
| %select:_(s32) = G_SELECT %cond, %three, %five |
| %val:_(s64) = G_CONSTANT i64 -8096 |
| %ashr:_(s64) = G_ASHR %val, %select |
| S_ENDPGM 0, implicit %ashr |
| ... |
| |
| --- |
| name: fold_smin_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_smin_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10 |
| ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 |
| ; CHECK-NEXT: %smin:_(s32) = G_SELECT %cond(s1), %ten, %twenty |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %smin(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %twenty:_(s32) = G_CONSTANT i32 20 |
| %select:_(s32) = G_SELECT %cond, %ten, %twenty |
| %thirty:_(s32) = G_CONSTANT i32 30 |
| %smin:_(s32) = G_SMIN %select, %thirty |
| S_ENDPGM 0, implicit %smin |
| ... |
| |
| --- |
| name: fold_smax_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_smax_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30 |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %thirty(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %twenty:_(s32) = G_CONSTANT i32 20 |
| %select:_(s32) = G_SELECT %cond, %ten, %twenty |
| %thirty:_(s32) = G_CONSTANT i32 30 |
| %smax:_(s32) = G_SMAX %select, %thirty |
| S_ENDPGM 0, implicit %smax |
| ... |
| |
| --- |
| name: fold_umin_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_umin_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10 |
| ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20 |
| ; CHECK-NEXT: %umin:_(s32) = G_SELECT %cond(s1), %ten, %twenty |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %umin(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %twenty:_(s32) = G_CONSTANT i32 20 |
| %select:_(s32) = G_SELECT %cond, %ten, %twenty |
| %thirty:_(s32) = G_CONSTANT i32 30 |
| %umin:_(s32) = G_UMIN %select, %thirty |
| S_ENDPGM 0, implicit %umin |
| ... |
| |
| --- |
| name: fold_umax_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_umax_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30 |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %thirty(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %twenty:_(s32) = G_CONSTANT i32 20 |
| %select:_(s32) = G_SELECT %cond, %ten, %twenty |
| %thirty:_(s32) = G_CONSTANT i32 30 |
| %umax:_(s32) = G_UMAX %select, %thirty |
| S_ENDPGM 0, implicit %umax |
| ... |
| |
| --- |
| name: fold_fadd_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_fadd_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.800000e+01 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_FCONSTANT float 2.000000e+01 |
| ; CHECK-NEXT: %fadd:_(s32) = nnan G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %fadd(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %two:_(s32) = G_FCONSTANT float 2.0 |
| %four:_(s32) = G_FCONSTANT float 4.0 |
| %select:_(s32) = G_SELECT %cond, %two, %four |
| %sixteen:_(s32) = G_FCONSTANT float 16.0 |
| %fadd:_(s32) = nnan G_FADD %select, %sixteen |
| S_ENDPGM 0, implicit %fadd |
| ... |
| |
| --- |
| name: fold_fadd_into_select_s32_1 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_fadd_into_select_s32_1 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.800000e+01 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_FCONSTANT float 2.000000e+01 |
| ; CHECK-NEXT: %fadd:_(s32) = nnan G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %fadd(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %two:_(s32) = G_FCONSTANT float 2.0 |
| %four:_(s32) = G_FCONSTANT float 4.0 |
| %select:_(s32) = G_SELECT %cond, %two, %four |
| %sixteen:_(s32) = G_FCONSTANT float 16.0 |
| %fadd:_(s32) = nnan G_FADD %sixteen, %select |
| S_ENDPGM 0, implicit %fadd |
| ... |
| |
| --- |
| name: fold_fsub_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_fsub_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float -1.400000e+01 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_FCONSTANT float -1.200000e+01 |
| ; CHECK-NEXT: %fsub:_(s32) = nnan G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %fsub(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %two:_(s32) = G_FCONSTANT float 2.0 |
| %four:_(s32) = G_FCONSTANT float 4.0 |
| %select:_(s32) = G_SELECT %cond, %two, %four |
| %sixteen:_(s32) = G_FCONSTANT float 16.0 |
| %fsub:_(s32) = nnan G_FSUB %select, %sixteen |
| S_ENDPGM 0, implicit %fsub |
| ... |
| |
| --- |
| name: fold_fmul_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_fmul_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 3.200000e+01 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_FCONSTANT float 6.400000e+01 |
| ; CHECK-NEXT: %fmul:_(s32) = nnan G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %fmul(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %two:_(s32) = G_FCONSTANT float 2.0 |
| %four:_(s32) = G_FCONSTANT float 4.0 |
| %select:_(s32) = G_SELECT %cond, %two, %four |
| %sixteen:_(s32) = G_FCONSTANT float 16.0 |
| %fmul:_(s32) = nnan G_FMUL %select, %sixteen |
| S_ENDPGM 0, implicit %fmul |
| ... |
| |
| --- |
| name: fold_fdiv_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_fdiv_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.250000e-01 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_FCONSTANT float 2.500000e-01 |
| ; CHECK-NEXT: %fdiv:_(s32) = nnan G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %fdiv(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %two:_(s32) = G_FCONSTANT float 2.0 |
| %four:_(s32) = G_FCONSTANT float 4.0 |
| %select:_(s32) = G_SELECT %cond, %two, %four |
| %sixteen:_(s32) = G_FCONSTANT float 16.0 |
| %fdiv:_(s32) = nnan G_FDIV %select, %sixteen |
| S_ENDPGM 0, implicit %fdiv |
| ... |
| |
| --- |
| name: fold_frem_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_frem_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00 |
| ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 |
| ; CHECK-NEXT: %frem:_(s32) = nnan G_SELECT %cond(s1), %two, %four |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %frem(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %two:_(s32) = G_FCONSTANT float 2.0 |
| %four:_(s32) = G_FCONSTANT float 4.0 |
| %select:_(s32) = G_SELECT %cond, %two, %four |
| %sixteen:_(s32) = G_FCONSTANT float 16.0 |
| %frem:_(s32) = nnan G_FREM %select, %sixteen |
| S_ENDPGM 0, implicit %frem |
| ... |
| |
| --- |
| name: fold_fpow_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_fpow_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00 |
| ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 |
| ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %two, %four |
| ; CHECK-NEXT: %sixteen:_(s32) = G_FCONSTANT float 1.600000e+01 |
| ; CHECK-NEXT: %fpow:_(s32) = nnan G_FPOW %select, %sixteen |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %fpow(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %two:_(s32) = G_FCONSTANT float 2.0 |
| %four:_(s32) = G_FCONSTANT float 4.0 |
| %select:_(s32) = G_SELECT %cond, %two, %four |
| %sixteen:_(s32) = G_FCONSTANT float 16.0 |
| %fpow:_(s32) = nnan G_FPOW %select, %sixteen |
| S_ENDPGM 0, implicit %fpow |
| ... |
| |
| --- |
| name: fold_fminnum_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_fminnum_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00 |
| ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 |
| ; CHECK-NEXT: %fminnum:_(s32) = nnan G_SELECT %cond(s1), %two, %four |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %fminnum(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %two:_(s32) = G_FCONSTANT float 2.0 |
| %four:_(s32) = G_FCONSTANT float 4.0 |
| %select:_(s32) = G_SELECT %cond, %two, %four |
| %sixteen:_(s32) = G_FCONSTANT float 16.0 |
| %fminnum:_(s32) = nnan G_FMINNUM %select, %sixteen |
| S_ENDPGM 0, implicit %fminnum |
| ... |
| |
| --- |
| name: fold_fminnum_ieee_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_fminnum_ieee_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00 |
| ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 |
| ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %two, %four |
| ; CHECK-NEXT: %sixteen:_(s32) = G_FCONSTANT float 1.600000e+01 |
| ; CHECK-NEXT: %fminnum_ieee:_(s32) = nnan G_FMINNUM_IEEE %select, %sixteen |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %fminnum_ieee(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %two:_(s32) = G_FCONSTANT float 2.0 |
| %four:_(s32) = G_FCONSTANT float 4.0 |
| %select:_(s32) = G_SELECT %cond, %two, %four |
| %sixteen:_(s32) = G_FCONSTANT float 16.0 |
| %fminnum_ieee:_(s32) = nnan G_FMINNUM_IEEE %select, %sixteen |
| S_ENDPGM 0, implicit %fminnum_ieee |
| ... |
| |
| --- |
| name: fold_fmaxnum_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_fmaxnum_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 |
| ; CHECK-NEXT: %three:_(s32) = G_FCONSTANT float 3.000000e+00 |
| ; CHECK-NEXT: %fmaxnum:_(s32) = nnan G_SELECT %cond(s1), %three, %four |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %fmaxnum(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %two:_(s32) = G_FCONSTANT float 2.0 |
| %four:_(s32) = G_FCONSTANT float 4.0 |
| %select:_(s32) = G_SELECT %cond, %two, %four |
| %three:_(s32) = G_FCONSTANT float 3.0 |
| %fmaxnum:_(s32) = nnan G_FMAXNUM %select, %three |
| S_ENDPGM 0, implicit %fmaxnum |
| ... |
| |
| --- |
| name: fold_fmaxnum_ieee_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_fmaxnum_ieee_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00 |
| ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 |
| ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %two, %four |
| ; CHECK-NEXT: %three:_(s32) = G_FCONSTANT float 3.000000e+00 |
| ; CHECK-NEXT: %fmaxnum_ieee:_(s32) = nnan G_FMAXNUM_IEEE %select, %three |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %fmaxnum_ieee(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %two:_(s32) = G_FCONSTANT float 2.0 |
| %four:_(s32) = G_FCONSTANT float 4.0 |
| %select:_(s32) = G_SELECT %cond, %two, %four |
| %three:_(s32) = G_FCONSTANT float 3.0 |
| %fmaxnum_ieee:_(s32) = nnan G_FMAXNUM_IEEE %select, %three |
| S_ENDPGM 0, implicit %fmaxnum_ieee |
| ... |
| |
| --- |
| name: fold_fminimum_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_fminimum_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00 |
| ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 |
| ; CHECK-NEXT: %fminimum:_(s32) = nnan G_SELECT %cond(s1), %two, %four |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %fminimum(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %two:_(s32) = G_FCONSTANT float 2.0 |
| %four:_(s32) = G_FCONSTANT float 4.0 |
| %select:_(s32) = G_SELECT %cond, %two, %four |
| %sixteen:_(s32) = G_FCONSTANT float 16.0 |
| %fminimum:_(s32) = nnan G_FMINIMUM %select, %sixteen |
| S_ENDPGM 0, implicit %fminimum |
| ... |
| |
| --- |
| name: fold_fmaximum_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_fmaximum_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 |
| ; CHECK-NEXT: %three:_(s32) = G_FCONSTANT float 3.000000e+00 |
| ; CHECK-NEXT: %fmaximum:_(s32) = nnan G_SELECT %cond(s1), %three, %four |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %fmaximum(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %two:_(s32) = G_FCONSTANT float 2.0 |
| %four:_(s32) = G_FCONSTANT float 4.0 |
| %select:_(s32) = G_SELECT %cond, %two, %four |
| %three:_(s32) = G_FCONSTANT float 3.0 |
| %fmaximum:_(s32) = nnan G_FMAXIMUM %select, %three |
| S_ENDPGM 0, implicit %fmaximum |
| ... |
| |
| --- |
| name: fold_fcopysign_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_fcopysign_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00 |
| ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 |
| ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %two, %four |
| ; CHECK-NEXT: %sixteen:_(s32) = G_FCONSTANT float 1.600000e+01 |
| ; CHECK-NEXT: %fcopysign:_(s32) = nnan G_FCOPYSIGN %select, %sixteen(s32) |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %fcopysign(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %two:_(s32) = G_FCONSTANT float 2.0 |
| %four:_(s32) = G_FCONSTANT float 4.0 |
| %select:_(s32) = G_SELECT %cond, %two, %four |
| %sixteen:_(s32) = G_FCONSTANT float 16.0 |
| %fcopysign:_(s32) = nnan G_FCOPYSIGN %select, %sixteen |
| S_ENDPGM 0, implicit %fcopysign |
| ... |
| |
| --- |
| name: fold_fcopysign_into_select_s32_s64_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_fcopysign_into_select_s32_s64_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00 |
| ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00 |
| ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %two, %four |
| ; CHECK-NEXT: %sixteen:_(s64) = G_FCONSTANT double 1.600000e+01 |
| ; CHECK-NEXT: %fcopysign:_(s32) = nnan G_FCOPYSIGN %select, %sixteen(s64) |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %fcopysign(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %two:_(s32) = G_FCONSTANT float 2.0 |
| %four:_(s32) = G_FCONSTANT float 4.0 |
| %select:_(s32) = G_SELECT %cond, %two, %four |
| %sixteen:_(s64) = G_FCONSTANT double 16.0 |
| %fcopysign:_(s32) = nnan G_FCOPYSIGN %select, %sixteen |
| S_ENDPGM 0, implicit %fcopysign |
| ... |
| |
| --- |
| name: fold_fcopysign_into_select_s64_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_fcopysign_into_select_s64_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: %two:_(s64) = G_FCONSTANT double 2.000000e+00 |
| ; CHECK-NEXT: %four:_(s64) = G_FCONSTANT double 4.000000e+00 |
| ; CHECK-NEXT: %select:_(s64) = G_SELECT %cond(s1), %two, %four |
| ; CHECK-NEXT: %sixteen:_(s32) = G_FCONSTANT float 1.600000e+01 |
| ; CHECK-NEXT: %fcopysign:_(s64) = nnan G_FCOPYSIGN %select, %sixteen(s32) |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %fcopysign(s64) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %two:_(s64) = G_FCONSTANT double 2.0 |
| %four:_(s64) = G_FCONSTANT double 4.0 |
| %select:_(s64) = G_SELECT %cond, %two, %four |
| %sixteen:_(s32) = G_FCONSTANT float 16.0 |
| %fcopysign:_(s64) = nnan G_FCOPYSIGN %select, %sixteen |
| S_ENDPGM 0, implicit %fcopysign |
| ... |
| |
| # Test handling of intermediate copy between add and select. |
| --- |
| name: fold_add_copy_into_select_s32_0 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_add_copy_into_select_s32_0 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 40 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 50 |
| ; CHECK-NEXT: %add:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %add(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %twenty:_(s32) = G_CONSTANT i32 20 |
| %select:_(s32) = G_SELECT %cond, %ten, %twenty |
| %thirty:_(s32) = G_CONSTANT i32 30 |
| %copy_select:_(s32) = COPY %select |
| %add:_(s32) = G_ADD %copy_select, %thirty |
| S_ENDPGM 0, implicit %add |
| ... |
| |
| --- |
| name: fold_add_copy_into_select_s32_1 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0 |
| ; CHECK-LABEL: name: fold_add_copy_into_select_s32_1 |
| ; CHECK: liveins: $vgpr0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0 |
| ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0 |
| ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 40 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 50 |
| ; CHECK-NEXT: %add:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]] |
| ; CHECK-NEXT: S_ENDPGM 0, implicit %add(s32) |
| %reg:_(s32) = COPY $vgpr0 |
| %zero:_(s32) = G_CONSTANT i32 0 |
| %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero |
| %ten:_(s32) = G_CONSTANT i32 10 |
| %twenty:_(s32) = G_CONSTANT i32 20 |
| %select:_(s32) = G_SELECT %cond, %ten, %twenty |
| %thirty:_(s32) = G_CONSTANT i32 30 |
| %copy_select:_(s32) = COPY %select |
| %add:_(s32) = G_ADD %thirty, %copy_select |
| S_ENDPGM 0, implicit %add |
| ... |