From aa9f0a57d03b1eef5a58c48b05f6657d2a5a0d0a Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Fri, 1 Oct 2010 20:28:06 +0000 Subject: [PATCH] Provide an option to restore old-style if-conversion heuristics for Thumb2. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115339 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/Thumb2InstrInfo.cpp | 29 +++++++++++++++++++++++++++++ lib/Target/ARM/Thumb2InstrInfo.h | 6 ++++++ 2 files changed, 35 insertions(+) diff --git a/lib/Target/ARM/Thumb2InstrInfo.cpp b/lib/Target/ARM/Thumb2InstrInfo.cpp index 49f5e4a9509..a79b4ae4b31 100644 --- a/lib/Target/ARM/Thumb2InstrInfo.cpp +++ b/lib/Target/ARM/Thumb2InstrInfo.cpp @@ -28,6 +28,11 @@ using namespace llvm; +static cl::opt +OldT2IfCvt("old-thumb2-ifcvt", cl::Hidden, + cl::desc("Use old-style Thumb2 if-conversion heuristics"), + cl::init(false)); + Thumb2InstrInfo::Thumb2InstrInfo(const ARMSubtarget &STI) : ARMBaseInstrInfo(STI), RI(*this, STI) { } @@ -37,6 +42,30 @@ unsigned Thumb2InstrInfo::getUnindexedOpcode(unsigned Opc) const { return 0; } +bool Thumb2InstrInfo::isProfitableToIfCvt(MachineBasicBlock &MBB, + unsigned NumInstrs, + float Prediction) const { + if (!OldT2IfCvt) + return ARMBaseInstrInfo::isProfitableToIfCvt(MBB, NumInstrs, Prediction); + return NumInstrs && NumInstrs <= 3; +} + +bool Thumb2InstrInfo:: +isProfitableToIfCvt(MachineBasicBlock &TMBB, unsigned NumT, + MachineBasicBlock &FMBB, unsigned NumF, + float Prediction) const { + if (!OldT2IfCvt) + return ARMBaseInstrInfo::isProfitableToIfCvt(TMBB, NumT, + FMBB, NumF, Prediction); + + // FIXME: Catch optimization such as: + // r0 = movne + // r0 = moveq + return NumT && NumF && + NumT <= 3 && NumF <= 3; +} + + void Thumb2InstrInfo::ReplaceTailWithBranchTo(MachineBasicBlock::iterator Tail, MachineBasicBlock *NewDest) const { diff --git a/lib/Target/ARM/Thumb2InstrInfo.h b/lib/Target/ARM/Thumb2InstrInfo.h index 9ed7eea7e2d..f9b1f32e627 100644 --- a/lib/Target/ARM/Thumb2InstrInfo.h +++ b/lib/Target/ARM/Thumb2InstrInfo.h @@ -38,6 +38,12 @@ public: bool isLegalToSplitMBBAt(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI) const; + bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumInstrs, + float Prediction) const; + bool isProfitableToIfCvt(MachineBasicBlock &TMBB, unsigned NumTInstrs, + MachineBasicBlock &FMBB, unsigned NumFInstrs, + float Prediction) const; + void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, DebugLoc DL, unsigned DestReg, unsigned SrcReg,