Adds an intrinsic/builtin that can be used to fine tune scheduler behavior. If there is a need to have highly optimized codegen and kernel developers have knowledge of inter-wave runtime behavior which is unknown to the compiler this builtin can be used to tune scheduling. This intrinsic creates a barrier between scheduling regions. The immediate parameter is a mask to determine the types of instructions that should be prevented from crossing the sched_barrier. In this initial patch, there are only two variations. A mask of 0 means that no instructions may be scheduled across the sched_barrier. A mask of 1 means that non-memory, non-side-effect inducing instructions may cross the sched_barrier. Note that this intrinsic is only meant to work with the scheduling passes. Any other transformations that may move code will not be impacted in the ways described above. Reviewed By: rampitec Differential Revision: https://reviews.llvm.org/D124700
83 lines
2.5 KiB
YAML
83 lines
2.5 KiB
YAML
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
|
|
# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs -run-pass post-RA-hazard-rec %s -o - | FileCheck -check-prefix=GCN %s
|
|
|
|
# WAVE_BARRIER and SI_MASKED_UNREACHABLE ect. are not really instructions. To
|
|
# fix the hazard (m0 def followed by V_INTERP), the compiler should insert a
|
|
# S_NOP.
|
|
|
|
---
|
|
name: hazard_wave_barrier
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $sgpr0
|
|
|
|
; GCN-LABEL: name: hazard_wave_barrier
|
|
; GCN: liveins: $sgpr0
|
|
; GCN-NEXT: {{ $}}
|
|
; GCN-NEXT: $m0 = S_MOV_B32 killed renamable $sgpr0
|
|
; GCN-NEXT: WAVE_BARRIER
|
|
; GCN-NEXT: S_NOP 0
|
|
; GCN-NEXT: renamable $vgpr0 = V_INTERP_MOV_F32 2, 0, 0, implicit $mode, implicit $m0, implicit $exec
|
|
; GCN-NEXT: renamable $sgpr1 = S_MOV_B32 0
|
|
; GCN-NEXT: S_ENDPGM 0
|
|
$m0 = S_MOV_B32 killed renamable $sgpr0
|
|
WAVE_BARRIER
|
|
renamable $vgpr0 = V_INTERP_MOV_F32 2, 0, 0, implicit $mode, implicit $m0, implicit $exec
|
|
renamable $sgpr1 = S_MOV_B32 0
|
|
S_ENDPGM 0
|
|
|
|
...
|
|
|
|
---
|
|
name: hazard-masked-unreachable
|
|
tracksRegLiveness: true
|
|
body: |
|
|
; GCN-LABEL: name: hazard-masked-unreachable
|
|
; GCN: bb.0:
|
|
; GCN-NEXT: successors: %bb.1(0x80000000)
|
|
; GCN-NEXT: liveins: $sgpr0
|
|
; GCN-NEXT: {{ $}}
|
|
; GCN-NEXT: $m0 = S_MOV_B32 killed renamable $sgpr0
|
|
; GCN-NEXT: SI_MASKED_UNREACHABLE
|
|
; GCN-NEXT: S_NOP 0
|
|
; GCN-NEXT: renamable $vgpr0 = V_INTERP_MOV_F32 2, 0, 0, implicit $mode, implicit $m0, implicit $exec
|
|
; GCN-NEXT: renamable $sgpr1 = S_MOV_B32 0
|
|
; GCN-NEXT: {{ $}}
|
|
; GCN-NEXT: bb.1:
|
|
; GCN-NEXT: S_ENDPGM 0
|
|
bb.0:
|
|
liveins: $sgpr0
|
|
|
|
$m0 = S_MOV_B32 killed renamable $sgpr0
|
|
SI_MASKED_UNREACHABLE
|
|
renamable $vgpr0 = V_INTERP_MOV_F32 2, 0, 0, implicit $mode, implicit $m0, implicit $exec
|
|
renamable $sgpr1 = S_MOV_B32 0
|
|
bb.1:
|
|
S_ENDPGM 0
|
|
...
|
|
|
|
---
|
|
name: hazard_sched_barrier
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $sgpr0
|
|
|
|
; GCN-LABEL: name: hazard_sched_barrier
|
|
; GCN: liveins: $sgpr0
|
|
; GCN-NEXT: {{ $}}
|
|
; GCN-NEXT: $m0 = S_MOV_B32 killed renamable $sgpr0
|
|
; GCN-NEXT: SCHED_BARRIER 0
|
|
; GCN-NEXT: S_NOP 0
|
|
; GCN-NEXT: renamable $vgpr0 = V_INTERP_MOV_F32 2, 0, 0, implicit $mode, implicit $m0, implicit $exec
|
|
; GCN-NEXT: renamable $sgpr1 = S_MOV_B32 0
|
|
; GCN-NEXT: S_ENDPGM 0
|
|
$m0 = S_MOV_B32 killed renamable $sgpr0
|
|
SCHED_BARRIER 0
|
|
renamable $vgpr0 = V_INTERP_MOV_F32 2, 0, 0, implicit $mode, implicit $m0, implicit $exec
|
|
renamable $sgpr1 = S_MOV_B32 0
|
|
S_ENDPGM 0
|
|
|
|
...
|