From 676b2dfd2719e03bda4d1d99de67be2a9bdfb124 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Wed, 5 May 2010 22:15:40 +0000 Subject: [PATCH] Do not pre-allocate references of D registers pairs if they are extracted from the same Q register and are in the right order. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103124 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/NEONPreAllocPass.cpp | 36 ++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/lib/Target/ARM/NEONPreAllocPass.cpp b/lib/Target/ARM/NEONPreAllocPass.cpp index ef6bf3a132b..59e3280434d 100644 --- a/lib/Target/ARM/NEONPreAllocPass.cpp +++ b/lib/Target/ARM/NEONPreAllocPass.cpp @@ -341,20 +341,40 @@ static bool isNEONMultiRegOp(int Opcode, unsigned &FirstOpnd, unsigned &NumRegs, bool NEONPreAllocPass::FormsRegSequence(MachineInstr *MI, unsigned FirstOpnd, unsigned NumRegs) { MachineInstr *RegSeq = 0; + unsigned LastSrcReg = 0; + unsigned LastSubIdx = 0; for (unsigned R = 0; R < NumRegs; ++R) { MachineOperand &MO = MI->getOperand(FirstOpnd + R); assert(MO.isReg() && MO.getSubReg() == 0 && "unexpected operand"); unsigned VirtReg = MO.getReg(); assert(TargetRegisterInfo::isVirtualRegister(VirtReg) && "expected a virtual register"); - if (!MRI->hasOneNonDBGUse(VirtReg)) - return false; - MachineInstr *UseMI = &*MRI->use_nodbg_begin(VirtReg); - if (UseMI->getOpcode() != TargetOpcode::REG_SEQUENCE) - return false; - if (RegSeq && RegSeq != UseMI) - return false; - RegSeq = UseMI; + if (MO.isDef()) { + // Feeding into a REG_SEQUENCE. + if (!MRI->hasOneNonDBGUse(VirtReg)) + return false; + MachineInstr *UseMI = &*MRI->use_nodbg_begin(VirtReg); + if (!UseMI->isRegSequence()) + return false; + if (RegSeq && RegSeq != UseMI) + return false; + RegSeq = UseMI; + } else { + // Extracting from a Q register. + MachineInstr *DefMI = MRI->getVRegDef(VirtReg); + if (!DefMI || !DefMI->isExtractSubreg()) + return false; + VirtReg = DefMI->getOperand(1).getReg(); + if (LastSrcReg && LastSrcReg != VirtReg) + return false; + const TargetRegisterClass *RC = MRI->getRegClass(VirtReg); + if (RC != ARM::QPRRegisterClass) + return false; + unsigned SubIdx = DefMI->getOperand(2).getImm(); + if (LastSubIdx && LastSubIdx != SubIdx-1) + return false; + LastSubIdx = SubIdx; + } } return true; }