[llvm-dev] RegBankSelect complex value mappings (original) (raw)

Matt Arsenault via llvm-dev llvm-dev at lists.llvm.org
Fri Dec 21 01:49:57 PST 2018


On Dec 21, 2018, at 6:51 PM, Matt Arsenault <arsenm2 at gmail.com> wrote:

On Dec 21, 2018, at 11:15 AM, Quentin Colombet <quentin.colombet at gmail.com <mailto:quentin.colombet at gmail.com>> wrote: Hi Matt, Your use case falls definitely in what RegBankSelect meant to solve. That said, the support you need is not implemented because we didn't have use cases to test the code against. Regarding the cost, if the mapping produces more than 1 partial value, right now RegBankSelect::getRepairCost will say this is too expensive and this is actually where you need to patch the pass to add a target hook to compute something that would use instruction to decompose the value. Yes, this is what happens with greedy. With fast I get a little further.

So the copy part cost I covered it. For the cost of rewriting the instruction completely, this is captured by InstructionMapping::getCost. The idea of InstructionMapping::getCost is to reflect the cost for transforming the current instruction into the instruction after we apply this mapping. Then the RepairCost is here to account for the cost of "bringing" every operand to the right place for this mapping using copy or some target specific sequence. Like the cost computation, the target specific sequences are not implemented, but should happen in RegBankSelect::repairReg. This seems to contradict the comment on repairReg? /// \note The caller is supposed to do the rewriting of op if need be. /// I.e., Reg = op ... => = NewOp … Right now, this will assert that the number of break downs should be == 1 but the code to decompose the operand should happen there. Finally, the rewriting of the current instruction is supposed to happen in RegisterBankInfo::applyMapping. If you have an example (.mir) that you can share, we can work together to make this happen. Cheers, -Quentin The simplest case is this, where there’s only one register bank involved. The cost of the unmerge and merge should be 0, there’s only a real cost from the fact that it is now 2 operations. --- name: andi64vv legalized: true body: | bb.0: ; Should turn into something like this, although the mergevalues and unmergevalues can be optimized out ; %0:vgpr(s64) = COPY $vgpr0vgpr1 ; %1:vgpr(s64) = COPY $vgpr2vgpr3 ; %2:vgpr(s32), %3:vgpr(s32) = GUNMERGEVALUES %0 ; %4:vgpr(s32), %5:vgpr(s32) = GUNMERGEVALUES %1 ; %6:vgpr(s32) = GAND %2, %3 ; %7:vgpr(s32) = GAND %4, %5 ; %8:vgpr(s64) = GMERGEVALUES %6, %7 liveins: vgpr0vgpr1,vgpr0vgpr1, vgpr0vgpr1,vgpr2vgpr3 %0:(s64) = COPY $vgpr0vgpr1 %1:(s64) = COPY $vgpr2vgpr3 %2:(s64) = GAND %0, %1 Part of my confusion about the operand focus is the use of RepairPts. In this case the inputs %0 and %1 have been trivially assigned already, but I kind of expected those to be present as something to handle here if that makes sense. -Matt

I posted a rough first step here: https://reviews.llvm.org/D55988 <https://reviews.llvm.org/D55988>

-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20181221/74a01bca/attachment.html>



More information about the llvm-dev mailing list