SelectionDAGISel.h revision c809b68357d6d41d91eb50febdb37df394e671bb
1//===-- llvm/CodeGen/SelectionDAGISel.h - Common Base Class------*- C++ -*-===//
2//
3//                     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.
7//
8//===----------------------------------------------------------------------===//
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;
24  class SDOperand;
25  class SSARegMap;
26  class MachineBasicBlock;
27  class MachineFunction;
28  class MachineInstr;
29  class TargetLowering;
30  class FunctionLoweringInfo;
31
32/// SelectionDAGISel - This is the common base class used for SelectionDAG-based
33/// pattern-matching instruction selectors.
34class SelectionDAGISel : public FunctionPass {
35public:
36  TargetLowering &TLI;
37  SSARegMap *RegMap;
38  SelectionDAG *CurDAG;
39  MachineBasicBlock *BB;
40
41  SelectionDAGISel(TargetLowering &tli) : TLI(tli) {}
42
43  virtual void getAnalysisUsage(AnalysisUsage &AU) const;
44
45  virtual bool runOnFunction(Function &Fn);
46
47  unsigned MakeReg(MVT::ValueType VT);
48
49  virtual void EmitFunctionEntryCode(Function &Fn, MachineFunction &MF) {}
50  virtual void InstructionSelectBasicBlock(SelectionDAG &SD) = 0;
51
52private:
53  SDOperand CopyValueToVirtualRegister(SelectionDAGLowering &SDL,
54                                       Value *V, unsigned Reg);
55  void SelectBasicBlock(BasicBlock *BB, MachineFunction &MF,
56                        FunctionLoweringInfo &FuncInfo);
57
58  void BuildSelectionDAG(SelectionDAG &DAG, BasicBlock *LLVMBB,
59           std::vector<std::pair<MachineInstr*, unsigned> > &PHINodesToUpdate,
60                         FunctionLoweringInfo &FuncInfo);
61  void LowerArguments(BasicBlock *BB, SelectionDAGLowering &SDL,
62                      std::vector<SDOperand> &UnorderedChains);
63};
64
65}
66
67#endif /* LLVM_CODEGEN_SELECTIONDAG_ISEL_H */
68