1 //===-- NEONPreAllocPass.cpp - Allocate adjacent NEON registers--*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #define DEBUG_TYPE "neon-prealloc"
12 #include "ARMInstrInfo.h"
13 #include "llvm/CodeGen/MachineInstr.h"
14 #include "llvm/CodeGen/MachineInstrBuilder.h"
15 #include "llvm/CodeGen/MachineRegisterInfo.h"
16 #include "llvm/CodeGen/MachineFunctionPass.h"
20 class NEONPreAllocPass : public MachineFunctionPass {
21 const TargetInstrInfo *TII;
22 MachineRegisterInfo *MRI;
26 NEONPreAllocPass() : MachineFunctionPass(&ID) {}
28 virtual bool runOnMachineFunction(MachineFunction &MF);
30 virtual const char *getPassName() const {
31 return "NEON register pre-allocation pass";
35 bool FormsRegSequence(MachineInstr *MI,
36 unsigned FirstOpnd, unsigned NumRegs) const;
37 bool PreAllocNEONRegisters(MachineBasicBlock &MBB);
40 char NEONPreAllocPass::ID = 0;
43 static bool isNEONMultiRegOp(int Opcode, unsigned &FirstOpnd, unsigned &NumRegs,
44 unsigned &Offset, unsigned &Stride) {
45 // Default to unit stride with no offset.
82 case ARM::VLD2LNq16odd:
83 case ARM::VLD2LNq32odd:
101 case ARM::VLD3q8_UPD:
102 case ARM::VLD3q16_UPD:
103 case ARM::VLD3q32_UPD:
110 case ARM::VLD3q8odd_UPD:
111 case ARM::VLD3q16odd_UPD:
112 case ARM::VLD3q32odd_UPD:
127 case ARM::VLD3LNq16odd:
128 case ARM::VLD3LNq32odd:
146 case ARM::VLD4q8_UPD:
147 case ARM::VLD4q16_UPD:
148 case ARM::VLD4q32_UPD:
155 case ARM::VLD4q8odd_UPD:
156 case ARM::VLD4q16odd_UPD:
157 case ARM::VLD4q32odd_UPD:
172 case ARM::VLD4LNq16odd:
173 case ARM::VLD4LNq32odd:
209 case ARM::VST2LNq16odd:
210 case ARM::VST2LNq32odd:
228 case ARM::VST3q8_UPD:
229 case ARM::VST3q16_UPD:
230 case ARM::VST3q32_UPD:
237 case ARM::VST3q8odd_UPD:
238 case ARM::VST3q16odd_UPD:
239 case ARM::VST3q32odd_UPD:
254 case ARM::VST3LNq16odd:
255 case ARM::VST3LNq32odd:
273 case ARM::VST4q8_UPD:
274 case ARM::VST4q16_UPD:
275 case ARM::VST4q32_UPD:
282 case ARM::VST4q8odd_UPD:
283 case ARM::VST4q16odd_UPD:
284 case ARM::VST4q32odd_UPD:
299 case ARM::VST4LNq16odd:
300 case ARM::VST4LNq32odd:
342 NEONPreAllocPass::FormsRegSequence(MachineInstr *MI,
343 unsigned FirstOpnd, unsigned NumRegs) const {
344 MachineOperand &FMO = MI->getOperand(FirstOpnd);
345 assert(FMO.isReg() && FMO.getSubReg() == 0 && "unexpected operand");
346 unsigned VirtReg = FMO.getReg();
347 assert(TargetRegisterInfo::isVirtualRegister(VirtReg) &&
348 "expected a virtual register");
350 MachineInstr *RegSeq = 0;
351 for (unsigned R = 0; R < NumRegs; ++R) {
352 const MachineOperand &MO = MI->getOperand(FirstOpnd + R);
353 assert(MO.isReg() && MO.getSubReg() == 0 && "unexpected operand");
354 unsigned VirtReg = MO.getReg();
355 assert(TargetRegisterInfo::isVirtualRegister(VirtReg) &&
356 "expected a virtual register");
357 // Feeding into a REG_SEQUENCE.
358 if (!MRI->hasOneNonDBGUse(VirtReg))
360 MachineInstr *UseMI = &*MRI->use_nodbg_begin(VirtReg);
361 if (!UseMI->isRegSequence())
363 if (RegSeq && RegSeq != UseMI)
368 // Make sure trailing operands of REG_SEQUENCE are undef.
369 unsigned NumExps = (RegSeq->getNumOperands() - 1) / 2;
370 for (unsigned i = NumRegs * 2 + 1; i < NumExps; i += 2) {
371 const MachineOperand &MO = RegSeq->getOperand(i);
372 unsigned VirtReg = MO.getReg();
373 MachineInstr *DefMI = MRI->getVRegDef(VirtReg);
374 if (!DefMI || !DefMI->isImplicitDef())
380 unsigned LastSrcReg = 0;
381 unsigned LastSubIdx = 0;
382 for (unsigned R = 0; R < NumRegs; ++R) {
383 const MachineOperand &MO = MI->getOperand(FirstOpnd + R);
384 assert(MO.isReg() && MO.getSubReg() == 0 && "unexpected operand");
385 unsigned VirtReg = MO.getReg();
386 assert(TargetRegisterInfo::isVirtualRegister(VirtReg) &&
387 "expected a virtual register");
388 // Extracting from a Q or QQ register.
389 MachineInstr *DefMI = MRI->getVRegDef(VirtReg);
390 if (!DefMI || !DefMI->isExtractSubreg())
392 VirtReg = DefMI->getOperand(1).getReg();
393 if (LastSrcReg && LastSrcReg != VirtReg)
395 LastSrcReg = VirtReg;
396 const TargetRegisterClass *RC = MRI->getRegClass(VirtReg);
397 if (RC != ARM::QPRRegisterClass && RC != ARM::QQPRRegisterClass)
399 unsigned SubIdx = DefMI->getOperand(2).getImm();
401 if (LastSubIdx != SubIdx-1)
404 // Must start from arm_dsubreg_0 or arm_qsubreg_0.
405 if (SubIdx != ARM::DSUBREG_0 && SubIdx != ARM::QSUBREG_0)
413 bool NEONPreAllocPass::PreAllocNEONRegisters(MachineBasicBlock &MBB) {
414 bool Modified = false;
416 MachineBasicBlock::iterator MBBI = MBB.begin(), E = MBB.end();
417 for (; MBBI != E; ++MBBI) {
418 MachineInstr *MI = &*MBBI;
419 unsigned FirstOpnd, NumRegs, Offset, Stride;
420 if (!isNEONMultiRegOp(MI->getOpcode(), FirstOpnd, NumRegs, Offset, Stride))
422 if (llvm::ModelWithRegSequence() &&
423 FormsRegSequence(MI, FirstOpnd, NumRegs))
426 MachineBasicBlock::iterator NextI = llvm::next(MBBI);
427 for (unsigned R = 0; R < NumRegs; ++R) {
428 MachineOperand &MO = MI->getOperand(FirstOpnd + R);
429 assert(MO.isReg() && MO.getSubReg() == 0 && "unexpected operand");
430 unsigned VirtReg = MO.getReg();
431 assert(TargetRegisterInfo::isVirtualRegister(VirtReg) &&
432 "expected a virtual register");
434 // For now, just assign a fixed set of adjacent registers.
435 // This leaves plenty of room for future improvements.
436 static const unsigned NEONDRegs[] = {
437 ARM::D0, ARM::D1, ARM::D2, ARM::D3,
438 ARM::D4, ARM::D5, ARM::D6, ARM::D7
440 MO.setReg(NEONDRegs[Offset + R * Stride]);
443 // Insert a copy from VirtReg.
444 TII->copyRegToReg(MBB, MBBI, MO.getReg(), VirtReg,
445 ARM::DPRRegisterClass, ARM::DPRRegisterClass,
448 MachineInstr *CopyMI = prior(MBBI);
449 CopyMI->findRegisterUseOperand(VirtReg)->setIsKill();
452 } else if (MO.isDef() && !MO.isDead()) {
453 // Add a copy to VirtReg.
454 TII->copyRegToReg(MBB, NextI, VirtReg, MO.getReg(),
455 ARM::DPRRegisterClass, ARM::DPRRegisterClass,
464 bool NEONPreAllocPass::runOnMachineFunction(MachineFunction &MF) {
465 TII = MF.getTarget().getInstrInfo();
466 MRI = &MF.getRegInfo();
468 bool Modified = false;
469 for (MachineFunction::iterator MFI = MF.begin(), E = MF.end(); MFI != E;
471 MachineBasicBlock &MBB = *MFI;
472 Modified |= PreAllocNEONRegisters(MBB);
478 /// createNEONPreAllocPass - returns an instance of the NEON register
479 /// pre-allocation pass.
480 FunctionPass *llvm::createNEONPreAllocPass() {
481 return new NEONPreAllocPass();