diff options
| author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-09-29 02:48:41 +0000 |
|---|---|---|
| committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-09-29 02:48:41 +0000 |
| commit | f7ad189033f6d0ec4d69a5cab1108a7275624c49 (patch) | |
| tree | f5af7a7e653cfb66281b96f4530dd462058ece55 | |
| parent | 866fcd34a60d97b4d53e0ab461f2e8d0133f8cd7 (diff) | |
| download | bcm5719-llvm-f7ad189033f6d0ec4d69a5cab1108a7275624c49.tar.gz bcm5719-llvm-f7ad189033f6d0ec4d69a5cab1108a7275624c49.zip | |
Use ExecutionDepsFix instead of NEONMoveFix.
This enables NEON domain tracking across basic blocks, but should
otherwise do the same thing.
llvm-svn: 140772
| -rw-r--r-- | llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp | 30 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMTargetMachine.cpp | 2 |
2 files changed, 21 insertions, 11 deletions
diff --git a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp index 70ac487e4bf..30830974355 100644 --- a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp +++ b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -2732,9 +2732,11 @@ ARMBaseInstrInfo::isFpMLxInstruction(unsigned Opcode, unsigned &MulOpc, // // We use the following execution domain numbering: // -// 0: Generic -// 1: VFP -// 2: NEON +enum ARMExeDomain { + ExeGeneric = 0, + ExeVFP = 1, + ExeNEON = 2 +}; // // Also see ARMInstrFormats.td and Domain* enums in ARMBaseInfo.h // @@ -2743,33 +2745,41 @@ ARMBaseInstrInfo::getExecutionDomain(const MachineInstr *MI) const { // VMOVD is a VFP instruction, but can be changed to NEON if it isn't // predicated. if (MI->getOpcode() == ARM::VMOVD && !isPredicated(MI)) - return std::make_pair(1, 3); + return std::make_pair(ExeVFP, (1<<ExeVFP) | (1<<ExeNEON)); // No other instructions can be swizzled, so just determine their domain. unsigned Domain = MI->getDesc().TSFlags & ARMII::DomainMask; if (Domain & ARMII::DomainNEON) - return std::make_pair(2, 0); + return std::make_pair(ExeNEON, 0); // Certain instructions can go either way on Cortex-A8. // Treat them as NEON instructions. if ((Domain & ARMII::DomainNEONA8) && Subtarget.isCortexA8()) - return std::make_pair(2, 0); + return std::make_pair(ExeNEON, 0); if (Domain & ARMII::DomainVFP) - return std::make_pair(1, 0); + return std::make_pair(ExeVFP, 0); - return std::make_pair(0, 0); + return std::make_pair(ExeGeneric, 0); } void ARMBaseInstrInfo::setExecutionDomain(MachineInstr *MI, unsigned Domain) const { // We only know how to change VMOVD into VORR. assert(MI->getOpcode() == ARM::VMOVD && "Can only swizzle VMOVD"); - if (Domain != 2) + if (Domain != ExeNEON) return; + // Zap the predicate operands. + assert(!isPredicated(MI) && "Cannot predicate a VORRd"); + MI->RemoveOperand(3); + MI->RemoveOperand(2); + // Change to a VORRd which requires two identical use operands. MI->setDesc(get(ARM::VORRd)); - MachineInstrBuilder(MI).addReg(MI->getOperand(1).getReg()); + + // Add the extra source operand and new predicates. + // This will go before any implicit ops. + AddDefaultPred(MachineInstrBuilder(MI).addReg(MI->getOperand(1).getReg())); } diff --git a/llvm/lib/Target/ARM/ARMTargetMachine.cpp b/llvm/lib/Target/ARM/ARMTargetMachine.cpp index 2cd818abf3f..f779ede3e3a 100644 --- a/llvm/lib/Target/ARM/ARMTargetMachine.cpp +++ b/llvm/lib/Target/ARM/ARMTargetMachine.cpp @@ -118,7 +118,7 @@ bool ARMBaseTargetMachine::addPreSched2(PassManagerBase &PM, if (!Subtarget.isThumb1Only()) PM.add(createARMLoadStoreOptimizationPass()); if (Subtarget.hasNEON()) - PM.add(createNEONMoveFixPass()); + PM.add(createExecutionDependencyFixPass(&ARM::DPRRegClass)); } // Expand some pseudo instructions into multiple instructions to allow |

