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