diff --git a/llvm/lib/Target/AMDGPU/SIInsertWaitcnts.cpp b/llvm/lib/Target/AMDGPU/SIInsertWaitcnts.cpp --- a/llvm/lib/Target/AMDGPU/SIInsertWaitcnts.cpp +++ b/llvm/lib/Target/AMDGPU/SIInsertWaitcnts.cpp @@ -842,6 +842,23 @@ return new SIInsertWaitcnts(); } +static bool updateOperandIfDifferent(MachineInstr &MI, int OpIdx, + unsigned NewEnc) { + MachineOperand &MO = MI.getOperand(OpIdx); + if (NewEnc != MO.getImm()) { + MO.setImm(NewEnc); + return true; + } + return false; +} + +static bool updateNamedOperandIfDifferent(MachineInstr &MI, uint16_t NamedIdx, + unsigned NewEnc) { + int OpIdx = AMDGPU::getNamedOperandIdx(MI.getOpcode(), NamedIdx); + assert(OpIdx >= 0); + return updateOperandIfDifferent(MI, OpIdx, NewEnc); +} + /// Combine consecutive waitcnt instructions that precede \p It and follow /// \p OldWaitcntInstr and apply any extra wait from waitcnt that were added /// by previous passes. Currently this pass conservatively assumes that these @@ -897,12 +914,8 @@ // Updated encoding of merged waitcnt with the required wait. if (WaitcntInstr) { if (Wait.hasWaitExceptVsCnt()) { - unsigned NewEnc = AMDGPU::encodeWaitcnt(IV, Wait); - unsigned OldEnc = WaitcntInstr->getOperand(0).getImm(); - if (OldEnc != NewEnc) { - WaitcntInstr->getOperand(0).setImm(NewEnc); - Modified = true; - } + Modified |= updateOperandIfDifferent(*WaitcntInstr, 0, + AMDGPU::encodeWaitcnt(IV, Wait)); ScoreBrackets.applyWaitcnt(Wait); Wait.VmCnt = ~0u; Wait.LgkmCnt = ~0u; @@ -925,14 +938,8 @@ if (WaitcntVsCntInstr) { if (Wait.hasWaitVsCnt()) { assert(ST->hasVscnt()); - unsigned OldVSCnt = - TII->getNamedOperand(*WaitcntVsCntInstr, AMDGPU::OpName::simm16) - ->getImm(); - if (Wait.VsCnt != OldVSCnt) { - TII->getNamedOperand(*WaitcntVsCntInstr, AMDGPU::OpName::simm16) - ->setImm(Wait.VsCnt); - Modified = true; - } + Modified |= updateNamedOperandIfDifferent( + *WaitcntVsCntInstr, AMDGPU::OpName::simm16, Wait.VsCnt); ScoreBrackets.applyWaitcnt(Wait); Wait.VsCnt = ~0u;