[llvm-commits] [llvm] r112983 - in /llvm/trunk/lib/Target/ARM: ARMExpandPseudoInsts.cpp ARMISelDAGToDAG.cpp ARMInstrNEON.td NEONPreAllocPass.cpp
Jakob Stoklund Olesen
stoklund at 2pi.dk
Fri Sep 3 15:38:43 PDT 2010
On Sep 3, 2010, at 11:16 AM, Bob Wilson wrote:
> Author: bwilson
> Date: Fri Sep 3 13:16:02 2010
> New Revision: 112983
>
> URL: http://llvm.org/viewvc/llvm-project?rev=112983&view=rev
> Log:
> Finish converting the rest of the NEON VLD instructions to use pseudo-
> instructions prior to regalloc. Since it's getting a little close to
> the 2.8 branch deadline, I'll have to leave the rest of the instructions
> handled by the NEONPreAllocPass for now, but I didn't want to leave half
> of the VLD instructions converted and the other half not.
>
> Modified:
> llvm/trunk/lib/Target/ARM/ARMExpandPseudoInsts.cpp
> llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp
> llvm/trunk/lib/Target/ARM/ARMInstrNEON.td
> llvm/trunk/lib/Target/ARM/NEONPreAllocPass.cpp
>
> Modified: llvm/trunk/lib/Target/ARM/ARMExpandPseudoInsts.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMExpandPseudoInsts.cpp?rev=112983&r1=112982&r2=112983&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMExpandPseudoInsts.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/ARMExpandPseudoInsts.cpp Fri Sep 3 13:16:02 2010
> @@ -105,16 +105,17 @@
> D2 = TRI->getSubReg(DstReg, ARM::dsub_5);
> D3 = TRI->getSubReg(DstReg, ARM::dsub_7);
> }
> - MIB.addReg(D0).addReg(D1);
> + MIB.addReg(D0, RegState::Define | getDeadRegState(DstIsDead))
> + .addReg(D1, RegState::Define | getDeadRegState(DstIsDead));
> if (NumRegs > 2)
> - MIB.addReg(D2);
> + MIB.addReg(D2, RegState::Define | getDeadRegState(DstIsDead));
> if (NumRegs > 3)
> - MIB.addReg(D3);
> + MIB.addReg(D3, RegState::Define | getDeadRegState(DstIsDead));
Thanks!
> - MIB.addReg(WBReg, getDefRegState(true) | getDeadRegState(WBIsDead));
> + MIB.addReg(WBReg, RegState::Define | getDeadRegState(WBIsDead));
Right. I think using the enums directly is fine. The functions were added as helpers when your <dead> bit is variable like here.
Not in this patch, but related:
// Copy the addrmode6 operands.
bool AddrIsKill = MI.getOperand(OpIdx).isKill();
MIB.addReg(MI.getOperand(OpIdx++).getReg(), getKillRegState(AddrIsKill));
MIB.addImm(MI.getOperand(OpIdx++).getImm());
Is easier like this:
MIB.addOperand(MI.getOperand(OpIdx++));
MIB.addOperand(MI.getOperand(OpIdx++));
> }
> // Copy the addrmode6 operands.
> bool AddrIsKill = MI.getOperand(OpIdx).isKill();
> @@ -128,9 +129,12 @@
>
> MIB = AddDefaultPred(MIB);
> TransferImpOps(MI, MIB, MIB);
> - // Add an implicit def for the super-reg.
> - MIB.addReg(DstReg, (getDefRegState(true) | getDeadRegState(DstIsDead) |
> - getImplRegState(true)));
> + // For an instruction writing the odd subregs, add an implicit use of the
> + // super-register because the even subregs were loaded separately.
> + if (RegSpc == OddDblSpc)
> + MIB.addReg(DstReg, RegState::Implicit);
This part is weird. Is OddDblSpc guaranteed to have DstReg live in? In that case, would there already be a DstReg<imp-use> operand on MI that gets transferred by TransferImpOps()?
The end result should be:
%D0, %D2, ... = VLD ..., %QQQQ0<imp-def>
%D1, %D3, ... = VLD ..., %QQQQ0<imp-use,kill>, %QQQQ0<imp-def>
> + // Add an implicit def for the super-register.
> + MIB.addReg(DstReg, RegState::ImplicitDefine | getDeadRegState(DstIsDead));
This is correct, but since TransferImpOps() has added arbitrary imp-ops to your new instruction, it would be better to call addRegisterDefined() / addRegisterDead(). That handles existing operands, and it will even flip the <dead> bit on subregs if you pass in a TRI.
You could argue that we are missing a MachineInstr::addRegisterUsed() function to complete the quartet.
/jakob
More information about the llvm-commits
mailing list