FastISel.h revision 763d89343be210eb62a13318ca0cc9321ce46bfb
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 TargetMachine;
30class TargetRegisterClass;
31
32/// FastISel - This is a fast-path instruction selection class that
33/// generates poor code and doesn't support illegal types or non-trivial
34/// lowering, but runs quickly.
35class FastISel {
36protected:
37  MachineBasicBlock *MBB;
38  MachineFunction &MF;
39  MachineRegisterInfo &MRI;
40  const TargetMachine &TM;
41  const TargetData &TD;
42  const TargetInstrInfo &TII;
43  const TargetLowering &TLI;
44
45public:
46  /// SelectInstructions - Do "fast" instruction selection over the
47  /// LLVM IR instructions in the range [Begin, N) where N is either
48  /// End or the first unsupported instruction. Return N.
49  /// ValueMap is filled in with a mapping of LLVM IR Values to
50  /// virtual register numbers. MBB is a block to which to append
51  /// the generated MachineInstrs.
52  BasicBlock::iterator
53  SelectInstructions(BasicBlock::iterator Begin, BasicBlock::iterator End,
54                     DenseMap<const Value*, unsigned> &ValueMap,
55                     DenseMap<const BasicBlock*, MachineBasicBlock *> &MBBMap,
56                     MachineBasicBlock *MBB);
57
58  virtual ~FastISel();
59
60protected:
61  explicit FastISel(MachineFunction &mf);
62
63  /// FastEmit_r - This method is called by target-independent code
64  /// to request that an instruction with the given type and opcode
65  /// be emitted.
66  virtual unsigned FastEmit_(MVT::SimpleValueType VT,
67                             MVT::SimpleValueType RetVT,
68                             ISD::NodeType Opcode);
69
70  /// FastEmit_r - This method is called by target-independent code
71  /// to request that an instruction with the given type, opcode, and
72  /// register operand be emitted.
73  ///
74  virtual unsigned FastEmit_r(MVT::SimpleValueType VT,
75                              MVT::SimpleValueType RetVT,
76                              ISD::NodeType Opcode, unsigned Op0);
77
78  /// FastEmit_rr - This method is called by target-independent code
79  /// to request that an instruction with the given type, opcode, and
80  /// register operands be emitted.
81  ///
82  virtual unsigned FastEmit_rr(MVT::SimpleValueType VT,
83                               MVT::SimpleValueType RetVT,
84                               ISD::NodeType Opcode,
85                               unsigned Op0, unsigned Op1);
86
87  /// FastEmit_ri - This method is called by target-independent code
88  /// to request that an instruction with the given type, opcode, and
89  /// register and immediate operands be emitted.
90  ///
91  virtual unsigned FastEmit_ri(MVT::SimpleValueType VT,
92                               MVT::SimpleValueType RetVT,
93                               ISD::NodeType Opcode,
94                               unsigned Op0, uint64_t Imm);
95
96  /// FastEmit_rri - This method is called by target-independent code
97  /// to request that an instruction with the given type, opcode, and
98  /// register and immediate operands be emitted.
99  ///
100  virtual unsigned FastEmit_rri(MVT::SimpleValueType VT,
101                                MVT::SimpleValueType RetVT,
102                                ISD::NodeType Opcode,
103                                unsigned Op0, unsigned Op1, uint64_t Imm);
104
105  /// FastEmit_ri_ - This method is a wrapper of FastEmit_ri. It first tries
106  /// to emit an instruction with an immediate operand using FastEmit_ri.
107  /// If that fails, it materializes the immediate into a register and try
108  /// FastEmit_rr instead.
109  unsigned FastEmit_ri_(MVT::SimpleValueType VT,
110                        ISD::NodeType Opcode,
111                        unsigned Op0, uint64_t Imm,
112                        MVT::SimpleValueType ImmType);
113
114  /// FastEmit_i - This method is called by target-independent code
115  /// to request that an instruction with the given type, opcode, and
116  /// immediate operand be emitted.
117  virtual unsigned FastEmit_i(MVT::SimpleValueType VT,
118                              MVT::SimpleValueType RetVT,
119                              ISD::NodeType Opcode,
120                              uint64_t Imm);
121
122  /// FastEmitInst_ - Emit a MachineInstr with no operands and a
123  /// result register in the given register class.
124  ///
125  unsigned FastEmitInst_(unsigned MachineInstOpcode,
126                         const TargetRegisterClass *RC);
127
128  /// FastEmitInst_r - Emit a MachineInstr with one register operand
129  /// and a result register in the given register class.
130  ///
131  unsigned FastEmitInst_r(unsigned MachineInstOpcode,
132                          const TargetRegisterClass *RC,
133                          unsigned Op0);
134
135  /// FastEmitInst_rr - Emit a MachineInstr with two register operands
136  /// and a result register in the given register class.
137  ///
138  unsigned FastEmitInst_rr(unsigned MachineInstOpcode,
139                           const TargetRegisterClass *RC,
140                           unsigned Op0, unsigned Op1);
141
142  /// FastEmitInst_ri - Emit a MachineInstr with two register operands
143  /// and a result register in the given register class.
144  ///
145  unsigned FastEmitInst_ri(unsigned MachineInstOpcode,
146                           const TargetRegisterClass *RC,
147                           unsigned Op0, uint64_t Imm);
148
149  /// FastEmitInst_rri - Emit a MachineInstr with two register operands,
150  /// an immediate, and a result register in the given register class.
151  ///
152  unsigned FastEmitInst_rri(unsigned MachineInstOpcode,
153                            const TargetRegisterClass *RC,
154                            unsigned Op0, unsigned Op1, uint64_t Imm);
155
156  /// FastEmitInst_i - Emit a MachineInstr with a single immediate
157  /// operand, and a result register in the given register class.
158  unsigned FastEmitInst_i(unsigned MachineInstrOpcode,
159                          const TargetRegisterClass *RC,
160                          uint64_t Imm);
161
162private:
163  unsigned createResultReg(const TargetRegisterClass *RC);
164
165  bool SelectBinaryOp(Instruction *I, ISD::NodeType ISDOpcode,
166                      DenseMap<const Value*, unsigned> &ValueMap);
167
168  bool SelectGetElementPtr(Instruction *I,
169                           DenseMap<const Value*, unsigned> &ValueMap);
170
171  bool SelectBitCast(Instruction *I,
172                     DenseMap<const Value*, unsigned> &ValueMap);
173};
174
175}
176
177#endif
178