735 lines
33 KiB
YAML
735 lines
33 KiB
YAML
# 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
|
|
...
|