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