[llvm] r315781 - [AArch64][RegisterBankInfo] Use the statically computed mappings for COPY
Quentin Colombet via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 16 08:47:31 PDT 2017
Thanks Bruno.
I’ll take a look.
> On Oct 14, 2017, at 12:31 PM, Bruno Cardoso Lopes <bruno.cardoso at gmail.com> wrote:
>
> Hi Quentin,
>
> Reverted this in r315823 because it broke:
> http://green.lab.llvm.org/green/job/Compiler_Verifiers_GlobalISEL/9882
>
> On Fri, Oct 13, 2017 at 5:43 PM, Quentin Colombet via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
>> Author: qcolombet
>> Date: Fri Oct 13 17:43:48 2017
>> New Revision: 315781
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=315781&view=rev
>> Log:
>> [AArch64][RegisterBankInfo] Use the statically computed mappings for COPY
>>
>> We use to resort on the generic implementation to get the mappings for
>> COPYs. The generic implementation resorts on table lookup and
>> dynamically allocated objects to get the valid mappings.
>>
>> Given we already know how to map G_BITCAST and have the static mappings
>> for them, use that code path for COPY as well. This is much more
>> efficient.
>>
>> Improve the compile time of RegBankSelect by up to 20%.
>>
>> Note: When we eventually generate all the mappings via TableGen, we
>> wouldn't have to do that dance to shave compile time. The intent of this
>> change was to make sure that moving to static structure really pays off.
>>
>> NFC.
>>
>> Modified:
>> llvm/trunk/lib/Target/AArch64/AArch64RegisterBankInfo.cpp
>>
>> Modified: llvm/trunk/lib/Target/AArch64/AArch64RegisterBankInfo.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64RegisterBankInfo.cpp?rev=315781&r1=315780&r2=315781&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/AArch64/AArch64RegisterBankInfo.cpp (original)
>> +++ llvm/trunk/lib/Target/AArch64/AArch64RegisterBankInfo.cpp Fri Oct 13 17:43:48 2017
>> @@ -415,12 +415,10 @@ AArch64RegisterBankInfo::getSameKindOfOp
>> const RegisterBankInfo::InstructionMapping &
>> AArch64RegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
>> const unsigned Opc = MI.getOpcode();
>> - const MachineFunction &MF = *MI.getParent()->getParent();
>> - const MachineRegisterInfo &MRI = MF.getRegInfo();
>>
>> // Try the default logic for non-generic instructions that are either copies
>> // or already have some operands assigned to banks.
>> - if (!isPreISelGenericOpcode(Opc) ||
>> + if ((Opc != TargetOpcode::COPY && !isPreISelGenericOpcode(Opc)) ||
>> Opc == TargetOpcode::G_PHI) {
>> const RegisterBankInfo::InstructionMapping &Mapping =
>> getInstrMappingImpl(MI);
>> @@ -428,6 +426,11 @@ AArch64RegisterBankInfo::getInstrMapping
>> return Mapping;
>> }
>>
>> + const MachineFunction &MF = *MI.getParent()->getParent();
>> + const MachineRegisterInfo &MRI = MF.getRegInfo();
>> + const TargetSubtargetInfo &STI = MF.getSubtarget();
>> + const TargetRegisterInfo &TRI = *STI.getRegisterInfo();
>> +
>> switch (Opc) {
>> // G_{F|S|U}REM are not listed because they are not legal.
>> // Arithmetic ops.
>> @@ -451,6 +454,30 @@ AArch64RegisterBankInfo::getInstrMapping
>> case TargetOpcode::G_FMUL:
>> case TargetOpcode::G_FDIV:
>> return getSameKindOfOperandsMapping(MI);
>> + case TargetOpcode::COPY: {
>> + unsigned DstReg = MI.getOperand(0).getReg();
>> + unsigned SrcReg = MI.getOperand(1).getReg();
>> + if (TargetRegisterInfo::isPhysicalRegister(DstReg) ||
>> + TargetRegisterInfo::isPhysicalRegister(SrcReg)) {
>> + const RegisterBank *DstRB = getRegBank(DstReg, MRI, TRI);
>> + const RegisterBank *SrcRB = getRegBank(SrcReg, MRI, TRI);
>> + if (!DstRB)
>> + DstRB = SrcRB;
>> + else if (!SrcRB)
>> + SrcRB = DstRB;
>> + // If both RB are null that means both registers are generic.
>> + // We shouldn't be here.
>> + assert(DstRB && SrcRB && "Both RegBank were nullptr");
>> + unsigned Size = getSizeInBits(DstReg, MRI, TRI);
>> + return getInstructionMapping(
>> + DefaultMappingID, copyCost(*DstRB, *SrcRB, Size),
>> + getCopyMapping(DstRB->getID(), SrcRB->getID(), Size),
>> + // We only care about the mapping of the destination.
>> + /*NumOperands*/ 1);
>> + }
>> + // Both registers are generic, use G_BITCAST.
>> + LLVM_FALLTHROUGH;
>> + }
>> case TargetOpcode::G_BITCAST: {
>> LLT DstTy = MRI.getType(MI.getOperand(0).getReg());
>> LLT SrcTy = MRI.getType(MI.getOperand(1).getReg());
>> @@ -464,7 +491,8 @@ AArch64RegisterBankInfo::getInstrMapping
>> return getInstructionMapping(
>> DefaultMappingID, copyCost(DstRB, SrcRB, Size),
>> getCopyMapping(DstRB.getID(), SrcRB.getID(), Size),
>> - /*NumOperands*/ 2);
>> + // We only care about the mapping of the destination for COPY.
>> + /*NumOperands*/ Opc == TargetOpcode::G_BITCAST ? 2 : 1);
>> }
>> default:
>> break;
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>
>
> --
> Bruno Cardoso Lopes
> http://www.brunocardoso.cc
More information about the llvm-commits
mailing list