[llvm-dev] Ok with mismatch between dead-markings in BUNDLE and bundled instructions?
Quentin Colombet via llvm-dev
llvm-dev at lists.llvm.org
Tue Jun 27 10:21:18 PDT 2017
Hi Mikael,
Thanks for bringing that up.
> Le 27 juin 2017 à 04:55, Mikael Holmén <mikael.holmen at ericsson.com> a écrit :
>
> Hi Quentin and llvm-dev,
>
> I've got a regalloc-related question that you might have an opinion or answer about.
>
> In our out-of-tree target we've been doing some bundling before register allocation for quite some time now, and last night a new problem popped up. What the fix should be depends on if this bundle is legal or not:
>
> BUNDLE %vreg39<imp-def,dead>
> * %vreg39:hiAcc<def> = mv_ar16_ar16_lo16In32 %vreg37
> [...]
>
> %vreg39 isn't used after the bundle so the dead-marking in the BUNDLE is correct. However, the def in the actual bundled instruction defining %vreg39 is not marked with dead.
>
> Is the above bundle ok or not?
Ultimately, I would like this to be the way we represent these situations, unfortunately the code base is not ready for that yet.
>
>
> When the register allocator later tries to spill/reload %vreg39 it thinks that %vreg39 is live, so it inserts a reload after the bundle, but then the verifier pukes on it and says that there is a use of the register after it's dead.
>
> The dead-marking on the BUNDLE is introduced by LiveIntervals::computeDeadValues which does
>
> // This is a dead def. Make sure the instruction knows.
> MachineInstr *MI = getInstructionFromIndex(Def);
> assert(MI && "No instruction defining live value");
> MI->addRegisterDead(LI.reg, TRI);
>
> and the reload after the BUNDLE is introduced by InlineSpiller::spillAroundUses which has determined that the register is live:
>
> // Rewrite instruction operands.
> bool hasLiveDef = false;
> for (const auto &OpPair : Ops) {
> MachineOperand &MO = OpPair.first->getOperand(OpPair.second);
> MO.setReg(NewVReg);
> if (MO.isUse()) {
> if (!OpPair.first->isRegTiedToDefOperand(OpPair.second))
> MO.setIsKill();
> } else {
> if (!MO.isDead())
> hasLiveDef = true;
> }
>
>
> So I suppose we could either make LiveIntervals::computeDeadValues mark the individual defs dead as well,
I didn't get that.
> or we could change InlineSpiller::spillAroundUses so that if we only look at the BUNDLE instruction (if it exists) in case of bundled instructions when looking for defs.
>
> Any opinions on what way to go?
>
I believe we should teach the spiller about the subregs so that it understands a particular subregs is dead.
Cheers,
Q
> Thanks,
> Mikael
More information about the llvm-dev
mailing list