blob: bf06a01d4c3c5685507bff8ca14c457a0867ea55 [file] [log] [blame]
# RUN: llc -march=amdgcn -mcpu=gfx900 -run-pass si-mode-register %s -o - | FileCheck %s
---
# check that the mode is changed to rtz from default rtn for interp f16
# CHECK-LABEL: name: interp_f16_default
# CHECK-LABEL: bb.0:
# CHECK: S_SETREG_IMM32_B32 3, 2177
# CHECK-NEXT: V_INTERP_P1LL_F16
# CHECK: S_SETREG_IMM32_B32 0, 2177
# CHECK-NEXT: V_ADD_F16_e32
# CHECK-NOT: S_SETREG_IMM32_B32
name: interp_f16_default
body: |
bb.0:
liveins: $sgpr0, $sgpr1, $sgpr2
$m0 = S_MOV_B32 killed $sgpr2
$vgpr0 = V_MOV_B32_e32 killed $sgpr0, implicit $exec, implicit $exec
$vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $m0, implicit $exec
$vgpr2 = V_MOV_B32_e32 killed $sgpr1, implicit $exec, implicit $exec
$vgpr0 = V_INTERP_P1LL_F16 0, killed $vgpr0, 2, 1, -1, 0, 0, implicit $m0, implicit $exec
$vgpr1 = V_INTERP_P2_F16 0, $vgpr2, 2, 1, 0, killed $vgpr1, 0, 0, implicit $m0, implicit $exec
$vgpr0 = V_INTERP_P2_F16 0, killed $vgpr2, 2, 1, 0, killed $vgpr0, -1, 0, implicit $m0, implicit $exec
$vgpr0 = V_ADD_F16_e32 killed $vgpr1, killed $vgpr0, implicit $exec
S_ENDPGM
...
---
# check that the mode is not changed for interp f16 when the mode is already RTZ
# CHECK-LABEL: name: interp_f16_explicit_rtz
# CHECK-LABEL: bb.0:
# CHECK: S_SETREG_IMM32_B32 3, 2177
# CHECK-NEXT: V_MOV_B32_e32
# CHECK: S_SETREG_IMM32_B32 0, 2177
# CHECK-NEXT: V_ADD_F16_e32
# CHECK-NOT: S_SETREG_IMM32_B32
name: interp_f16_explicit_rtz
body: |
bb.0:
liveins: $sgpr0, $sgpr1, $sgpr2
$m0 = S_MOV_B32 killed $sgpr2
S_SETREG_IMM32_B32 3, 2177
$vgpr0 = V_MOV_B32_e32 killed $sgpr0, implicit $exec, implicit $exec
$vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $m0, implicit $exec
$vgpr2 = V_MOV_B32_e32 killed $sgpr1, implicit $exec, implicit $exec
$vgpr0 = V_INTERP_P1LL_F16 0, killed $vgpr0, 2, 1, -1, 0, 0, implicit $m0, implicit $exec
$vgpr1 = V_INTERP_P2_F16 0, $vgpr2, 2, 1, 0, killed $vgpr1, 0, 0, implicit $m0, implicit $exec
$vgpr0 = V_INTERP_P2_F16 0, killed $vgpr2, 2, 1, 0, killed $vgpr0, -1, 0, implicit $m0, implicit $exec
$vgpr0 = V_ADD_F16_e32 killed $vgpr1, killed $vgpr0, implicit $exec
S_ENDPGM
...
---
# check that explicit RTN mode change is registered
# CHECK-LABEL: name: explicit_rtn
# CHECK-LABEL: bb.0:
# CHECK: S_SETREG_IMM32_B32 3, 2177
# CHECK-NEXT: V_INTERP_P1LL_F16
# CHECK: S_SETREG_IMM32_B32 0, 2177
# CHECK-NEXT: V_ADD_F16_e32
# CHECK-NOT: S_SETREG_IMM32_B32
name: explicit_rtn
body: |
bb.0:
liveins: $sgpr0, $sgpr1, $sgpr2
$m0 = S_MOV_B32 killed $sgpr2
$vgpr0 = V_MOV_B32_e32 killed $sgpr0, implicit $exec, implicit $exec
$vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $m0, implicit $exec
$vgpr2 = V_MOV_B32_e32 killed $sgpr1, implicit $exec, implicit $exec
$vgpr0 = V_INTERP_P1LL_F16 0, killed $vgpr0, 2, 1, -1, 0, 0, implicit $m0, implicit $exec
$vgpr1 = V_INTERP_P2_F16 0, $vgpr2, 2, 1, 0, killed $vgpr1, 0, 0, implicit $m0, implicit $exec
$vgpr0 = V_INTERP_P2_F16 0, killed $vgpr2, 2, 1, 0, killed $vgpr0, -1, 0, implicit $m0, implicit $exec
S_SETREG_IMM32_B32 0, 2177
$vgpr0 = V_ADD_F16_e32 killed $vgpr1, killed $vgpr0, implicit $exec
S_ENDPGM
...
---
# check that the mode is unchanged from RTN for F64 instruction
# CHECK-LABEL: name: rtn_default
# CHECK-LABEL: bb.0:
# CHECK-NOT: S_SETREG_IMM32_B32
# CHECK: V_FRACT_F64
name: rtn_default
body: |
bb.0:
liveins: $vgpr1_vgpr2
$vgpr1_vgpr2 = V_FRACT_F64_e32 killed $vgpr1_vgpr2, implicit $exec
S_ENDPGM
...
---
# check that the mode is changed from RTZ to RTN for F64 instruction
# CHECK-LABEL: name: rtn_from_rtz
# CHECK-LABEL: bb.0:
# CHECK: S_SETREG_IMM32_B32 3, 2177
# CHECK-NEXT: S_SETREG_IMM32_B32 0, 2177
# CHECK-NEXT: V_FRACT_F64
# CHECK-NOT: S_SETREG_IMM32_B32
name: rtn_from_rtz
body: |
bb.0:
liveins: $vgpr1_vgpr2
S_SETREG_IMM32_B32 3, 2177
$vgpr1_vgpr2 = V_FRACT_F64_e32 killed $vgpr1_vgpr2, implicit $exec
S_ENDPGM
...
---
# CHECK-LABEL: name: rtz_from_rtn
# CHECK-LABEL: bb.1:
# CHECK: S_SETREG_IMM32_B32 3, 2177
# CHECK-NOT: S_SETREG_IMM32_B32
name: rtz_from_rtn
body: |
bb.0:
successors: %bb.1
liveins: $vgpr1_vgpr2
$vgpr1_vgpr2 = V_FRACT_F64_e32 killed $vgpr1_vgpr2, implicit $exec
S_BRANCH %bb.1
bb.1:
$vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $m0, implicit $exec
S_ENDPGM
...
---
# check that the mode is changed from RTZ to RTN for F64 instruction
# and back again for remaining interp instruction
# CHECK-LABEL: name: interp_f16_plus_sqrt_f64
# CHECK-LABEL: bb.0:
# CHECK: S_SETREG_IMM32_B32 3, 2177
# CHECK: V_INTERP_P1LL_F16
# CHECK: V_INTERP_P1LL_F16
# CHECK: V_INTERP_P2_F16
# CHECK: S_SETREG_IMM32_B32 0, 2177
# CHECK: V_FRACT_F64
# CHECK: S_SETREG_IMM32_B32 3, 2177
# CHECK: V_INTERP_P2_F16
name: interp_f16_plus_sqrt_f64
body: |
bb.0:
liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr3, $vgpr4
$m0 = S_MOV_B32 killed $sgpr2
$vgpr0 = V_MOV_B32_e32 $sgpr0, implicit $exec, implicit $exec
$vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $m0, implicit $exec
$vgpr2 = V_MOV_B32_e32 $sgpr1, implicit $exec, implicit $exec
$vgpr0 = V_INTERP_P1LL_F16 0, killed $vgpr0, 2, 1, -1, 0, 0, implicit $m0, implicit $exec
$vgpr1 = V_INTERP_P2_F16 0, $vgpr2, 2, 1, 0, killed $vgpr1, 0, 0, implicit $m0, implicit $exec
$vgpr3_vgpr4 = V_FRACT_F64_e32 killed $vgpr3_vgpr4, implicit $exec
$vgpr0 = V_INTERP_P2_F16 0, killed $vgpr2, 2, 1, 0, killed $vgpr0, -1, 0, implicit $m0, implicit $exec
$vgpr0 = V_ADD_F16_e32 killed $sgpr0, killed $vgpr0, implicit $exec
S_ENDPGM
...
---
# check that an explicit change to the single precision mode has no effect
# CHECK-LABEL: name: single_precision_mode_change
# CHECK-LABEL: bb.0:
# CHECK: S_SETREG_IMM32_B32 3, 2177
# CHECK: V_INTERP_P1LL_F16
# CHECK: V_INTERP_P1LL_F16
# CHECK: V_INTERP_P2_F16
# CHECK: S_SETREG_IMM32_B32 0, 2177
# CHECK: V_FRACT_F64
# CHECK: S_SETREG_IMM32_B32 3, 2177
# CHECK: V_INTERP_P2_F16
name: single_precision_mode_change
body: |
bb.0:
liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr3, $vgpr4
$m0 = S_MOV_B32 killed $sgpr2
$vgpr0 = V_MOV_B32_e32 $sgpr0, implicit $exec, implicit $exec
$vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $m0, implicit $exec
S_SETREG_IMM32_B32 2, 2049
$vgpr2 = V_MOV_B32_e32 $sgpr1, implicit $exec, implicit $exec
$vgpr0 = V_INTERP_P1LL_F16 0, killed $vgpr0, 2, 1, -1, 0, 0, implicit $m0, implicit $exec
$vgpr1 = V_INTERP_P2_F16 0, $vgpr2, 2, 1, 0, killed $vgpr1, 0, 0, implicit $m0, implicit $exec
$vgpr3_vgpr4 = V_FRACT_F64_e32 killed $vgpr3_vgpr4, implicit $exec
$vgpr0 = V_INTERP_P2_F16 0, killed $vgpr2, 2, 1, 0, killed $vgpr0, -1, 0, implicit $m0, implicit $exec
$vgpr0 = V_ADD_F16_e32 killed $sgpr0, killed $vgpr0, implicit $exec
S_ENDPGM
...
---
# check that mode is propagated back to start of loop - first instruction is RTN but needs
# setreg as RTZ is set in loop
# CHECK-LABEL: name: loop
# CHECK-LABEL: bb.1:
# CHECK: S_SETREG_IMM32_B32 0, 2177
# CHECK: V_FRACT_F64
# CHECK-LABEL: bb.2:
# CHECK: S_SETREG_IMM32_B32 3, 2177
# CHECK: V_INTERP_P1LL_F16
# CHECK-NOT: S_SETREG_IMM32_B32
name: loop
body: |
bb.0:
liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr3, $vgpr4
successors: %bb.1
$m0 = S_MOV_B32 killed $sgpr2
S_BRANCH %bb.1
bb.1:
successors: %bb.2
$vgpr3_vgpr4 = V_FRACT_F64_e32 killed $vgpr3_vgpr4, implicit $exec
S_BRANCH %bb.2
bb.2:
successors: %bb.1, %bb.3
$vgpr0 = V_MOV_B32_e32 $sgpr0, implicit $exec, implicit $exec
$vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $m0, implicit $exec
S_CBRANCH_VCCZ %bb.1, implicit $vcc
S_BRANCH %bb.3
bb.3:
S_ENDPGM
...
---
# two back-edges to same node with different modes
# CHECK-LABEL: name: double_loop
# CHECK-NOT: S_SETREG_IMM32_B32
# CHECK-LABEL: bb.2:
# CHECK: S_SETREG_IMM32_B32 0, 2177
# CHECK: V_FRACT_F64_e32
# CHECK-LABEL: bb.4:
# CHECK: S_SETREG_IMM32_B32 3, 2177
name: double_loop
body: |
bb.0:
liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr3, $vgpr4
successors: %bb.1
$m0 = S_MOV_B32 killed $sgpr2
S_BRANCH %bb.1
bb.1:
successors: %bb.2
S_NOP 1
S_BRANCH %bb.2
bb.2:
successors: %bb.1, %bb.3
$vgpr3_vgpr4 = V_FRACT_F64_e32 killed $vgpr3_vgpr4, implicit $exec
S_CBRANCH_VCCZ %bb.1, implicit $vcc
S_BRANCH %bb.3
bb.3:
successors: %bb.4
S_NOP 1
S_BRANCH %bb.4
bb.4:
successors: %bb.5
S_NOP 1
S_BRANCH %bb.5
bb.5:
successors: %bb.1, %bb.6
S_SETREG_IMM32_B32 3, 2177
S_CBRANCH_VCCZ %bb.1, implicit $vcc
S_BRANCH %bb.6
bb.6:
S_ENDPGM
...
---
# check that mode is propagated back to start of loop and through a block that
# neither sets or uses the mode.
# CHECK-LABEL: name: loop_indirect
# CHECK_NOT: S_SETREG_IMM32_B32
# CHECK-LABEL: bb.3:
# CHECK: S_SETREG_IMM32_B32 3, 2177
# CHECK: V_INTERP_P1LL_F16
# CHECK-NOT: S_SETREG_IMM32_B32
name: loop_indirect
body: |
bb.0:
liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr3, $vgpr4
successors: %bb.1
$m0 = S_MOV_B32 killed $sgpr2
S_BRANCH %bb.1
bb.1:
successors: %bb.2
S_NOP 1
S_BRANCH %bb.2
bb.2:
successors: %bb.3
S_NOP 1
S_BRANCH %bb.3
bb.3:
successors: %bb.1, %bb.4
$vgpr0 = V_MOV_B32_e32 $sgpr0, implicit $exec, implicit $exec
$vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $m0, implicit $exec
S_CBRANCH_VCCZ %bb.1, implicit $vcc
S_BRANCH %bb.4
bb.4:
S_ENDPGM
...
---
# check that multiple mode values are propagated to a block that uses the mode
# CHECK-LABEL: name: multiple_mode_direct
# CHECK-LABEL: bb.3:
# CHECK: S_SETREG_IMM32_B32 0, 2177
# CHECK: V_FRACT_F64_e32
# CHECK-NOT: S_SETREG_IMM32_B32
name: multiple_mode_direct
body: |
bb.0:
liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr3, $vgpr4
successors: %bb.1
$m0 = S_MOV_B32 killed $sgpr2
S_BRANCH %bb.1
bb.1:
successors: %bb.2, %bb.3
S_CBRANCH_VCCZ %bb.2, implicit $vcc
S_BRANCH %bb.3
bb.2:
successors: %bb.3
S_SETREG_IMM32_B32 3, 2177
S_BRANCH %bb.3
bb.3:
successors: %bb.4
$vgpr3_vgpr4 = V_FRACT_F64_e32 killed $vgpr3_vgpr4, implicit $exec
S_BRANCH %bb.4
bb.4:
S_ENDPGM
...
---
# check that multiple mode values are propagated through a block that neither
# sets or uses the mode.
# CHECK-LABEL: name: multiple_mode_indirect
# CHECK-LABEL: bb.4:
# CHECK: S_SETREG_IMM32_B32 0, 2177
# CHECK: V_FRACT_F64_e32
# CHECK-NOT: S_SETREG_IMM32_B32
name: multiple_mode_indirect
body: |
bb.0:
liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr3, $vgpr4
successors: %bb.1
$m0 = S_MOV_B32 killed $sgpr2
S_BRANCH %bb.1
bb.1:
successors: %bb.2, %bb.3
S_CBRANCH_VCCZ %bb.2, implicit $vcc
S_BRANCH %bb.3
bb.2:
successors: %bb.3
S_SETREG_IMM32_B32 3, 2177
S_BRANCH %bb.3
bb.3:
successors: %bb.4
S_NOP 1
S_BRANCH %bb.4
bb.4:
successors: %bb.5
$vgpr3_vgpr4 = V_FRACT_F64_e32 killed $vgpr3_vgpr4, implicit $exec
S_BRANCH %bb.5
bb.5:
S_ENDPGM
...
---
# CHECK-LABEL: name: pass_through_blocks
# CHECK-LABEL: bb.0:
# CHECK: V_FRACT_F64_e32
# CHECK-NEXT: S_SETREG_IMM32_B32 3, 2177
# CHECK-NOT: S_SETREG_IMM32_B32
name: pass_through_blocks
body: |
bb.0:
successors: %bb.1
liveins: $vgpr1_vgpr2
$vgpr1_vgpr2 = V_FRACT_F64_e32 killed $vgpr1_vgpr2, implicit $exec
$vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $m0, implicit $exec
S_BRANCH %bb.1
bb.1:
successors: %bb.2
S_BRANCH %bb.2
bb.2:
successors: %bb.3
S_BRANCH %bb.3
bb.3:
successors: %bb.4
S_BRANCH %bb.4
bb.4:
$vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $m0, implicit $exec
S_ENDPGM
...
---
# check that multiple mode values are propagated
# CHECK-LABEL: name: if_then_else
# CHECK-LABEL: bb.3:
# CHECK: S_SETREG_IMM32_B32 0, 2177
# CHECK: V_FRACT_F64_e32
# CHECK-NOT: S_SETREG_IMM32_B32
name: if_then_else
body: |
bb.0:
liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr3, $vgpr4
successors: %bb.1
$m0 = S_MOV_B32 killed $sgpr2
S_BRANCH %bb.1
bb.1:
successors: %bb.2, %bb.3
S_CBRANCH_VCCZ %bb.3, implicit $vcc
S_BRANCH %bb.2
bb.2:
successors: %bb.3
S_SETREG_IMM32_B32 3, 2177
S_BRANCH %bb.3
bb.3:
successors: %bb.4
$vgpr3_vgpr4 = V_FRACT_F64_e32 killed $vgpr3_vgpr4, implicit $exec
S_BRANCH %bb.4
bb.4:
S_ENDPGM
...