blob: ecf394701053682bd65dc0e93873f893ce116ae5 [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;
Chris Lattnerbeac75d2010-09-05 02:18:34 +000037 class LoadInst;
Andrew Trick6e8f4c42010-12-24 04:28:06 +000038
Chris Lattnercc524ca2005-01-07 07:46:03 +000039/// SelectionDAGISel - This is the common base class used for SelectionDAG-based
40/// pattern-matching instruction selectors.
Dan Gohmanad2afc22009-07-31 18:16:33 +000041class SelectionDAGISel : public MachineFunctionPass {
Chris Lattnercc524ca2005-01-07 07:46:03 +000042public:
Dan Gohman79ce2762009-01-15 19:20:50 +000043 const TargetMachine &TM;
Dan Gohmand858e902010-04-17 15:26:15 +000044 const TargetLowering &TLI;
Dan Gohman7c3234c2008-08-27 23:52:12 +000045 FunctionLoweringInfo *FuncInfo;
Dan Gohman79ce2762009-01-15 19:20:50 +000046 MachineFunction *MF;
47 MachineRegisterInfo *RegInfo;
Chris Lattnercc524ca2005-01-07 07:46:03 +000048 SelectionDAG *CurDAG;
Dan Gohman2048b852009-11-23 18:04:58 +000049 SelectionDAGBuilder *SDB;
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
Dan Gohmanf0757b02010-04-21 01:34:56 +000055 explicit SelectionDAGISel(const TargetMachine &tm,
Bill Wendling98a366d2009-04-29 23:29:43 +000056 CodeGenOpt::Level OL = CodeGenOpt::Default);
Dan Gohman7c3234c2008-08-27 23:52:12 +000057 virtual ~SelectionDAGISel();
Andrew Trick6e8f4c42010-12-24 04:28:06 +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() {}
Andrew Trick6e8f4c42010-12-24 04:28: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() {}
Andrew Trick6e8f4c42010-12-24 04:28:06 +000070
Chris Lattner7c306da2010-03-02 06:34:30 +000071 /// PostprocessISelDAG() - This hook allows the target to hack on the graph
72 /// right after selection.
73 virtual void PostprocessISelDAG() {}
Andrew Trick6e8f4c42010-12-24 04:28:06 +000074
Chris Lattner7c306da2010-03-02 06:34:30 +000075 /// Select - Main hook targets implement to select a node.
76 virtual SDNode *Select(SDNode *N) = 0;
Andrew Trick6e8f4c42010-12-24 04:28:06 +000077
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.
Chris Lattnerddf897a2010-10-11 05:48:00 +000095 /// FIXME: This is a static member function because the MSP430/SystemZ/X86
96 /// targets, which uses it during isel. This could become a proper member.
Dan Gohmand858e902010-04-17 15:26:15 +000097 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
Chris Lattneraa6d7082010-02-28 21:58:42 +0000101 // Opcodes used by the DAG state machine:
102 enum BuiltinOpcodes {
103 OPC_Scope,
104 OPC_RecordNode,
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000105 OPC_RecordChild0, OPC_RecordChild1, OPC_RecordChild2, OPC_RecordChild3,
Chris Lattneraa6d7082010-02-28 21:58:42 +0000106 OPC_RecordChild4, OPC_RecordChild5, OPC_RecordChild6, OPC_RecordChild7,
107 OPC_RecordMemRef,
Chris Lattner29d8f0c2010-12-23 17:24:32 +0000108 OPC_CaptureGlueInput,
Chris Lattneraa6d7082010-02-28 21:58:42 +0000109 OPC_MoveChild,
110 OPC_MoveParent,
111 OPC_CheckSame,
112 OPC_CheckPatternPredicate,
113 OPC_CheckPredicate,
114 OPC_CheckOpcode,
Chris Lattnereb669212010-03-01 06:59:22 +0000115 OPC_SwitchOpcode,
Chris Lattneraa6d7082010-02-28 21:58:42 +0000116 OPC_CheckType,
Chris Lattnercfe2eab2010-03-03 06:28:15 +0000117 OPC_SwitchType,
Chris Lattneraa6d7082010-02-28 21:58:42 +0000118 OPC_CheckChild0Type, OPC_CheckChild1Type, OPC_CheckChild2Type,
119 OPC_CheckChild3Type, OPC_CheckChild4Type, OPC_CheckChild5Type,
120 OPC_CheckChild6Type, OPC_CheckChild7Type,
Chris Lattner53106542010-02-28 22:14:32 +0000121 OPC_CheckInteger,
Chris Lattneraa6d7082010-02-28 21:58:42 +0000122 OPC_CheckCondCode,
123 OPC_CheckValueType,
124 OPC_CheckComplexPat,
Chris Lattner53106542010-02-28 22:14:32 +0000125 OPC_CheckAndImm, OPC_CheckOrImm,
Chris Lattneraa6d7082010-02-28 21:58:42 +0000126 OPC_CheckFoldableChainNode,
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000127
Chris Lattner53106542010-02-28 22:14:32 +0000128 OPC_EmitInteger,
Chris Lattneraa6d7082010-02-28 21:58:42 +0000129 OPC_EmitRegister,
Jim Grosbach2d76c842011-03-01 01:37:19 +0000130 OPC_EmitRegister2,
Chris Lattneraa6d7082010-02-28 21:58:42 +0000131 OPC_EmitConvertToTarget,
132 OPC_EmitMergeInputChains,
Chris Lattneraa4e3392010-03-28 05:50:16 +0000133 OPC_EmitMergeInputChains1_0,
134 OPC_EmitMergeInputChains1_1,
Chris Lattneraa6d7082010-02-28 21:58:42 +0000135 OPC_EmitCopyToReg,
136 OPC_EmitNodeXForm,
137 OPC_EmitNode,
138 OPC_MorphNodeTo,
Chris Lattner29d8f0c2010-12-23 17:24:32 +0000139 OPC_MarkGlueResults,
Chris Lattneraa6d7082010-02-28 21:58:42 +0000140 OPC_CompleteMatch
141 };
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000142
Chris Lattneraa6d7082010-02-28 21:58:42 +0000143 enum {
Chris Lattner29d8f0c2010-12-23 17:24:32 +0000144 OPFL_None = 0, // Node has no chain or glue input and isn't variadic.
Chris Lattneraa6d7082010-02-28 21:58:42 +0000145 OPFL_Chain = 1, // Node has a chain input.
Chris Lattnera4359be2010-12-23 17:13:18 +0000146 OPFL_GlueInput = 2, // Node has a glue input.
147 OPFL_GlueOutput = 4, // Node has a glue output.
Chris Lattneraa6d7082010-02-28 21:58:42 +0000148 OPFL_MemRefs = 8, // Node gets accumulated MemRefs.
149 OPFL_Variadic0 = 1<<4, // Node is variadic, root has 0 fixed inputs.
150 OPFL_Variadic1 = 2<<4, // Node is variadic, root has 1 fixed inputs.
151 OPFL_Variadic2 = 3<<4, // Node is variadic, root has 2 fixed inputs.
152 OPFL_Variadic3 = 4<<4, // Node is variadic, root has 3 fixed inputs.
153 OPFL_Variadic4 = 5<<4, // Node is variadic, root has 4 fixed inputs.
154 OPFL_Variadic5 = 6<<4, // Node is variadic, root has 5 fixed inputs.
155 OPFL_Variadic6 = 7<<4, // Node is variadic, root has 6 fixed inputs.
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000156
Chris Lattneraa6d7082010-02-28 21:58:42 +0000157 OPFL_VariadicInfo = OPFL_Variadic6
158 };
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000159
Chris Lattner2a49d572010-02-28 22:37:22 +0000160 /// getNumFixedFromVariadicInfo - Transform an EmitNode flags word into the
161 /// number of fixed arity values that should be skipped when copying from the
162 /// root.
163 static inline int getNumFixedFromVariadicInfo(unsigned Flags) {
164 return ((Flags&OPFL_VariadicInfo) >> 4)-1;
165 }
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000166
167
Chris Lattner66bac3c2005-08-18 18:44:33 +0000168protected:
Evan Chenge2c0a4f2008-07-01 18:49:06 +0000169 /// DAGSize - Size of DAG being instruction selected.
170 ///
171 unsigned DAGSize;
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000172
Chris Lattner17b4b172010-03-02 06:04:12 +0000173 /// ISelPosition - Node iterator marking the current position of
174 /// instruction selection as it procedes through the topologically-sorted
175 /// node list.
176 SelectionDAG::allnodes_iterator ISelPosition;
177
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000178
179 /// ISelUpdater - helper class to handle updates of the
Chris Lattner17b4b172010-03-02 06:04:12 +0000180 /// instruction selection graph.
181 class ISelUpdater : public SelectionDAG::DAGUpdateListener {
182 SelectionDAG::allnodes_iterator &ISelPosition;
183 public:
184 explicit ISelUpdater(SelectionDAG::allnodes_iterator &isp)
185 : ISelPosition(isp) {}
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000186
Chris Lattner17b4b172010-03-02 06:04:12 +0000187 /// NodeDeleted - Handle nodes deleted from the graph. If the
188 /// node being deleted is the current ISelPosition node, update
189 /// ISelPosition.
190 ///
191 virtual void NodeDeleted(SDNode *N, SDNode *E) {
192 if (ISelPosition == SelectionDAG::allnodes_iterator(N))
193 ++ISelPosition;
194 }
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000195
Chris Lattner17b4b172010-03-02 06:04:12 +0000196 /// NodeUpdated - Ignore updates for now.
197 virtual void NodeUpdated(SDNode *N) {}
198 };
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000199
Chris Lattner17b4b172010-03-02 06:04:12 +0000200 /// ReplaceUses - replace all uses of the old node F with the use
201 /// of the new node T.
202 void ReplaceUses(SDValue F, SDValue T) {
203 ISelUpdater ISU(ISelPosition);
204 CurDAG->ReplaceAllUsesOfValueWith(F, T, &ISU);
205 }
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000206
Chris Lattner17b4b172010-03-02 06:04:12 +0000207 /// ReplaceUses - replace all uses of the old nodes F with the use
208 /// of the new nodes T.
209 void ReplaceUses(const SDValue *F, const SDValue *T, unsigned Num) {
210 ISelUpdater ISU(ISelPosition);
211 CurDAG->ReplaceAllUsesOfValuesWith(F, T, Num, &ISU);
212 }
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000213
Chris Lattner17b4b172010-03-02 06:04:12 +0000214 /// ReplaceUses - replace all uses of the old node F with the use
215 /// of the new node T.
216 void ReplaceUses(SDNode *F, SDNode *T) {
217 ISelUpdater ISU(ISelPosition);
218 CurDAG->ReplaceAllUsesWith(F, T, &ISU);
219 }
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000220
Evan Chenge2c0a4f2008-07-01 18:49:06 +0000221
Chris Lattner4c12e712006-02-24 02:12:52 +0000222 /// SelectInlineAsmMemoryOperands - Calls to this are automatically generated
223 /// by tblgen. Others should not call it.
Dan Gohmanf350b272008-08-23 02:25:05 +0000224 void SelectInlineAsmMemoryOperands(std::vector<SDValue> &Ops);
Evan Chengb2c121a2006-07-27 06:36:49 +0000225
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000226
Chris Lattnerf1b7c7d2010-03-03 07:31:15 +0000227public:
Chris Lattner75548062006-10-11 03:58:02 +0000228 // Calls to these predicates are generated by tblgen.
Dan Gohman475871a2008-07-27 21:46:04 +0000229 bool CheckAndMask(SDValue LHS, ConstantSDNode *RHS,
Dan Gohmandc9b3d02007-07-24 23:00:27 +0000230 int64_t DesiredMaskS) const;
Dan Gohman475871a2008-07-27 21:46:04 +0000231 bool CheckOrMask(SDValue LHS, ConstantSDNode *RHS,
Dan Gohmandc9b3d02007-07-24 23:00:27 +0000232 int64_t DesiredMaskS) const;
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000233
234
Chris Lattner050a03d2010-02-16 07:21:10 +0000235 /// CheckPatternPredicate - This function is generated by tblgen in the
236 /// target. It runs the specified pattern predicate and returns true if it
237 /// succeeds or false if it fails. The number is a private implementation
238 /// detail to the code tblgen produces.
239 virtual bool CheckPatternPredicate(unsigned PredNo) const {
240 assert(0 && "Tblgen should generate the implementation of this!");
241 return 0;
242 }
243
Dan Gohmanfb76fe02010-02-22 04:10:52 +0000244 /// CheckNodePredicate - This function is generated by tblgen in the target.
245 /// It runs node predicate number PredNo and returns true if it succeeds or
Chris Lattner050a03d2010-02-16 07:21:10 +0000246 /// false if it fails. The number is a private implementation
247 /// detail to the code tblgen produces.
248 virtual bool CheckNodePredicate(SDNode *N, unsigned PredNo) const {
249 assert(0 && "Tblgen should generate the implementation of this!");
250 return 0;
251 }
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000252
Chris Lattner78d3af42010-09-21 20:37:12 +0000253 virtual bool CheckComplexPattern(SDNode *Root, SDNode *Parent, SDValue N,
254 unsigned PatternNo,
Chris Lattnerd847bc22010-09-21 22:00:25 +0000255 SmallVectorImpl<std::pair<SDValue, SDNode*> > &Result) {
Chris Lattnerbd12fe82010-02-17 00:41:34 +0000256 assert(0 && "Tblgen should generate the implementation of this!");
257 return false;
258 }
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000259
Chris Lattnerbeff6a32010-02-21 03:15:11 +0000260 virtual SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) {
Chris Lattner7a2bdde2011-04-15 05:18:47 +0000261 assert(0 && "Tblgen should generate this!");
Chris Lattnerbeff6a32010-02-21 03:15:11 +0000262 return SDValue();
263 }
264
Chris Lattnerf1b7c7d2010-03-03 07:31:15 +0000265 SDNode *SelectCodeCommon(SDNode *NodeToMatch,
266 const unsigned char *MatcherTable,
267 unsigned TableSize);
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000268
Chris Lattnerf1b7c7d2010-03-03 07:31:15 +0000269private:
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000270
Dan Gohmane1f188f2009-10-29 22:30:23 +0000271 // Calls to these functions are generated by tblgen.
Dan Gohmaneeb3a002010-01-05 01:24:18 +0000272 SDNode *Select_INLINEASM(SDNode *N);
273 SDNode *Select_UNDEF(SDNode *N);
Dan Gohmaneeb3a002010-01-05 01:24:18 +0000274 void CannotYetSelect(SDNode *N);
Dan Gohmane1f188f2009-10-29 22:30:23 +0000275
Chris Lattner80d8a932005-01-17 17:14:43 +0000276private:
Chris Lattner7c306da2010-03-02 06:34:30 +0000277 void DoInstructionSelection();
Chris Lattner3ff1e4d2010-03-02 06:55:04 +0000278 SDNode *MorphNode(SDNode *Node, unsigned TargetOpc, SDVTList VTs,
279 const SDValue *Ops, unsigned NumOps, unsigned EmitNodeInfo);
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000280
Dan Gohman84023e02010-07-10 09:00:22 +0000281 void PrepareEHLandingPad();
Dan Gohman46510a72010-04-15 01:51:59 +0000282 void SelectAllBasicBlocks(const Function &Fn);
Chris Lattnerb686af02011-04-22 21:59:37 +0000283 bool TryToFoldFastISelLoad(const LoadInst *LI, const Instruction *FoldInst,
284 FastISel *FastIS);
Dan Gohman84023e02010-07-10 09:00:22 +0000285 void FinishBasicBlock();
Misha Brukmanea61c352005-04-21 20:39:54 +0000286
Devang Pateldf8370b2010-10-25 21:31:46 +0000287 void SelectBasicBlock(BasicBlock::const_iterator Begin,
Dan Gohman84023e02010-07-10 09:00:22 +0000288 BasicBlock::const_iterator End,
289 bool &HadTailCall);
290 void CodeGenAndEmitDAG();
Dan Gohman46510a72010-04-15 01:51:59 +0000291 void LowerArguments(const BasicBlock *BB);
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000292
Dan Gohmanf350b272008-08-23 02:25:05 +0000293 void ComputeLiveOutVRegInfo();
294
Dan Gohman0a3776d2009-02-06 18:26:51 +0000295 /// Create the scheduler. If a specific scheduler was specified
296 /// via the SchedulerRegistry, use it, otherwise select the
297 /// one preferred by the target.
298 ///
Dan Gohman47ac0f02009-02-11 04:27:20 +0000299 ScheduleDAGSDNodes *CreateScheduler();
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000300
Chris Lattner7390eeb2010-03-01 18:47:11 +0000301 /// OpcodeOffset - This is a cache used to dispatch efficiently into isel
302 /// state machines that start with a OPC_SwitchOpcode node.
303 std::vector<unsigned> OpcodeOffset;
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000304
Chris Lattnera4359be2010-12-23 17:13:18 +0000305 void UpdateChainsAndGlue(SDNode *NodeToMatch, SDValue InputChain,
306 const SmallVectorImpl<SDNode*> &ChainNodesMatched,
307 SDValue InputGlue, const SmallVectorImpl<SDNode*> &F,
308 bool isMorphNodeTo);
Andrew Trick6e8f4c42010-12-24 04:28:06 +0000309
Chris Lattnercc524ca2005-01-07 07:46:03 +0000310};
311
312}
313
314#endif /* LLVM_CODEGEN_SELECTIONDAG_ISEL_H */