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 "XCoreSubtarget.h"
17#include "llvm/CodeGen/MachineFrameInfo.h"
18#include "llvm/CodeGen/MachineFunctionPass.h"
19#include "llvm/CodeGen/MachineInstrBuilder.h"
20#include "llvm/Support/Compiler.h"
21#include "llvm/Support/raw_ostream.h"
22#include "llvm/Target/TargetMachine.h"
23using namespace llvm;
24
25namespace {
26  struct XCoreFTAOElim : public MachineFunctionPass {
27    static char ID;
28    XCoreFTAOElim() : MachineFunctionPass(ID) {}
29
30    bool runOnMachineFunction(MachineFunction &Fn) override;
31
32    const char *getPassName() const override {
33      return "XCore FRAME_TO_ARGS_OFFSET Elimination";
34    }
35  };
36  char XCoreFTAOElim::ID = 0;
37}
38
39/// createXCoreFrameToArgsOffsetEliminationPass - returns an instance of the
40/// Frame to args offset elimination pass
41FunctionPass *llvm::createXCoreFrameToArgsOffsetEliminationPass() {
42  return new XCoreFTAOElim();
43}
44
45bool XCoreFTAOElim::runOnMachineFunction(MachineFunction &MF) {
46  const XCoreInstrInfo &TII =
47      *static_cast<const XCoreInstrInfo *>(MF.getSubtarget().getInstrInfo());
48  unsigned StackSize = MF.getFrameInfo()->getStackSize();
49  for (MachineFunction::iterator MFI = MF.begin(), E = MF.end(); MFI != E;
50       ++MFI) {
51    MachineBasicBlock &MBB = *MFI;
52    for (MachineBasicBlock::iterator MBBI = MBB.begin(), EE = MBB.end();
53         MBBI != EE; ++MBBI) {
54      if (MBBI->getOpcode() == XCore::FRAME_TO_ARGS_OFFSET) {
55        MachineInstr *OldInst = MBBI;
56        unsigned Reg = OldInst->getOperand(0).getReg();
57        MBBI = TII.loadImmediate(MBB, MBBI, Reg, StackSize);
58        OldInst->eraseFromParent();
59      }
60    }
61  }
62  return true;
63}
64