diff options
author | Evan Cheng <evan.cheng@apple.com> | 2009-08-15 07:59:10 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2009-08-15 07:59:10 +0000 |
commit | bc9b754091ea281e769e487f396b40f6675b9edb (patch) | |
tree | 7184d0f8f2aebfdb1aaa860e27656d9146d2e379 /lib/Target/ARM | |
parent | ad27d77fc07d9d77419d45c056be7685cc32b5a9 (diff) | |
download | external_llvm-bc9b754091ea281e769e487f396b40f6675b9edb.zip external_llvm-bc9b754091ea281e769e487f396b40f6675b9edb.tar.gz external_llvm-bc9b754091ea281e769e487f396b40f6675b9edb.tar.bz2 |
Turn on if-conversion for thumb2.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@79084 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM')
-rw-r--r-- | lib/Target/ARM/ARMBaseInstrInfo.h | 5 | ||||
-rw-r--r-- | lib/Target/ARM/ARMISelLowering.cpp | 33 | ||||
-rw-r--r-- | lib/Target/ARM/ARMSchedule.td | 6 | ||||
-rw-r--r-- | lib/Target/ARM/ARMScheduleV6.td | 6 | ||||
-rw-r--r-- | lib/Target/ARM/ARMScheduleV7.td | 6 | ||||
-rw-r--r-- | lib/Target/ARM/ARMTargetMachine.cpp | 10 | ||||
-rw-r--r-- | lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp | 2 | ||||
-rw-r--r-- | lib/Target/ARM/Thumb2ITBlockPass.cpp | 20 | ||||
-rw-r--r-- | lib/Target/ARM/Thumb2SizeReduction.cpp | 20 |
9 files changed, 57 insertions, 51 deletions
diff --git a/lib/Target/ARM/ARMBaseInstrInfo.h b/lib/Target/ARM/ARMBaseInstrInfo.h index 4810d3b..f4d1ef3 100644 --- a/lib/Target/ARM/ARMBaseInstrInfo.h +++ b/lib/Target/ARM/ARMBaseInstrInfo.h @@ -273,6 +273,11 @@ const MachineInstrBuilder &AddDefaultT1CC(const MachineInstrBuilder &MIB, } static inline +const MachineInstrBuilder &AddNoT1CC(const MachineInstrBuilder &MIB) { + return MIB.addReg(0); +} + +static inline bool isUncondBranchOpcode(int Opc) { return Opc == ARM::B || Opc == ARM::tB || Opc == ARM::t2B; } diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp index a447100..9de737b 100644 --- a/lib/Target/ARM/ARMISelLowering.cpp +++ b/lib/Target/ARM/ARMISelLowering.cpp @@ -391,26 +391,19 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM) setStackPointerRegisterToSaveRestore(ARM::SP); setSchedulingPreference(SchedulingForRegPressure); - setIfCvtBlockSizeLimit(Subtarget->isThumb() ? 0 : 10); - setIfCvtDupBlockSizeLimit(Subtarget->isThumb() ? 0 : 2); - - if (!Subtarget->isThumb()) { - // Use branch latency information to determine if-conversion limits. - // FIXME: If-converter should use instruction latency of the branch being - // eliminated to compute the threshold. For ARMv6, the branch "latency" - // varies depending on whether it's dynamically or statically predicted - // and on whether the destination is in the prefetch buffer. - const TargetInstrInfo *TII = getTargetMachine().getInstrInfo(); - const InstrItineraryData &InstrItins = Subtarget->getInstrItineraryData(); - unsigned Latency= InstrItins.getLatency(TII->get(ARM::Bcc).getSchedClass()); - if (Latency > 1) { - setIfCvtBlockSizeLimit(Latency-1); - if (Latency > 2) - setIfCvtDupBlockSizeLimit(Latency-2); - } else { - setIfCvtBlockSizeLimit(10); - setIfCvtDupBlockSizeLimit(2); - } + + // FIXME: If-converter should use instruction latency to determine + // profitability rather than relying on fixed limits. + if (Subtarget->getCPUString() == "generic") { + // Generic (and overly aggressive) if-conversion limits. + setIfCvtBlockSizeLimit(10); + setIfCvtDupBlockSizeLimit(2); + } else if (Subtarget->hasV6Ops()) { + setIfCvtBlockSizeLimit(2); + setIfCvtDupBlockSizeLimit(1); + } else { + setIfCvtBlockSizeLimit(3); + setIfCvtDupBlockSizeLimit(2); } maxStoresPerMemcpy = 1; //// temporary - rewrite interface to use type diff --git a/lib/Target/ARM/ARMSchedule.td b/lib/Target/ARM/ARMSchedule.td index 972c1f8..d54e20f 100644 --- a/lib/Target/ARM/ARMSchedule.td +++ b/lib/Target/ARM/ARMSchedule.td @@ -39,12 +39,14 @@ def GenericItineraries : ProcessorItineraries<[ InstrItinData<IIC_iMPYh , [InstrStage<1, [FU_Pipe0]>]>, InstrItinData<IIC_iMPYw , [InstrStage<1, [FU_Pipe0]>]>, InstrItinData<IIC_iMPYl , [InstrStage<1, [FU_Pipe0]>]>, - InstrItinData<IIC_iLoad , [InstrStage<1, [FU_Pipe0]>, InstrStage<1, [FU_LdSt0]>]>, + InstrItinData<IIC_iLoad , [InstrStage<1, [FU_Pipe0]>, + InstrStage<1, [FU_LdSt0]>]>, InstrItinData<IIC_iStore , [InstrStage<1, [FU_Pipe0]>]>, InstrItinData<IIC_Br , [InstrStage<1, [FU_Pipe0]>]>, InstrItinData<IIC_fpALU , [InstrStage<1, [FU_Pipe0]>]>, InstrItinData<IIC_fpMPY , [InstrStage<1, [FU_Pipe0]>]>, - InstrItinData<IIC_fpLoad , [InstrStage<1, [FU_Pipe0]>, InstrStage<1, [FU_LdSt0]>]>, + InstrItinData<IIC_fpLoad , [InstrStage<1, [FU_Pipe0]>, + InstrStage<1, [FU_LdSt0]>]>, InstrItinData<IIC_fpStore , [InstrStage<1, [FU_Pipe0]>]> ]>; diff --git a/lib/Target/ARM/ARMScheduleV6.td b/lib/Target/ARM/ARMScheduleV6.td index e1d6de9..e594f52 100644 --- a/lib/Target/ARM/ARMScheduleV6.td +++ b/lib/Target/ARM/ARMScheduleV6.td @@ -18,11 +18,13 @@ def V6Itineraries : ProcessorItineraries<[ InstrItinData<IIC_iMPYh , [InstrStage<1, [FU_Pipe0]>]>, InstrItinData<IIC_iMPYw , [InstrStage<1, [FU_Pipe0]>]>, InstrItinData<IIC_iMPYl , [InstrStage<1, [FU_Pipe0]>]>, - InstrItinData<IIC_iLoad , [InstrStage<1, [FU_Pipe0]>, InstrStage<1, [FU_LdSt0]>]>, + InstrItinData<IIC_iLoad , [InstrStage<1, [FU_Pipe0]>, + InstrStage<1, [FU_LdSt0]>]>, InstrItinData<IIC_iStore , [InstrStage<1, [FU_Pipe0]>]>, InstrItinData<IIC_Br , [InstrStage<1, [FU_Pipe0]>]>, InstrItinData<IIC_fpALU , [InstrStage<1, [FU_Pipe0]>]>, InstrItinData<IIC_fpMPY , [InstrStage<1, [FU_Pipe0]>]>, - InstrItinData<IIC_fpLoad , [InstrStage<1, [FU_Pipe0]>, InstrStage<1, [FU_LdSt0]>]>, + InstrItinData<IIC_fpLoad , [InstrStage<1, [FU_Pipe0]>, + InstrStage<1, [FU_LdSt0]>]>, InstrItinData<IIC_fpStore , [InstrStage<1, [FU_Pipe0]>]> ]>; diff --git a/lib/Target/ARM/ARMScheduleV7.td b/lib/Target/ARM/ARMScheduleV7.td index 78537a5..9c3b5e3 100644 --- a/lib/Target/ARM/ARMScheduleV7.td +++ b/lib/Target/ARM/ARMScheduleV7.td @@ -55,11 +55,13 @@ def CortexA9Itineraries : ProcessorItineraries<[ InstrItinData<IIC_iMPYh , [InstrStage<1, [FU_Pipe0]>]>, InstrItinData<IIC_iMPYw , [InstrStage<1, [FU_Pipe0]>]>, InstrItinData<IIC_iMPYl , [InstrStage<1, [FU_Pipe0]>]>, - InstrItinData<IIC_iLoad , [InstrStage<1, [FU_Pipe0]>, InstrStage<1, [FU_LdSt0]>]>, + InstrItinData<IIC_iLoad , [InstrStage<1, [FU_Pipe0]>, + InstrStage<1, [FU_LdSt0]>]>, InstrItinData<IIC_iStore , [InstrStage<1, [FU_Pipe0]>]>, InstrItinData<IIC_Br , [InstrStage<1, [FU_Pipe0]>]>, InstrItinData<IIC_fpALU , [InstrStage<1, [FU_Pipe0]>]>, InstrItinData<IIC_fpMPY , [InstrStage<1, [FU_Pipe0]>]>, - InstrItinData<IIC_fpLoad , [InstrStage<1, [FU_Pipe0]>, InstrStage<1, [FU_LdSt0]>]>, + InstrItinData<IIC_fpLoad , [InstrStage<1, [FU_Pipe0]>, + InstrStage<1, [FU_LdSt0]>]>, InstrItinData<IIC_fpStore , [InstrStage<1, [FU_Pipe0]>]> ]>; diff --git a/lib/Target/ARM/ARMTargetMachine.cpp b/lib/Target/ARM/ARMTargetMachine.cpp index fbc5f38..fdfa3a3 100644 --- a/lib/Target/ARM/ARMTargetMachine.cpp +++ b/lib/Target/ARM/ARMTargetMachine.cpp @@ -75,17 +75,15 @@ ARMTargetMachine::ARMTargetMachine(const Target &T, const std::string &TT, ThumbTargetMachine::ThumbTargetMachine(const Target &T, const std::string &TT, const std::string &FS) : ARMBaseTargetMachine(T, TT, FS, true), + InstrInfo(Subtarget.hasThumb2() + ? ((ARMBaseInstrInfo*)new Thumb2InstrInfo(Subtarget)) + : ((ARMBaseInstrInfo*)new Thumb1InstrInfo(Subtarget))), DataLayout(Subtarget.isAPCS_ABI() ? std::string("e-p:32:32-f64:32:32-i64:32:32-" "i16:16:32-i8:8:32-i1:8:32-a:0:32") : std::string("e-p:32:32-f64:64:64-i64:64:64-" "i16:16:32-i8:8:32-i1:8:32-a:0:32")), TLInfo(*this) { - // Create the approriate type of Thumb InstrInfo - if (Subtarget.hasThumb2()) - InstrInfo = new Thumb2InstrInfo(Subtarget); - else - InstrInfo = new Thumb1InstrInfo(Subtarget); } @@ -116,7 +114,7 @@ bool ARMBaseTargetMachine::addPreEmitPass(PassManagerBase &PM, PM.add(createARMLoadStoreOptimizationPass()); if (OptLevel != CodeGenOpt::None && - !DisableIfConversion && !Subtarget.isThumb()) + !DisableIfConversion && !Subtarget.isThumb1Only()) PM.add(createIfConverterPass()); if (Subtarget.isThumb2()) { diff --git a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp index 178b7a2..72fd7e4 100644 --- a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp @@ -702,7 +702,7 @@ ARMAsmPrinter::printThumbITMask(const MachineInstr *MI, int Op) { unsigned NumTZ = CountTrailingZeros_32(Mask); assert(NumTZ <= 3 && "Invalid IT mask!"); for (unsigned Pos = 3, e = NumTZ; Pos > e; --Pos) { - bool T = (Mask & (1 << Pos)) != 0; + bool T = (Mask & (1 << Pos)) == 0; if (T) O << 't'; else diff --git a/lib/Target/ARM/Thumb2ITBlockPass.cpp b/lib/Target/ARM/Thumb2ITBlockPass.cpp index da7228b..e74a526 100644 --- a/lib/Target/ARM/Thumb2ITBlockPass.cpp +++ b/lib/Target/ARM/Thumb2ITBlockPass.cpp @@ -66,23 +66,19 @@ bool Thumb2ITBlockPass::InsertITBlocks(MachineBasicBlock &MBB) { .addImm(CC); ++MBBI; - // Finalize IT mask. If the following instruction is not predicated or it's - // predicated on a condition that's not the same or the opposite of CC, then - // the mask is 0x8. + // Finalize IT mask. ARMCC::CondCodes OCC = ARMCC::getOppositeCondition(CC); - unsigned Mask = 0x8; - while (MBBI != E || (Mask & 1)) { + unsigned Mask = 0, Pos = 3; + while (MBBI != E && Pos) { ARMCC::CondCodes NCC = getPredicate(&*MBBI, TII); - if (NCC == CC) { - Mask >>= 1; - Mask |= 0x8; - } else if (NCC == OCC) { - Mask >>= 1; - } else { + if (NCC == OCC) { + Mask |= (1 << Pos); + } else if (NCC != CC) break; - } + --Pos; ++MBBI; } + Mask |= (1 << Pos); MIB.addImm(Mask); Modified = true; ++NumITs; diff --git a/lib/Target/ARM/Thumb2SizeReduction.cpp b/lib/Target/ARM/Thumb2SizeReduction.cpp index 0a86a75..b3ed8e8 100644 --- a/lib/Target/ARM/Thumb2SizeReduction.cpp +++ b/lib/Target/ARM/Thumb2SizeReduction.cpp @@ -129,7 +129,7 @@ namespace { static char ID; Thumb2SizeReduce(); - const TargetInstrInfo *TII; + const Thumb2InstrInfo *TII; virtual bool runOnMachineFunction(MachineFunction &MF); @@ -454,8 +454,12 @@ Thumb2SizeReduce::ReduceTo2Addr(MachineBasicBlock &MBB, MachineInstr *MI, DebugLoc dl = MI->getDebugLoc(); MachineInstrBuilder MIB = BuildMI(MBB, *MI, dl, NewTID); MIB.addOperand(MI->getOperand(0)); - if (HasCC && NewTID.hasOptionalDef()) - AddDefaultT1CC(MIB, CCDead); + if (NewTID.hasOptionalDef()) { + if (HasCC) + AddDefaultT1CC(MIB, CCDead); + else + AddNoT1CC(MIB); + } // Transfer the rest of operands. unsigned NumOps = TID.getNumOperands(); @@ -534,8 +538,12 @@ Thumb2SizeReduce::ReduceToNarrow(MachineBasicBlock &MBB, MachineInstr *MI, DebugLoc dl = MI->getDebugLoc(); MachineInstrBuilder MIB = BuildMI(MBB, *MI, dl, NewTID); MIB.addOperand(MI->getOperand(0)); - if (HasCC && NewTID.hasOptionalDef()) - AddDefaultT1CC(MIB, CCDead); + if (NewTID.hasOptionalDef()) { + if (HasCC) + AddDefaultT1CC(MIB, CCDead); + else + AddNoT1CC(MIB); + } // Transfer the rest of operands. unsigned NumOps = TID.getNumOperands(); @@ -659,7 +667,7 @@ bool Thumb2SizeReduce::ReduceMBB(MachineBasicBlock &MBB) { bool Thumb2SizeReduce::runOnMachineFunction(MachineFunction &MF) { const TargetMachine &TM = MF.getTarget(); - TII = TM.getInstrInfo(); + TII = static_cast<const Thumb2InstrInfo*>(TM.getInstrInfo()); bool Modified = false; for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) |