blob: ffaa1c6a35c0c4f2afeadbbc98c2cfd0b0643926 [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//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source 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
18#include "llvm/Pass.h"
19#include "llvm/CodeGen/ValueTypes.h"
20
21namespace llvm {
22 class SelectionDAG;
23 class SelectionDAGLowering;
Chris Lattner8a496fc2005-01-13 17:58:35 +000024 class SDOperand;
Chris Lattnercc524ca2005-01-07 07:46:03 +000025 class SSARegMap;
26 class MachineBasicBlock;
27 class MachineFunction;
28 class MachineInstr;
29 class TargetLowering;
30 class FunctionLoweringInfo;
Chris Lattner37e30cf2006-03-06 00:20:29 +000031 class HazardRecognizer;
Chris Lattnercc524ca2005-01-07 07:46:03 +000032
33/// SelectionDAGISel - This is the common base class used for SelectionDAG-based
34/// pattern-matching instruction selectors.
35class SelectionDAGISel : public FunctionPass {
36public:
37 TargetLowering &TLI;
38 SSARegMap *RegMap;
39 SelectionDAG *CurDAG;
40 MachineBasicBlock *BB;
41
42 SelectionDAGISel(TargetLowering &tli) : TLI(tli) {}
43
Chris Lattnerc809b682005-08-17 06:46:50 +000044 virtual void getAnalysisUsage(AnalysisUsage &AU) const;
Chris Lattnercc524ca2005-01-07 07:46:03 +000045
46 virtual bool runOnFunction(Function &Fn);
47
48 unsigned MakeReg(MVT::ValueType VT);
49
Chris Lattnercc13b762005-05-13 07:23:03 +000050 virtual void EmitFunctionEntryCode(Function &Fn, MachineFunction &MF) {}
Chris Lattnercc524ca2005-01-07 07:46:03 +000051 virtual void InstructionSelectBasicBlock(SelectionDAG &SD) = 0;
Misha Brukmanea61c352005-04-21 20:39:54 +000052
Chris Lattner4c12e712006-02-24 02:12:52 +000053 /// SelectInlineAsmMemoryOperand - Select the specified address as a target
54 /// addressing mode, according to the specified constraint code. If this does
55 /// not match or is not implemented, return true. The resultant operands
56 /// (which will appear in the machine instruction) should be added to the
57 /// OutOps vector.
58 virtual bool SelectInlineAsmMemoryOperand(const SDOperand &Op,
59 char ConstraintCode,
60 std::vector<SDOperand> &OutOps,
61 SelectionDAG &DAG) {
62 return true;
63 }
64
Chris Lattner37e30cf2006-03-06 00:20:29 +000065 /// GetTargetHazardRecognizer - Return the hazard recognizer to use for this
66 /// target when scheduling the DAG.
67 virtual HazardRecognizer &GetTargetHazardRecognizer();
68
Chris Lattner66bac3c2005-08-18 18:44:33 +000069protected:
70 /// Pick a safe ordering and emit instructions for each target node in the
71 /// graph.
Evan Chenga9c20912006-01-21 02:32:06 +000072 void ScheduleAndEmitDAG(SelectionDAG &DAG);
Chris Lattner66bac3c2005-08-18 18:44:33 +000073
Chris Lattner4c12e712006-02-24 02:12:52 +000074 /// SelectInlineAsmMemoryOperands - Calls to this are automatically generated
75 /// by tblgen. Others should not call it.
76 void SelectInlineAsmMemoryOperands(std::vector<SDOperand> &Ops,
77 SelectionDAG &DAG);
78
Chris Lattner80d8a932005-01-17 17:14:43 +000079private:
Chris Lattner8a496fc2005-01-13 17:58:35 +000080 SDOperand CopyValueToVirtualRegister(SelectionDAGLowering &SDL,
81 Value *V, unsigned Reg);
Chris Lattnercc524ca2005-01-07 07:46:03 +000082 void SelectBasicBlock(BasicBlock *BB, MachineFunction &MF,
83 FunctionLoweringInfo &FuncInfo);
Misha Brukmanea61c352005-04-21 20:39:54 +000084
Chris Lattnercc524ca2005-01-07 07:46:03 +000085 void BuildSelectionDAG(SelectionDAG &DAG, BasicBlock *LLVMBB,
86 std::vector<std::pair<MachineInstr*, unsigned> > &PHINodesToUpdate,
87 FunctionLoweringInfo &FuncInfo);
Chris Lattner80d8a932005-01-17 17:14:43 +000088 void LowerArguments(BasicBlock *BB, SelectionDAGLowering &SDL,
89 std::vector<SDOperand> &UnorderedChains);
Chris Lattnercc524ca2005-01-07 07:46:03 +000090};
91
92}
93
94#endif /* LLVM_CODEGEN_SELECTIONDAG_ISEL_H */