blob: 03d9bf5a9a56f92b2ece2d997779b1f6b7763578 [file] [log] [blame]
Chris Lattnercc524ca2005-01-07 07:46:03 +00001//===-- llvm/CodeGen/SelectionDAGISel.h - Common Base Class------*- C++ -*-===//
Misha Brukmanea61c352005-04-21 20:39:54 +00002//
Chris Lattnercc524ca2005-01-07 07:46:03 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattner7ed47a12007-12-29 19:59:42 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Misha Brukmanea61c352005-04-21 20:39:54 +00007//
Chris Lattnercc524ca2005-01-07 07:46:03 +00008//===----------------------------------------------------------------------===//
9//
10// This file implements the SelectionDAGISel class, which is used as the common
11// base class for SelectionDAG-based instruction selectors.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CODEGEN_SELECTIONDAG_ISEL_H
16#define LLVM_CODEGEN_SELECTIONDAG_ISEL_H
17
Dan Gohmanf350b272008-08-23 02:25:05 +000018#include "llvm/BasicBlock.h"
Chris Lattnercc524ca2005-01-07 07:46:03 +000019#include "llvm/Pass.h"
Evan Chengfe8dc2e2006-08-07 22:16:08 +000020#include "llvm/CodeGen/SelectionDAG.h"
Dan Gohmanad2afc22009-07-31 18:16:33 +000021#include "llvm/CodeGen/MachineFunctionPass.h"
Chris Lattnercc524ca2005-01-07 07:46:03 +000022
23namespace llvm {
Dan Gohman3df24e62008-09-03 23:12:08 +000024 class FastISel;
Dan Gohman2048b852009-11-23 18:04:58 +000025 class SelectionDAGBuilder;
Dan Gohman475871a2008-07-27 21:46:04 +000026 class SDValue;
Chris Lattner84bc5422007-12-31 04:13:23 +000027 class MachineRegisterInfo;
Chris Lattnercc524ca2005-01-07 07:46:03 +000028 class MachineBasicBlock;
29 class MachineFunction;
30 class MachineInstr;
31 class TargetLowering;
Dan Gohmandd5b58a2008-10-14 23:54:11 +000032 class TargetInstrInfo;
Chris Lattnercc524ca2005-01-07 07:46:03 +000033 class FunctionLoweringInfo;
Dan Gohmanfc54c552009-01-15 22:18:12 +000034 class ScheduleHazardRecognizer;
Gordon Henriksen5eca0752008-08-17 18:44:35 +000035 class GCFunctionInfo;
Dan Gohman47ac0f02009-02-11 04:27:20 +000036 class ScheduleDAGSDNodes;
Anton Korobeynikovd0b82b32007-03-07 16:25:09 +000037
Chris Lattnercc524ca2005-01-07 07:46:03 +000038/// SelectionDAGISel - This is the common base class used for SelectionDAG-based
39/// pattern-matching instruction selectors.
Dan Gohmanad2afc22009-07-31 18:16:33 +000040class SelectionDAGISel : public MachineFunctionPass {
Chris Lattnercc524ca2005-01-07 07:46:03 +000041public:
Dan Gohman79ce2762009-01-15 19:20:50 +000042 const TargetMachine &TM;
Dan Gohmand858e902010-04-17 15:26:15 +000043 const TargetLowering &TLI;
Dan Gohman7c3234c2008-08-27 23:52:12 +000044 FunctionLoweringInfo *FuncInfo;
Dan Gohman79ce2762009-01-15 19:20:50 +000045 MachineFunction *MF;
46 MachineRegisterInfo *RegInfo;
Chris Lattnercc524ca2005-01-07 07:46:03 +000047 SelectionDAG *CurDAG;
Dan Gohman2048b852009-11-23 18:04:58 +000048 SelectionDAGBuilder *SDB;
Chris Lattnercc524ca2005-01-07 07:46:03 +000049 MachineBasicBlock *BB;
Dan Gohman5f43f922007-08-27 16:26:13 +000050 AliasAnalysis *AA;
Gordon Henriksen5eca0752008-08-17 18:44:35 +000051 GCFunctionInfo *GFI;
Bill Wendling98a366d2009-04-29 23:29:43 +000052 CodeGenOpt::Level OptLevel;
Devang Patel19974732007-05-03 01:11:54 +000053 static char ID;
Chris Lattnercc524ca2005-01-07 07:46:03 +000054
Bill Wendling98a366d2009-04-29 23:29:43 +000055 explicit SelectionDAGISel(TargetMachine &tm,
56 CodeGenOpt::Level OL = CodeGenOpt::Default);
Dan Gohman7c3234c2008-08-27 23:52:12 +000057 virtual ~SelectionDAGISel();
Jim Laskey9373beb2006-08-01 19:14:14 +000058
Dan Gohmand858e902010-04-17 15:26:15 +000059 const TargetLowering &getTargetLowering() { return TLI; }
Chris Lattnercc524ca2005-01-07 07:46:03 +000060
Chris Lattnerc809b682005-08-17 06:46:50 +000061 virtual void getAnalysisUsage(AnalysisUsage &AU) const;
Chris Lattnercc524ca2005-01-07 07:46:03 +000062
Dan Gohmanad2afc22009-07-31 18:16:33 +000063 virtual bool runOnMachineFunction(MachineFunction &MF);
Chris Lattnercc524ca2005-01-07 07:46:03 +000064
Dan Gohman64652652010-04-14 20:17:22 +000065 virtual void EmitFunctionEntryCode() {}
Evan Chengdb8d56b2008-06-30 20:45:06 +000066
Chris Lattner7c306da2010-03-02 06:34:30 +000067 /// PreprocessISelDAG - This hook allows targets to hack on the graph before
68 /// instruction selection starts.
69 virtual void PreprocessISelDAG() {}
70
71 /// PostprocessISelDAG() - This hook allows the target to hack on the graph
72 /// right after selection.
73 virtual void PostprocessISelDAG() {}
74
75 /// Select - Main hook targets implement to select a node.
76 virtual SDNode *Select(SDNode *N) = 0;
77
Chris Lattner4c12e712006-02-24 02:12:52 +000078 /// SelectInlineAsmMemoryOperand - Select the specified address as a target
79 /// addressing mode, according to the specified constraint code. If this does
80 /// not match or is not implemented, return true. The resultant operands
81 /// (which will appear in the machine instruction) should be added to the
82 /// OutOps vector.
Dan Gohman475871a2008-07-27 21:46:04 +000083 virtual bool SelectInlineAsmMemoryOperand(const SDValue &Op,
Chris Lattner4c12e712006-02-24 02:12:52 +000084 char ConstraintCode,
Dan Gohmanf350b272008-08-23 02:25:05 +000085 std::vector<SDValue> &OutOps) {
Chris Lattner4c12e712006-02-24 02:12:52 +000086 return true;
87 }
Evan Chengb2c121a2006-07-27 06:36:49 +000088
Evan Cheng014bf212010-02-15 19:41:07 +000089 /// IsProfitableToFold - Returns true if it's profitable to fold the specific
90 /// operand node N of U during instruction selection that starts at Root.
91 virtual bool IsProfitableToFold(SDValue N, SDNode *U, SDNode *Root) const;
92
93 /// IsLegalToFold - Returns true if the specific operand node N of
94 /// U can be folded during instruction selection that starts at Root.
Dan Gohmand858e902010-04-17 15:26:15 +000095 /// FIXME: This is a static member function because the PIC16 target,
96 /// which uses it during lowering.
97 static bool IsLegalToFold(SDValue N, SDNode *U, SDNode *Root,
98 CodeGenOpt::Level OptLevel,
99 bool IgnoreChains = false);
Anton Korobeynikovc1c6ef82009-05-08 18:51:58 +0000100
Jim Laskey9ff542f2006-08-01 18:29:48 +0000101 /// CreateTargetHazardRecognizer - Return a newly allocated hazard recognizer
102 /// to use for this target when scheduling the DAG.
Dan Gohmanfc54c552009-01-15 22:18:12 +0000103 virtual ScheduleHazardRecognizer *CreateTargetHazardRecognizer();
Jim Laskey9ff542f2006-08-01 18:29:48 +0000104
Chris Lattneraa6d7082010-02-28 21:58:42 +0000105
106 // Opcodes used by the DAG state machine:
107 enum BuiltinOpcodes {
108 OPC_Scope,
109 OPC_RecordNode,
110 OPC_RecordChild0, OPC_RecordChild1, OPC_RecordChild2, OPC_RecordChild3,
111 OPC_RecordChild4, OPC_RecordChild5, OPC_RecordChild6, OPC_RecordChild7,
112 OPC_RecordMemRef,
113 OPC_CaptureFlagInput,
114 OPC_MoveChild,
115 OPC_MoveParent,
116 OPC_CheckSame,
117 OPC_CheckPatternPredicate,
118 OPC_CheckPredicate,
119 OPC_CheckOpcode,
Chris Lattnereb669212010-03-01 06:59:22 +0000120 OPC_SwitchOpcode,
Chris Lattneraa6d7082010-02-28 21:58:42 +0000121 OPC_CheckType,
Chris Lattnercfe2eab2010-03-03 06:28:15 +0000122 OPC_SwitchType,
Chris Lattneraa6d7082010-02-28 21:58:42 +0000123 OPC_CheckChild0Type, OPC_CheckChild1Type, OPC_CheckChild2Type,
124 OPC_CheckChild3Type, OPC_CheckChild4Type, OPC_CheckChild5Type,
125 OPC_CheckChild6Type, OPC_CheckChild7Type,
Chris Lattner53106542010-02-28 22:14:32 +0000126 OPC_CheckInteger,
Chris Lattneraa6d7082010-02-28 21:58:42 +0000127 OPC_CheckCondCode,
128 OPC_CheckValueType,
129 OPC_CheckComplexPat,
Chris Lattner53106542010-02-28 22:14:32 +0000130 OPC_CheckAndImm, OPC_CheckOrImm,
Chris Lattneraa6d7082010-02-28 21:58:42 +0000131 OPC_CheckFoldableChainNode,
Chris Lattneraa6d7082010-02-28 21:58:42 +0000132
Chris Lattner53106542010-02-28 22:14:32 +0000133 OPC_EmitInteger,
Chris Lattneraa6d7082010-02-28 21:58:42 +0000134 OPC_EmitRegister,
135 OPC_EmitConvertToTarget,
136 OPC_EmitMergeInputChains,
Chris Lattneraa4e3392010-03-28 05:50:16 +0000137 OPC_EmitMergeInputChains1_0,
138 OPC_EmitMergeInputChains1_1,
Chris Lattneraa6d7082010-02-28 21:58:42 +0000139 OPC_EmitCopyToReg,
140 OPC_EmitNodeXForm,
141 OPC_EmitNode,
142 OPC_MorphNodeTo,
143 OPC_MarkFlagResults,
144 OPC_CompleteMatch
145 };
146
147 enum {
148 OPFL_None = 0, // Node has no chain or flag input and isn't variadic.
149 OPFL_Chain = 1, // Node has a chain input.
150 OPFL_FlagInput = 2, // Node has a flag input.
151 OPFL_FlagOutput = 4, // Node has a flag output.
152 OPFL_MemRefs = 8, // Node gets accumulated MemRefs.
153 OPFL_Variadic0 = 1<<4, // Node is variadic, root has 0 fixed inputs.
154 OPFL_Variadic1 = 2<<4, // Node is variadic, root has 1 fixed inputs.
155 OPFL_Variadic2 = 3<<4, // Node is variadic, root has 2 fixed inputs.
156 OPFL_Variadic3 = 4<<4, // Node is variadic, root has 3 fixed inputs.
157 OPFL_Variadic4 = 5<<4, // Node is variadic, root has 4 fixed inputs.
158 OPFL_Variadic5 = 6<<4, // Node is variadic, root has 5 fixed inputs.
159 OPFL_Variadic6 = 7<<4, // Node is variadic, root has 6 fixed inputs.
160
161 OPFL_VariadicInfo = OPFL_Variadic6
162 };
163
Chris Lattner2a49d572010-02-28 22:37:22 +0000164 /// getNumFixedFromVariadicInfo - Transform an EmitNode flags word into the
165 /// number of fixed arity values that should be skipped when copying from the
166 /// root.
167 static inline int getNumFixedFromVariadicInfo(unsigned Flags) {
168 return ((Flags&OPFL_VariadicInfo) >> 4)-1;
169 }
170
171
Chris Lattner66bac3c2005-08-18 18:44:33 +0000172protected:
Evan Chenge2c0a4f2008-07-01 18:49:06 +0000173 /// DAGSize - Size of DAG being instruction selected.
174 ///
175 unsigned DAGSize;
Chris Lattner17b4b172010-03-02 06:04:12 +0000176
177 /// ISelPosition - Node iterator marking the current position of
178 /// instruction selection as it procedes through the topologically-sorted
179 /// node list.
180 SelectionDAG::allnodes_iterator ISelPosition;
181
182
183 /// ISelUpdater - helper class to handle updates of the
184 /// instruction selection graph.
185 class ISelUpdater : public SelectionDAG::DAGUpdateListener {
186 SelectionDAG::allnodes_iterator &ISelPosition;
187 public:
188 explicit ISelUpdater(SelectionDAG::allnodes_iterator &isp)
189 : ISelPosition(isp) {}
190
191 /// NodeDeleted - Handle nodes deleted from the graph. If the
192 /// node being deleted is the current ISelPosition node, update
193 /// ISelPosition.
194 ///
195 virtual void NodeDeleted(SDNode *N, SDNode *E) {
196 if (ISelPosition == SelectionDAG::allnodes_iterator(N))
197 ++ISelPosition;
198 }
199
200 /// NodeUpdated - Ignore updates for now.
201 virtual void NodeUpdated(SDNode *N) {}
202 };
203
204 /// ReplaceUses - replace all uses of the old node F with the use
205 /// of the new node T.
206 void ReplaceUses(SDValue F, SDValue T) {
207 ISelUpdater ISU(ISelPosition);
208 CurDAG->ReplaceAllUsesOfValueWith(F, T, &ISU);
209 }
210
211 /// ReplaceUses - replace all uses of the old nodes F with the use
212 /// of the new nodes T.
213 void ReplaceUses(const SDValue *F, const SDValue *T, unsigned Num) {
214 ISelUpdater ISU(ISelPosition);
215 CurDAG->ReplaceAllUsesOfValuesWith(F, T, Num, &ISU);
216 }
217
218 /// ReplaceUses - replace all uses of the old node F with the use
219 /// of the new node T.
220 void ReplaceUses(SDNode *F, SDNode *T) {
221 ISelUpdater ISU(ISelPosition);
222 CurDAG->ReplaceAllUsesWith(F, T, &ISU);
223 }
224
Evan Chenge2c0a4f2008-07-01 18:49:06 +0000225
Chris Lattner4c12e712006-02-24 02:12:52 +0000226 /// SelectInlineAsmMemoryOperands - Calls to this are automatically generated
227 /// by tblgen. Others should not call it.
Dan Gohmanf350b272008-08-23 02:25:05 +0000228 void SelectInlineAsmMemoryOperands(std::vector<SDValue> &Ops);
Evan Chengb2c121a2006-07-27 06:36:49 +0000229
Chris Lattnerf1b7c7d2010-03-03 07:31:15 +0000230
231public:
Chris Lattner75548062006-10-11 03:58:02 +0000232 // Calls to these predicates are generated by tblgen.
Dan Gohman475871a2008-07-27 21:46:04 +0000233 bool CheckAndMask(SDValue LHS, ConstantSDNode *RHS,
Dan Gohmandc9b3d02007-07-24 23:00:27 +0000234 int64_t DesiredMaskS) const;
Dan Gohman475871a2008-07-27 21:46:04 +0000235 bool CheckOrMask(SDValue LHS, ConstantSDNode *RHS,
Dan Gohmandc9b3d02007-07-24 23:00:27 +0000236 int64_t DesiredMaskS) const;
Chris Lattner75548062006-10-11 03:58:02 +0000237
Chris Lattner050a03d2010-02-16 07:21:10 +0000238
239 /// CheckPatternPredicate - This function is generated by tblgen in the
240 /// target. It runs the specified pattern predicate and returns true if it
241 /// succeeds or false if it fails. The number is a private implementation
242 /// detail to the code tblgen produces.
243 virtual bool CheckPatternPredicate(unsigned PredNo) const {
244 assert(0 && "Tblgen should generate the implementation of this!");
245 return 0;
246 }
247
Dan Gohmanfb76fe02010-02-22 04:10:52 +0000248 /// CheckNodePredicate - This function is generated by tblgen in the target.
249 /// It runs node predicate number PredNo and returns true if it succeeds or
Chris Lattner050a03d2010-02-16 07:21:10 +0000250 /// false if it fails. The number is a private implementation
251 /// detail to the code tblgen produces.
252 virtual bool CheckNodePredicate(SDNode *N, unsigned PredNo) const {
253 assert(0 && "Tblgen should generate the implementation of this!");
254 return 0;
255 }
256
Chris Lattnerbd12fe82010-02-17 00:41:34 +0000257 virtual bool CheckComplexPattern(SDNode *Root, SDValue N, unsigned PatternNo,
258 SmallVectorImpl<SDValue> &Result) {
259 assert(0 && "Tblgen should generate the implementation of this!");
260 return false;
261 }
262
Chris Lattnerbeff6a32010-02-21 03:15:11 +0000263 virtual SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) {
264 assert(0 && "Tblgen shoudl generate this!");
265 return SDValue();
266 }
267
Chris Lattnerf1b7c7d2010-03-03 07:31:15 +0000268 SDNode *SelectCodeCommon(SDNode *NodeToMatch,
269 const unsigned char *MatcherTable,
270 unsigned TableSize);
271
272private:
Chris Lattnerbeff6a32010-02-21 03:15:11 +0000273
Dan Gohmane1f188f2009-10-29 22:30:23 +0000274 // Calls to these functions are generated by tblgen.
Dan Gohmaneeb3a002010-01-05 01:24:18 +0000275 SDNode *Select_INLINEASM(SDNode *N);
276 SDNode *Select_UNDEF(SDNode *N);
Dan Gohmaneeb3a002010-01-05 01:24:18 +0000277 void CannotYetSelect(SDNode *N);
Dan Gohmane1f188f2009-10-29 22:30:23 +0000278
Chris Lattner80d8a932005-01-17 17:14:43 +0000279private:
Chris Lattner7c306da2010-03-02 06:34:30 +0000280 void DoInstructionSelection();
Chris Lattner3ff1e4d2010-03-02 06:55:04 +0000281 SDNode *MorphNode(SDNode *Node, unsigned TargetOpc, SDVTList VTs,
282 const SDValue *Ops, unsigned NumOps, unsigned EmitNodeInfo);
Chris Lattner7c306da2010-03-02 06:34:30 +0000283
Dan Gohman25208642010-04-14 19:53:31 +0000284 void PrepareEHLandingPad(MachineBasicBlock *BB);
Dan Gohman46510a72010-04-15 01:51:59 +0000285 void SelectAllBasicBlocks(const Function &Fn);
Dan Gohman7c3234c2008-08-27 23:52:12 +0000286 void FinishBasicBlock();
Misha Brukmanea61c352005-04-21 20:39:54 +0000287
Dan Gohman46510a72010-04-15 01:51:59 +0000288 void SelectBasicBlock(const BasicBlock *LLVMBB,
289 BasicBlock::const_iterator Begin,
290 BasicBlock::const_iterator End,
Dan Gohmanb4afb132009-11-20 02:51:26 +0000291 bool &HadTailCall);
Dan Gohmanf350b272008-08-23 02:25:05 +0000292 void CodeGenAndEmitDAG();
Dan Gohman46510a72010-04-15 01:51:59 +0000293 void LowerArguments(const BasicBlock *BB);
Chris Lattneread0d882008-06-17 06:09:18 +0000294
Evan Chengd40d03e2010-01-06 19:38:29 +0000295 void ShrinkDemandedOps();
Dan Gohmanf350b272008-08-23 02:25:05 +0000296 void ComputeLiveOutVRegInfo();
297
Dan Gohman46510a72010-04-15 01:51:59 +0000298 void HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB);
Nate Begemanf15485a2006-03-27 01:32:24 +0000299
Dan Gohman46510a72010-04-15 01:51:59 +0000300 bool HandlePHINodesInSuccessorBlocksFast(const BasicBlock *LLVMBB,
301 FastISel *F);
Dan Gohman3df24e62008-09-03 23:12:08 +0000302
Dan Gohman0a3776d2009-02-06 18:26:51 +0000303 /// Create the scheduler. If a specific scheduler was specified
304 /// via the SchedulerRegistry, use it, otherwise select the
305 /// one preferred by the target.
306 ///
Dan Gohman47ac0f02009-02-11 04:27:20 +0000307 ScheduleDAGSDNodes *CreateScheduler();
Chris Lattner7390eeb2010-03-01 18:47:11 +0000308
309 /// OpcodeOffset - This is a cache used to dispatch efficiently into isel
310 /// state machines that start with a OPC_SwitchOpcode node.
311 std::vector<unsigned> OpcodeOffset;
Chris Lattner82dd3d32010-03-02 07:50:03 +0000312
313 void UpdateChainsAndFlags(SDNode *NodeToMatch, SDValue InputChain,
314 const SmallVectorImpl<SDNode*> &ChainNodesMatched,
315 SDValue InputFlag,const SmallVectorImpl<SDNode*> &F,
316 bool isMorphNodeTo);
317
Chris Lattnercc524ca2005-01-07 07:46:03 +0000318};
319
320}
321
322#endif /* LLVM_CODEGEN_SELECTIONDAG_ISEL_H */