SelectionDAGISel.h revision a9c2091cd38e401c846391c9951ff416e709b65e
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 52protected: 53 /// Pick a safe ordering and emit instructions for each target node in the 54 /// graph. 55 void ScheduleAndEmitDAG(SelectionDAG &DAG); 56 57private: 58 SDOperand CopyValueToVirtualRegister(SelectionDAGLowering &SDL, 59 Value *V, unsigned Reg); 60 void SelectBasicBlock(BasicBlock *BB, MachineFunction &MF, 61 FunctionLoweringInfo &FuncInfo); 62 63 void BuildSelectionDAG(SelectionDAG &DAG, BasicBlock *LLVMBB, 64 std::vector<std::pair<MachineInstr*, unsigned> > &PHINodesToUpdate, 65 FunctionLoweringInfo &FuncInfo); 66 void LowerArguments(BasicBlock *BB, SelectionDAGLowering &SDL, 67 std::vector<SDOperand> &UnorderedChains); 68}; 69 70} 71 72#endif /* LLVM_CODEGEN_SELECTIONDAG_ISEL_H */ 73