The insertion of waterfall loops splits the current basic block into
three blocks. So the basic block that we iterate over must be updated.
This failed assert(!NodePtr->isKnownSentinel()) in ilist_iterator for
divergent calls in branches before.
Paths 
  |  Differential  D90596  
[AMDGPU] Fix iterating in SIFixSGPRCopies ClosedPublic Authored by sebastian-ne on Nov 2 2020, 4:56 AM. 
Details 
 Summary The insertion of waterfall loops splits the current basic block into This failed assert(!NodePtr->isKnownSentinel()) in ilist_iterator for 
Diff Detail 
 Event Timeline
 
 
 
 
 This revision is now accepted and ready to land.Nov 4 2020, 9:36 AM This revision was landed with ongoing or failed builds.Nov 4 2020, 9:43 AM Closed by commit rG31a0b2834f88: [AMDGPU] Fix iterating in SIFixSGPRCopies (authored by sebastian-ne).  ·  Explain Why This revision was automatically updated to reflect the committed changes. 
Revision Contents 
 
Diff 302874 llvm/lib/Target/AMDGPU/SIFixSGPRCopies.cpp
 llvm/lib/Target/AMDGPU/SIInstrInfo.h
 llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
 llvm/test/CodeGen/AMDGPU/indirect-call.ll
  | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
I'm not sure this is an entirely reliable way to get the parent if the instruction was erased (I guess this doesn't happen for any of the copy-like cases). Other places that change the control flow in situations like this return the new block from the modifying function and check if it matches the original