From 307e0d5490a5f2a069a00e4273784d1a2e005ab9 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Sat, 1 Feb 2020 20:21:44 -0500 Subject: [PATCH] AMDGPU/GlobalISel: Fix processing new phi in waterfall loop The adjusted iterator range included the last we just inserted, and don't want to process. Figure out the new iterator range before inserting phis. This was a harmless problem, but added an unnecessary complication for a future patch. --- llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp index 4943f99..0fe2fcb 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp @@ -762,6 +762,10 @@ bool AMDGPURegisterBankInfo::executeInWaterfallLoop( const unsigned ExecReg = Subtarget.isWave32() ? AMDGPU::EXEC_LO : AMDGPU::EXEC; +#ifndef NDEBUG + const int OrigRangeSize = std::distance(Range.begin(), Range.end()); +#endif + for (MachineInstr &MI : Range) { for (MachineOperand &Def : MI.defs()) { LLT ResTy = MRI.getType(Def.getReg()); @@ -827,13 +831,14 @@ bool AMDGPURegisterBankInfo::executeInWaterfallLoop( const DebugLoc &DL = B.getDL(); - // Figure out the iterator range after splicing the instructions. - auto NewBegin = std::prev(LoopBB->end()); + MachineInstr &FirstInst = *Range.begin(); // Move the instruction into the loop. Note we moved everything after // Range.end() already into a new block, so Range.end() is no longer valid. LoopBB->splice(LoopBB->end(), &MBB, Range.begin(), MBB.end()); + // Figure out the iterator range after splicing the instructions. + MachineBasicBlock::iterator NewBegin = FirstInst.getIterator(); auto NewEnd = LoopBB->end(); MachineBasicBlock::iterator I = Range.begin(); @@ -841,6 +846,8 @@ bool AMDGPURegisterBankInfo::executeInWaterfallLoop( Register CondReg; + assert(std::distance(NewBegin, NewEnd) == OrigRangeSize); + for (MachineInstr &MI : make_range(NewBegin, NewEnd)) { for (MachineOperand &Op : MI.uses()) { if (!Op.isReg() || Op.isDef()) -- 2.7.4