diff options
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h | 197 |
1 files changed, 104 insertions, 93 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h index a5b8d402fae..9eb0eaf97a1 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h @@ -1,4 +1,4 @@ -//===-- SelectionDAGBuilder.h - Selection-DAG building --------*- C++ -*---===// +//===- SelectionDAGBuilder.h - Selection-DAG building -----------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -16,67 +16,75 @@ #include "StatepointLowering.h" #include "llvm/ADT/APInt.h" +#include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/SmallVector.h" #include "llvm/Analysis/AliasAnalysis.h" +#include "llvm/CodeGen/ISDOpcodes.h" +#include "llvm/CodeGen/MachineValueType.h" #include "llvm/CodeGen/SelectionDAG.h" #include "llvm/CodeGen/SelectionDAGNodes.h" +#include "llvm/CodeGen/ValueTypes.h" #include "llvm/IR/CallSite.h" -#include "llvm/IR/Constants.h" +#include "llvm/IR/DebugLoc.h" +#include "llvm/IR/Instruction.h" #include "llvm/IR/Statepoint.h" +#include "llvm/Support/BranchProbability.h" +#include "llvm/Support/CodeGen.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Target/TargetLowering.h" +#include <algorithm> +#include <cassert> +#include <cstdint> #include <utility> #include <vector> namespace llvm { -class AddrSpaceCastInst; class AllocaInst; +class AtomicCmpXchgInst; +class AtomicRMWInst; class BasicBlock; -class BitCastInst; class BranchInst; class CallInst; +class CatchPadInst; +class CatchReturnInst; +class CatchSwitchInst; +class CleanupPadInst; +class CleanupReturnInst; +class Constant; +class ConstantInt; +class ConstrainedFPIntrinsic; class DbgValueInst; -class ExtractElementInst; -class FCmpInst; -class FPExtInst; -class FPToSIInst; -class FPToUIInst; -class FPTruncInst; -class Function; +class DataLayout; +class DIExpression; +class DILocalVariable; +class DILocation; +class FenceInst; class FunctionLoweringInfo; -class GetElementPtrInst; class GCFunctionInfo; -class ICmpInst; -class IntToPtrInst; +class GCRelocateInst; +class GCResultInst; class IndirectBrInst; class InvokeInst; -class InsertElementInst; -class Instruction; +class LandingPadInst; +class LLVMContext; class LoadInst; class MachineBasicBlock; -class MachineInstr; -class MachineRegisterInfo; -class MDNode; -class MVT; class PHINode; -class PtrToIntInst; +class ResumeInst; class ReturnInst; class SDDbgValue; -class SExtInst; -class SelectInst; -class ShuffleVectorInst; -class SIToFPInst; class StoreInst; class SwitchInst; -class DataLayout; class TargetLibraryInfo; -class TargetLowering; -class TruncInst; -class UIToFPInst; -class UnreachableInst; +class TargetMachine; +class Type; class VAArgInst; -class ZExtInst; +class UnreachableInst; +class Use; +class User; +class Value; //===----------------------------------------------------------------------===// /// SelectionDAGBuilder - This is the common target-independent lowering @@ -84,7 +92,7 @@ class ZExtInst; /// class SelectionDAGBuilder { /// CurInst - The current instruction being visited - const Instruction *CurInst; + const Instruction *CurInst = nullptr; DenseMap<const Value*, SDValue> NodeMap; @@ -94,13 +102,15 @@ class SelectionDAGBuilder { /// DanglingDebugInfo - Helper type for DanglingDebugInfoMap. class DanglingDebugInfo { - const DbgValueInst* DI; + const DbgValueInst* DI = nullptr; DebugLoc dl; - unsigned SDNodeOrder; + unsigned SDNodeOrder = 0; + public: - DanglingDebugInfo() : DI(nullptr), dl(DebugLoc()), SDNodeOrder(0) { } + DanglingDebugInfo() = default; DanglingDebugInfo(const DbgValueInst *di, DebugLoc DL, unsigned SDNO) : DI(di), dl(std::move(DL)), SDNodeOrder(SDNO) {} + const DbgValueInst* getDI() { return DI; } DebugLoc getdl() { return dl; } unsigned getSDNodeOrder() { return SDNodeOrder; } @@ -120,8 +130,8 @@ public: /// State used while lowering a statepoint sequence (gc_statepoint, /// gc_relocate, and gc_result). See StatepointLowering.hpp/cpp for details. StatepointLoweringState StatepointLowering; -private: +private: /// PendingExports - CopyToReg nodes that copy values to virtual registers /// for export to other blocks need to be emitted before any terminator /// instruction, but they have no other ordering requirements. We bunch them @@ -189,23 +199,22 @@ private: } }; - typedef std::vector<CaseCluster> CaseClusterVector; - typedef CaseClusterVector::iterator CaseClusterIt; + using CaseClusterVector = std::vector<CaseCluster>; + using CaseClusterIt = CaseClusterVector::iterator; struct CaseBits { - uint64_t Mask; - MachineBasicBlock* BB; - unsigned Bits; + uint64_t Mask = 0; + MachineBasicBlock* BB = nullptr; + unsigned Bits = 0; BranchProbability ExtraProb; + CaseBits() = default; CaseBits(uint64_t mask, MachineBasicBlock* bb, unsigned bits, BranchProbability Prob): - Mask(mask), BB(bb), Bits(bits), ExtraProb(Prob) { } - - CaseBits() : Mask(0), BB(nullptr), Bits(0) {} + Mask(mask), BB(bb), Bits(bits), ExtraProb(Prob) {} }; - typedef std::vector<CaseBits> CaseBitsVector; + using CaseBitsVector = std::vector<CaseBits>; /// Sort Clusters and merge adjacent cases. void sortAndRangeify(CaseClusterVector &Clusters); @@ -214,16 +223,6 @@ private: /// SelectionDAGBuilder and SDISel for the code generation of additional basic /// blocks needed by multi-case switch statements. struct CaseBlock { - CaseBlock(ISD::CondCode cc, const Value *cmplhs, const Value *cmprhs, - const Value *cmpmiddle, MachineBasicBlock *truebb, - MachineBasicBlock *falsebb, MachineBasicBlock *me, - SDLoc dl, - BranchProbability trueprob = BranchProbability::getUnknown(), - BranchProbability falseprob = BranchProbability::getUnknown()) - : CC(cc), CmpLHS(cmplhs), CmpMHS(cmpmiddle), CmpRHS(cmprhs), - TrueBB(truebb), FalseBB(falsebb), ThisBB(me), DL(dl), - TrueProb(trueprob), FalseProb(falseprob) {} - // CC - the condition code to use for the case block's setcc node ISD::CondCode CC; @@ -244,12 +243,19 @@ private: // TrueProb/FalseProb - branch weights. BranchProbability TrueProb, FalseProb; + + CaseBlock(ISD::CondCode cc, const Value *cmplhs, const Value *cmprhs, + const Value *cmpmiddle, MachineBasicBlock *truebb, + MachineBasicBlock *falsebb, MachineBasicBlock *me, + SDLoc dl, + BranchProbability trueprob = BranchProbability::getUnknown(), + BranchProbability falseprob = BranchProbability::getUnknown()) + : CC(cc), CmpLHS(cmplhs), CmpMHS(cmpmiddle), CmpRHS(cmprhs), + TrueBB(truebb), FalseBB(falsebb), ThisBB(me), DL(dl), + TrueProb(trueprob), FalseProb(falseprob) {} }; struct JumpTable { - JumpTable(unsigned R, unsigned J, MachineBasicBlock *M, - MachineBasicBlock *D): Reg(R), JTI(J), MBB(M), Default(D) {} - /// Reg - the virtual register containing the index of the jump table entry //. to jump to. unsigned Reg; @@ -260,39 +266,38 @@ private: /// Default - the MBB of the default bb, which is a successor of the range /// check MBB. This is when updating PHI nodes in successors. MachineBasicBlock *Default; + + JumpTable(unsigned R, unsigned J, MachineBasicBlock *M, + MachineBasicBlock *D): Reg(R), JTI(J), MBB(M), Default(D) {} }; struct JumpTableHeader { - JumpTableHeader(APInt F, APInt L, const Value *SV, MachineBasicBlock *H, - bool E = false) - : First(std::move(F)), Last(std::move(L)), SValue(SV), HeaderBB(H), - Emitted(E) {} APInt First; APInt Last; const Value *SValue; MachineBasicBlock *HeaderBB; bool Emitted; + + JumpTableHeader(APInt F, APInt L, const Value *SV, MachineBasicBlock *H, + bool E = false) + : First(std::move(F)), Last(std::move(L)), SValue(SV), HeaderBB(H), + Emitted(E) {} }; - typedef std::pair<JumpTableHeader, JumpTable> JumpTableBlock; + using JumpTableBlock = std::pair<JumpTableHeader, JumpTable>; struct BitTestCase { - BitTestCase(uint64_t M, MachineBasicBlock* T, MachineBasicBlock* Tr, - BranchProbability Prob): - Mask(M), ThisBB(T), TargetBB(Tr), ExtraProb(Prob) { } uint64_t Mask; MachineBasicBlock *ThisBB; MachineBasicBlock *TargetBB; BranchProbability ExtraProb; + + BitTestCase(uint64_t M, MachineBasicBlock* T, MachineBasicBlock* Tr, + BranchProbability Prob): + Mask(M), ThisBB(T), TargetBB(Tr), ExtraProb(Prob) {} }; - typedef SmallVector<BitTestCase, 3> BitTestInfo; + using BitTestInfo = SmallVector<BitTestCase, 3>; struct BitTestBlock { - BitTestBlock(APInt F, APInt R, const Value *SV, unsigned Rg, MVT RgVT, - bool E, bool CR, MachineBasicBlock *P, MachineBasicBlock *D, - BitTestInfo C, BranchProbability Pr) - : First(std::move(F)), Range(std::move(R)), SValue(SV), Reg(Rg), - RegVT(RgVT), Emitted(E), ContiguousRange(CR), Parent(P), Default(D), - Cases(std::move(C)), Prob(Pr) {} APInt First; APInt Range; const Value *SValue; @@ -305,6 +310,13 @@ private: BitTestInfo Cases; BranchProbability Prob; BranchProbability DefaultProb; + + BitTestBlock(APInt F, APInt R, const Value *SV, unsigned Rg, MVT RgVT, + bool E, bool CR, MachineBasicBlock *P, MachineBasicBlock *D, + BitTestInfo C, BranchProbability Pr) + : First(std::move(F)), Range(std::move(R)), SValue(SV), Reg(Rg), + RegVT(RgVT), Emitted(E), ContiguousRange(CR), Parent(P), Default(D), + Cases(std::move(C)), Prob(Pr) {} }; /// Return the range of value in [First..Last]. @@ -341,7 +353,7 @@ private: const ConstantInt *LT; BranchProbability DefaultProb; }; - typedef SmallVector<SwitchWorkListItem, 4> SwitchWorkList; + using SwitchWorkList = SmallVector<SwitchWorkListItem, 4>; /// Determine the rank by weight of CC in [First,Last]. If CC has more weight /// than each cluster in the range, its rank is 0. @@ -471,8 +483,7 @@ private: /// the same function, use the same failure basic block). class StackProtectorDescriptor { public: - StackProtectorDescriptor() - : ParentMBB(nullptr), SuccessMBB(nullptr), FailureMBB(nullptr) {} + StackProtectorDescriptor() = default; /// Returns true if all fields of the stack protector descriptor are /// initialized implying that we should/are ready to emit a stack protector. @@ -538,15 +549,15 @@ private: /// replace it with a compare/branch to the successor mbbs /// SuccessMBB/FailureMBB depending on whether or not the stack protector /// was violated. - MachineBasicBlock *ParentMBB; + MachineBasicBlock *ParentMBB = nullptr; /// A basic block visited on stack protector check success that contains the /// terminators of ParentMBB. - MachineBasicBlock *SuccessMBB; + MachineBasicBlock *SuccessMBB = nullptr; /// This basic block visited on stack protector check failure that will /// contain a call to __stack_chk_fail(). - MachineBasicBlock *FailureMBB; + MachineBasicBlock *FailureMBB = nullptr; /// Add a successor machine basic block to ParentMBB. If the successor mbb /// has not been created yet (i.e. if SuccMBB = 0), then the machine basic @@ -559,25 +570,29 @@ private: private: const TargetMachine &TM; + public: /// Lowest valid SDNodeOrder. The special case 0 is reserved for scheduling /// nodes without a corresponding SDNode. static const unsigned LowestSDNodeOrder = 1; SelectionDAG &DAG; - const DataLayout *DL; - AliasAnalysis *AA; + const DataLayout *DL = nullptr; + AliasAnalysis *AA = nullptr; const TargetLibraryInfo *LibInfo; /// SwitchCases - Vector of CaseBlock structures used to communicate /// SwitchInst code generation information. std::vector<CaseBlock> SwitchCases; + /// JTCases - Vector of JumpTable structures used to communicate /// SwitchInst code generation information. std::vector<JumpTableBlock> JTCases; + /// BitTestCases - Vector of BitTestBlock structures used to communicate /// SwitchInst code generation information. std::vector<BitTestBlock> BitTestCases; + /// A StackProtectorDescriptor structure used to communicate stack protector /// information in between SelectBasicBlock and FinishBasicBlock. StackProtectorDescriptor SPDescriptor; @@ -594,22 +609,19 @@ public: GCFunctionInfo *GFI; /// LPadToCallSiteMap - Map a landing pad to the call site indexes. - DenseMap<MachineBasicBlock*, SmallVector<unsigned, 4> > LPadToCallSiteMap; + DenseMap<MachineBasicBlock *, SmallVector<unsigned, 4>> LPadToCallSiteMap; /// HasTailCall - This is set to true if a call in the current /// block has been translated as a tail call. In this case, /// no subsequent DAG nodes should be created. - /// - bool HasTailCall; + bool HasTailCall = false; LLVMContext *Context; SelectionDAGBuilder(SelectionDAG &dag, FunctionLoweringInfo &funcinfo, CodeGenOpt::Level ol) - : CurInst(nullptr), SDNodeOrder(LowestSDNodeOrder), TM(dag.getTarget()), - DAG(dag), DL(nullptr), AA(nullptr), FuncInfo(funcinfo), - HasTailCall(false) { - } + : SDNodeOrder(LowestSDNodeOrder), TM(dag.getTarget()), DAG(dag), + FuncInfo(funcinfo) {} void init(GCFunctionInfo *gfi, AliasAnalysis *AA, const TargetLibraryInfo *li); @@ -658,6 +670,7 @@ public: // resolveDanglingDebugInfo - if we saw an earlier dbg_value referring to V, // generate the debug data structures now that we've seen its definition. void resolveDanglingDebugInfo(const Value *V, SDValue Val); + SDValue getValue(const Value *V); bool findValue(const Value *V) const; @@ -982,13 +995,11 @@ struct RegsForValue { /// Records if this value needs to be treated in an ABI dependant manner, /// different to normal type legalization. - bool IsABIMangled; - - RegsForValue(); + bool IsABIMangled = false; + RegsForValue() = default; RegsForValue(const SmallVector<unsigned, 4> ®s, MVT regvt, EVT valuevt, bool IsABIMangledValue = false); - RegsForValue(LLVMContext &Context, const TargetLowering &TLI, const DataLayout &DL, unsigned Reg, Type *Ty, bool IsABIMangledValue = false); @@ -1028,4 +1039,4 @@ struct RegsForValue { } // end namespace llvm -#endif +#endif // LLVM_LIB_CODEGEN_SELECTIONDAG_SELECTIONDAGBUILDER_H |