[llvm] [AMDGPU][SIInsertWaitcnts] Do not add s_waitcnt when the counters are known to be 0 already (PR #72830)
Jay Foad via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 13 05:28:24 PST 2023
================
@@ -886,34 +900,39 @@ bool SIInsertWaitcnts::applyPreexistingWaitcnt(
if (II.isMetaInstruction())
continue;
- if (II.getOpcode() == AMDGPU::S_WAITCNT) {
- // Conservatively update required wait if this waitcnt was added in an
- // earlier pass. In this case it will not exist in the tracked waitcnt
- // set.
- if (!TrackedWaitcntSet.count(&II)) {
- unsigned IEnc = II.getOperand(0).getImm();
- AMDGPU::Waitcnt OldWait = AMDGPU::decodeWaitcnt(IV, IEnc);
- Wait = Wait.combined(OldWait);
- }
+ unsigned Opcode = II.getOpcode();
+ bool CanFullyDiscardWaitcntSequence = SIInstrInfo::isSoftWaitcnt(Opcode);
+
+ if (SIInstrInfo::isWaitcnt(Opcode)) {
+ // Update required wait count. If this is a soft waitcnt (= it was added
+ // by an earlier pass), it may be entirely removed.
+ unsigned IEnc = II.getOperand(0).getImm();
+ AMDGPU::Waitcnt OldWait = AMDGPU::decodeWaitcnt(IV, IEnc);
+ if (CanFullyDiscardWaitcntSequence)
+ ScoreBrackets.simplifyWaitcnt(OldWait);
+ Wait = Wait.combined(OldWait);
// Merge consecutive waitcnt of the same type by erasing multiples.
- if (!WaitcntInstr) {
+ if (!WaitcntInstr &&
+ (Wait.hasWaitExceptVsCnt() || !CanFullyDiscardWaitcntSequence)) {
WaitcntInstr = ⅈ
} else {
II.eraseFromParent();
Modified = true;
}
----------------
jayfoad wrote:
I find this easier to understand as it has fewer negatives:
```suggestion
if (WaitcntInstr ||
(!Wait.hasWaitExceptVsCnt() && CanFullyDiscardWaitcntSequence)) {
II.eraseFromParent();
Modified = true;
} else {
WaitcntInstr = ⅈ
}
```
https://github.com/llvm/llvm-project/pull/72830
More information about the llvm-commits
mailing list