MipsConstantIslandPass.cpp revision a430cb613b6e93c05f128b04323c57acfd08686d
1c55a96383497a772a307b346368133960b02ad03Eric Laurent//===-- MipsConstantIslandPass.cpp - Emit Pc Relative loads----------------===//
2c55a96383497a772a307b346368133960b02ad03Eric Laurent//
3c55a96383497a772a307b346368133960b02ad03Eric Laurent//                     The LLVM Compiler Infrastructure
4c55a96383497a772a307b346368133960b02ad03Eric Laurent//
5c55a96383497a772a307b346368133960b02ad03Eric Laurent// This file is distributed under the University of Illinois Open Source
6c55a96383497a772a307b346368133960b02ad03Eric Laurent// License. See LICENSE.TXT for details.
7c55a96383497a772a307b346368133960b02ad03Eric Laurent//
8c55a96383497a772a307b346368133960b02ad03Eric Laurent//===----------------------------------------------------------------------===//
9c55a96383497a772a307b346368133960b02ad03Eric Laurent//
10c55a96383497a772a307b346368133960b02ad03Eric Laurent//
11c55a96383497a772a307b346368133960b02ad03Eric Laurent// This pass is used to make Pc relative loads of constants.
12c55a96383497a772a307b346368133960b02ad03Eric Laurent// For now, only Mips16 will use this. While it has the same name and
13c55a96383497a772a307b346368133960b02ad03Eric Laurent// uses many ideas from the LLVM ARM Constant Island Pass, it's not intended
14c55a96383497a772a307b346368133960b02ad03Eric Laurent// to reuse any of the code from the ARM version.
15c55a96383497a772a307b346368133960b02ad03Eric Laurent//
16c55a96383497a772a307b346368133960b02ad03Eric Laurent// Loading constants inline is expensive on Mips16 and it's in general better
17c55a96383497a772a307b346368133960b02ad03Eric Laurent// to place the constant nearby in code space and then it can be loaded with a
18c55a96383497a772a307b346368133960b02ad03Eric Laurent// simple 16 bit load instruction.
19c55a96383497a772a307b346368133960b02ad03Eric Laurent//
20c55a96383497a772a307b346368133960b02ad03Eric Laurent// The constants can be not just numbers but addresses of functions and labels.
21c55a96383497a772a307b346368133960b02ad03Eric Laurent// This can be particularly helpful in static relocation mode for embedded
22c55a96383497a772a307b346368133960b02ad03Eric Laurent// non linux targets.
23c55a96383497a772a307b346368133960b02ad03Eric Laurent//
24c55a96383497a772a307b346368133960b02ad03Eric Laurent//
25c55a96383497a772a307b346368133960b02ad03Eric Laurent
26c55a96383497a772a307b346368133960b02ad03Eric Laurent#define DEBUG_TYPE "mips-constant-islands"
27c55a96383497a772a307b346368133960b02ad03Eric Laurent
28c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "Mips.h"
29c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "MCTargetDesc/MipsBaseInfo.h"
30c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "MipsTargetMachine.h"
31c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "llvm/ADT/Statistic.h"
32c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "llvm/CodeGen/MachineFunctionPass.h"
33c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "llvm/CodeGen/MachineInstrBuilder.h"
34c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "llvm/IR/Function.h"
35c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "llvm/Support/CommandLine.h"
36c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "llvm/Support/MathExtras.h"
37c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "llvm/Target/TargetInstrInfo.h"
38c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "llvm/Target/TargetMachine.h"
39c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "llvm/Target/TargetRegisterInfo.h"
40c55a96383497a772a307b346368133960b02ad03Eric Laurent
41c55a96383497a772a307b346368133960b02ad03Eric Laurentusing namespace llvm;
42c55a96383497a772a307b346368133960b02ad03Eric Laurent
43c55a96383497a772a307b346368133960b02ad03Eric Laurentnamespace {
44c55a96383497a772a307b346368133960b02ad03Eric Laurent  typedef MachineBasicBlock::iterator Iter;
45c55a96383497a772a307b346368133960b02ad03Eric Laurent  typedef MachineBasicBlock::reverse_iterator ReverseIter;
46c55a96383497a772a307b346368133960b02ad03Eric Laurent
47c55a96383497a772a307b346368133960b02ad03Eric Laurent  class MipsConstantIslands : public MachineFunctionPass {
48c55a96383497a772a307b346368133960b02ad03Eric Laurent
49c55a96383497a772a307b346368133960b02ad03Eric Laurent  public:
50c55a96383497a772a307b346368133960b02ad03Eric Laurent    static char ID;
51c55a96383497a772a307b346368133960b02ad03Eric Laurent    MipsConstantIslands(TargetMachine &tm)
52c55a96383497a772a307b346368133960b02ad03Eric Laurent      : MachineFunctionPass(ID), TM(tm),
53c55a96383497a772a307b346368133960b02ad03Eric Laurent        TII(static_cast<const MipsInstrInfo*>(tm.getInstrInfo())),
54c55a96383497a772a307b346368133960b02ad03Eric Laurent        IsPIC(TM.getRelocationModel() == Reloc::PIC_),
55c55a96383497a772a307b346368133960b02ad03Eric Laurent        ABI(TM.getSubtarget<MipsSubtarget>().getTargetABI()) {}
56c55a96383497a772a307b346368133960b02ad03Eric Laurent
57c55a96383497a772a307b346368133960b02ad03Eric Laurent    virtual const char *getPassName() const {
58c55a96383497a772a307b346368133960b02ad03Eric Laurent      return "Mips Constant Islands";
59c55a96383497a772a307b346368133960b02ad03Eric Laurent    }
60c55a96383497a772a307b346368133960b02ad03Eric Laurent
61c55a96383497a772a307b346368133960b02ad03Eric Laurent    bool runOnMachineFunction(MachineFunction &F);
62c55a96383497a772a307b346368133960b02ad03Eric Laurent
63c55a96383497a772a307b346368133960b02ad03Eric Laurent  private:
64c55a96383497a772a307b346368133960b02ad03Eric Laurent
65c55a96383497a772a307b346368133960b02ad03Eric Laurent
66c55a96383497a772a307b346368133960b02ad03Eric Laurent    const TargetMachine &TM;
67c55a96383497a772a307b346368133960b02ad03Eric Laurent    const MipsInstrInfo *TII;
68c55a96383497a772a307b346368133960b02ad03Eric Laurent    bool IsPIC;
69    unsigned ABI;
70
71  };
72
73  char MipsConstantIslands::ID = 0;
74} // end of anonymous namespace
75
76/// createMipsLongBranchPass - Returns a pass that converts branches to long
77/// branches.
78FunctionPass *llvm::createMipsConstantIslandPass(MipsTargetMachine &tm) {
79  return new MipsConstantIslands(tm);
80}
81
82bool MipsConstantIslands::runOnMachineFunction(MachineFunction &F) {
83  // The intention is for this to be a mips16 only pass for now
84  // FIXME:
85  // if (!TM.getSubtarget<MipsSubtarget>().inMips16Mode())
86  //  return false;
87  return false;
88}
89
90