SelectionDAGBuilder.h revision bdc09d9b0943a8c5cee29c4f87666eaa97e081d4
12048b85c7c2c987874b9423e682ec8e60b60574bDan Gohman//===-- SelectionDAGBuilder.h - Selection-DAG building --------------------===//
2f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman//
3f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman//                     The LLVM Compiler Infrastructure
4f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman//
5f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman// This file is distributed under the University of Illinois Open Source
6f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman// License. See LICENSE.TXT for details.
7f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman//
8f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman//===----------------------------------------------------------------------===//
9f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman//
10f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman// This implements routines for translating from LLVM IR into SelectionDAG IR.
11f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman//
12f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman//===----------------------------------------------------------------------===//
13f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
142048b85c7c2c987874b9423e682ec8e60b60574bDan Gohman#ifndef SELECTIONDAGBUILDER_H
152048b85c7c2c987874b9423e682ec8e60b60574bDan Gohman#define SELECTIONDAGBUILDER_H
16f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
17f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman#include "llvm/Constants.h"
180a5372ed3e8cda10d724feda3c1a1c998db05ca0Owen Anderson#include "llvm/CodeGen/SelectionDAG.h"
19f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman#include "llvm/ADT/APInt.h"
20f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman#include "llvm/ADT/DenseMap.h"
21f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman#ifndef NDEBUG
22f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman#include "llvm/ADT/SmallSet.h"
23f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman#endif
24f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman#include "llvm/CodeGen/SelectionDAGNodes.h"
250eb96fd94bce94df680f1fc436c1d3d1c510f937Bill Wendling#include "llvm/CodeGen/ValueTypes.h"
26f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman#include "llvm/Support/CallSite.h"
27c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/Support/ErrorHandling.h"
28f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman#include <vector>
29f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman#include <set>
30f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
31f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmannamespace llvm {
32f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
33f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass AliasAnalysis;
34f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass AllocaInst;
35f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass BasicBlock;
36f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass BitCastInst;
37f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass BranchInst;
38f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass CallInst;
392ad0fcf794924f618a7240741cc14a39be99d0f2Evan Chengclass DbgValueInst;
40f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass ExtractElementInst;
41f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass ExtractValueInst;
42f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass FCmpInst;
43f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass FPExtInst;
44f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass FPToSIInst;
45f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass FPToUIInst;
46f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass FPTruncInst;
47f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass Function;
486277eb2bb997a5da0808a8a5a57f18fd9faaf336Dan Gohmanclass FunctionLoweringInfo;
49f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass GetElementPtrInst;
50f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass GCFunctionInfo;
51f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass ICmpInst;
52f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass IntToPtrInst;
53ab21db79ef1d2530880ad11f21f0b87ffca02dd4Chris Lattnerclass IndirectBrInst;
54f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass InvokeInst;
55f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass InsertElementInst;
56f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass InsertValueInst;
57f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass Instruction;
58f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass LoadInst;
59f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass MachineBasicBlock;
60f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass MachineInstr;
61f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass MachineRegisterInfo;
622ad0fcf794924f618a7240741cc14a39be99d0f2Evan Chengclass MDNode;
63f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass PHINode;
64f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass PtrToIntInst;
65f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass ReturnInst;
66f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass SDISelAsmOperandInfo;
67bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesenclass SDDbgValue;
68f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass SExtInst;
69f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass SelectInst;
70f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass ShuffleVectorInst;
71f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass SIToFPInst;
72f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass StoreInst;
73f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass SwitchInst;
74f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass TargetData;
75f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass TargetLowering;
76f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass TruncInst;
77f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass UIToFPInst;
78f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass UnreachableInst;
79f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass UnwindInst;
80f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass VAArgInst;
81f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanclass ZExtInst;
82f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
83f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman//===----------------------------------------------------------------------===//
842048b85c7c2c987874b9423e682ec8e60b60574bDan Gohman/// SelectionDAGBuilder - This is the common target-independent lowering
85f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman/// implementation that is parameterized by a TargetLowering object.
86f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman///
872048b85c7c2c987874b9423e682ec8e60b60574bDan Gohmanclass SelectionDAGBuilder {
8866978ee97773aa76c3f15bee2fc77e5905aaf068Dale Johannesen  /// CurDebugLoc - current file + line number.  Changes as we build the DAG.
8966978ee97773aa76c3f15bee2fc77e5905aaf068Dale Johannesen  DebugLoc CurDebugLoc;
9066978ee97773aa76c3f15bee2fc77e5905aaf068Dale Johannesen
91f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  DenseMap<const Value*, SDValue> NodeMap;
929126c0d42a5176e5865171713fae4a62e3c69912Devang Patel
939126c0d42a5176e5865171713fae4a62e3c69912Devang Patel  /// UnusedArgNodeMap - Maps argument value for unused arguments. This is used
949126c0d42a5176e5865171713fae4a62e3c69912Devang Patel  /// to preserve debug information for incoming arguments.
959126c0d42a5176e5865171713fae4a62e3c69912Devang Patel  DenseMap<const Value*, SDValue> UnusedArgNodeMap;
96f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
97bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen  /// DanglingDebugInfo - Helper type for DanglingDebugInfoMap.
98bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen  class DanglingDebugInfo {
99bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen    const DbgValueInst* DI;
100bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen    DebugLoc dl;
101bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen    unsigned SDNodeOrder;
102bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen  public:
103bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen    DanglingDebugInfo() : DI(0), dl(DebugLoc()), SDNodeOrder(0) { }
104bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen    DanglingDebugInfo(const DbgValueInst *di, DebugLoc DL, unsigned SDNO) :
105bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen      DI(di), dl(DL), SDNodeOrder(SDNO) { }
106bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen    const DbgValueInst* getDI() { return DI; }
107bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen    DebugLoc getdl() { return dl; }
108bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen    unsigned getSDNodeOrder() { return SDNodeOrder; }
109bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen  };
110bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen
111bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen  /// DanglingDebugInfoMap - Keeps track of dbg_values for which we have not
112bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen  /// yet seen the referent.  We defer handling these until we do see it.
113bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen  DenseMap<const Value*, DanglingDebugInfo> DanglingDebugInfoMap;
114bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen
1158047d9a6be9c6261c4d3f286786be856d619ed0fChris Lattnerpublic:
116f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// PendingLoads - Loads are not emitted to the program immediately.  We bunch
117f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// them up and then emit token factor nodes when possible.  This allows us to
118f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// get simple disambiguation between loads without worrying about alias
119f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// analysis.
120f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  SmallVector<SDValue, 8> PendingLoads;
1218047d9a6be9c6261c4d3f286786be856d619ed0fChris Lattnerprivate:
122f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
123f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// PendingExports - CopyToReg nodes that copy values to virtual registers
124f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// for export to other blocks need to be emitted before any terminator
125f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// instruction, but they have no other ordering requirements. We bunch them
126f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// up and the emit a single tokenfactor for them just before terminator
127f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// instructions.
128f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  SmallVector<SDValue, 8> PendingExports;
129f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
130b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendling  /// SDNodeOrder - A unique monotonically increasing number used to order the
131b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendling  /// SDNodes we create.
132b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendling  unsigned SDNodeOrder;
133b4e6a5df5dada0cd919cc6e2717eb3118db9cc45Bill Wendling
134f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// Case - A struct to record the Value for a switch case, and the
135f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// case's target basic block.
136f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  struct Case {
137f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    Constant* Low;
138f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    Constant* High;
139f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    MachineBasicBlock* BB;
140f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
141f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    Case() : Low(0), High(0), BB(0) { }
142f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    Case(Constant* low, Constant* high, MachineBasicBlock* bb) :
143f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman      Low(low), High(high), BB(bb) { }
144e880efe446f731b73558542c12a6f980b8baa765Chris Lattner    APInt size() const {
145e880efe446f731b73558542c12a6f980b8baa765Chris Lattner      const APInt &rHigh = cast<ConstantInt>(High)->getValue();
146e880efe446f731b73558542c12a6f980b8baa765Chris Lattner      const APInt &rLow  = cast<ConstantInt>(Low)->getValue();
147f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman      return (rHigh - rLow + 1ULL);
148f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    }
149f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  };
150f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
151f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  struct CaseBits {
152f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    uint64_t Mask;
153f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    MachineBasicBlock* BB;
154f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    unsigned Bits;
155f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
156f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    CaseBits(uint64_t mask, MachineBasicBlock* bb, unsigned bits):
157f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman      Mask(mask), BB(bb), Bits(bits) { }
158f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  };
159f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
160f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  typedef std::vector<Case>           CaseVector;
161f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  typedef std::vector<CaseBits>       CaseBitsVector;
162f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  typedef CaseVector::iterator        CaseItr;
163f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  typedef std::pair<CaseItr, CaseItr> CaseRange;
164f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
165f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// CaseRec - A struct with ctor used in lowering switches to a binary tree
166f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// of conditional branches.
167f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  struct CaseRec {
16846510a73e977273ec67747eb34cbdb43f815e451Dan Gohman    CaseRec(MachineBasicBlock *bb, const Constant *lt, const Constant *ge,
16946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman            CaseRange r) :
170f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    CaseBB(bb), LT(lt), GE(ge), Range(r) {}
171f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
172f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    /// CaseBB - The MBB in which to emit the compare and branch
173f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    MachineBasicBlock *CaseBB;
174f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    /// LT, GE - If nonzero, we know the current case value must be less-than or
175f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    /// greater-than-or-equal-to these Constants.
17646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman    const Constant *LT;
17746510a73e977273ec67747eb34cbdb43f815e451Dan Gohman    const Constant *GE;
178f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    /// Range - A pair of iterators representing the range of case values to be
179f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    /// processed at this point in the binary search tree.
180f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    CaseRange Range;
181f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  };
182f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
183f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  typedef std::vector<CaseRec> CaseRecVector;
184f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
185f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// The comparison function for sorting the switch case values in the vector.
186f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// WARNING: Case ranges should be disjoint!
187f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  struct CaseCmp {
18853334ca5acc43500bb2744ed1a44e16442e92d0dChris Lattner    bool operator()(const Case &C1, const Case &C2) {
189f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman      assert(isa<ConstantInt>(C1.Low) && isa<ConstantInt>(C2.High));
190f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman      const ConstantInt* CI1 = cast<const ConstantInt>(C1.Low);
191f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman      const ConstantInt* CI2 = cast<const ConstantInt>(C2.High);
192f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman      return CI1->getValue().slt(CI2->getValue());
193f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    }
194f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  };
195f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
196f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  struct CaseBitsCmp {
19753334ca5acc43500bb2744ed1a44e16442e92d0dChris Lattner    bool operator()(const CaseBits &C1, const CaseBits &C2) {
198f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman      return C1.Bits > C2.Bits;
199f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    }
200f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  };
201f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
20253334ca5acc43500bb2744ed1a44e16442e92d0dChris Lattner  size_t Clusterify(CaseVector &Cases, const SwitchInst &SI);
2032321858c8cf5583a77b1318d5275188058ab5504Anton Korobeynikov
2042048b85c7c2c987874b9423e682ec8e60b60574bDan Gohman  /// CaseBlock - This structure is used to communicate between
2052048b85c7c2c987874b9423e682ec8e60b60574bDan Gohman  /// SelectionDAGBuilder and SDISel for the code generation of additional basic
2062048b85c7c2c987874b9423e682ec8e60b60574bDan Gohman  /// blocks needed by multi-case switch statements.
207f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  struct CaseBlock {
20846510a73e977273ec67747eb34cbdb43f815e451Dan Gohman    CaseBlock(ISD::CondCode cc, const Value *cmplhs, const Value *cmprhs,
20946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman              const Value *cmpmiddle,
210f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman              MachineBasicBlock *truebb, MachineBasicBlock *falsebb,
211f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman              MachineBasicBlock *me)
212f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman      : CC(cc), CmpLHS(cmplhs), CmpMHS(cmpmiddle), CmpRHS(cmprhs),
213f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman        TrueBB(truebb), FalseBB(falsebb), ThisBB(me) {}
214f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    // CC - the condition code to use for the case block's setcc node
215f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    ISD::CondCode CC;
216f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    // CmpLHS/CmpRHS/CmpMHS - The LHS/MHS/RHS of the comparison to emit.
217f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    // Emit by default LHS op RHS. MHS is used for range comparisons:
218f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    // If MHS is not null: (LHS <= MHS) and (MHS <= RHS).
21946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman    const Value *CmpLHS, *CmpMHS, *CmpRHS;
220f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    // TrueBB/FalseBB - the block to branch to if the setcc is true/false.
221f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    MachineBasicBlock *TrueBB, *FalseBB;
222f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    // ThisBB - the block into which to emit the code for the setcc and branches
223f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    MachineBasicBlock *ThisBB;
224f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  };
225f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  struct JumpTable {
226f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    JumpTable(unsigned R, unsigned J, MachineBasicBlock *M,
227f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman              MachineBasicBlock *D): Reg(R), JTI(J), MBB(M), Default(D) {}
228f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
229f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    /// Reg - the virtual register containing the index of the jump table entry
230f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    //. to jump to.
231f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    unsigned Reg;
232f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    /// JTI - the JumpTableIndex for this jump table in the function.
233f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    unsigned JTI;
234f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    /// MBB - the MBB into which to emit the code for the indirect jump.
235f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    MachineBasicBlock *MBB;
236f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    /// Default - the MBB of the default bb, which is a successor of the range
237f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    /// check MBB.  This is when updating PHI nodes in successors.
238f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    MachineBasicBlock *Default;
239f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  };
240f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  struct JumpTableHeader {
24146510a73e977273ec67747eb34cbdb43f815e451Dan Gohman    JumpTableHeader(APInt F, APInt L, const Value *SV, MachineBasicBlock *H,
242f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman                    bool E = false):
243f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman      First(F), Last(L), SValue(SV), HeaderBB(H), Emitted(E) {}
2442321858c8cf5583a77b1318d5275188058ab5504Anton Korobeynikov    APInt First;
2452321858c8cf5583a77b1318d5275188058ab5504Anton Korobeynikov    APInt Last;
24646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman    const Value *SValue;
247f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    MachineBasicBlock *HeaderBB;
248f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    bool Emitted;
249f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  };
250f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  typedef std::pair<JumpTableHeader, JumpTable> JumpTableBlock;
251f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
252f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  struct BitTestCase {
253f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    BitTestCase(uint64_t M, MachineBasicBlock* T, MachineBasicBlock* Tr):
254f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman      Mask(M), ThisBB(T), TargetBB(Tr) { }
255f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    uint64_t Mask;
25653334ca5acc43500bb2744ed1a44e16442e92d0dChris Lattner    MachineBasicBlock *ThisBB;
25753334ca5acc43500bb2744ed1a44e16442e92d0dChris Lattner    MachineBasicBlock *TargetBB;
258f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  };
259f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
260f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  typedef SmallVector<BitTestCase, 3> BitTestInfo;
261f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
262f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  struct BitTestBlock {
26346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman    BitTestBlock(APInt F, APInt R, const Value* SV,
264f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman                 unsigned Rg, bool E,
265f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman                 MachineBasicBlock* P, MachineBasicBlock* D,
266f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman                 const BitTestInfo& C):
267f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman      First(F), Range(R), SValue(SV), Reg(Rg), Emitted(E),
268f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman      Parent(P), Default(D), Cases(C) { }
2692321858c8cf5583a77b1318d5275188058ab5504Anton Korobeynikov    APInt First;
2702321858c8cf5583a77b1318d5275188058ab5504Anton Korobeynikov    APInt Range;
27146510a73e977273ec67747eb34cbdb43f815e451Dan Gohman    const Value *SValue;
272f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    unsigned Reg;
273f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    bool Emitted;
274f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    MachineBasicBlock *Parent;
275f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    MachineBasicBlock *Default;
276f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    BitTestInfo Cases;
277f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  };
278f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
279f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanpublic:
280f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  // TLI - This is information that describes the available target features we
281f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  // need for lowering.  This indicates when operations are unavailable,
282f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  // implemented with a libcall, etc.
28355e59c186303ff02c0be7429da3b1b36c347f164Dan Gohman  const TargetMachine &TM;
284d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman  const TargetLowering &TLI;
285f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  SelectionDAG &DAG;
286f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  const TargetData *TD;
287f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  AliasAnalysis *AA;
288f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
289f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// SwitchCases - Vector of CaseBlock structures used to communicate
290f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// SwitchInst code generation information.
291f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  std::vector<CaseBlock> SwitchCases;
292f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// JTCases - Vector of JumpTable structures used to communicate
293f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// SwitchInst code generation information.
294f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  std::vector<JumpTableBlock> JTCases;
295f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// BitTestCases - Vector of BitTestBlock structures used to communicate
296f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// SwitchInst code generation information.
297f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  std::vector<BitTestBlock> BitTestCases;
298fb2e752e4175920d0531f2afc93a23d0cdf4db14Evan Cheng
299f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  // Emit PHI-node-operand constants only once even if used by multiple
300f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  // PHI nodes.
30146510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  DenseMap<const Constant *, unsigned> ConstantsOut;
302f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
303f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// FuncInfo - Information about the function as a whole.
304f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  ///
305f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  FunctionLoweringInfo &FuncInfo;
306dfdacee2abd53d71a5b9a9f4d38c7973cc722663Bill Wendling
307be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling  /// OptLevel - What optimization level we're generating code for.
308dfdacee2abd53d71a5b9a9f4d38c7973cc722663Bill Wendling  ///
30998a366d547772010e94609e4584489b3e5ce0043Bill Wendling  CodeGenOpt::Level OptLevel;
310f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
311f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// GFI - Garbage collection metadata for the function.
312f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  GCFunctionInfo *GFI;
313f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
31498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  /// HasTailCall - This is set to true if a call in the current
31598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  /// block has been translated as a tail call. In this case,
31698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  /// no subsequent DAG nodes should be created.
31798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  ///
31898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman  bool HasTailCall;
31998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
3200a5372ed3e8cda10d724feda3c1a1c998db05ca0Owen Anderson  LLVMContext *Context;
3210a5372ed3e8cda10d724feda3c1a1c998db05ca0Owen Anderson
32255e59c186303ff02c0be7429da3b1b36c347f164Dan Gohman  SelectionDAGBuilder(SelectionDAG &dag, FunctionLoweringInfo &funcinfo,
3232048b85c7c2c987874b9423e682ec8e60b60574bDan Gohman                      CodeGenOpt::Level ol)
32455e59c186303ff02c0be7429da3b1b36c347f164Dan Gohman    : SDNodeOrder(0), TM(dag.getTarget()), TLI(dag.getTargetLoweringInfo()),
32555e59c186303ff02c0be7429da3b1b36c347f164Dan Gohman      DAG(dag), FuncInfo(funcinfo), OptLevel(ol),
326a4f2bb08de92ccec21cbb3d0a9518384b0173660Chris Lattner      HasTailCall(false), Context(dag.getContext()) {
327f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  }
328f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
329f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  void init(GCFunctionInfo *gfi, AliasAnalysis &aa);
330f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
331b02b62a2719bf5cfe12cfc902ab4e85d675450a0Dan Gohman  /// clear - Clear out the current SelectionDAG and the associated
3322048b85c7c2c987874b9423e682ec8e60b60574bDan Gohman  /// state and prepare this SelectionDAGBuilder object to be used
333f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// for a new block. This doesn't clear out information about
334f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// additional blocks that are needed to complete switch lowering
335f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// or PHI node updating; that information is cleared out as it is
336f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// consumed.
337f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  void clear();
338f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
339f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// getRoot - Return the current virtual root of the Selection DAG,
340f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// flushing any PendingLoad items. This must be done before emitting
341f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// a store or any other node that may need to be ordered after any
342f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// prior load instructions.
343f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  ///
344f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  SDValue getRoot();
345f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
346f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// getControlRoot - Similar to getRoot, but instead of flushing all the
347f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// PendingLoad items, flush all the PendingExports items. It is necessary
348f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  /// to do this before emitting a terminator instruction.
349f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  ///
350f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  SDValue getControlRoot();
351f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
35266978ee97773aa76c3f15bee2fc77e5905aaf068Dale Johannesen  DebugLoc getCurDebugLoc() const { return CurDebugLoc; }
35366978ee97773aa76c3f15bee2fc77e5905aaf068Dale Johannesen
3543ea3c2461932d96d3defa0a9aa93ffaf631bb19dBill Wendling  unsigned getSDNodeOrder() const { return SDNodeOrder; }
3553ea3c2461932d96d3defa0a9aa93ffaf631bb19dBill Wendling
35646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void CopyValueToVirtualRegister(const Value *V, unsigned Reg);
357f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
3584533cac557cdcc13e7c990942758ec8338d9172aBill Wendling  /// AssignOrderingToNode - Assign an ordering to the node. The order is gotten
3594533cac557cdcc13e7c990942758ec8338d9172aBill Wendling  /// from how the code appeared in the source. The ordering is used by the
3604533cac557cdcc13e7c990942758ec8338d9172aBill Wendling  /// scheduler to effectively turn off scheduling.
3614533cac557cdcc13e7c990942758ec8338d9172aBill Wendling  void AssignOrderingToNode(const SDNode *Node);
3624533cac557cdcc13e7c990942758ec8338d9172aBill Wendling
36346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visit(const Instruction &I);
364f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
36546510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visit(unsigned Opcode, const User &I);
366f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
367bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen  // resolveDanglingDebugInfo - if we saw an earlier dbg_value referring to V,
368bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen  // generate the debug data structures now that we've seen its definition.
369bdc09d9b0943a8c5cee29c4f87666eaa97e081d4Dale Johannesen  void resolveDanglingDebugInfo(const Value *V, SDValue Val);
370f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  SDValue getValue(const Value *V);
37128a173581c67cda78b2febd24d10edb13f760c4cDan Gohman  SDValue getNonRegisterValue(const Value *V);
37228a173581c67cda78b2febd24d10edb13f760c4cDan Gohman  SDValue getValueImpl(const Value *V);
373f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
374f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  void setValue(const Value *V, SDValue NewN) {
375f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    SDValue &N = NodeMap[V];
376f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    assert(N.getNode() == 0 && "Already set a value for this node!");
377f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman    N = NewN;
378f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  }
379f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
3809126c0d42a5176e5865171713fae4a62e3c69912Devang Patel  void setUnusedArgValue(const Value *V, SDValue NewN) {
3819126c0d42a5176e5865171713fae4a62e3c69912Devang Patel    SDValue &N = UnusedArgNodeMap[V];
3829126c0d42a5176e5865171713fae4a62e3c69912Devang Patel    assert(N.getNode() == 0 && "Already set a value for this node!");
3839126c0d42a5176e5865171713fae4a62e3c69912Devang Patel    N = NewN;
3849126c0d42a5176e5865171713fae4a62e3c69912Devang Patel  }
3859126c0d42a5176e5865171713fae4a62e3c69912Devang Patel
3868e3455ba1734a64dc5a6884d4a5218d436da54e2Dale Johannesen  void GetRegistersForValue(SDISelAsmOperandInfo &OpInfo,
387f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman                            std::set<unsigned> &OutputRegs,
388f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman                            std::set<unsigned> &InputRegs);
389f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
39046510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void FindMergedConditions(const Value *Cond, MachineBasicBlock *TBB,
391f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman                            MachineBasicBlock *FBB, MachineBasicBlock *CurBB,
39299be8ae3898d87373ef0c8f1159b287e28a8d81bDan Gohman                            MachineBasicBlock *SwitchBB, unsigned Opc);
39346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void EmitBranchForMergedCondition(const Value *Cond, MachineBasicBlock *TBB,
394c227734855b615f5b09060e7ea67f697de08fc7eDan Gohman                                    MachineBasicBlock *FBB,
39599be8ae3898d87373ef0c8f1159b287e28a8d81bDan Gohman                                    MachineBasicBlock *CurBB,
39699be8ae3898d87373ef0c8f1159b287e28a8d81bDan Gohman                                    MachineBasicBlock *SwitchBB);
397f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  bool ShouldEmitAsBranches(const std::vector<CaseBlock> &Cases);
39846510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  bool isExportableFromCurrentBlock(const Value *V, const BasicBlock *FromBB);
39946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void CopyToExportRegsIfNeeded(const Value *V);
40046510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void ExportFromCurrentBlock(const Value *V);
40146510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void LowerCallTo(ImmutableCallSite CS, SDValue Callee, bool IsTailCall,
402f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman                   MachineBasicBlock *LandingPad = NULL);
403f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
404f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanprivate:
405f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  // Terminator instructions.
40646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitRet(const ReturnInst &I);
40746510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitBr(const BranchInst &I);
40846510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitSwitch(const SwitchInst &I);
40946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitIndirectBr(const IndirectBrInst &I);
410a60f0e7f817f170df55371491e246b95b0d8d6b0Bill Wendling  void visitUnreachable(const UnreachableInst &I) { /* noop */ }
411f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
412f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  // Helpers for visitSwitch
413f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  bool handleSmallSwitchRange(CaseRec& CR,
414f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman                              CaseRecVector& WorkList,
41546510a73e977273ec67747eb34cbdb43f815e451Dan Gohman                              const Value* SV,
41699be8ae3898d87373ef0c8f1159b287e28a8d81bDan Gohman                              MachineBasicBlock* Default,
41799be8ae3898d87373ef0c8f1159b287e28a8d81bDan Gohman                              MachineBasicBlock *SwitchBB);
418f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  bool handleJTSwitchCase(CaseRec& CR,
419f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman                          CaseRecVector& WorkList,
42046510a73e977273ec67747eb34cbdb43f815e451Dan Gohman                          const Value* SV,
42199be8ae3898d87373ef0c8f1159b287e28a8d81bDan Gohman                          MachineBasicBlock* Default,
42299be8ae3898d87373ef0c8f1159b287e28a8d81bDan Gohman                          MachineBasicBlock *SwitchBB);
423f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  bool handleBTSplitSwitchCase(CaseRec& CR,
424f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman                               CaseRecVector& WorkList,
42546510a73e977273ec67747eb34cbdb43f815e451Dan Gohman                               const Value* SV,
42699be8ae3898d87373ef0c8f1159b287e28a8d81bDan Gohman                               MachineBasicBlock* Default,
42799be8ae3898d87373ef0c8f1159b287e28a8d81bDan Gohman                               MachineBasicBlock *SwitchBB);
428f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  bool handleBitTestsSwitchCase(CaseRec& CR,
429f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman                                CaseRecVector& WorkList,
43046510a73e977273ec67747eb34cbdb43f815e451Dan Gohman                                const Value* SV,
43199be8ae3898d87373ef0c8f1159b287e28a8d81bDan Gohman                                MachineBasicBlock* Default,
43299be8ae3898d87373ef0c8f1159b287e28a8d81bDan Gohman                                MachineBasicBlock *SwitchBB);
433f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanpublic:
43499be8ae3898d87373ef0c8f1159b287e28a8d81bDan Gohman  void visitSwitchCase(CaseBlock &CB,
43599be8ae3898d87373ef0c8f1159b287e28a8d81bDan Gohman                       MachineBasicBlock *SwitchBB);
43699be8ae3898d87373ef0c8f1159b287e28a8d81bDan Gohman  void visitBitTestHeader(BitTestBlock &B, MachineBasicBlock *SwitchBB);
437f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  void visitBitTestCase(MachineBasicBlock* NextMBB,
438f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman                        unsigned Reg,
43999be8ae3898d87373ef0c8f1159b287e28a8d81bDan Gohman                        BitTestCase &B,
44099be8ae3898d87373ef0c8f1159b287e28a8d81bDan Gohman                        MachineBasicBlock *SwitchBB);
441f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  void visitJumpTable(JumpTable &JT);
44299be8ae3898d87373ef0c8f1159b287e28a8d81bDan Gohman  void visitJumpTableHeader(JumpTable &JT, JumpTableHeader &JTH,
44399be8ae3898d87373ef0c8f1159b287e28a8d81bDan Gohman                            MachineBasicBlock *SwitchBB);
444f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
445f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohmanprivate:
446f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  // These all get lowered before this pass.
44746510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitInvoke(const InvokeInst &I);
44846510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitUnwind(const UnwindInst &I);
44946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman
45046510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitBinary(const User &I, unsigned OpCode);
45146510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitShift(const User &I, unsigned Opcode);
45246510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitAdd(const User &I)  { visitBinary(I, ISD::ADD); }
45346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitFAdd(const User &I) { visitBinary(I, ISD::FADD); }
45446510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitSub(const User &I)  { visitBinary(I, ISD::SUB); }
45546510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitFSub(const User &I);
45646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitMul(const User &I)  { visitBinary(I, ISD::MUL); }
45746510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitFMul(const User &I) { visitBinary(I, ISD::FMUL); }
45846510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitURem(const User &I) { visitBinary(I, ISD::UREM); }
45946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitSRem(const User &I) { visitBinary(I, ISD::SREM); }
46046510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitFRem(const User &I) { visitBinary(I, ISD::FREM); }
46146510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitUDiv(const User &I) { visitBinary(I, ISD::UDIV); }
46246510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitSDiv(const User &I) { visitBinary(I, ISD::SDIV); }
46346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitFDiv(const User &I) { visitBinary(I, ISD::FDIV); }
46446510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitAnd (const User &I) { visitBinary(I, ISD::AND); }
46546510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitOr  (const User &I) { visitBinary(I, ISD::OR); }
46646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitXor (const User &I) { visitBinary(I, ISD::XOR); }
46746510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitShl (const User &I) { visitShift(I, ISD::SHL); }
46846510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitLShr(const User &I) { visitShift(I, ISD::SRL); }
46946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitAShr(const User &I) { visitShift(I, ISD::SRA); }
47046510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitICmp(const User &I);
47146510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitFCmp(const User &I);
472f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  // Visit the conversion instructions
47346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitTrunc(const User &I);
47446510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitZExt(const User &I);
47546510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitSExt(const User &I);
47646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitFPTrunc(const User &I);
47746510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitFPExt(const User &I);
47846510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitFPToUI(const User &I);
47946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitFPToSI(const User &I);
48046510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitUIToFP(const User &I);
48146510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitSIToFP(const User &I);
48246510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitPtrToInt(const User &I);
48346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitIntToPtr(const User &I);
48446510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitBitCast(const User &I);
48546510a73e977273ec67747eb34cbdb43f815e451Dan Gohman
48646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitExtractElement(const User &I);
48746510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitInsertElement(const User &I);
48846510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitShuffleVector(const User &I);
48946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman
49046510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitExtractValue(const ExtractValueInst &I);
49146510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitInsertValue(const InsertValueInst &I);
49246510a73e977273ec67747eb34cbdb43f815e451Dan Gohman
49346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitGetElementPtr(const User &I);
49446510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitSelect(const User &I);
49546510a73e977273ec67747eb34cbdb43f815e451Dan Gohman
49646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitAlloca(const AllocaInst &I);
49746510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitLoad(const LoadInst &I);
49846510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitStore(const StoreInst &I);
499ba5be5c07bb19dcf484e3aa40cd139dd07c10407Dan Gohman  void visitPHI(const PHINode &I);
50046510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitCall(const CallInst &I);
50146510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  bool visitMemCmpCall(const CallInst &I);
5028047d9a6be9c6261c4d3f286786be856d619ed0fChris Lattner
50346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitInlineAsm(ImmutableCallSite CS);
50446510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  const char *visitIntrinsicCall(const CallInst &I, unsigned Intrinsic);
50546510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitTargetIntrinsic(const CallInst &I, unsigned Intrinsic);
50646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman
50746510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitPow(const CallInst &I);
50846510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitExp2(const CallInst &I);
50946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitExp(const CallInst &I);
51046510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitLog(const CallInst &I);
51146510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitLog2(const CallInst &I);
51246510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitLog10(const CallInst &I);
51346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman
51446510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitVAStart(const CallInst &I);
51546510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitVAArg(const VAArgInst &I);
51646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitVAEnd(const CallInst &I);
51746510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitVACopy(const CallInst &I);
51846510a73e977273ec67747eb34cbdb43f815e451Dan Gohman
51946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitUserOp1(const Instruction &I) {
520c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    llvm_unreachable("UserOp1 should not exist at instruction selection time!");
521f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  }
52246510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  void visitUserOp2(const Instruction &I) {
523c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    llvm_unreachable("UserOp2 should not exist at instruction selection time!");
524f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman  }
525f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
52646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  const char *implVisitBinaryAtomic(const CallInst& I, ISD::NodeType Op);
52746510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  const char *implVisitAluOverflow(const CallInst &I, ISD::NodeType Op);
528c105a2b5b7d8969e78bd4b203e980dced8a1c689Dan Gohman
529c105a2b5b7d8969e78bd4b203e980dced8a1c689Dan Gohman  void HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB);
5302ad0fcf794924f618a7240741cc14a39be99d0f2Evan Cheng
5312ad0fcf794924f618a7240741cc14a39be99d0f2Evan Cheng  /// EmitFuncArgumentDbgValue - If the DbgValueInst is a dbg_value of a
5322ad0fcf794924f618a7240741cc14a39be99d0f2Evan Cheng  /// function argument, create the corresponding DBG_VALUE machine instruction
5332ad0fcf794924f618a7240741cc14a39be99d0f2Evan Cheng  /// for it now. At the end of instruction selection, they will be inserted to
5342ad0fcf794924f618a7240741cc14a39be99d0f2Evan Cheng  /// the entry BB.
5359e8a2b93465bc8abd9b318faebb256b1c168baa9Evan Cheng  bool EmitFuncArgumentDbgValue(const DbgValueInst &DI,
5362ad0fcf794924f618a7240741cc14a39be99d0f2Evan Cheng                                const Value *V, MDNode *Variable,
5375d11ea39f7f78169efdc4a62fd924e8f0661ca55Dan Gohman                                uint64_t Offset, const SDValue &N);
538f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman};
539f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
540f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman} // end namespace llvm
541f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman
542f0cbcd48804961b05359ee41859bbd7774f41fe0Dan Gohman#endif
543