[llvm] 5847d5f - AMDGPU/GlobalISel: Add baseline test for binop fold into select combine

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 8 15:17:27 PST 2022


Author: Matt Arsenault
Date: 2022-02-08T18:17:21-05:00
New Revision: 5847d5fb24c30caa92b0e7a74d6bd64376f568a5

URL: https://github.com/llvm/llvm-project/commit/5847d5fb24c30caa92b0e7a74d6bd64376f568a5
DIFF: https://github.com/llvm/llvm-project/commit/5847d5fb24c30caa92b0e7a74d6bd64376f568a5.diff

LOG: AMDGPU/GlobalISel: Add baseline test for binop fold into select combine

Added: 
    llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fold-binop-into-select.mir

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fold-binop-into-select.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fold-binop-into-select.mir
new file mode 100644
index 0000000000000..f80a2c0101587
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fold-binop-into-select.mir
@@ -0,0 +1,1612 @@
+# 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: %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)
+    %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: %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)
+    %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: %ten:_(s32) = G_CONSTANT i32 10
+    ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20
+    ; CHECK-NEXT: %ten_vec:_(<2 x s32>) = G_BUILD_VECTOR %ten(s32), %ten(s32)
+    ; CHECK-NEXT: %twenty_vec:_(<2 x s32>) = G_BUILD_VECTOR %twenty(s32), %twenty(s32)
+    ; CHECK-NEXT: %select:_(<2 x s32>) = G_SELECT %cond(<2 x s1>), %ten_vec, %twenty_vec
+    ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30
+    ; CHECK-NEXT: %thirty_vec:_(<2 x s32>) = G_BUILD_VECTOR %thirty(s32), %thirty(s32)
+    ; CHECK-NEXT: %add:_(<2 x s32>) = G_ADD %select, %thirty_vec
+    ; 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: %ten:_(s32) = G_CONSTANT i32 10
+    ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20
+    ; CHECK-NEXT: %const_vec0:_(<2 x s32>) = G_BUILD_VECTOR %ten(s32), %twenty(s32)
+    ; CHECK-NEXT: %const_vec1:_(<2 x s32>) = G_BUILD_VECTOR %twenty(s32), %ten(s32)
+    ; CHECK-NEXT: %select:_(<2 x s32>) = G_SELECT %cond(<2 x s1>), %const_vec0, %const_vec1
+    ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30
+    ; CHECK-NEXT: %const_vec3:_(<2 x s32>) = G_BUILD_VECTOR %thirty(s32), %ten(s32)
+    ; CHECK-NEXT: %add:_(<2 x s32>) = G_ADD %select, %const_vec3
+    ; 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: %select:_(<2 x s32>) = G_SELECT %cond(<2 x s1>), %const_vec0, %const_vec1
+    ; 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:_(<2 x s32>) = G_ADD %select, %const_vec3
+    ; 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: %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: %sub:_(s32) = G_SUB %select, %thirty
+    ; 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: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty
+    ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30
+    ; CHECK-NEXT: %sub:_(s32) = G_SUB %thirty, %select
+    ; 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: %ten:_(p3) = G_CONSTANT i32 10
+    ; CHECK-NEXT: %twenty:_(p3) = G_CONSTANT i32 20
+    ; CHECK-NEXT: %select:_(p3) = G_SELECT %cond(s1), %ten, %twenty
+    ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30
+    ; CHECK-NEXT: %ptr_add:_(p3) = G_PTR_ADD %select, %thirty(s32)
+    ; 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: %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:_(p3) = G_CONSTANT i32 30
+    ; CHECK-NEXT: %ptr_add:_(p3) = G_PTR_ADD %thirty, %select(s32)
+    ; 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: %ten:_(s64) = G_CONSTANT i64 10
+    ; CHECK-NEXT: %twenty:_(s64) = G_CONSTANT i64 20
+    ; CHECK-NEXT: %select:_(s64) = G_SELECT %cond(s1), %ten, %twenty
+    ; CHECK-NEXT: %seven:_(s32) = G_CONSTANT i32 7
+    ; CHECK-NEXT: %shl:_(s64) = G_SHL %select, %seven(s32)
+    ; 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: %ten:_(s32) = G_CONSTANT i32 10
+    ; CHECK-NEXT: %sixteen:_(s32) = G_CONSTANT i32 16
+    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %ten, %sixteen
+    ; CHECK-NEXT: %eight:_(s64) = G_CONSTANT i64 8
+    ; CHECK-NEXT: %shl:_(s64) = G_SHL %eight, %select(s32)
+    ; 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: %neg1:_(s32) = G_CONSTANT i32 -1
+    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %zero, %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
+    %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: %neg1:_(s32) = G_CONSTANT i32 -1
+    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %neg1, %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
+    %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: %select:_(s32) = G_SELECT %cond(s1), %zero, %neg1
+    ; 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
+    %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: %select:_(s32) = G_SELECT %cond(s1), %neg1, %zero
+    ; 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
+    %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: %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_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: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty
+    ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30
+    ; CHECK-NEXT: %xor:_(s32) = G_XOR %select, %thirty
+    ; 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: %hundred:_(s32) = G_CONSTANT i32 100
+    ; CHECK-NEXT: %fortytwo:_(s32) = G_CONSTANT i32 42
+    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %hundred, %fortytwo
+    ; CHECK-NEXT: %two:_(s32) = G_CONSTANT i32 2
+    ; CHECK-NEXT: %sdiv:_(s32) = G_SDIV %select, %two
+    ; 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: %hundred:_(s32) = G_CONSTANT i32 100
+    ; CHECK-NEXT: %fortytwo:_(s32) = G_CONSTANT i32 42
+    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %hundred, %fortytwo
+    ; CHECK-NEXT: %three:_(s32) = G_CONSTANT i32 3
+    ; CHECK-NEXT: %srem:_(s32) = G_SREM %select, %three
+    ; 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: %hundred:_(s32) = G_CONSTANT i32 100
+    ; CHECK-NEXT: %fortytwo:_(s32) = G_CONSTANT i32 42
+    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %hundred, %fortytwo
+    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
+    ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR %select, [[C]](s32)
+    ; CHECK-NEXT: S_ENDPGM 0, implicit [[LSHR]](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: %hundred:_(s32) = G_CONSTANT i32 100
+    ; CHECK-NEXT: %fortytwo:_(s32) = G_CONSTANT i32 42
+    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %hundred, %fortytwo
+    ; CHECK-NEXT: %three:_(s32) = G_CONSTANT i32 3
+    ; CHECK-NEXT: %udiv:_(s32) = G_UREM %select, %three
+    ; 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: %ten:_(s64) = G_CONSTANT i64 10
+    ; CHECK-NEXT: %twenty:_(s64) = G_CONSTANT i64 20
+    ; CHECK-NEXT: %select:_(s64) = G_SELECT %cond(s1), %ten, %twenty
+    ; CHECK-NEXT: %two:_(s32) = G_CONSTANT i32 2
+    ; CHECK-NEXT: %lshr:_(s64) = G_LSHR %select, %two(s32)
+    ; 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: %three:_(s32) = G_CONSTANT i32 3
+    ; CHECK-NEXT: %five:_(s32) = G_CONSTANT i32 5
+    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %three, %five
+    ; CHECK-NEXT: %val:_(s64) = G_CONSTANT i64 8096
+    ; CHECK-NEXT: %lshr:_(s64) = G_LSHR %val, %select(s32)
+    ; 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: %ten:_(s64) = G_CONSTANT i64 10
+    ; CHECK-NEXT: %twenty:_(s64) = G_CONSTANT i64 20
+    ; CHECK-NEXT: %select:_(s64) = G_SELECT %cond(s1), %ten, %twenty
+    ; CHECK-NEXT: %two:_(s32) = G_CONSTANT i32 2
+    ; CHECK-NEXT: %ashr:_(s64) = G_ASHR %select, %two(s32)
+    ; 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: %three:_(s32) = G_CONSTANT i32 3
+    ; CHECK-NEXT: %five:_(s32) = G_CONSTANT i32 5
+    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %three, %five
+    ; CHECK-NEXT: %val:_(s64) = G_CONSTANT i64 -8096
+    ; CHECK-NEXT: %ashr:_(s64) = G_ASHR %val, %select(s32)
+    ; 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: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty
+    ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30
+    ; CHECK-NEXT: %smin:_(s32) = G_SMIN %select, %thirty
+    ; 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: %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: %smax:_(s32) = G_SMAX %select, %thirty
+    ; CHECK-NEXT: S_ENDPGM 0, implicit %smax(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: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty
+    ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30
+    ; CHECK-NEXT: %umin:_(s32) = G_UMIN %select, %thirty
+    ; 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: %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: %umax:_(s32) = G_UMAX %select, %thirty
+    ; CHECK-NEXT: S_ENDPGM 0, implicit %umax(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: %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: %fadd:_(s32) = nnan G_FADD %select, %sixteen
+    ; 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: %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: %fadd:_(s32) = nnan G_FADD %sixteen, %select
+    ; 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: %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: %fsub:_(s32) = nnan G_FSUB %select, %sixteen
+    ; 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: %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: %fmul:_(s32) = nnan G_FMUL %select, %sixteen
+    ; 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: %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: %fdiv:_(s32) = nnan G_FDIV %select, %sixteen
+    ; 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: %select:_(s32) = G_SELECT %cond(s1), %two, %four
+    ; CHECK-NEXT: %sixteen:_(s32) = G_FCONSTANT float 1.600000e+01
+    ; CHECK-NEXT: %frem:_(s32) = nnan G_FREM %select, %sixteen
+    ; 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: %select:_(s32) = G_SELECT %cond(s1), %two, %four
+    ; CHECK-NEXT: %sixteen:_(s32) = G_FCONSTANT float 1.600000e+01
+    ; CHECK-NEXT: %fminnum:_(s32) = nnan G_FMINNUM %select, %sixteen
+    ; 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: %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:_(s32) = nnan G_FMAXNUM %select, %three
+    ; 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: %select:_(s32) = G_SELECT %cond(s1), %two, %four
+    ; CHECK-NEXT: %sixteen:_(s32) = G_FCONSTANT float 1.600000e+01
+    ; CHECK-NEXT: %fminimum:_(s32) = nnan G_FMINIMUM %select, %sixteen
+    ; 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: %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: %fmaximum:_(s32) = nnan G_FMAXIMUM %select, %three
+    ; 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: %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)
+    %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: %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)
+    %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
+...


        


More information about the llvm-commits mailing list