Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[AMDGPU] Suppress redundant waitcnt instrs.
1. Run the memory legalizer prior to the waitcnt pass; keep the policy that the waitcnt pass does not remove any waitcnts within the incoming IR. 2. The waitcnt pass doesn't (yet) track waitcnts that exist prior to the waitcnt pass (it just skips over them); because the waitcnt pass is ignorant of them, it may insert a redundant waitcnt. To avoid this, check the prev instr. If it and the to-be-inserted waitcnt are the same, suppress the insertion. We keep the existing waitcnt under the assumption that whomever, e.g., the memory legalizer, inserted it knows what they were doing. 3. Follow-on work: teach the waitcnt pass to record the pre-existing waitcnts for better waitcnt production. Differential Revision: https://reviews.llvm.org/D42854 llvm-svn: 324440
- Loading branch information
Showing
3 changed files
with
63 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
# RUN: llc -mtriple=amdgcn -verify-machineinstrs -run-pass si-insert-waitcnts -o - %s | FileCheck %s | ||
|
||
# Check that the waitcnt pass does *not* insert a redundant waitcnt instr. | ||
# In this testcase, ensure that pass does not insert redundant S_WAITCNT 127 | ||
# or S_WAITCNT 3952 | ||
|
||
... | ||
# CHECK-LABEL: name: waitcnt-no-redundant | ||
# CHECK: DS_READ_B64 | ||
# CHECK-NEXT: S_WAITCNT 127 | ||
# CHECK-NEXT: FLAT_ATOMIC_CMPSWAP | ||
# CHECK-NEXT: S_WAITCNT 3952 | ||
# CHECK-NEXT: BUFFER_WBINVL1_VOL | ||
|
||
name: waitcnt-no-redundant | ||
body: | | ||
bb.0: | ||
renamable $vgpr0_vgpr1 = DS_READ_B64 killed renamable $vgpr0, 0, 0, implicit $m0, implicit $exec | ||
S_WAITCNT 127 | ||
FLAT_ATOMIC_CMPSWAP killed renamable $vgpr0_vgpr1, killed renamable $vgpr3_vgpr4, 0, 0, implicit $exec, implicit $flat_scr | ||
S_WAITCNT 3952 | ||
BUFFER_WBINVL1_VOL implicit $exec | ||
S_ENDPGM | ||
... |