FastISel.h revision 066b5d8403483bf3a8bb033b690da318fbc68e79
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/ADT/DenseMap.h"
18#include "llvm/CodeGen/ValueTypes.h"
19#include "llvm/CodeGen/MachineBasicBlock.h"
20
21namespace llvm {
22
23class AllocaInst;
24class Constant;
25class ConstantFP;
26class FunctionLoweringInfo;
27class Instruction;
28class LoadInst;
29class MachineBasicBlock;
30class MachineConstantPool;
31class MachineFunction;
32class MachineInstr;
33class MachineFrameInfo;
34class MachineRegisterInfo;
35class TargetData;
36class TargetInstrInfo;
37class TargetLowering;
38class TargetMachine;
39class TargetRegisterClass;
40class TargetRegisterInfo;
41class User;
42class Value;
43
44/// FastISel - This is a fast-path instruction selection class that
45/// generates poor code and doesn't support illegal types or non-trivial
46/// lowering, but runs quickly.
47class FastISel {
48protected:
49  DenseMap<const Value *, unsigned> LocalValueMap;
50  FunctionLoweringInfo &FuncInfo;
51  MachineRegisterInfo &MRI;
52  MachineFrameInfo &MFI;
53  MachineConstantPool &MCP;
54  DebugLoc DL;
55  const TargetMachine &TM;
56  const TargetData &TD;
57  const TargetInstrInfo &TII;
58  const TargetLowering &TLI;
59  const TargetRegisterInfo &TRI;
60
61  /// The position of the last instruction for materializing constants
62  /// for use in the current block. It resets to EmitStartPt when it
63  /// makes sense (for example, it's usually profitable to avoid function
64  /// calls between the definition and the use)
65  MachineInstr *LastLocalValue;
66
67  /// The top most instruction in the current block that is allowed for
68  /// emitting local variables. LastLocalValue resets to EmitStartPt when
69  /// it makes sense (for example, on function calls)
70  MachineInstr *EmitStartPt;
71
72public:
73  /// getLastLocalValue - Return the position of the last instruction
74  /// emitted for materializing constants for use in the current block.
75  MachineInstr *getLastLocalValue() { return LastLocalValue; }
76
77  /// setLastLocalValue - Update the position of the last instruction
78  /// emitted for materializing constants for use in the current block.
79  void setLastLocalValue(MachineInstr *I) {
80    EmitStartPt = I;
81    LastLocalValue = I;
82  }
83
84  /// startNewBlock - Set the current block to which generated machine
85  /// instructions will be appended, and clear the local CSE map.
86  ///
87  void startNewBlock();
88
89  /// getCurDebugLoc() - Return current debug location information.
90  DebugLoc getCurDebugLoc() const { return DL; }
91
92  /// SelectInstruction - Do "fast" instruction selection for the given
93  /// LLVM IR instruction, and append generated machine instructions to
94  /// the current block. Return true if selection was successful.
95  ///
96  bool SelectInstruction(const Instruction *I);
97
98  /// SelectOperator - Do "fast" instruction selection for the given
99  /// LLVM IR operator (Instruction or ConstantExpr), and append
100  /// generated machine instructions to the current block. Return true
101  /// if selection was successful.
102  ///
103  bool SelectOperator(const User *I, unsigned Opcode);
104
105  /// getRegForValue - Create a virtual register and arrange for it to
106  /// be assigned the value for the given LLVM value.
107  unsigned getRegForValue(const Value *V);
108
109  /// lookUpRegForValue - Look up the value to see if its value is already
110  /// cached in a register. It may be defined by instructions across blocks or
111  /// defined locally.
112  unsigned lookUpRegForValue(const Value *V);
113
114  /// getRegForGEPIndex - This is a wrapper around getRegForValue that also
115  /// takes care of truncating or sign-extending the given getelementptr
116  /// index value.
117  std::pair<unsigned, bool> getRegForGEPIndex(const Value *V);
118
119  /// TryToFoldLoad - The specified machine instr operand is a vreg, and that
120  /// vreg is being provided by the specified load instruction.  If possible,
121  /// try to fold the load as an operand to the instruction, returning true if
122  /// possible.
123  virtual bool TryToFoldLoad(MachineInstr * /*MI*/, unsigned /*OpNo*/,
124                             const LoadInst * /*LI*/) {
125    return false;
126  }
127
128  /// recomputeInsertPt - Reset InsertPt to prepare for inserting instructions
129  /// into the current block.
130  void recomputeInsertPt();
131
132  struct SavePoint {
133    MachineBasicBlock::iterator InsertPt;
134    DebugLoc DL;
135  };
136
137  /// enterLocalValueArea - Prepare InsertPt to begin inserting instructions
138  /// into the local value area and return the old insert position.
139  SavePoint enterLocalValueArea();
140
141  /// leaveLocalValueArea - Reset InsertPt to the given old insert position.
142  void leaveLocalValueArea(SavePoint Old);
143
144  virtual ~FastISel();
145
146protected:
147  explicit FastISel(FunctionLoweringInfo &funcInfo);
148
149  /// TargetSelectInstruction - This method is called by target-independent
150  /// code when the normal FastISel process fails to select an instruction.
151  /// This gives targets a chance to emit code for anything that doesn't
152  /// fit into FastISel's framework. It returns true if it was successful.
153  ///
154  virtual bool
155  TargetSelectInstruction(const Instruction *I) = 0;
156
157  /// FastEmit_r - This method is called by target-independent code
158  /// to request that an instruction with the given type and opcode
159  /// be emitted.
160  virtual unsigned FastEmit_(MVT VT,
161                             MVT RetVT,
162                             unsigned Opcode);
163
164  /// FastEmit_r - This method is called by target-independent code
165  /// to request that an instruction with the given type, opcode, and
166  /// register operand be emitted.
167  ///
168  virtual unsigned FastEmit_r(MVT VT,
169                              MVT RetVT,
170                              unsigned Opcode,
171                              unsigned Op0, bool Op0IsKill);
172
173  /// FastEmit_rr - This method is called by target-independent code
174  /// to request that an instruction with the given type, opcode, and
175  /// register operands be emitted.
176  ///
177  virtual unsigned FastEmit_rr(MVT VT,
178                               MVT RetVT,
179                               unsigned Opcode,
180                               unsigned Op0, bool Op0IsKill,
181                               unsigned Op1, bool Op1IsKill);
182
183  /// FastEmit_ri - This method is called by target-independent code
184  /// to request that an instruction with the given type, opcode, and
185  /// register and immediate operands be emitted.
186  ///
187  virtual unsigned FastEmit_ri(MVT VT,
188                               MVT RetVT,
189                               unsigned Opcode,
190                               unsigned Op0, bool Op0IsKill,
191                               uint64_t Imm);
192
193  /// FastEmit_rf - This method is called by target-independent code
194  /// to request that an instruction with the given type, opcode, and
195  /// register and floating-point immediate operands be emitted.
196  ///
197  virtual unsigned FastEmit_rf(MVT VT,
198                               MVT RetVT,
199                               unsigned Opcode,
200                               unsigned Op0, bool Op0IsKill,
201                               const ConstantFP *FPImm);
202
203  /// FastEmit_rri - This method is called by target-independent code
204  /// to request that an instruction with the given type, opcode, and
205  /// register and immediate operands be emitted.
206  ///
207  virtual unsigned FastEmit_rri(MVT VT,
208                                MVT RetVT,
209                                unsigned Opcode,
210                                unsigned Op0, bool Op0IsKill,
211                                unsigned Op1, bool Op1IsKill,
212                                uint64_t Imm);
213
214  /// FastEmit_ri_ - This method is a wrapper of FastEmit_ri. It first tries
215  /// to emit an instruction with an immediate operand using FastEmit_ri.
216  /// If that fails, it materializes the immediate into a register and try
217  /// FastEmit_rr instead.
218  unsigned FastEmit_ri_(MVT VT,
219                        unsigned Opcode,
220                        unsigned Op0, bool Op0IsKill,
221                        uint64_t Imm, MVT ImmType);
222
223  /// FastEmit_i - This method is called by target-independent code
224  /// to request that an instruction with the given type, opcode, and
225  /// immediate operand be emitted.
226  virtual unsigned FastEmit_i(MVT VT,
227                              MVT RetVT,
228                              unsigned Opcode,
229                              uint64_t Imm);
230
231  /// FastEmit_f - This method is called by target-independent code
232  /// to request that an instruction with the given type, opcode, and
233  /// floating-point immediate operand be emitted.
234  virtual unsigned FastEmit_f(MVT VT,
235                              MVT RetVT,
236                              unsigned Opcode,
237                              const ConstantFP *FPImm);
238
239  /// FastEmitInst_ - Emit a MachineInstr with no operands and a
240  /// result register in the given register class.
241  ///
242  unsigned FastEmitInst_(unsigned MachineInstOpcode,
243                         const TargetRegisterClass *RC);
244
245  /// FastEmitInst_r - Emit a MachineInstr with one register operand
246  /// and a result register in the given register class.
247  ///
248  unsigned FastEmitInst_r(unsigned MachineInstOpcode,
249                          const TargetRegisterClass *RC,
250                          unsigned Op0, bool Op0IsKill);
251
252  /// FastEmitInst_rr - Emit a MachineInstr with two register operands
253  /// and a result register in the given register class.
254  ///
255  unsigned FastEmitInst_rr(unsigned MachineInstOpcode,
256                           const TargetRegisterClass *RC,
257                           unsigned Op0, bool Op0IsKill,
258                           unsigned Op1, bool Op1IsKill);
259
260  /// FastEmitInst_rrr - Emit a MachineInstr with three register operands
261  /// and a result register in the given register class.
262  ///
263  unsigned FastEmitInst_rrr(unsigned MachineInstOpcode,
264                           const TargetRegisterClass *RC,
265                           unsigned Op0, bool Op0IsKill,
266                           unsigned Op1, bool Op1IsKill,
267                           unsigned Op2, bool Op2IsKill);
268
269  /// FastEmitInst_ri - Emit a MachineInstr with a register operand,
270  /// an immediate, and a result register in the given register class.
271  ///
272  unsigned FastEmitInst_ri(unsigned MachineInstOpcode,
273                           const TargetRegisterClass *RC,
274                           unsigned Op0, bool Op0IsKill,
275                           uint64_t Imm);
276
277  /// FastEmitInst_rii - Emit a MachineInstr with one register operand
278  /// and two immediate operands.
279  ///
280  unsigned FastEmitInst_rii(unsigned MachineInstOpcode,
281                           const TargetRegisterClass *RC,
282                           unsigned Op0, bool Op0IsKill,
283                           uint64_t Imm1, uint64_t Imm2);
284
285  /// FastEmitInst_rf - Emit a MachineInstr with two register operands
286  /// and a result register in the given register class.
287  ///
288  unsigned FastEmitInst_rf(unsigned MachineInstOpcode,
289                           const TargetRegisterClass *RC,
290                           unsigned Op0, bool Op0IsKill,
291                           const ConstantFP *FPImm);
292
293  /// FastEmitInst_rri - Emit a MachineInstr with two register operands,
294  /// an immediate, and a result register in the given register class.
295  ///
296  unsigned FastEmitInst_rri(unsigned MachineInstOpcode,
297                            const TargetRegisterClass *RC,
298                            unsigned Op0, bool Op0IsKill,
299                            unsigned Op1, bool Op1IsKill,
300                            uint64_t Imm);
301
302  /// FastEmitInst_i - Emit a MachineInstr with a single immediate
303  /// operand, and a result register in the given register class.
304  unsigned FastEmitInst_i(unsigned MachineInstrOpcode,
305                          const TargetRegisterClass *RC,
306                          uint64_t Imm);
307
308  /// FastEmitInst_ii - Emit a MachineInstr with a two immediate operands.
309  unsigned FastEmitInst_ii(unsigned MachineInstrOpcode,
310                          const TargetRegisterClass *RC,
311                          uint64_t Imm1, uint64_t Imm2);
312
313  /// FastEmitInst_extractsubreg - Emit a MachineInstr for an extract_subreg
314  /// from a specified index of a superregister to a specified type.
315  unsigned FastEmitInst_extractsubreg(MVT RetVT,
316                                      unsigned Op0, bool Op0IsKill,
317                                      uint32_t Idx);
318
319  /// FastEmitZExtFromI1 - Emit MachineInstrs to compute the value of Op
320  /// with all but the least significant bit set to zero.
321  unsigned FastEmitZExtFromI1(MVT VT,
322                              unsigned Op0, bool Op0IsKill);
323
324  /// FastEmitBranch - Emit an unconditional branch to the given block,
325  /// unless it is the immediate (fall-through) successor, and update
326  /// the CFG.
327  void FastEmitBranch(MachineBasicBlock *MBB, DebugLoc DL);
328
329  void UpdateValueMap(const Value* I, unsigned Reg, unsigned NumRegs = 1);
330
331  unsigned createResultReg(const TargetRegisterClass *RC);
332
333  /// TargetMaterializeConstant - Emit a constant in a register using
334  /// target-specific logic, such as constant pool loads.
335  virtual unsigned TargetMaterializeConstant(const Constant* C) {
336    return 0;
337  }
338
339  /// TargetMaterializeAlloca - Emit an alloca address in a register using
340  /// target-specific logic.
341  virtual unsigned TargetMaterializeAlloca(const AllocaInst* C) {
342    return 0;
343  }
344
345  virtual unsigned TargetMaterializeFloatZero(const ConstantFP* CF) {
346    return 0;
347  }
348
349private:
350  bool SelectBinaryOp(const User *I, unsigned ISDOpcode);
351
352  bool SelectFNeg(const User *I);
353
354  bool SelectGetElementPtr(const User *I);
355
356  bool SelectCall(const User *I);
357
358  bool SelectBitCast(const User *I);
359
360  bool SelectCast(const User *I, unsigned Opcode);
361
362  bool SelectExtractValue(const User *I);
363
364  /// HandlePHINodesInSuccessorBlocks - Handle PHI nodes in successor blocks.
365  /// Emit code to ensure constants are copied into registers when needed.
366  /// Remember the virtual registers that need to be added to the Machine PHI
367  /// nodes as input.  We cannot just directly add them, because expansion
368  /// might result in multiple MBB's for one BB.  As such, the start of the
369  /// BB might correspond to a different MBB than the end.
370  bool HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB);
371
372  /// materializeRegForValue - Helper for getRegForVale. This function is
373  /// called when the value isn't already available in a register and must
374  /// be materialized with new instructions.
375  unsigned materializeRegForValue(const Value *V, MVT VT);
376
377  /// flushLocalValueMap - clears LocalValueMap and moves the area for the
378  /// new local variables to the beginning of the block. It helps to avoid
379  /// spilling cached variables across heavy instructions like calls.
380  void flushLocalValueMap();
381
382  /// hasTrivialKill - Test whether the given value has exactly one use.
383  bool hasTrivialKill(const Value *V) const;
384};
385
386}
387
388#endif
389