700 lines · plain
1# RUN: llc --mtriple=amdgcn--amdhsa -mcpu=fiji -verify-machineinstrs -run-pass si-fold-operands,si-shrink-instructions %s -o - | FileCheck %s2# RUN: llc --mtriple=amdgcn--amdhsa -mcpu=fiji -verify-machineinstrs -passes si-fold-operands,si-shrink-instructions %s -o - | FileCheck %s3--- |4 define amdgpu_kernel void @add_f32_1.0_one_f16_use() #0 {5 %f16.val0 = load volatile half, ptr addrspace(1) poison6 %f16.val1 = load volatile half, ptr addrspace(1) poison7 %f32.val = load volatile float, ptr addrspace(1) poison8 %f16.add0 = fadd half %f16.val0, 0xH3C009 %f32.add = fadd float %f32.val, 1.000000e+0010 store volatile half %f16.add0, ptr addrspace(1) poison11 store volatile float %f32.add, ptr addrspace(1) poison12 ret void13 }14 15 define amdgpu_kernel void @add_f32_1.0_multi_f16_use() #0 {16 %f16.val0 = load volatile half, ptr addrspace(1) poison17 %f16.val1 = load volatile half, ptr addrspace(1) poison18 %f32.val = load volatile float, ptr addrspace(1) poison19 %f16.add0 = fadd half %f16.val0, 0xH3C0020 %f32.add = fadd float %f32.val, 1.000000e+0021 store volatile half %f16.add0, ptr addrspace(1) poison22 store volatile float %f32.add, ptr addrspace(1) poison23 ret void24 }25 26 define amdgpu_kernel void @add_f32_1.0_one_f32_use_one_f16_use () #0 {27 %f16.val0 = load volatile half, ptr addrspace(1) poison28 %f16.val1 = load volatile half, ptr addrspace(1) poison29 %f32.val = load volatile float, ptr addrspace(1) poison30 %f16.add0 = fadd half %f16.val0, 0xH3C0031 %f32.add = fadd float %f32.val, 1.000000e+0032 store volatile half %f16.add0, ptr addrspace(1) poison33 store volatile float %f32.add, ptr addrspace(1) poison34 ret void35 }36 37 define amdgpu_kernel void @add_f32_1.0_one_f32_use_multi_f16_use () #0 {38 %f16.val0 = load volatile half, ptr addrspace(1) poison39 %f16.val1 = load volatile half, ptr addrspace(1) poison40 %f32.val = load volatile float, ptr addrspace(1) poison41 %f16.add0 = fadd half %f16.val0, 0xH3C0042 %f16.add1 = fadd half %f16.val1, 0xH3C0043 %f32.add = fadd float %f32.val, 1.000000e+0044 store volatile half %f16.add0, ptr addrspace(1) poison45 store volatile half %f16.add1, ptr addrspace(1) poison46 store volatile float %f32.add, ptr addrspace(1) poison47 ret void48 }49 50 define amdgpu_kernel void @add_i32_1_multi_f16_use() #0 {51 %f16.val0 = load volatile half, ptr addrspace(1) poison52 %f16.val1 = load volatile half, ptr addrspace(1) poison53 %f16.add0 = fadd half %f16.val0, 0xH000154 %f16.add1 = fadd half %f16.val1, 0xH000155 store volatile half %f16.add0, ptr addrspace(1) poison56 store volatile half %f16.add1,ptr addrspace(1) poison57 ret void58 }59 60 define amdgpu_kernel void @add_i32_m2_one_f32_use_multi_f16_use () #0 {61 %f16.val0 = load volatile half, ptr addrspace(1) poison62 %f16.val1 = load volatile half, ptr addrspace(1) poison63 %f32.val = load volatile float, ptr addrspace(1) poison64 %f16.add0 = fadd half %f16.val0, 0xHFFFE65 %f16.add1 = fadd half %f16.val1, 0xHFFFE66 %f32.add = fadd float %f32.val, 0xffffffffc000000067 store volatile half %f16.add0, ptr addrspace(1) poison68 store volatile half %f16.add1, ptr addrspace(1) poison69 store volatile float %f32.add, ptr addrspace(1) poison70 ret void71 }72 73 define amdgpu_kernel void @add_f16_1.0_multi_f32_use() #0 {74 %f32.val0 = load volatile float, ptr addrspace(1) poison75 %f32.val1 = load volatile float, ptr addrspace(1) poison76 %f32.val = load volatile float, ptr addrspace(1) poison77 %f32.add0 = fadd float %f32.val0, 1.078 %f32.add1 = fadd float %f32.val1, 1.079 store volatile float %f32.add0, ptr addrspace(1) poison80 store volatile float %f32.add1, ptr addrspace(1) poison81 ret void82 }83 84 define amdgpu_kernel void @add_f16_1.0_other_high_bits_multi_f16_use() #0 {85 %f16.val0 = load volatile half, ptr addrspace(1) poison86 %f16.val1 = load volatile half, ptr addrspace(1) poison87 %f32.val = load volatile half, ptr addrspace(1) poison88 %f16.add0 = fadd half %f16.val0, 0xH3C0089 %f32.add = fadd half %f32.val, 1.000000e+0090 store volatile half %f16.add0, ptr addrspace(1) poison91 store volatile half %f32.add, ptr addrspace(1) poison92 ret void93 }94 95 define amdgpu_kernel void @add_f16_1.0_other_high_bits_use_f16_f32() #0 {96 %f16.val0 = load volatile half, ptr addrspace(1) poison97 %f16.val1 = load volatile half, ptr addrspace(1) poison98 %f32.val = load volatile half, ptr addrspace(1) poison99 %f16.add0 = fadd half %f16.val0, 0xH3C00100 %f32.add = fadd half %f32.val, 1.000000e+00101 store volatile half %f16.add0, ptr addrspace(1) poison102 store volatile half %f32.add, ptr addrspace(1) poison103 ret void104 }105 106 attributes #0 = { nounwind }107 108...109---110 111# f32 1.0 with a single use should be folded as the low 32-bits of a112# literal constant.113 114# CHECK-LABEL: name: add_f32_1.0_one_f16_use115# CHECK: %13:vgpr_32 = V_ADD_F16_e32 1065353216, killed %11, implicit $mode, implicit $exec116 117name: add_f32_1.0_one_f16_use118alignment: 1119exposesReturnsTwice: false120legalized: false121regBankSelected: false122selected: false123tracksRegLiveness: true124registers:125 - { id: 0, class: sreg_64 }126 - { id: 1, class: sreg_32 }127 - { id: 2, class: sgpr_32 }128 - { id: 3, class: vgpr_32 }129 - { id: 4, class: sreg_64 }130 - { id: 5, class: sreg_32 }131 - { id: 6, class: sreg_64 }132 - { id: 7, class: sreg_32 }133 - { id: 8, class: sreg_32 }134 - { id: 9, class: sreg_32 }135 - { id: 10, class: sgpr_128 }136 - { id: 11, class: vgpr_32 }137 - { id: 12, class: vgpr_32 }138 - { id: 13, class: vgpr_32 }139frameInfo:140 isFrameAddressTaken: false141 isReturnAddressTaken: false142 hasStackMap: false143 hasPatchPoint: false144 stackSize: 0145 offsetAdjustment: 0146 maxAlignment: 0147 adjustsStack: false148 hasCalls: false149 maxCallFrameSize: 0150 hasOpaqueSPAdjustment: false151 hasVAStart: false152 hasMustTailInVarArgFunc: false153body: |154 bb.0 (%ir-block.0):155 %4 = IMPLICIT_DEF156 %5 = COPY %4.sub1157 %6 = IMPLICIT_DEF158 %7 = COPY %6.sub0159 %8 = S_MOV_B32 61440160 %9 = S_MOV_B32 -1161 %10 = REG_SEQUENCE killed %7, 1, killed %5, 2, killed %9, 3, killed %8, 4162 %11 = BUFFER_LOAD_USHORT_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s16) from `ptr addrspace(1) poison`)163 %12 = V_MOV_B32_e32 1065353216, implicit $exec164 %13 = V_ADD_F16_e64 0, killed %11, 0, %12, 0, 0, implicit $mode, implicit $exec165 BUFFER_STORE_SHORT_OFFSET killed %13, %10, 0, 0, 0, 0, implicit $exec :: (volatile store (s16) into `ptr addrspace(1) poison`)166 S_ENDPGM 0167 168...169---170# Materialized f32 inline immediate should not be folded into the f16171# operands172 173# CHECK-LABEL: name: add_f32_1.0_multi_f16_use174# CHECK: %14:vgpr_32 = V_ADD_F16_e32 1065353216, killed %11, implicit $mode, implicit $exec175# CHECK: %15:vgpr_32 = V_ADD_F16_e32 1065353216, killed %12, implicit $mode, implicit $exec176 177 178name: add_f32_1.0_multi_f16_use179alignment: 1180exposesReturnsTwice: false181legalized: false182regBankSelected: false183selected: false184tracksRegLiveness: true185registers:186 - { id: 0, class: sreg_64 }187 - { id: 1, class: sreg_32 }188 - { id: 2, class: sgpr_32 }189 - { id: 3, class: vgpr_32 }190 - { id: 4, class: sreg_64 }191 - { id: 5, class: sreg_32 }192 - { id: 6, class: sreg_64 }193 - { id: 7, class: sreg_32 }194 - { id: 8, class: sreg_32 }195 - { id: 9, class: sreg_32 }196 - { id: 10, class: sgpr_128 }197 - { id: 11, class: vgpr_32 }198 - { id: 12, class: vgpr_32 }199 - { id: 13, class: vgpr_32 }200 - { id: 14, class: vgpr_32 }201 - { id: 15, class: vgpr_32 }202frameInfo:203 isFrameAddressTaken: false204 isReturnAddressTaken: false205 hasStackMap: false206 hasPatchPoint: false207 stackSize: 0208 offsetAdjustment: 0209 maxAlignment: 0210 adjustsStack: false211 hasCalls: false212 maxCallFrameSize: 0213 hasOpaqueSPAdjustment: false214 hasVAStart: false215 hasMustTailInVarArgFunc: false216body: |217 bb.0 (%ir-block.0):218 %4 = IMPLICIT_DEF219 %5 = COPY %4.sub1220 %6 = IMPLICIT_DEF221 %7 = COPY %6.sub0222 %8 = S_MOV_B32 61440223 %9 = S_MOV_B32 -1224 %10 = REG_SEQUENCE killed %7, 1, killed %5, 2, killed %9, 3, killed %8, 4225 %11 = BUFFER_LOAD_USHORT_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s16) from `ptr addrspace(1) poison`)226 %12 = BUFFER_LOAD_DWORD_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s32) from `ptr addrspace(1) poison`)227 %13 = V_MOV_B32_e32 1065353216, implicit $exec228 %14 = V_ADD_F16_e64 0, killed %11, 0, %13, 0, 0, implicit $mode, implicit $exec229 %15 = V_ADD_F16_e64 0, killed %12, 0, killed %13, 0, 0, implicit $mode, implicit $exec230 BUFFER_STORE_SHORT_OFFSET killed %14, %10, 0, 0, 0, 0, implicit $exec :: (volatile store (s16) into `ptr addrspace(1) poison`)231 BUFFER_STORE_SHORT_OFFSET killed %15, %10, 0, 0, 0, 0, implicit $exec :: (volatile store (s16) into `ptr addrspace(1) poison`)232 S_ENDPGM 0233 234...235---236 237# f32 1.0 should be folded into the single f32 use as an inline238# immediate, and folded into the single f16 use as a literal constant239 240# CHECK-LABEL: name: add_f32_1.0_one_f32_use_one_f16_use241# CHECK: %15:vgpr_32 = V_ADD_F16_e32 1065353216, %11, implicit $mode, implicit $exec242# CHECK: %16:vgpr_32 = V_ADD_F32_e32 1065353216, killed %13, implicit $mode, implicit $exec243 244name: add_f32_1.0_one_f32_use_one_f16_use245alignment: 1246exposesReturnsTwice: false247legalized: false248regBankSelected: false249selected: false250tracksRegLiveness: true251registers:252 - { id: 0, class: sreg_64 }253 - { id: 1, class: sreg_32 }254 - { id: 2, class: sgpr_32 }255 - { id: 3, class: vgpr_32 }256 - { id: 4, class: sreg_64 }257 - { id: 5, class: sreg_32 }258 - { id: 6, class: sreg_64 }259 - { id: 7, class: sreg_32 }260 - { id: 8, class: sreg_32 }261 - { id: 9, class: sreg_32 }262 - { id: 10, class: sgpr_128 }263 - { id: 11, class: vgpr_32 }264 - { id: 12, class: vgpr_32 }265 - { id: 13, class: vgpr_32 }266 - { id: 14, class: vgpr_32 }267 - { id: 15, class: vgpr_32 }268 - { id: 16, class: vgpr_32 }269frameInfo:270 isFrameAddressTaken: false271 isReturnAddressTaken: false272 hasStackMap: false273 hasPatchPoint: false274 stackSize: 0275 offsetAdjustment: 0276 maxAlignment: 0277 adjustsStack: false278 hasCalls: false279 maxCallFrameSize: 0280 hasOpaqueSPAdjustment: false281 hasVAStart: false282 hasMustTailInVarArgFunc: false283body: |284 bb.0 (%ir-block.0):285 %4 = IMPLICIT_DEF286 %5 = COPY %4.sub1287 %6 = IMPLICIT_DEF288 %7 = COPY %6.sub0289 %8 = S_MOV_B32 61440290 %9 = S_MOV_B32 -1291 %10 = REG_SEQUENCE killed %7, 1, killed %5, 2, killed %9, 3, killed %8, 4292 %11 = BUFFER_LOAD_USHORT_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s16) from `ptr addrspace(1) poison`)293 %12 = BUFFER_LOAD_USHORT_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s16) from `ptr addrspace(1) poison`)294 %13 = BUFFER_LOAD_DWORD_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s32) from `ptr addrspace(1) poison`)295 %14 = V_MOV_B32_e32 1065353216, implicit $exec296 %15 = V_ADD_F16_e64 0, %11, 0, %14, 0, 0, implicit $mode, implicit $exec297 %16 = V_ADD_F32_e64 0, killed %13, 0, killed %14, 0, 0, implicit $mode, implicit $exec298 BUFFER_STORE_SHORT_OFFSET killed %15, %10, 0, 0, 0, 0, implicit $exec :: (volatile store (s16) into `ptr addrspace(1) poison`)299 BUFFER_STORE_DWORD_OFFSET killed %16, %10, 0, 0, 0, 0, implicit $exec :: (volatile store (s32) into `ptr addrspace(1) poison`)300 S_ENDPGM 0301 302...303---304 305# f32 1.0 should be folded for the single f32 use as an inline306# constant, and not folded as a multi-use literal for the f16 cases307 308# CHECK-LABEL: name: add_f32_1.0_one_f32_use_multi_f16_use309# CHECK: %15:vgpr_32 = V_ADD_F16_e32 1065353216, %11, implicit $mode, implicit $exec310# CHECK: %16:vgpr_32 = V_ADD_F16_e32 1065353216, %12, implicit $mode, implicit $exec311# CHECK: %17:vgpr_32 = V_ADD_F32_e32 1065353216, killed %13, implicit $mode, implicit $exec312 313name: add_f32_1.0_one_f32_use_multi_f16_use314alignment: 1315exposesReturnsTwice: false316legalized: false317regBankSelected: false318selected: false319tracksRegLiveness: true320registers:321 - { id: 0, class: sreg_64 }322 - { id: 1, class: sreg_32 }323 - { id: 2, class: sgpr_32 }324 - { id: 3, class: vgpr_32 }325 - { id: 4, class: sreg_64 }326 - { id: 5, class: sreg_32 }327 - { id: 6, class: sreg_64 }328 - { id: 7, class: sreg_32 }329 - { id: 8, class: sreg_32 }330 - { id: 9, class: sreg_32 }331 - { id: 10, class: sgpr_128 }332 - { id: 11, class: vgpr_32 }333 - { id: 12, class: vgpr_32 }334 - { id: 13, class: vgpr_32 }335 - { id: 14, class: vgpr_32 }336 - { id: 15, class: vgpr_32 }337 - { id: 16, class: vgpr_32 }338 - { id: 17, class: vgpr_32 }339frameInfo:340 isFrameAddressTaken: false341 isReturnAddressTaken: false342 hasStackMap: false343 hasPatchPoint: false344 stackSize: 0345 offsetAdjustment: 0346 maxAlignment: 0347 adjustsStack: false348 hasCalls: false349 maxCallFrameSize: 0350 hasOpaqueSPAdjustment: false351 hasVAStart: false352 hasMustTailInVarArgFunc: false353body: |354 bb.0 (%ir-block.0):355 %4 = IMPLICIT_DEF356 %5 = COPY %4.sub1357 %6 = IMPLICIT_DEF358 %7 = COPY %6.sub0359 %8 = S_MOV_B32 61440360 %9 = S_MOV_B32 -1361 %10 = REG_SEQUENCE killed %7, 1, killed %5, 2, killed %9, 3, killed %8, 4362 %11 = BUFFER_LOAD_USHORT_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s16) from `ptr addrspace(1) poison`)363 %12 = BUFFER_LOAD_USHORT_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s16) from `ptr addrspace(1) poison`)364 %13 = BUFFER_LOAD_DWORD_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s32) from `ptr addrspace(1) poison`)365 %14 = V_MOV_B32_e32 1065353216, implicit $exec366 %15 = V_ADD_F16_e64 0, %11, 0, %14, 0, 0, implicit $mode, implicit $exec367 %16 = V_ADD_F16_e64 0, %12, 0, %14, 0, 0, implicit $mode, implicit $exec368 %17 = V_ADD_F32_e64 0, killed %13, 0, killed %14, 0, 0, implicit $mode, implicit $exec369 BUFFER_STORE_SHORT_OFFSET killed %15, %10, 0, 0, 0, 0, implicit $exec :: (volatile store (s16) into `ptr addrspace(1) poison`)370 BUFFER_STORE_SHORT_OFFSET killed %16, %10, 0, 0, 0, 0, implicit $exec :: (volatile store (s16) into `ptr addrspace(1) poison`)371 BUFFER_STORE_DWORD_OFFSET killed %17, %10, 0, 0, 0, 0, implicit $exec :: (volatile store (s32) into `ptr addrspace(1) poison`)372 S_ENDPGM 0373 374...375---376# CHECK-LABEL: name: add_i32_1_multi_f16_use377# CHECK: %14:vgpr_32 = V_ADD_F16_e32 1, killed %11, implicit $mode, implicit $exec378# CHECK: %15:vgpr_32 = V_ADD_F16_e32 1, killed %12, implicit $mode, implicit $exec379 380 381name: add_i32_1_multi_f16_use382alignment: 1383exposesReturnsTwice: false384legalized: false385regBankSelected: false386selected: false387tracksRegLiveness: true388registers:389 - { id: 0, class: sreg_64 }390 - { id: 1, class: sreg_32 }391 - { id: 2, class: sgpr_32 }392 - { id: 3, class: vgpr_32 }393 - { id: 4, class: sreg_64 }394 - { id: 5, class: sreg_32 }395 - { id: 6, class: sreg_64 }396 - { id: 7, class: sreg_32 }397 - { id: 8, class: sreg_32 }398 - { id: 9, class: sreg_32 }399 - { id: 10, class: sgpr_128 }400 - { id: 11, class: vgpr_32 }401 - { id: 12, class: vgpr_32 }402 - { id: 13, class: vgpr_32 }403 - { id: 14, class: vgpr_32 }404 - { id: 15, class: vgpr_32 }405frameInfo:406 isFrameAddressTaken: false407 isReturnAddressTaken: false408 hasStackMap: false409 hasPatchPoint: false410 stackSize: 0411 offsetAdjustment: 0412 maxAlignment: 0413 adjustsStack: false414 hasCalls: false415 maxCallFrameSize: 0416 hasOpaqueSPAdjustment: false417 hasVAStart: false418 hasMustTailInVarArgFunc: false419body: |420 bb.0 (%ir-block.0):421 %4 = IMPLICIT_DEF422 %5 = COPY %4.sub1423 %6 = IMPLICIT_DEF424 %7 = COPY %6.sub0425 %8 = S_MOV_B32 61440426 %9 = S_MOV_B32 -1427 %10 = REG_SEQUENCE killed %7, 1, killed %5, 2, killed %9, 3, killed %8, 4428 %11 = BUFFER_LOAD_USHORT_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s16) from `ptr addrspace(1) poison`)429 %12 = BUFFER_LOAD_DWORD_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s32) from `ptr addrspace(1) poison`)430 %13 = V_MOV_B32_e32 1, implicit $exec431 %14 = V_ADD_F16_e64 0, killed %11, 0, %13, 0, 0, implicit $mode, implicit $exec432 %15 = V_ADD_F16_e64 0, killed %12, 0, killed %13, 0, 0, implicit $mode, implicit $exec433 BUFFER_STORE_SHORT_OFFSET killed %14, %10, 0, 0, 0, 0, implicit $exec :: (volatile store (s16) into `ptr addrspace(1) poison`)434 BUFFER_STORE_SHORT_OFFSET killed %15, %10, 0, 0, 0, 0, implicit $exec :: (volatile store (s16) into `ptr addrspace(1) poison`)435 S_ENDPGM 0436 437...438---439 440# CHECK-LABEL: name: add_i32_m2_one_f32_use_multi_f16_use441# CHECK: %15:vgpr_32 = V_ADD_F16_e32 -2, %11, implicit $mode, implicit $exec442# CHECK: %16:vgpr_32 = V_ADD_F16_e32 -2, %12, implicit $mode, implicit $exec443# CHECK: %17:vgpr_32 = V_ADD_F32_e32 -2, killed %13, implicit $mode, implicit $exec444 445name: add_i32_m2_one_f32_use_multi_f16_use446alignment: 1447exposesReturnsTwice: false448legalized: false449regBankSelected: false450selected: false451tracksRegLiveness: true452registers:453 - { id: 0, class: sreg_64 }454 - { id: 1, class: sreg_32 }455 - { id: 2, class: sgpr_32 }456 - { id: 3, class: vgpr_32 }457 - { id: 4, class: sreg_64 }458 - { id: 5, class: sreg_32 }459 - { id: 6, class: sreg_64 }460 - { id: 7, class: sreg_32 }461 - { id: 8, class: sreg_32 }462 - { id: 9, class: sreg_32 }463 - { id: 10, class: sgpr_128 }464 - { id: 11, class: vgpr_32 }465 - { id: 12, class: vgpr_32 }466 - { id: 13, class: vgpr_32 }467 - { id: 14, class: vgpr_32 }468 - { id: 15, class: vgpr_32 }469 - { id: 16, class: vgpr_32 }470 - { id: 17, class: vgpr_32 }471frameInfo:472 isFrameAddressTaken: false473 isReturnAddressTaken: false474 hasStackMap: false475 hasPatchPoint: false476 stackSize: 0477 offsetAdjustment: 0478 maxAlignment: 0479 adjustsStack: false480 hasCalls: false481 maxCallFrameSize: 0482 hasOpaqueSPAdjustment: false483 hasVAStart: false484 hasMustTailInVarArgFunc: false485body: |486 bb.0 (%ir-block.0):487 %4 = IMPLICIT_DEF488 %5 = COPY %4.sub1489 %6 = IMPLICIT_DEF490 %7 = COPY %6.sub0491 %8 = S_MOV_B32 61440492 %9 = S_MOV_B32 -1493 %10 = REG_SEQUENCE killed %7, 1, killed %5, 2, killed %9, 3, killed %8, 4494 %11 = BUFFER_LOAD_USHORT_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s16) from `ptr addrspace(1) poison`)495 %12 = BUFFER_LOAD_USHORT_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s16) from `ptr addrspace(1) poison`)496 %13 = BUFFER_LOAD_DWORD_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s32) from `ptr addrspace(1) poison`)497 %14 = V_MOV_B32_e32 -2, implicit $exec498 %15 = V_ADD_F16_e64 0, %11, 0, %14, 0, 0, implicit $mode, implicit $exec499 %16 = V_ADD_F16_e64 0, %12, 0, %14, 0, 0, implicit $mode, implicit $exec500 %17 = V_ADD_F32_e64 0, killed %13, 0, killed %14, 0, 0, implicit $mode, implicit $exec501 BUFFER_STORE_SHORT_OFFSET killed %15, %10, 0, 0, 0, 0, implicit $exec :: (volatile store (s16) into `ptr addrspace(1) poison`)502 BUFFER_STORE_SHORT_OFFSET killed %16, %10, 0, 0, 0, 0, implicit $exec :: (volatile store (s16) into `ptr addrspace(1) poison`)503 BUFFER_STORE_DWORD_OFFSET killed %17, %10, 0, 0, 0, 0, implicit $exec :: (volatile store (s32) into `ptr addrspace(1) poison`)504 S_ENDPGM 0505 506...507---508 509# f32 1.0 should be folded for the single f32 use as an inline510# constant, and not folded as a multi-use literal for the f16 cases511 512# CHECK-LABEL: name: add_f16_1.0_multi_f32_use513# CHECK: %14:vgpr_32 = V_ADD_F32_e32 15360, %11, implicit $mode, implicit $exec514# CHECK: %15:vgpr_32 = V_ADD_F32_e32 15360, %12, implicit $mode, implicit $exec515 516name: add_f16_1.0_multi_f32_use517alignment: 1518exposesReturnsTwice: false519legalized: false520regBankSelected: false521selected: false522tracksRegLiveness: true523registers:524 - { id: 0, class: sreg_64 }525 - { id: 1, class: sreg_32 }526 - { id: 2, class: sgpr_32 }527 - { id: 3, class: vgpr_32 }528 - { id: 4, class: sreg_64 }529 - { id: 5, class: sreg_32 }530 - { id: 6, class: sreg_64 }531 - { id: 7, class: sreg_32 }532 - { id: 8, class: sreg_32 }533 - { id: 9, class: sreg_32 }534 - { id: 10, class: sgpr_128 }535 - { id: 11, class: vgpr_32 }536 - { id: 12, class: vgpr_32 }537 - { id: 13, class: vgpr_32 }538 - { id: 14, class: vgpr_32 }539 - { id: 15, class: vgpr_32 }540frameInfo:541 isFrameAddressTaken: false542 isReturnAddressTaken: false543 hasStackMap: false544 hasPatchPoint: false545 stackSize: 0546 offsetAdjustment: 0547 maxAlignment: 0548 adjustsStack: false549 hasCalls: false550 maxCallFrameSize: 0551 hasOpaqueSPAdjustment: false552 hasVAStart: false553 hasMustTailInVarArgFunc: false554body: |555 bb.0 (%ir-block.0):556 %4 = IMPLICIT_DEF557 %5 = COPY %4.sub1558 %6 = IMPLICIT_DEF559 %7 = COPY %6.sub0560 %8 = S_MOV_B32 61440561 %9 = S_MOV_B32 -1562 %10 = REG_SEQUENCE killed %7, 1, killed %5, 2, killed %9, 3, killed %8, 4563 %11 = BUFFER_LOAD_DWORD_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s32) from `ptr addrspace(1) poison`)564 %12 = BUFFER_LOAD_DWORD_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s32) from `ptr addrspace(1) poison`)565 %13 = V_MOV_B32_e32 15360, implicit $exec566 %14 = V_ADD_F32_e64 0, %11, 0, %13, 0, 0, implicit $mode, implicit $exec567 %15 = V_ADD_F32_e64 0, %12, 0, %13, 0, 0, implicit $mode, implicit $exec568 BUFFER_STORE_DWORD_OFFSET killed %14, %10, 0, 0, 0, 0, implicit $exec :: (volatile store (s32) into `ptr addrspace(1) poison`)569 BUFFER_STORE_DWORD_OFFSET killed %15, %10, 0, 0, 0, 0, implicit $exec :: (volatile store (s32) into `ptr addrspace(1) poison`)570 S_ENDPGM 0571 572...573---574 575# The low 16-bits are an inline immediate, but the high bits are junk576 577# CHECK-LABEL: name: add_f16_1.0_other_high_bits_multi_f16_use578# CHECK: %14:vgpr_32 = V_ADD_F16_e32 80886784, %11, implicit $mode, implicit $exec579# CHECK: %15:vgpr_32 = V_ADD_F16_e32 80886784, %12, implicit $mode, implicit $exec580 581name: add_f16_1.0_other_high_bits_multi_f16_use582alignment: 1583exposesReturnsTwice: false584legalized: false585regBankSelected: false586selected: false587tracksRegLiveness: true588registers:589 - { id: 0, class: sreg_64 }590 - { id: 1, class: sreg_32 }591 - { id: 2, class: sgpr_32 }592 - { id: 3, class: vgpr_32 }593 - { id: 4, class: sreg_64 }594 - { id: 5, class: sreg_32 }595 - { id: 6, class: sreg_64 }596 - { id: 7, class: sreg_32 }597 - { id: 8, class: sreg_32 }598 - { id: 9, class: sreg_32 }599 - { id: 10, class: sgpr_128 }600 - { id: 11, class: vgpr_32 }601 - { id: 12, class: vgpr_32 }602 - { id: 13, class: vgpr_32 }603 - { id: 14, class: vgpr_32 }604 - { id: 15, class: vgpr_32 }605frameInfo:606 isFrameAddressTaken: false607 isReturnAddressTaken: false608 hasStackMap: false609 hasPatchPoint: false610 stackSize: 0611 offsetAdjustment: 0612 maxAlignment: 0613 adjustsStack: false614 hasCalls: false615 maxCallFrameSize: 0616 hasOpaqueSPAdjustment: false617 hasVAStart: false618 hasMustTailInVarArgFunc: false619body: |620 bb.0 (%ir-block.0):621 %4 = IMPLICIT_DEF622 %5 = COPY %4.sub1623 %6 = IMPLICIT_DEF624 %7 = COPY %6.sub0625 %8 = S_MOV_B32 61440626 %9 = S_MOV_B32 -1627 %10 = REG_SEQUENCE killed %7, 1, killed %5, 2, killed %9, 3, killed %8, 4628 %11 = BUFFER_LOAD_USHORT_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s16) from `ptr addrspace(1) poison`)629 %12 = BUFFER_LOAD_USHORT_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s16) from `ptr addrspace(1) poison`)630 %13 = V_MOV_B32_e32 80886784, implicit $exec631 %14 = V_ADD_F16_e64 0, %11, 0, %13, 0, 0, implicit $mode, implicit $exec632 %15 = V_ADD_F16_e64 0, %12, 0, %13, 0, 0, implicit $mode, implicit $exec633 BUFFER_STORE_SHORT_OFFSET killed %14, %10, 0, 0, 0, 0, implicit $exec :: (volatile store (s16) into `ptr addrspace(1) poison`)634 BUFFER_STORE_SHORT_OFFSET killed %15, %10, 0, 0, 0, 0, implicit $exec :: (volatile store (s16) into `ptr addrspace(1) poison`)635 S_ENDPGM 0636 637...638---639 640# CHECK-LABEL: name: add_f16_1.0_other_high_bits_use_f16_f32641# CHECK: %14:vgpr_32 = V_ADD_F32_e32 305413120, %11, implicit $mode, implicit $exec642# CHECK: %15:vgpr_32 = V_ADD_F16_e32 305413120, %12, implicit $mode, implicit $exec643name: add_f16_1.0_other_high_bits_use_f16_f32644alignment: 1645exposesReturnsTwice: false646legalized: false647regBankSelected: false648selected: false649tracksRegLiveness: true650registers:651 - { id: 0, class: sreg_64 }652 - { id: 1, class: sreg_32 }653 - { id: 2, class: sgpr_32 }654 - { id: 3, class: vgpr_32 }655 - { id: 4, class: sreg_64 }656 - { id: 5, class: sreg_32 }657 - { id: 6, class: sreg_64 }658 - { id: 7, class: sreg_32 }659 - { id: 8, class: sreg_32 }660 - { id: 9, class: sreg_32 }661 - { id: 10, class: sgpr_128 }662 - { id: 11, class: vgpr_32 }663 - { id: 12, class: vgpr_32 }664 - { id: 13, class: vgpr_32 }665 - { id: 14, class: vgpr_32 }666 - { id: 15, class: vgpr_32 }667frameInfo:668 isFrameAddressTaken: false669 isReturnAddressTaken: false670 hasStackMap: false671 hasPatchPoint: false672 stackSize: 0673 offsetAdjustment: 0674 maxAlignment: 0675 adjustsStack: false676 hasCalls: false677 maxCallFrameSize: 0678 hasOpaqueSPAdjustment: false679 hasVAStart: false680 hasMustTailInVarArgFunc: false681body: |682 bb.0 (%ir-block.0):683 %4 = IMPLICIT_DEF684 %5 = COPY %4.sub1685 %6 = IMPLICIT_DEF686 %7 = COPY %6.sub0687 %8 = S_MOV_B32 61440688 %9 = S_MOV_B32 -1689 %10 = REG_SEQUENCE killed %7, 1, killed %5, 2, killed %9, 3, killed %8, 4690 %11 = BUFFER_LOAD_DWORD_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s32) from `ptr addrspace(1) poison`)691 %12 = BUFFER_LOAD_USHORT_OFFSET %10, 0, 0, 0, 0, implicit $exec :: (volatile load (s16) from `ptr addrspace(1) poison`)692 %13 = V_MOV_B32_e32 305413120, implicit $exec693 %14 = V_ADD_F32_e64 0, %11, 0, %13, 0, 0, implicit $mode, implicit $exec694 %15 = V_ADD_F16_e64 0, %12, 0, %13, 0, 0, implicit $mode, implicit $exec695 BUFFER_STORE_DWORD_OFFSET killed %14, %10, 0, 0, 0, 0, implicit $exec :: (volatile store (s32) into `ptr addrspace(1) poison`)696 BUFFER_STORE_SHORT_OFFSET killed %15, %10, 0, 0, 0, 0, implicit $exec :: (volatile store (s16) into `ptr addrspace(1) poison`)697 S_ENDPGM 0698 699...700