From 82b9a28c7e3e802d05c86a844804f4d87cf91fce Mon Sep 17 00:00:00 2001 From: Jessica Paquette Date: Wed, 13 Mar 2019 23:29:54 +0000 Subject: [PATCH] [AArch64][GlobalISel] Gardening: Simplify subregister copy in selectBuildVector NFC. Some more preliminary factoring for G_INSERT_VECTOR_ELT. Also better code-reuse, etc., etc. Differential Revision: https://reviews.llvm.org/D59323 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@356107 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../AArch64/AArch64InstructionSelector.cpp | 36 +++++++++---------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/lib/Target/AArch64/AArch64InstructionSelector.cpp b/lib/Target/AArch64/AArch64InstructionSelector.cpp index 8f3c6fd489a..b033824bfdf 100644 --- a/lib/Target/AArch64/AArch64InstructionSelector.cpp +++ b/lib/Target/AArch64/AArch64InstructionSelector.cpp @@ -2383,28 +2383,24 @@ bool AArch64InstructionSelector::selectBuildVector( // If DstTy's size in bits is less than 128, then emit a subregister copy // from DstVec to the last register we've defined. if (DstSize < 128) { - unsigned SubReg = 0; - - // Helper lambda to decide on a register class and subregister for the - // subregister copy. - auto GetRegInfoForCopy = [&SubReg, - &DstSize]() -> const TargetRegisterClass * { - switch (DstSize) { - default: - LLVM_DEBUG(dbgs() << "Unknown destination size (" << DstSize << ")\n"); - return nullptr; - case 32: - SubReg = AArch64::ssub; - return &AArch64::FPR32RegClass; - case 64: - SubReg = AArch64::dsub; - return &AArch64::FPR64RegClass; - } - }; - - const TargetRegisterClass *RC = GetRegInfoForCopy(); + // Force this to be FPR using the destination vector. + const TargetRegisterClass *RC = + getMinClassForRegBank(*RBI.getRegBank(DstVec, MRI, TRI), DstSize); if (!RC) return false; + if (RC != &AArch64::FPR32RegClass && RC != &AArch64::FPR64RegClass) { + LLVM_DEBUG(dbgs() << "Unsupported register class!\n"); + return false; + } + + unsigned SubReg = 0; + if (!getSubRegForClass(RC, TRI, SubReg)) + return false; + if (SubReg != AArch64::ssub && SubReg != AArch64::dsub) { + LLVM_DEBUG(dbgs() << "Unsupported destination size! (" << DstSize + << "\n"); + return false; + } unsigned Reg = MRI.createVirtualRegister(RC); unsigned DstReg = I.getOperand(0).getReg(); -- 2.40.0