mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-22 10:29:35 +00:00
shorter/easier and have the DAG use that to do the same lookup. This can be used in the future for TargetMachine based caching lookups from the MachineFunction easily. Update the MIPS subtarget switching machinery to update this pointer at the same time it runs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214838 91177308-0d34-0410-b5e6-96231b3b80d8
64 lines
2.1 KiB
C++
64 lines
2.1 KiB
C++
//===-- XCoreFrameToArgsOffsetElim.cpp ----------------------------*- C++ -*-=//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Replace Pseudo FRAME_TO_ARGS_OFFSET with the appropriate real offset.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "XCore.h"
|
|
#include "XCoreInstrInfo.h"
|
|
#include "XCoreSubtarget.h"
|
|
#include "llvm/CodeGen/MachineFrameInfo.h"
|
|
#include "llvm/CodeGen/MachineFunctionPass.h"
|
|
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
|
#include "llvm/Support/Compiler.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
#include "llvm/Target/TargetMachine.h"
|
|
using namespace llvm;
|
|
|
|
namespace {
|
|
struct XCoreFTAOElim : public MachineFunctionPass {
|
|
static char ID;
|
|
XCoreFTAOElim() : MachineFunctionPass(ID) {}
|
|
|
|
bool runOnMachineFunction(MachineFunction &Fn) override;
|
|
|
|
const char *getPassName() const override {
|
|
return "XCore FRAME_TO_ARGS_OFFSET Elimination";
|
|
}
|
|
};
|
|
char XCoreFTAOElim::ID = 0;
|
|
}
|
|
|
|
/// createXCoreFrameToArgsOffsetEliminationPass - returns an instance of the
|
|
/// Frame to args offset elimination pass
|
|
FunctionPass *llvm::createXCoreFrameToArgsOffsetEliminationPass() {
|
|
return new XCoreFTAOElim();
|
|
}
|
|
|
|
bool XCoreFTAOElim::runOnMachineFunction(MachineFunction &MF) {
|
|
const XCoreInstrInfo &TII =
|
|
*static_cast<const XCoreInstrInfo *>(MF.getSubtarget().getInstrInfo());
|
|
unsigned StackSize = MF.getFrameInfo()->getStackSize();
|
|
for (MachineFunction::iterator MFI = MF.begin(), E = MF.end(); MFI != E;
|
|
++MFI) {
|
|
MachineBasicBlock &MBB = *MFI;
|
|
for (MachineBasicBlock::iterator MBBI = MBB.begin(), EE = MBB.end();
|
|
MBBI != EE; ++MBBI) {
|
|
if (MBBI->getOpcode() == XCore::FRAME_TO_ARGS_OFFSET) {
|
|
MachineInstr *OldInst = MBBI;
|
|
unsigned Reg = OldInst->getOperand(0).getReg();
|
|
MBBI = TII.loadImmediate(MBB, MBBI, Reg, StackSize);
|
|
OldInst->eraseFromParent();
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|