SelectionDAGISel.h revision 80d8a93489a5a3d1a90f8e23d27393d6844259b4
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    AU.setPreservesAll();
45  }
46
47  virtual bool runOnFunction(Function &Fn);
48
49  unsigned MakeReg(MVT::ValueType VT);
50
51  virtual void InstructionSelectBasicBlock(SelectionDAG &SD) = 0;
52
53private:
54  SDOperand CopyValueToVirtualRegister(SelectionDAGLowering &SDL,
55                                       Value *V, unsigned Reg);
56  void SelectBasicBlock(BasicBlock *BB, MachineFunction &MF,
57                        FunctionLoweringInfo &FuncInfo);
58
59  void BuildSelectionDAG(SelectionDAG &DAG, BasicBlock *LLVMBB,
60           std::vector<std::pair<MachineInstr*, unsigned> > &PHINodesToUpdate,
61                         FunctionLoweringInfo &FuncInfo);
62  void LowerArguments(BasicBlock *BB, SelectionDAGLowering &SDL,
63                      std::vector<SDOperand> &UnorderedChains);
64};
65
66}
67
68#endif /* LLVM_CODEGEN_SELECTIONDAG_ISEL_H */
69