[llvm] r315781 - [AArch64][RegisterBankInfo] Use the statically computed mappings for COPY

Bruno Cardoso Lopes via llvm-commits llvm-commits at lists.llvm.org
Sat Oct 14 12:31:55 PDT 2017


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