FastISel.h revision c7f72de3b4ef21828ea4780f0693bf0acd04e1c5
1//===-- FastISel.h - Definition of the FastISel class ---------------------===// 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// This file defines the FastISel class. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LLVM_CODEGEN_FASTISEL_H 15#define LLVM_CODEGEN_FASTISEL_H 16 17#include "llvm/BasicBlock.h" 18#include "llvm/ADT/DenseMap.h" 19#include "llvm/CodeGen/SelectionDAGNodes.h" 20 21namespace llvm { 22 23class MachineBasicBlock; 24class MachineFunction; 25class MachineRegisterInfo; 26class TargetData; 27class TargetInstrInfo; 28class TargetLowering; 29class TargetRegisterClass; 30 31/// FastISel - This is a fast-path instruction selection class that 32/// generates poor code and doesn't support illegal types or non-trivial 33/// lowering, but runs quickly. 34class FastISel { 35 MachineBasicBlock *MBB; 36 MachineFunction &MF; 37 MachineRegisterInfo &MRI; 38 const TargetData &TD; 39 const TargetInstrInfo &TII; 40 TargetLowering &TLI; 41 42public: 43 /// SelectInstructions - Do "fast" instruction selection over the 44 /// LLVM IR instructions in the range [Begin, N) where N is either 45 /// End or the first unsupported instruction. Return N. 46 /// ValueMap is filled in with a mapping of LLVM IR Values to 47 /// register numbers. 48 BasicBlock::iterator 49 SelectInstructions(BasicBlock::iterator Begin, BasicBlock::iterator End, 50 DenseMap<const Value*, unsigned> &ValueMap, 51 MachineBasicBlock *mbb); 52 53 virtual ~FastISel(); 54 55protected: 56 explicit FastISel(MachineFunction &mf); 57 58 /// FastEmit_r - This method is called by target-independent code 59 /// to request that an instruction with the given type and opcode 60 /// be emitted. 61 virtual unsigned FastEmit_(MVT::SimpleValueType VT, 62 ISD::NodeType Opcode); 63 64 /// FastEmit_r - This method is called by target-independent code 65 /// to request that an instruction with the given type, opcode, and 66 /// register operand be emitted. 67 /// 68 virtual unsigned FastEmit_r(MVT::SimpleValueType VT, 69 ISD::NodeType Opcode, unsigned Op0); 70 71 /// FastEmit_rr - This method is called by target-independent code 72 /// to request that an instruction with the given type, opcode, and 73 /// register operands be emitted. 74 /// 75 virtual unsigned FastEmit_rr(MVT::SimpleValueType VT, 76 ISD::NodeType Opcode, 77 unsigned Op0, unsigned Op1); 78 79 /// FastEmit_i - This method is called by target-independent code 80 /// to request that an instruction with the given type which materialize 81 /// the specified immediate value. 82 virtual unsigned FastEmit_i(MVT::SimpleValueType VT, uint64_t Imm); 83 84 /// FastEmit_ri - This method is called by target-independent code 85 /// to request that an instruction with the given type, opcode, and 86 /// register and immediate operands be emitted. 87 /// 88 virtual unsigned FastEmit_ri(MVT::SimpleValueType VT, 89 ISD::NodeType Opcode, 90 unsigned Op0, uint64_t Imm, 91 MVT::SimpleValueType ImmType); 92 93 /// FastEmit_ri_ - This method is a wrapper of FastEmit_ri. It first tries 94 /// to emit an instruction with an immediate operand using FastEmit_ri. 95 /// If that fails, it materializes the immediate into a register and try 96 /// FastEmit_rr instead. 97 unsigned FastEmit_ri_(MVT::SimpleValueType VT, 98 ISD::NodeType Opcode, 99 unsigned Op0, uint64_t Imm, 100 MVT::SimpleValueType ImmType); 101 102 /// FastEmitInst_ - Emit a MachineInstr with no operands and a 103 /// result register in the given register class. 104 /// 105 unsigned FastEmitInst_(unsigned MachineInstOpcode, 106 const TargetRegisterClass *RC); 107 108 /// FastEmitInst_ - Emit a MachineInstr with one register operand 109 /// and a result register in the given register class. 110 /// 111 unsigned FastEmitInst_r(unsigned MachineInstOpcode, 112 const TargetRegisterClass *RC, 113 unsigned Op0); 114 115 /// FastEmitInst_ - Emit a MachineInstr with two register operands 116 /// and a result register in the given register class. 117 /// 118 unsigned FastEmitInst_rr(unsigned MachineInstOpcode, 119 const TargetRegisterClass *RC, 120 unsigned Op0, unsigned Op1); 121 122private: 123 unsigned createResultReg(const TargetRegisterClass *RC); 124 125 bool SelectBinaryOp(Instruction *I, ISD::NodeType ISDOpcode, 126 DenseMap<const Value*, unsigned> &ValueMap); 127 128 bool SelectGetElementPtr(Instruction *I, 129 DenseMap<const Value*, unsigned> &ValueMap); 130}; 131 132} 133 134#endif 135