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" 1637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "XCoreSubtarget.h" 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineFrameInfo.h" 1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineFunctionPass.h" 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineInstrBuilder.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; 30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar MachineFunctionProperties getRequiredProperties() const override { 31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return MachineFunctionProperties().set( 32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar MachineFunctionProperties::Property::AllVRegsAllocated); 33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const char *getPassName() const override { 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return "XCore FRAME_TO_ARGS_OFFSET Elimination"; 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines char XCoreFTAOElim::ID = 0; 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// createXCoreFrameToArgsOffsetEliminationPass - returns an instance of the 4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Frame to args offset elimination pass 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesFunctionPass *llvm::createXCoreFrameToArgsOffsetEliminationPass() { 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return new XCoreFTAOElim(); 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool XCoreFTAOElim::runOnMachineFunction(MachineFunction &MF) { 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const XCoreInstrInfo &TII = 5037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines *static_cast<const XCoreInstrInfo *>(MF.getSubtarget().getInstrInfo()); 5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned StackSize = MF.getFrameInfo()->getStackSize(); 5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (MachineFunction::iterator MFI = MF.begin(), E = MF.end(); MFI != E; 5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ++MFI) { 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineBasicBlock &MBB = *MFI; 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (MachineBasicBlock::iterator MBBI = MBB.begin(), EE = MBB.end(); 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MBBI != EE; ++MBBI) { 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (MBBI->getOpcode() == XCore::FRAME_TO_ARGS_OFFSET) { 5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr *OldInst = MBBI; 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Reg = OldInst->getOperand(0).getReg(); 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MBBI = TII.loadImmediate(MBB, MBBI, Reg, StackSize); 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OldInst->eraseFromParent(); 6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 67