diff options
Diffstat (limited to 'lib/Target/Hexagon/HexagonOptimizeConstExt.cpp')
-rw-r--r-- | lib/Target/Hexagon/HexagonOptimizeConstExt.cpp | 261 |
1 files changed, 0 insertions, 261 deletions
diff --git a/lib/Target/Hexagon/HexagonOptimizeConstExt.cpp b/lib/Target/Hexagon/HexagonOptimizeConstExt.cpp deleted file mode 100644 index 91987a0d81..0000000000 --- a/lib/Target/Hexagon/HexagonOptimizeConstExt.cpp +++ /dev/null @@ -1,261 +0,0 @@ -//===---- HexagonOptimizeConstExt.cpp - Optimize Constant Extender Use ----===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This pass traverses through all the basic blocks in a functions and replaces -// constant extended instruction with their register equivalent if the same -// constant is being used by more than two instructions. -//===----------------------------------------------------------------------===// - -#define DEBUG_TYPE "xfer" -#include "llvm/CodeGen/MachineDominators.h" -#include "llvm/Support/Debug.h" -#include "llvm/ADT/StringMap.h" -#include "llvm/ADT/StringRef.h" -#include "llvm/ADT/SmallString.h" -#include "llvm/ADT/Twine.h" -#include "llvm/CodeGen/MachineInstrBuilder.h" -#include "HexagonTargetMachine.h" -#include "HexagonConstExtInfo.h" -#include "llvm/CodeGen/MachineFunctionAnalysis.h" -#include "llvm/Support/CommandLine.h" -#define DEBUG_TYPE "xfer" - -using namespace llvm; - -namespace { - -class HexagonOptimizeConstExt : public MachineFunctionPass { - HexagonTargetMachine& QTM; - const HexagonSubtarget &QST; - -public: - static char ID; - HexagonOptimizeConstExt(HexagonTargetMachine& TM) - : MachineFunctionPass(ID), QTM(TM), QST(*TM.getSubtargetImpl()) {} - - const char *getPassName() const { - return "Remove sub-optimal uses of constant extenders"; - } - - void getAnalysisUsage(AnalysisUsage &AU) const { - MachineFunctionPass::getAnalysisUsage(AU); - AU.addRequired<MachineDominatorTree>(); - AU.addPreserved<MachineDominatorTree>(); - } - - bool runOnMachineFunction(MachineFunction &Fn); - void removeConstExtFromMI (const HexagonInstrInfo *TII, MachineInstr* oldMI, - unsigned DestReg); -}; - -char HexagonOptimizeConstExt::ID = 0; - -// Remove constant extended instructions with the corresponding non-extended -// instruction. -void HexagonOptimizeConstExt::removeConstExtFromMI (const HexagonInstrInfo *TII, - MachineInstr* oldMI, - unsigned DestReg) { - assert(HexagonConstExt::NonExtEquivalentExists(oldMI->getOpcode()) && - "Non-extended equivalent instruction doesn't exist"); - MachineBasicBlock *MBB = oldMI->getParent (); - int oldOpCode = oldMI->getOpcode(); - unsigned short CExtOpNum = HexagonConstExt::getCExtOpNum(oldOpCode); - unsigned numOperands = oldMI->getNumOperands(); - MachineInstrBuilder MIB = BuildMI(*MBB, oldMI, oldMI->getDebugLoc(), - TII->get(HexagonConstExt::getNonExtOpcode(oldMI->getOpcode()))); - - for (unsigned i = 0; i < numOperands; ++i) { - if (i == CExtOpNum) { - MIB.addReg(DestReg); - if (oldMI->getDesc().mayLoad()) { - // As of now, only absolute addressing mode instructions can load from - // global addresses. Other addressing modes allow only constant - // literals. Load with absolute addressing mode gets replaced with the - // corresponding base+offset load. - if (oldMI->getOperand(i).isGlobal()) { - MIB.addImm(oldMI->getOperand(i).getOffset()); - } - else - MIB.addImm(0); - } - else if (oldMI->getDesc().mayStore()){ - if (oldMI->getOperand(i).isGlobal()) { - // If stored value is a global address and is extended, it is required - // to have 0 offset. - if (CExtOpNum == (numOperands-1)) - assert((oldMI->getOperand(i).getOffset()==0) && "Invalid Offset"); - else - MIB.addImm(oldMI->getOperand(i).getOffset()); - } - else if (CExtOpNum != (numOperands-1)) - MIB.addImm(0); - } - } - else { - const MachineOperand &op = oldMI->getOperand(i); - MIB.addOperand(op); - } - } - DEBUG(dbgs () << "Removing old instr: " << *oldMI << "\n"); - DEBUG(dbgs() << "New instr: " << (*MIB) << "\n"); - oldMI->eraseFromParent(); -} - -// Returns false for the following instructions, since it may not be profitable -// to convert these instructions into a non-extended instruction if the offset -// is non-zero. -static bool canHaveAnyOffset(MachineInstr* MI) { - switch (MI->getOpcode()) { - case Hexagon::STriw_offset_ext_V4: - case Hexagon::STrih_offset_ext_V4: - return false; - default: - return true; - } -} - -bool HexagonOptimizeConstExt::runOnMachineFunction(MachineFunction &Fn) { - - const HexagonInstrInfo *TII = QTM.getInstrInfo(); - MachineDominatorTree &MDT = getAnalysis<MachineDominatorTree>(); - - // CExtMap maintains a list of instructions for each constant extended value. - // It also keeps a flag for the value to indicate if it's a global address - // or a constant literal. - StringMap<std::pair<SmallVector<MachineInstr*, 8>, bool > > CExtMap; - - // Loop over all the basic blocks - for (MachineFunction::iterator MBBb = Fn.begin(), MBBe = Fn.end(); - MBBb != MBBe; ++MBBb) { - MachineBasicBlock* MBB = MBBb; - - // Traverse the basic block and update a map of (ImmValue->MI) - MachineBasicBlock::iterator MII = MBB->begin(); - MachineBasicBlock::iterator MIE = MBB->end (); - - while (MII != MIE) { - MachineInstr *MI = MII; - // Check if the instruction has any constant extended operand and also has - // a non-extended equivalent. - if (TII->isConstExtended(MI) && - HexagonConstExt::NonExtEquivalentExists(MI->getOpcode())) { - short ExtOpNum = HexagonConstExt::getCExtOpNum(MI->getOpcode()); - SmallString<256> TmpData; - if (MI->getOperand(ExtOpNum).isImm()) { - DEBUG(dbgs() << "Selected for replacement : " << *MI << "\n"); - int ImmValue = MI->getOperand(ExtOpNum).getImm(); - StringRef ExtValue = Twine(ImmValue).toStringRef(TmpData); - CExtMap[ExtValue].first.push_back(MI); - CExtMap[ExtValue].second = false; - } - else if (MI->getOperand(ExtOpNum).isGlobal()) { - StringRef ExtValue = MI->getOperand(ExtOpNum).getGlobal()->getName(); - // If stored value is constant extended and has an offset, it's not - // profitable to replace these instructions with the non-extended - // version. - if (MI->getOperand(ExtOpNum).getOffset() == 0 - || canHaveAnyOffset(MI)) { - DEBUG(dbgs() << "Selected for replacement : " << *MI << "\n"); - CExtMap[ExtValue].first.push_back(MI); - CExtMap[ExtValue].second = true; - } - } - } - ++MII; - } // While ends - } - - enum OpType {imm, GlobalAddr}; - // Process the constants that have been extended. - for (StringMap<std::pair<SmallVector<MachineInstr*, 8>, bool> >::iterator II= - CExtMap.begin(), IE = CExtMap.end(); II != IE; ++II) { - - SmallVector<MachineInstr*, 8> &MIList = (*II).second.first; - - // Replace the constant extended instructions with the non-extended - // equivalent if more than 2 instructions extend the same constant value. - if (MIList.size() <= 2) - continue; - - bool ExtOpType = (*II).second.second; - StringRef ExtValue = (*II).getKeyData(); - const GlobalValue *GV = NULL; - unsigned char TargetFlags=0; - int ExtOpNum = HexagonConstExt::getCExtOpNum(MIList[0]->getOpcode()); - SmallVector<MachineBasicBlock*, 8> MachineBlocks; - - if (ExtOpType == GlobalAddr) { - GV = MIList[0]->getOperand(ExtOpNum).getGlobal(); - TargetFlags = MIList[0]->getOperand(ExtOpNum).getTargetFlags(); - } - - // For each instruction in the list, record the block it belongs to. - for (SmallVector<MachineInstr*, 8>::iterator LB = MIList.begin(), - LE = MIList.end(); LB != LE; ++LB) { - MachineInstr *MI = (*LB); - MachineBlocks.push_back (MI->getParent()); - } - - MachineBasicBlock* CommDomBlock = MachineBlocks[0]; - MachineBasicBlock* oldCommDomBlock = NULL; - // replaceMIs is the list of instructions to be replaced with a - // non-extended equivalent instruction. - // The idea here is that not all the instructions in the MIList will - // be replaced with a register. - SmallVector<MachineInstr*, 8> replaceMIs; - replaceMIs.push_back(MIList[0]); - - for (unsigned i= 1; i < MachineBlocks.size(); ++i) { - oldCommDomBlock = CommDomBlock; - MachineBasicBlock *BB = MachineBlocks[i]; - CommDomBlock = MDT.findNearestCommonDominator(&(*CommDomBlock), - &(*BB)); - if (!CommDomBlock) { - CommDomBlock = oldCommDomBlock; - break; - } - replaceMIs.push_back(MIList[i]); - } - - // Insert into CommDomBlock. - if (CommDomBlock) { - unsigned DestReg = TII->createVR (CommDomBlock->getParent(), MVT::i32); - MachineInstr *firstMI = CommDomBlock->getFirstNonPHI(); - if (ExtOpType == imm) { - int ImmValue = 0; - ExtValue.getAsInteger(10,ImmValue); - BuildMI (*CommDomBlock, firstMI, firstMI->getDebugLoc(), - TII->get(Hexagon::TFRI), DestReg) - .addImm(ImmValue); - } - else { - BuildMI (*CommDomBlock, firstMI, firstMI->getDebugLoc(), - TII->get(Hexagon::TFRI_V4), DestReg) - .addGlobalAddress(GV, 0, TargetFlags); - } - for (unsigned i= 0; i < replaceMIs.size(); i++) { - MachineInstr *oldMI = replaceMIs[i]; - removeConstExtFromMI(TII, oldMI, DestReg); - } - replaceMIs.clear(); - } - } - return true; -} -} - -//===----------------------------------------------------------------------===// -// Public Constructor Functions -//===----------------------------------------------------------------------===// - -FunctionPass * -llvm::createHexagonOptimizeConstExt(HexagonTargetMachine &TM) { - return new HexagonOptimizeConstExt(TM); -} - |