| # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py |
| # RUN: llc -march=amdgcn -mcpu=gfx908 -verify-machineinstrs -run-pass=machine-sink -o - %s | FileCheck -check-prefixes=GFX9 %s |
| |
| --- |
| name: test_sink_fmac_to_only_use |
| alignment: 1 |
| tracksRegLiveness: true |
| machineFunctionInfo: |
| isEntryFunction: true |
| body: | |
| ; GFX9-LABEL: name: test_sink_fmac_to_only_use |
| ; GFX9: bb.0: |
| ; GFX9-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 |
| ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 |
| ; GFX9-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| ; GFX9-NEXT: [[V_MOV_B32_e32_1:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| ; GFX9-NEXT: [[S_MOV_B64_:%[0-9]+]]:sreg_64 = S_MOV_B64 0 |
| ; GFX9-NEXT: [[S_MOV_B64_1:%[0-9]+]]:sreg_64 = S_MOV_B64 0 |
| ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_]] |
| ; GFX9-NEXT: [[COPY3:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_1]] |
| ; GFX9-NEXT: [[GLOBAL_LOAD_DWORD:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY2]], 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| ; GFX9-NEXT: [[GLOBAL_LOAD_DWORD1:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY3]], 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| ; GFX9-NEXT: [[COPY4:%[0-9]+]]:vgpr_32(s32) = COPY $vgpr0 |
| ; GFX9-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 1 |
| ; GFX9-NEXT: [[V_CMP_LT_I32_e64_:%[0-9]+]]:sreg_64 = V_CMP_LT_I32_e64 [[COPY4]](s32), [[S_MOV_B32_]], implicit $exec |
| ; GFX9-NEXT: [[SI_IF:%[0-9]+]]:sreg_64 = SI_IF [[V_CMP_LT_I32_e64_]], %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| ; GFX9-NEXT: S_BRANCH %bb.1 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.1: |
| ; GFX9-NEXT: successors: %bb.2(0x80000000) |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: %9:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec |
| ; GFX9-NEXT: %10:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %9, 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec |
| ; GFX9-NEXT: %12:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD1]], 0, [[COPY1]], 0, [[COPY]], 0, 0, implicit $mode, implicit $exec |
| ; GFX9-NEXT: %13:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %12, 0, [[COPY1]], 0, [[COPY]], 0, 0, implicit $mode, implicit $exec |
| ; GFX9-NEXT: [[V_ADD_F32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_F32_e32 %9, %10, implicit $mode, implicit $exec |
| ; GFX9-NEXT: [[V_ADD_F32_e32_1:%[0-9]+]]:vgpr_32 = V_ADD_F32_e32 %12, %13, implicit $mode, implicit $exec |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.2: |
| ; GFX9-NEXT: successors: %bb.3(0x80000000) |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[PHI:%[0-9]+]]:vgpr_32 = PHI [[V_MOV_B32_e32_]], %bb.0, [[V_ADD_F32_e32_]], %bb.1 |
| ; GFX9-NEXT: [[PHI1:%[0-9]+]]:vgpr_32 = PHI [[V_MOV_B32_e32_1]], %bb.0, [[V_ADD_F32_e32_1]], %bb.1 |
| ; GFX9-NEXT: SI_END_CF [[SI_IF]], implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.3: |
| ; GFX9-NEXT: S_ENDPGM 0, implicit [[PHI]], implicit [[PHI1]] |
| bb.0: |
| liveins: $vgpr0, $vgpr1, $vgpr2 |
| %1:vgpr_32 = COPY $vgpr0 |
| %2:vgpr_32 = COPY $vgpr1 |
| %3:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| %4:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| %5:sreg_64 = S_MOV_B64 0 |
| %6:sreg_64 = S_MOV_B64 0 |
| %7:vreg_64 = COPY %5 |
| %8:vreg_64 = COPY %6 |
| %9:vgpr_32 = GLOBAL_LOAD_DWORD killed %7, 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| %10:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %9, 0, %1, 0, %2, 0, 0, implicit $mode, implicit $exec |
| %11:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %10, 0, %1, 0, %2, 0, 0, implicit $mode, implicit $exec |
| %12:vgpr_32 = GLOBAL_LOAD_DWORD killed %8, 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| %13:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %12, 0, %2, 0, %1, 0, 0, implicit $mode, implicit $exec |
| %14:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %13, 0, %2, 0, %1, 0, 0, implicit $mode, implicit $exec |
| %15:vgpr_32(s32) = COPY $vgpr0 |
| %16:sreg_32 = S_MOV_B32 1 |
| %17:sreg_64 = V_CMP_LT_I32_e64 %15(s32), %16, implicit $exec |
| %18:sreg_64 = COPY %17 |
| %19:sreg_64 = SI_IF %18, %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| S_BRANCH %bb.1 |
| |
| bb.1: |
| %20:vgpr_32 = V_ADD_F32_e32 %10, %11, implicit $mode, implicit $exec |
| %21:vgpr_32 = V_ADD_F32_e32 %13, %14, implicit $mode, implicit $exec |
| |
| bb.2: |
| %22:vgpr_32 = PHI %3, %bb.0, %20, %bb.1 |
| %23:vgpr_32 = PHI %4, %bb.0, %21, %bb.1 |
| SI_END_CF %19, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| |
| bb.3: |
| S_ENDPGM 0, implicit %22, implicit %23 |
| ... |
| --- |
| name: test_no_sink_into_if_cond_multiple_uses |
| alignment: 1 |
| tracksRegLiveness: true |
| machineFunctionInfo: |
| isEntryFunction: true |
| body: | |
| ; GFX9-LABEL: name: test_no_sink_into_if_cond_multiple_uses |
| ; GFX9: bb.0: |
| ; GFX9-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 |
| ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 |
| ; GFX9-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| ; GFX9-NEXT: [[V_MOV_B32_e32_1:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| ; GFX9-NEXT: [[S_MOV_B64_:%[0-9]+]]:sreg_64 = S_MOV_B64 0 |
| ; GFX9-NEXT: [[S_MOV_B64_1:%[0-9]+]]:sreg_64 = S_MOV_B64 0 |
| ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_]] |
| ; GFX9-NEXT: [[COPY3:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_1]] |
| ; GFX9-NEXT: [[GLOBAL_LOAD_DWORD:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY2]], 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| ; GFX9-NEXT: %9:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec |
| ; GFX9-NEXT: %10:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %9, 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec |
| ; GFX9-NEXT: [[GLOBAL_LOAD_DWORD1:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY3]], 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| ; GFX9-NEXT: %12:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD1]], 0, [[COPY1]], 0, [[COPY]], 0, 0, implicit $mode, implicit $exec |
| ; GFX9-NEXT: %13:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %12, 0, [[COPY1]], 0, [[COPY]], 0, 0, implicit $mode, implicit $exec |
| ; GFX9-NEXT: [[COPY4:%[0-9]+]]:vgpr_32(s32) = COPY $vgpr0 |
| ; GFX9-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 1 |
| ; GFX9-NEXT: [[V_CMP_LT_I32_e64_:%[0-9]+]]:sreg_64 = V_CMP_LT_I32_e64 [[COPY4]](s32), [[S_MOV_B32_]], implicit $exec |
| ; GFX9-NEXT: [[SI_IF:%[0-9]+]]:sreg_64 = SI_IF [[V_CMP_LT_I32_e64_]], %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| ; GFX9-NEXT: S_BRANCH %bb.1 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.1: |
| ; GFX9-NEXT: successors: %bb.2(0x80000000) |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[V_ADD_F32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_F32_e32 %9, %10, implicit $mode, implicit $exec |
| ; GFX9-NEXT: [[V_ADD_F32_e32_1:%[0-9]+]]:vgpr_32 = V_ADD_F32_e32 %12, %13, implicit $mode, implicit $exec |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.2: |
| ; GFX9-NEXT: successors: %bb.3(0x80000000) |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[PHI:%[0-9]+]]:vgpr_32 = PHI [[V_MOV_B32_e32_]], %bb.0, [[V_ADD_F32_e32_]], %bb.1 |
| ; GFX9-NEXT: [[PHI1:%[0-9]+]]:vgpr_32 = PHI [[V_MOV_B32_e32_1]], %bb.0, [[V_ADD_F32_e32_1]], %bb.1 |
| ; GFX9-NEXT: SI_END_CF [[SI_IF]], implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.3: |
| ; GFX9-NEXT: [[V_ADD_F32_e32_2:%[0-9]+]]:vgpr_32 = V_ADD_F32_e32 %13, %10, implicit $mode, implicit $exec |
| ; GFX9-NEXT: S_ENDPGM 0, implicit [[PHI]], implicit [[PHI1]] |
| bb.0: |
| liveins: $vgpr0, $vgpr1, $vgpr2 |
| %1:vgpr_32 = COPY $vgpr0 |
| %2:vgpr_32 = COPY $vgpr1 |
| %3:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| %4:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| %5:sreg_64 = S_MOV_B64 0 |
| %6:sreg_64 = S_MOV_B64 0 |
| %7:vreg_64 = COPY %5 |
| %8:vreg_64 = COPY %6 |
| %9:vgpr_32 = GLOBAL_LOAD_DWORD killed %7, 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| %10:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %9, 0, %1, 0, %2, 0, 0, implicit $mode, implicit $exec |
| %11:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %10, 0, %1, 0, %2, 0, 0, implicit $mode, implicit $exec |
| %12:vgpr_32 = GLOBAL_LOAD_DWORD killed %8, 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| %13:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %12, 0, %2, 0, %1, 0, 0, implicit $mode, implicit $exec |
| %14:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %13, 0, %2, 0, %1, 0, 0, implicit $mode, implicit $exec |
| %15:vgpr_32(s32) = COPY $vgpr0 |
| %16:sreg_32 = S_MOV_B32 1 |
| %17:sreg_64 = V_CMP_LT_I32_e64 %15(s32), %16, implicit $exec |
| %18:sreg_64 = COPY %17 |
| %19:sreg_64 = SI_IF %18, %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| S_BRANCH %bb.1 |
| |
| bb.1: |
| %20:vgpr_32 = V_ADD_F32_e32 %10, %11, implicit $mode, implicit $exec |
| %21:vgpr_32 = V_ADD_F32_e32 %13, %14, implicit $mode, implicit $exec |
| |
| bb.2: |
| %22:vgpr_32 = PHI %3, %bb.0, %20, %bb.1 |
| %23:vgpr_32 = PHI %4, %bb.0, %21, %bb.1 |
| SI_END_CF %19, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| |
| bb.3: |
| %24:vgpr_32 = V_ADD_F32_e32 %14, %11, implicit $mode, implicit $exec |
| S_ENDPGM 0, implicit %22, implicit %23 |
| ... |
| --- |
| name: no_sink_fmac_not_constant_mode |
| alignment: 1 |
| tracksRegLiveness: true |
| machineFunctionInfo: |
| isEntryFunction: true |
| body: | |
| ; GFX9-LABEL: name: no_sink_fmac_not_constant_mode |
| ; GFX9: bb.0: |
| ; GFX9-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: $mode = IMPLICIT_DEF |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 |
| ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 |
| ; GFX9-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| ; GFX9-NEXT: [[V_MOV_B32_e32_1:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| ; GFX9-NEXT: [[S_MOV_B64_:%[0-9]+]]:sreg_64 = S_MOV_B64 0 |
| ; GFX9-NEXT: [[S_MOV_B64_1:%[0-9]+]]:sreg_64 = S_MOV_B64 0 |
| ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_]] |
| ; GFX9-NEXT: [[COPY3:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_1]] |
| ; GFX9-NEXT: [[GLOBAL_LOAD_DWORD:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY2]], 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| ; GFX9-NEXT: %9:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec |
| ; GFX9-NEXT: %10:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %9, 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec |
| ; GFX9-NEXT: [[GLOBAL_LOAD_DWORD1:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY3]], 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| ; GFX9-NEXT: %12:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD1]], 0, [[COPY1]], 0, [[COPY]], 0, 0, implicit $mode, implicit $exec |
| ; GFX9-NEXT: %13:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %12, 0, [[COPY1]], 0, [[COPY]], 0, 0, implicit $mode, implicit $exec |
| ; GFX9-NEXT: [[COPY4:%[0-9]+]]:vgpr_32(s32) = COPY $vgpr0 |
| ; GFX9-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 1 |
| ; GFX9-NEXT: [[V_CMP_LT_I32_e64_:%[0-9]+]]:sreg_64 = V_CMP_LT_I32_e64 [[COPY4]](s32), [[S_MOV_B32_]], implicit $exec |
| ; GFX9-NEXT: [[SI_IF:%[0-9]+]]:sreg_64 = SI_IF [[V_CMP_LT_I32_e64_]], %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| ; GFX9-NEXT: S_BRANCH %bb.1 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.1: |
| ; GFX9-NEXT: successors: %bb.2(0x80000000) |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[V_ADD_F32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_F32_e32 %9, %10, implicit $mode, implicit $exec |
| ; GFX9-NEXT: [[V_ADD_F32_e32_1:%[0-9]+]]:vgpr_32 = V_ADD_F32_e32 %12, %13, implicit $mode, implicit $exec |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.2: |
| ; GFX9-NEXT: successors: %bb.3(0x80000000) |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[PHI:%[0-9]+]]:vgpr_32 = PHI [[V_MOV_B32_e32_]], %bb.0, [[V_ADD_F32_e32_]], %bb.1 |
| ; GFX9-NEXT: [[PHI1:%[0-9]+]]:vgpr_32 = PHI [[V_MOV_B32_e32_1]], %bb.0, [[V_ADD_F32_e32_1]], %bb.1 |
| ; GFX9-NEXT: SI_END_CF [[SI_IF]], implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.3: |
| ; GFX9-NEXT: S_ENDPGM 0, implicit [[PHI]], implicit [[PHI1]] |
| bb.0: |
| liveins: $vgpr0, $vgpr1, $vgpr2 |
| $mode = IMPLICIT_DEF |
| %1:vgpr_32 = COPY $vgpr0 |
| %2:vgpr_32 = COPY $vgpr1 |
| %3:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| %4:vgpr_32 = V_MOV_B32_e32 0, implicit $exec |
| %5:sreg_64 = S_MOV_B64 0 |
| %6:sreg_64 = S_MOV_B64 0 |
| %7:vreg_64 = COPY %5 |
| %8:vreg_64 = COPY %6 |
| %9:vgpr_32 = GLOBAL_LOAD_DWORD killed %7, 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| %10:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %9, 0, %1, 0, %2, 0, 0, implicit $mode, implicit $exec |
| %11:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %10, 0, %1, 0, %2, 0, 0, implicit $mode, implicit $exec |
| %12:vgpr_32 = GLOBAL_LOAD_DWORD killed %8, 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| %13:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %12, 0, %2, 0, %1, 0, 0, implicit $mode, implicit $exec |
| %14:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %13, 0, %2, 0, %1, 0, 0, implicit $mode, implicit $exec |
| %15:vgpr_32(s32) = COPY $vgpr0 |
| %16:sreg_32 = S_MOV_B32 1 |
| %17:sreg_64 = V_CMP_LT_I32_e64 %15(s32), %16, implicit $exec |
| %18:sreg_64 = COPY %17 |
| %19:sreg_64 = SI_IF %18, %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| S_BRANCH %bb.1 |
| |
| bb.1: |
| %20:vgpr_32 = V_ADD_F32_e32 %10, %11, implicit $mode, implicit $exec |
| %21:vgpr_32 = V_ADD_F32_e32 %13, %14, implicit $mode, implicit $exec |
| |
| bb.2: |
| %22:vgpr_32 = PHI %3, %bb.0, %20, %bb.1 |
| %23:vgpr_32 = PHI %4, %bb.0, %21, %bb.1 |
| SI_END_CF %19, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| |
| bb.3: |
| S_ENDPGM 0, implicit %22, implicit %23 |
| ... |
| --- |
| name: test_no_sink_fmac_wwm |
| alignment: 1 |
| tracksRegLiveness: true |
| machineFunctionInfo: |
| isEntryFunction: true |
| body: | |
| ; GFX9-LABEL: name: test_no_sink_fmac_wwm |
| ; GFX9: bb.0: |
| ; GFX9-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 |
| ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 |
| ; GFX9-NEXT: [[S_MOV_B64_:%[0-9]+]]:sreg_64 = S_MOV_B64 0 |
| ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_]] |
| ; GFX9-NEXT: [[GLOBAL_LOAD_DWORD:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY2]], 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| ; GFX9-NEXT: %5:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec |
| ; GFX9-NEXT: early-clobber %6:vgpr_32 = STRICT_WWM %5, implicit $exec |
| ; GFX9-NEXT: [[COPY3:%[0-9]+]]:vgpr_32(s32) = COPY $vgpr0 |
| ; GFX9-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 1 |
| ; GFX9-NEXT: [[V_CMP_LT_I32_e64_:%[0-9]+]]:sreg_64 = V_CMP_LT_I32_e64 [[COPY3]](s32), [[S_MOV_B32_]], implicit $exec |
| ; GFX9-NEXT: [[SI_IF:%[0-9]+]]:sreg_64 = SI_IF [[V_CMP_LT_I32_e64_]], %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| ; GFX9-NEXT: S_BRANCH %bb.1 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.1: |
| ; GFX9-NEXT: successors: %bb.2(0x80000000) |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.2: |
| ; GFX9-NEXT: successors: %bb.3(0x80000000) |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: S_NOP 0, implicit %5 |
| ; GFX9-NEXT: SI_END_CF [[SI_IF]], implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.3: |
| ; GFX9-NEXT: S_ENDPGM 0, implicit %6 |
| bb.0: |
| liveins: $vgpr0, $vgpr1, $vgpr2 |
| %1:vgpr_32 = COPY $vgpr0 |
| %2:vgpr_32 = COPY $vgpr1 |
| |
| %20:sreg_64 = S_MOV_B64 0 |
| %30:vreg_64 = COPY %20 |
| %29:vgpr_32 = GLOBAL_LOAD_DWORD killed %30, 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| %6:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %29, 0, %1, 0, %2, 0, 0, implicit $mode, implicit $exec |
| %9:vgpr_32 = STRICT_WWM %6, implicit $exec |
| |
| %16:vgpr_32(s32) = COPY $vgpr0 |
| %23:sreg_32 = S_MOV_B32 1 |
| %24:sreg_64 = V_CMP_LT_I32_e64 %16(s32), %23, implicit $exec |
| %0:sreg_64 = COPY %24 |
| %5:sreg_64 = SI_IF %0, %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| S_BRANCH %bb.1 |
| |
| bb.1: |
| |
| bb.2: |
| S_NOP 0, implicit %6 |
| SI_END_CF %5, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| |
| bb.3: |
| S_ENDPGM 0, implicit %9 |
| ... |
| --- |
| name: test_def_and_use_in_loop_sink_fmac |
| tracksRegLiveness: true |
| machineFunctionInfo: |
| isEntryFunction: true |
| body: | |
| ; GFX9-LABEL: name: test_def_and_use_in_loop_sink_fmac |
| ; GFX9: bb.0.entry: |
| ; GFX9-NEXT: successors: %bb.1(0x80000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 |
| ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 |
| ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vreg_64 = COPY $vgpr2_vgpr3 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.1: |
| ; GFX9-NEXT: successors: %bb.2(0x40000000), %bb.3(0x40000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[S_MOV_B64_:%[0-9]+]]:sreg_64 = S_MOV_B64 0 |
| ; GFX9-NEXT: [[COPY3:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_]] |
| ; GFX9-NEXT: [[GLOBAL_LOAD_DWORD:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD [[COPY3]], 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| ; GFX9-NEXT: [[GLOBAL_LOAD_DWORD1:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD [[COPY2]], 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| ; GFX9-NEXT: [[COPY4:%[0-9]+]]:vgpr_32(s32) = COPY $vgpr0 |
| ; GFX9-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 1 |
| ; GFX9-NEXT: [[V_CMP_LT_I32_e64_:%[0-9]+]]:sreg_64 = V_CMP_LT_I32_e64 [[COPY4]](s32), [[S_MOV_B32_]], implicit $exec |
| ; GFX9-NEXT: [[SI_IF:%[0-9]+]]:sreg_64 = SI_IF [[V_CMP_LT_I32_e64_]], %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| ; GFX9-NEXT: S_BRANCH %bb.2 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.2: |
| ; GFX9-NEXT: successors: %bb.3(0x80000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: S_NOP 0 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.3: |
| ; GFX9-NEXT: successors: %bb.4(0x40000000), %bb.6(0x40000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: %6:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec |
| ; GFX9-NEXT: %8:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD1]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec |
| ; GFX9-NEXT: S_NOP 0, implicit %6, implicit %8 |
| ; GFX9-NEXT: SI_END_CF [[SI_IF]], implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| ; GFX9-NEXT: S_CBRANCH_EXECZ %bb.6, implicit $exec |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.4: |
| ; GFX9-NEXT: successors: %bb.5(0x04000000), %bb.4(0x7c000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: S_NOP 0 |
| ; GFX9-NEXT: S_CBRANCH_EXECZ %bb.4, implicit $exec |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.5: |
| ; GFX9-NEXT: successors: %bb.6(0x80000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: S_NOP 0 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.6: |
| ; GFX9-NEXT: successors: %bb.7(0x04000000), %bb.1(0x7c000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: S_CBRANCH_VCCZ %bb.1, implicit $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.7: |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: S_ENDPGM 0 |
| bb.0.entry: |
| successors: %bb.1(0x80000000) |
| |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| %101:vgpr_32 = COPY $vgpr0 |
| %102:vgpr_32 = COPY $vgpr1 |
| %15:vreg_64 = COPY $vgpr2_vgpr3 |
| |
| bb.1: |
| successors: %bb.2(0x40000000), %bb.3(0x40000000) |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| |
| %20:sreg_64 = S_MOV_B64 0 |
| %30:vreg_64 = COPY %20 |
| %29:vgpr_32 = GLOBAL_LOAD_DWORD %30, 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| %6:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %29, 0, %101, 0, %102, 0, 0, implicit $mode, implicit $exec |
| %31:vgpr_32 = GLOBAL_LOAD_DWORD %15, 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| %7:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %31, 0, %101, 0, %102, 0, 0, implicit $mode, implicit $exec |
| %16:vgpr_32(s32) = COPY $vgpr0 |
| %23:sreg_32 = S_MOV_B32 1 |
| %24:sreg_64 = V_CMP_LT_I32_e64 %16(s32), %23, implicit $exec |
| %0:sreg_64 = COPY %24 |
| %5:sreg_64 = SI_IF %0, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| S_BRANCH %bb.2 |
| |
| bb.2: |
| successors: %bb.3(0x80000000) |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| |
| S_NOP 0 |
| |
| bb.3: |
| successors: %bb.4(0x40000000), %bb.6(0x40000000) |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| |
| S_NOP 0, implicit %6, implicit %7 |
| SI_END_CF %5, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| S_CBRANCH_EXECZ %bb.6, implicit $exec |
| |
| bb.4: |
| successors: %bb.5(0x04000000), %bb.4(0x7c000000) |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| |
| S_NOP 0 |
| S_CBRANCH_EXECZ %bb.4, implicit $exec |
| |
| bb.5: |
| successors: %bb.6(0x80000000) |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| |
| S_NOP 0 |
| |
| bb.6: |
| successors: %bb.7(0x04000000), %bb.1(0x7c000000) |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| |
| S_CBRANCH_VCCZ %bb.1, implicit $vcc |
| |
| bb.7: |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| S_ENDPGM 0 |
| ... |
| --- |
| name: test_no_sink_def_into_loop |
| tracksRegLiveness: true |
| machineFunctionInfo: |
| isEntryFunction: true |
| body: | |
| ; GFX9-LABEL: name: test_no_sink_def_into_loop |
| ; GFX9: bb.0.entry: |
| ; GFX9-NEXT: successors: %bb.1(0x80000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 |
| ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 |
| ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vreg_64 = COPY $vgpr2_vgpr3 |
| ; GFX9-NEXT: [[S_MOV_B64_:%[0-9]+]]:sreg_64 = S_MOV_B64 0 |
| ; GFX9-NEXT: [[COPY3:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_]] |
| ; GFX9-NEXT: [[GLOBAL_LOAD_DWORD:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY3]], 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| ; GFX9-NEXT: %6:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec |
| ; GFX9-NEXT: [[GLOBAL_LOAD_DWORD1:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY2]], 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| ; GFX9-NEXT: %8:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD1]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.1: |
| ; GFX9-NEXT: successors: %bb.2(0x40000000), %bb.3(0x40000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: S_NOP 0, implicit %6, implicit %8 |
| ; GFX9-NEXT: [[COPY4:%[0-9]+]]:vgpr_32(s32) = COPY $vgpr0 |
| ; GFX9-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 1 |
| ; GFX9-NEXT: [[V_CMP_LT_I32_e64_:%[0-9]+]]:sreg_64 = V_CMP_LT_I32_e64 [[COPY4]](s32), [[S_MOV_B32_]], implicit $exec |
| ; GFX9-NEXT: [[SI_IF:%[0-9]+]]:sreg_64 = SI_IF [[V_CMP_LT_I32_e64_]], %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| ; GFX9-NEXT: S_BRANCH %bb.2 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.2: |
| ; GFX9-NEXT: successors: %bb.3(0x80000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: S_NOP 0 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.3: |
| ; GFX9-NEXT: successors: %bb.4(0x40000000), %bb.6(0x40000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: SI_END_CF [[SI_IF]], implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| ; GFX9-NEXT: S_CBRANCH_EXECZ %bb.6, implicit $exec |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.4: |
| ; GFX9-NEXT: successors: %bb.5(0x04000000), %bb.4(0x7c000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: S_NOP 0 |
| ; GFX9-NEXT: S_CBRANCH_EXECZ %bb.4, implicit $exec |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.5: |
| ; GFX9-NEXT: successors: %bb.6(0x80000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: S_NOP 0 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.6: |
| ; GFX9-NEXT: successors: %bb.7(0x04000000), %bb.1(0x7c000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: S_CBRANCH_VCCZ %bb.1, implicit $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.7: |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: S_ENDPGM 0 |
| bb.0.entry: |
| successors: %bb.1(0x80000000) |
| |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| %101:vgpr_32 = COPY $vgpr0 |
| %102:vgpr_32 = COPY $vgpr1 |
| %15:vreg_64 = COPY $vgpr2_vgpr3 |
| %20:sreg_64 = S_MOV_B64 0 |
| %30:vreg_64 = COPY %20 |
| %29:vgpr_32 = GLOBAL_LOAD_DWORD killed %30, 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| %6:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %29, 0, %101, 0, %102, 0, 0, implicit $mode, implicit $exec |
| %31:vgpr_32 = GLOBAL_LOAD_DWORD killed %15, 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| %7:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %31, 0, %101, 0, %102, 0, 0, implicit $mode, implicit $exec |
| |
| bb.1: |
| successors: %bb.2(0x40000000), %bb.3(0x40000000) |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| |
| S_NOP 0, implicit %6, implicit %7 |
| %16:vgpr_32(s32) = COPY $vgpr0 |
| %23:sreg_32 = S_MOV_B32 1 |
| %24:sreg_64 = V_CMP_LT_I32_e64 %16(s32), %23, implicit $exec |
| %0:sreg_64 = COPY %24 |
| %5:sreg_64 = SI_IF %0, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| S_BRANCH %bb.2 |
| |
| bb.2: |
| successors: %bb.3(0x80000000) |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| |
| S_NOP 0 |
| |
| bb.3: |
| successors: %bb.4(0x40000000), %bb.6(0x40000000) |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| |
| SI_END_CF %5, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| S_CBRANCH_EXECZ %bb.6, implicit $exec |
| |
| bb.4: |
| successors: %bb.5(0x04000000), %bb.4(0x7c000000) |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| |
| S_NOP 0 |
| S_CBRANCH_EXECZ %bb.4, implicit $exec |
| |
| bb.5: |
| successors: %bb.6(0x80000000) |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| |
| S_NOP 0 |
| |
| bb.6: |
| successors: %bb.7(0x04000000), %bb.1(0x7c000000) |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| |
| S_CBRANCH_VCCZ %bb.1, implicit $vcc |
| |
| bb.7: |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| S_ENDPGM 0 |
| ... |
| --- |
| name: test_no_sink_def_into_loop2 |
| tracksRegLiveness: true |
| machineFunctionInfo: |
| isEntryFunction: true |
| body: | |
| ; GFX9-LABEL: name: test_no_sink_def_into_loop2 |
| ; GFX9: bb.0.entry: |
| ; GFX9-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 |
| ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 |
| ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vreg_64 = COPY $vgpr2_vgpr3 |
| ; GFX9-NEXT: [[S_MOV_B64_:%[0-9]+]]:sreg_64 = S_MOV_B64 0 |
| ; GFX9-NEXT: [[COPY3:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_]] |
| ; GFX9-NEXT: [[GLOBAL_LOAD_DWORD:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY3]], 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| ; GFX9-NEXT: %6:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec |
| ; GFX9-NEXT: [[GLOBAL_LOAD_DWORD1:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY2]], 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| ; GFX9-NEXT: %8:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD1]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec |
| ; GFX9-NEXT: S_CBRANCH_EXECZ %bb.2, implicit $exec |
| ; GFX9-NEXT: S_BRANCH %bb.1 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.1: |
| ; GFX9-NEXT: successors: %bb.2(0x80000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: S_NOP 0 |
| ; GFX9-NEXT: S_BRANCH %bb.2 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.2: |
| ; GFX9-NEXT: successors: %bb.3(0x40000000), %bb.4(0x40000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: S_NOP 0, implicit %6, implicit %8 |
| ; GFX9-NEXT: [[COPY4:%[0-9]+]]:vgpr_32(s32) = COPY $vgpr0 |
| ; GFX9-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 1 |
| ; GFX9-NEXT: [[V_CMP_LT_I32_e64_:%[0-9]+]]:sreg_64 = V_CMP_LT_I32_e64 [[COPY4]](s32), [[S_MOV_B32_]], implicit $exec |
| ; GFX9-NEXT: [[SI_IF:%[0-9]+]]:sreg_64 = SI_IF [[V_CMP_LT_I32_e64_]], %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| ; GFX9-NEXT: S_BRANCH %bb.3 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.3: |
| ; GFX9-NEXT: successors: %bb.4(0x80000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: S_NOP 0 |
| ; GFX9-NEXT: S_BRANCH %bb.4 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.4: |
| ; GFX9-NEXT: successors: %bb.5(0x40000000), %bb.7(0x40000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: SI_END_CF [[SI_IF]], implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| ; GFX9-NEXT: S_CBRANCH_EXECZ %bb.7, implicit $exec |
| ; GFX9-NEXT: S_BRANCH %bb.5 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.5: |
| ; GFX9-NEXT: successors: %bb.6(0x04000000), %bb.5(0x7c000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: S_NOP 0 |
| ; GFX9-NEXT: S_CBRANCH_EXECZ %bb.5, implicit $exec |
| ; GFX9-NEXT: S_BRANCH %bb.6 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.6: |
| ; GFX9-NEXT: successors: %bb.7(0x80000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: S_NOP 0 |
| ; GFX9-NEXT: S_BRANCH %bb.7 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.7: |
| ; GFX9-NEXT: successors: %bb.8(0x04000000), %bb.2(0x7c000000) |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: S_CBRANCH_VCCZ %bb.2, implicit $vcc |
| ; GFX9-NEXT: S_BRANCH %bb.8 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: bb.8: |
| ; GFX9-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: S_ENDPGM 0 |
| bb.0.entry: |
| successors: %bb.1(0x40000000), %bb.2 (0x40000000) |
| |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| %101:vgpr_32 = COPY $vgpr0 |
| %102:vgpr_32 = COPY $vgpr1 |
| %15:vreg_64 = COPY $vgpr2_vgpr3 |
| %20:sreg_64 = S_MOV_B64 0 |
| %30:vreg_64 = COPY %20 |
| %29:vgpr_32 = GLOBAL_LOAD_DWORD killed %30, 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| %6:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %29, 0, %101, 0, %102, 0, 0, implicit $mode, implicit $exec |
| %31:vgpr_32 = GLOBAL_LOAD_DWORD killed %15, 0, 0, implicit $exec :: (load (s32), addrspace 1) |
| %7:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %31, 0, %101, 0, %102, 0, 0, implicit $mode, implicit $exec |
| S_CBRANCH_EXECZ %bb.2, implicit $exec |
| S_BRANCH %bb.1 |
| |
| bb.1: |
| successors: %bb.2(0x80000000) |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| S_NOP 0 |
| S_BRANCH %bb.2 |
| |
| bb.2: |
| successors: %bb.3(0x40000000), %bb.4(0x40000000) |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| |
| S_NOP 0, implicit %6, implicit %7 |
| %16:vgpr_32(s32) = COPY $vgpr0 |
| %23:sreg_32 = S_MOV_B32 1 |
| %24:sreg_64 = V_CMP_LT_I32_e64 %16(s32), %23, implicit $exec |
| %0:sreg_64 = COPY %24 |
| %5:sreg_64 = SI_IF %0, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| S_BRANCH %bb.3 |
| |
| bb.3: |
| successors: %bb.4(0x80000000) |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| |
| S_NOP 0 |
| S_BRANCH %bb.4 |
| |
| bb.4: |
| successors: %bb.5(0x40000000), %bb.7(0x40000000) |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| |
| SI_END_CF %5, implicit-def dead $exec, implicit-def dead $scc, implicit $exec |
| S_CBRANCH_EXECZ %bb.7, implicit $exec |
| S_BRANCH %bb.5 |
| |
| bb.5: |
| successors: %bb.6(0x04000000), %bb.5(0x7c000000) |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| |
| S_NOP 0 |
| S_CBRANCH_EXECZ %bb.5, implicit $exec |
| S_BRANCH %bb.6 |
| |
| bb.6: |
| successors: %bb.7(0x80000000) |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| |
| S_NOP 0 |
| S_BRANCH %bb.7 |
| |
| bb.7: |
| successors: %bb.8(0x04000000), %bb.2(0x7c000000) |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| |
| S_CBRANCH_VCCZ %bb.2, implicit $vcc |
| S_BRANCH %bb.8 |
| |
| bb.8: |
| liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc |
| S_ENDPGM 0 |
| ... |