[llvm-dev] Dealing with illegal operand mappings in RegBankSelect

Matt Arsenault via llvm-dev llvm-dev at lists.llvm.org
Tue Feb 26 16:58:40 PST 2019



> On Feb 26, 2019, at 7:46 PM, Quentin Colombet <qcolombet at apple.com> wrote:
> 
>> The only  use I would have for the copy is as as a means of passing which registers were already created for the new mapping, after which point I would need to delete it.
> 
> Could you describe in pseudo code what the expansion of vgpr into sgpr looks like?
> e.g., = use vgpr
> And you only support = use sgpr 
> 

It’s serializing the vector operation. There’s an additional optimization to reduce the number of loop iterations when multiple work items/lanes/threads have the same value in them which happens in practice, but essentially it does:

Save Execution Mask
For (Lane : Wavefront/Warp) {
  Enable Lane, Disable all other lanes
  SGPR = read SGPR value for current lane from VGPR
  VGPRResult[Lane] = use_op SGPR
}
Restore Execution Mask

Eventually it might be nice to have optimizations to only emit one of these loops when multiple consecutive instructions need the same register handled (which I suspect will happen frequently with image samplers), but I haven’t really thought about what that should look like yet.

-Matt
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190226/589014a5/attachment.html>


More information about the llvm-dev mailing list