136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===-- XCoreFrameToArgsOffsetElim.cpp ----------------------------*- C++ -*-=// 236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// The LLVM Compiler Infrastructure 436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source 636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details. 736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Replace Pseudo FRAME_TO_ARGS_OFFSET with the appropriate real offset. 1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "XCore.h" 1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "XCoreInstrInfo.h" 1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineFrameInfo.h" 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineFunctionPass.h" 1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineInstrBuilder.h" 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/Compiler.h" 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/raw_ostream.h" 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Target/TargetMachine.h" 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesusing namespace llvm; 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace { 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct XCoreFTAOElim : public MachineFunctionPass { 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines static char ID; 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines XCoreFTAOElim() : MachineFunctionPass(ID) {} 2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool runOnMachineFunction(MachineFunction &Fn) override; 3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const char *getPassName() const override { 3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return "XCore FRAME_TO_ARGS_OFFSET Elimination"; 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines char XCoreFTAOElim::ID = 0; 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// createXCoreFrameToArgsOffsetEliminationPass - returns an instance of the 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Frame to args offset elimination pass 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesFunctionPass *llvm::createXCoreFrameToArgsOffsetEliminationPass() { 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return new XCoreFTAOElim(); 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool XCoreFTAOElim::runOnMachineFunction(MachineFunction &MF) { 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const XCoreInstrInfo &TII = 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines *static_cast<const XCoreInstrInfo*>(MF.getTarget().getInstrInfo()); 4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned StackSize = MF.getFrameInfo()->getStackSize(); 4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (MachineFunction::iterator MFI = MF.begin(), E = MF.end(); MFI != E; 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ++MFI) { 5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineBasicBlock &MBB = *MFI; 5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (MachineBasicBlock::iterator MBBI = MBB.begin(), EE = MBB.end(); 5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MBBI != EE; ++MBBI) { 5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (MBBI->getOpcode() == XCore::FRAME_TO_ARGS_OFFSET) { 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr *OldInst = MBBI; 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Reg = OldInst->getOperand(0).getReg(); 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MBBI = TII.loadImmediate(MBB, MBBI, Reg, StackSize); 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OldInst->eraseFromParent(); 5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 63