191bc56edSDimitry Andric //===-- XCoreFrameToArgsOffsetElim.cpp ----------------------------*- C++ -*-=// 291bc56edSDimitry Andric // 391bc56edSDimitry Andric // The LLVM Compiler Infrastructure 491bc56edSDimitry Andric // 591bc56edSDimitry Andric // This file is distributed under the University of Illinois Open Source 691bc56edSDimitry Andric // License. See LICENSE.TXT for details. 791bc56edSDimitry Andric // 891bc56edSDimitry Andric //===----------------------------------------------------------------------===// 991bc56edSDimitry Andric // 1091bc56edSDimitry Andric // Replace Pseudo FRAME_TO_ARGS_OFFSET with the appropriate real offset. 1191bc56edSDimitry Andric // 1291bc56edSDimitry Andric //===----------------------------------------------------------------------===// 1391bc56edSDimitry Andric 1491bc56edSDimitry Andric #include "XCore.h" 1591bc56edSDimitry Andric #include "XCoreInstrInfo.h" 1639d628a0SDimitry Andric #include "XCoreSubtarget.h" 1791bc56edSDimitry Andric #include "llvm/CodeGen/MachineFrameInfo.h" 1891bc56edSDimitry Andric #include "llvm/CodeGen/MachineFunctionPass.h" 1991bc56edSDimitry Andric #include "llvm/CodeGen/MachineInstrBuilder.h" 2091bc56edSDimitry Andric #include "llvm/Support/raw_ostream.h" 2191bc56edSDimitry Andric #include "llvm/Target/TargetMachine.h" 2291bc56edSDimitry Andric using namespace llvm; 2391bc56edSDimitry Andric 2491bc56edSDimitry Andric namespace { 2591bc56edSDimitry Andric struct XCoreFTAOElim : public MachineFunctionPass { 2691bc56edSDimitry Andric static char ID; XCoreFTAOElim__anona059c7250111::XCoreFTAOElim2791bc56edSDimitry Andric XCoreFTAOElim() : MachineFunctionPass(ID) {} 2891bc56edSDimitry Andric 2991bc56edSDimitry Andric bool runOnMachineFunction(MachineFunction &Fn) override; getRequiredProperties__anona059c7250111::XCoreFTAOElim303ca95b02SDimitry Andric MachineFunctionProperties getRequiredProperties() const override { 313ca95b02SDimitry Andric return MachineFunctionProperties().set( 32*d88c1a5aSDimitry Andric MachineFunctionProperties::Property::NoVRegs); 333ca95b02SDimitry Andric } 3491bc56edSDimitry Andric getPassName__anona059c7250111::XCoreFTAOElim35*d88c1a5aSDimitry Andric StringRef getPassName() const override { 3691bc56edSDimitry Andric return "XCore FRAME_TO_ARGS_OFFSET Elimination"; 3791bc56edSDimitry Andric } 3891bc56edSDimitry Andric }; 3991bc56edSDimitry Andric char XCoreFTAOElim::ID = 0; 4091bc56edSDimitry Andric } 4191bc56edSDimitry Andric 4291bc56edSDimitry Andric /// createXCoreFrameToArgsOffsetEliminationPass - returns an instance of the 4391bc56edSDimitry Andric /// Frame to args offset elimination pass createXCoreFrameToArgsOffsetEliminationPass()4491bc56edSDimitry AndricFunctionPass *llvm::createXCoreFrameToArgsOffsetEliminationPass() { 4591bc56edSDimitry Andric return new XCoreFTAOElim(); 4691bc56edSDimitry Andric } 4791bc56edSDimitry Andric runOnMachineFunction(MachineFunction & MF)4891bc56edSDimitry Andricbool XCoreFTAOElim::runOnMachineFunction(MachineFunction &MF) { 4991bc56edSDimitry Andric const XCoreInstrInfo &TII = 5039d628a0SDimitry Andric *static_cast<const XCoreInstrInfo *>(MF.getSubtarget().getInstrInfo()); 51*d88c1a5aSDimitry Andric unsigned StackSize = MF.getFrameInfo().getStackSize(); 5291bc56edSDimitry Andric for (MachineFunction::iterator MFI = MF.begin(), E = MF.end(); MFI != E; 5391bc56edSDimitry Andric ++MFI) { 5491bc56edSDimitry Andric MachineBasicBlock &MBB = *MFI; 5591bc56edSDimitry Andric for (MachineBasicBlock::iterator MBBI = MBB.begin(), EE = MBB.end(); 5691bc56edSDimitry Andric MBBI != EE; ++MBBI) { 5791bc56edSDimitry Andric if (MBBI->getOpcode() == XCore::FRAME_TO_ARGS_OFFSET) { 58*d88c1a5aSDimitry Andric MachineInstr &OldInst = *MBBI; 59*d88c1a5aSDimitry Andric unsigned Reg = OldInst.getOperand(0).getReg(); 6091bc56edSDimitry Andric MBBI = TII.loadImmediate(MBB, MBBI, Reg, StackSize); 61*d88c1a5aSDimitry Andric OldInst.eraseFromParent(); 6291bc56edSDimitry Andric } 6391bc56edSDimitry Andric } 6491bc56edSDimitry Andric } 6591bc56edSDimitry Andric return true; 6691bc56edSDimitry Andric } 67