1//===-- XCoreFrameToArgsOffsetElim.cpp ----------------------------*- C++ -*-=//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Replace Pseudo FRAME_TO_ARGS_OFFSET with the appropriate real offset.
11//
12//===----------------------------------------------------------------------===//
13
14#include "XCore.h"
15#include "XCoreInstrInfo.h"
16#include "llvm/CodeGen/MachineFrameInfo.h"
17#include "llvm/CodeGen/MachineFunctionPass.h"
18#include "llvm/CodeGen/MachineInstrBuilder.h"
19#include "llvm/Support/Compiler.h"
20#include "llvm/Support/raw_ostream.h"
21#include "llvm/Target/TargetMachine.h"
22using namespace llvm;
23
24namespace {
25  struct XCoreFTAOElim : public MachineFunctionPass {
26    static char ID;
27    XCoreFTAOElim() : MachineFunctionPass(ID) {}
28
29    bool runOnMachineFunction(MachineFunction &Fn) override;
30
31    const char *getPassName() const override {
32      return "XCore FRAME_TO_ARGS_OFFSET Elimination";
33    }
34  };
35  char XCoreFTAOElim::ID = 0;
36}
37
38/// createXCoreFrameToArgsOffsetEliminationPass - returns an instance of the
39/// Frame to args offset elimination pass
40FunctionPass *llvm::createXCoreFrameToArgsOffsetEliminationPass() {
41  return new XCoreFTAOElim();
42}
43
44bool XCoreFTAOElim::runOnMachineFunction(MachineFunction &MF) {
45  const XCoreInstrInfo &TII =
46          *static_cast<const XCoreInstrInfo*>(MF.getTarget().getInstrInfo());
47  unsigned StackSize = MF.getFrameInfo()->getStackSize();
48  for (MachineFunction::iterator MFI = MF.begin(), E = MF.end(); MFI != E;
49       ++MFI) {
50    MachineBasicBlock &MBB = *MFI;
51    for (MachineBasicBlock::iterator MBBI = MBB.begin(), EE = MBB.end();
52         MBBI != EE; ++MBBI) {
53      if (MBBI->getOpcode() == XCore::FRAME_TO_ARGS_OFFSET) {
54        MachineInstr *OldInst = MBBI;
55        unsigned Reg = OldInst->getOperand(0).getReg();
56        MBBI = TII.loadImmediate(MBB, MBBI, Reg, StackSize);
57        OldInst->eraseFromParent();
58      }
59    }
60  }
61  return true;
62}
63