1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -mtriple=amdgcn-amd-amdhsa -verify-machineinstrs -run-pass si-fold-operands,dead-mi-elimination %s -o - | FileCheck -check-prefix=GCN %s 3 4--- 5 6# First operand is FI is in a VGPR, other operand is a VGPR 7name: shrink_vgpr_fi_vgpr_v_add_i32_e64_no_carry_out_use 8tracksRegLiveness: true 9stack: 10 - { id: 0, type: default, offset: 0, size: 64, alignment: 16 } 11body: | 12 bb.0: 13 liveins: $vgpr0 14 15 ; GCN-LABEL: name: shrink_vgpr_fi_vgpr_v_add_i32_e64_no_carry_out_use 16 ; GCN: liveins: $vgpr0 17 ; GCN-NEXT: {{ $}} 18 ; GCN-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 %stack.0, implicit $exec 19 ; GCN-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 20 ; GCN-NEXT: [[V_ADD_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_CO_U32_e32 [[V_MOV_B32_e32_]], [[COPY]], implicit-def $vcc, implicit $exec 21 ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e32_]] 22 %0:vgpr_32 = V_MOV_B32_e32 %stack.0, implicit $exec 23 %1:vgpr_32 = COPY $vgpr0 24 %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec 25 S_ENDPGM 0, implicit %2 26 27... 28 29--- 30 31# First operand is a VGPR, other operand FI is in a VGPR 32name: shrink_vgpr_vgpr_fi_v_add_i32_e64_no_carry_out_use 33tracksRegLiveness: true 34stack: 35 - { id: 0, type: default, offset: 0, size: 64, alignment: 16 } 36body: | 37 bb.0: 38 liveins: $vgpr0 39 40 ; GCN-LABEL: name: shrink_vgpr_vgpr_fi_v_add_i32_e64_no_carry_out_use 41 ; GCN: liveins: $vgpr0 42 ; GCN-NEXT: {{ $}} 43 ; GCN-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 44 ; GCN-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 %stack.0, implicit $exec 45 ; GCN-NEXT: [[V_ADD_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_CO_U32_e32 [[COPY]], [[V_MOV_B32_e32_]], implicit-def $vcc, implicit $exec 46 ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e32_]] 47 %0:vgpr_32 = COPY $vgpr0 48 %1:vgpr_32 = V_MOV_B32_e32 %stack.0, implicit $exec 49 %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec 50 S_ENDPGM 0, implicit %2 51 52... 53 54--- 55 56# First operand is FI is in an SGPR, other operand is a VGPR 57name: shrink_vgpr_fi_sgpr_v_add_i32_e64_no_carry_out_use 58tracksRegLiveness: true 59stack: 60 - { id: 0, type: default, offset: 0, size: 64, alignment: 16 } 61body: | 62 bb.0: 63 liveins: $sgpr0 64 65 ; GCN-LABEL: name: shrink_vgpr_fi_sgpr_v_add_i32_e64_no_carry_out_use 66 ; GCN: liveins: $sgpr0 67 ; GCN-NEXT: {{ $}} 68 ; GCN-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 %stack.0, implicit $exec 69 ; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_32_xm0 = COPY $sgpr0 70 ; GCN-NEXT: [[V_ADD_CO_U32_e64_:%[0-9]+]]:vgpr_32, [[V_ADD_CO_U32_e64_1:%[0-9]+]]:sreg_64 = V_ADD_CO_U32_e64 [[COPY]], [[V_MOV_B32_e32_]], 0, implicit $exec 71 ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e64_]] 72 %0:vgpr_32 = V_MOV_B32_e32 %stack.0, implicit $exec 73 %1:sreg_32_xm0 = COPY $sgpr0 74 %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec 75 S_ENDPGM 0, implicit %2 76 77... 78 79--- 80 81# First operand is an SGPR, other operand FI is in a VGPR 82name: shrink_sgpr_vgpr_fi_v_add_i32_e64_no_carry_out_use 83tracksRegLiveness: true 84stack: 85 - { id: 0, type: default, offset: 0, size: 64, alignment: 16 } 86body: | 87 bb.0: 88 liveins: $sgpr0 89 90 ; GCN-LABEL: name: shrink_sgpr_vgpr_fi_v_add_i32_e64_no_carry_out_use 91 ; GCN: liveins: $sgpr0 92 ; GCN-NEXT: {{ $}} 93 ; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_32_xm0 = COPY $sgpr0 94 ; GCN-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 %stack.0, implicit $exec 95 ; GCN-NEXT: [[V_ADD_CO_U32_e64_:%[0-9]+]]:vgpr_32, [[V_ADD_CO_U32_e64_1:%[0-9]+]]:sreg_64 = V_ADD_CO_U32_e64 [[V_MOV_B32_e32_]], [[COPY]], 0, implicit $exec 96 ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e64_]] 97 %0:sreg_32_xm0 = COPY $sgpr0 98 %1:vgpr_32 = V_MOV_B32_e32 %stack.0, implicit $exec 99 %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec 100 S_ENDPGM 0, implicit %2 101 102... 103 104--- 105 106# First operand is FI is in an SGPR, other operand is a VGPR 107name: shrink_sgpr_fi_vgpr_v_add_i32_e64_no_carry_out_use 108tracksRegLiveness: true 109stack: 110 - { id: 0, type: default, offset: 0, size: 64, alignment: 16 } 111body: | 112 bb.0: 113 liveins: $vgpr0 114 115 ; GCN-LABEL: name: shrink_sgpr_fi_vgpr_v_add_i32_e64_no_carry_out_use 116 ; GCN: liveins: $vgpr0 117 ; GCN-NEXT: {{ $}} 118 ; GCN-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32_xm0 = S_MOV_B32 %stack.0 119 ; GCN-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 120 ; GCN-NEXT: [[V_ADD_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_CO_U32_e32 [[S_MOV_B32_]], [[COPY]], implicit-def $vcc, implicit $exec 121 ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e32_]] 122 %0:sreg_32_xm0 = S_MOV_B32 %stack.0 123 %1:vgpr_32 = COPY $vgpr0 124 %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec 125 S_ENDPGM 0, implicit %2 126 127... 128 129--- 130 131# First operand is a VGPR, other operand FI is in an SGPR 132name: shrink_vgpr_sgpr_fi_v_add_i32_e64_no_carry_out_use 133tracksRegLiveness: true 134stack: 135 - { id: 0, type: default, offset: 0, size: 64, alignment: 16} 136body: | 137 bb.0: 138 liveins: $vgpr0 139 140 ; GCN-LABEL: name: shrink_vgpr_sgpr_fi_v_add_i32_e64_no_carry_out_use 141 ; GCN: liveins: $vgpr0 142 ; GCN-NEXT: {{ $}} 143 ; GCN-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 144 ; GCN-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32_xm0 = S_MOV_B32 %stack.0 145 ; GCN-NEXT: [[V_ADD_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_CO_U32_e32 [[S_MOV_B32_]], [[COPY]], implicit-def $vcc, implicit $exec 146 ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e32_]] 147 %0:vgpr_32 = COPY $vgpr0 148 %1:sreg_32_xm0 = S_MOV_B32 %stack.0 149 %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec 150 S_ENDPGM 0, implicit %2 151 152... 153 154--- 155 156# First operand is FI is in a VGPR, other operand is an inline imm in a VGPR 157name: shrink_vgpr_imm_fi_vgpr_v_add_i32_e64_no_carry_out_use 158tracksRegLiveness: true 159stack: 160 - { id: 0, type: default, offset: 0, size: 64, alignment: 16 } 161body: | 162 bb.0: 163 164 ; GCN-LABEL: name: shrink_vgpr_imm_fi_vgpr_v_add_i32_e64_no_carry_out_use 165 ; GCN: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 %stack.0, implicit $exec 166 ; GCN-NEXT: [[V_ADD_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_CO_U32_e32 16, [[V_MOV_B32_e32_]], implicit-def $vcc, implicit $exec 167 ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e32_]] 168 %0:vgpr_32 = V_MOV_B32_e32 %stack.0, implicit $exec 169 %1:vgpr_32 = V_MOV_B32_e32 16, implicit $exec 170 %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec 171 S_ENDPGM 0, implicit %2 172 173... 174 175--- 176 177# First operand is an inline imm in a VGPR, other operand FI is in a VGPR 178name: shrink_vgpr_imm_vgpr_fi_v_add_i32_e64_no_carry_out_use 179tracksRegLiveness: true 180stack: 181 - { id: 0, type: default, offset: 0, size: 64, alignment: 16 } 182body: | 183 bb.0: 184 185 ; GCN-LABEL: name: shrink_vgpr_imm_vgpr_fi_v_add_i32_e64_no_carry_out_use 186 ; GCN: [[V_ADD_CO_U32_e64_:%[0-9]+]]:vgpr_32, [[V_ADD_CO_U32_e64_1:%[0-9]+]]:sreg_64 = V_ADD_CO_U32_e64 16, %stack.0, 0, implicit $exec 187 ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e64_]] 188 %0:vgpr_32 = V_MOV_B32_e32 16, implicit $exec 189 %1:vgpr_32 = V_MOV_B32_e32 %stack.0, implicit $exec 190 %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec 191 S_ENDPGM 0, implicit %2 192 193... 194 195--- 196 197# First operand is FI is in a VGPR, other operand is an literal constant in a VGPR 198name: shrink_vgpr_k_fi_vgpr_v_add_i32_e64_no_carry_out_use 199tracksRegLiveness: true 200stack: 201 - { id: 0, type: default, offset: 0, size: 64, alignment: 16 } 202body: | 203 bb.0: 204 205 ; GCN-LABEL: name: shrink_vgpr_k_fi_vgpr_v_add_i32_e64_no_carry_out_use 206 ; GCN: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 %stack.0, implicit $exec 207 ; GCN-NEXT: [[V_ADD_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_CO_U32_e32 1234, [[V_MOV_B32_e32_]], implicit-def $vcc, implicit $exec 208 ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e32_]] 209 %0:vgpr_32 = V_MOV_B32_e32 %stack.0, implicit $exec 210 %1:vgpr_32 = V_MOV_B32_e32 1234, implicit $exec 211 %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec 212 S_ENDPGM 0, implicit %2 213 214... 215 216--- 217 218# First operand is a literal constant in a VGPR, other operand FI is in a VGPR 219name: shrink_vgpr_k_vgpr_fi_v_add_i32_e64_no_carry_out_use 220tracksRegLiveness: true 221stack: 222 - { id: 0, type: default, offset: 0, size: 64, alignment: 16 } 223body: | 224 bb.0: 225 226 ; GCN-LABEL: name: shrink_vgpr_k_vgpr_fi_v_add_i32_e64_no_carry_out_use 227 ; GCN: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 1234, implicit $exec 228 ; GCN-NEXT: [[V_ADD_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_CO_U32_e32 %stack.0, [[V_MOV_B32_e32_]], implicit-def $vcc, implicit $exec 229 ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e32_]] 230 %0:vgpr_32 = V_MOV_B32_e32 1234, implicit $exec 231 %1:vgpr_32 = V_MOV_B32_e32 %stack.0, implicit $exec 232 %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec 233 S_ENDPGM 0, implicit %2 234 235... 236