diff options
Diffstat (limited to 'contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h')
| -rw-r--r-- | contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h | 133 | 
1 files changed, 69 insertions, 64 deletions
diff --git a/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h b/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h index abde8a89befc..431d52b4b9b9 100644 --- a/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h +++ b/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h @@ -304,10 +304,13 @@ private:      BranchProbability DefaultProb;    }; -  /// Check whether a range of clusters is dense enough for a jump table. -  bool isDense(const CaseClusterVector &Clusters, -               const SmallVectorImpl<unsigned> &TotalCases, -               unsigned First, unsigned Last, unsigned MinDensity) const; +  /// Return the range of value in [First..Last]. +  uint64_t getJumpTableRange(const CaseClusterVector &Clusters, unsigned First, +                             unsigned Last) const; + +  /// Return the number of cases in [First..Last]. +  uint64_t getJumpTableNumCases(const SmallVectorImpl<unsigned> &TotalCases, +                                unsigned First, unsigned Last) const;    /// Build a jump table cluster from Clusters[First..Last]. Returns false if it    /// decides it's not a good idea. @@ -319,14 +322,6 @@ private:    void findJumpTables(CaseClusterVector &Clusters, const SwitchInst *SI,                        MachineBasicBlock *DefaultMBB); -  /// Check whether the range [Low,High] fits in a machine word. -  bool rangeFitsInWord(const APInt &Low, const APInt &High); - -  /// Check whether these clusters are suitable for lowering with bit tests based -  /// on the number of destinations, comparison metric, and range. -  bool isSuitableForBitTests(unsigned NumDests, unsigned NumCmps, -                             const APInt &Low, const APInt &High); -    /// Build a bit test cluster from Clusters[First..Last]. Returns false if it    /// decides it's not a good idea.    bool buildBitTests(CaseClusterVector &Clusters, unsigned First, unsigned Last, @@ -609,40 +604,34 @@ public:    SelectionDAGBuilder(SelectionDAG &dag, FunctionLoweringInfo &funcinfo,                        CodeGenOpt::Level ol)      : CurInst(nullptr), SDNodeOrder(LowestSDNodeOrder), TM(dag.getTarget()), -      DAG(dag), FuncInfo(funcinfo), +      DAG(dag), DL(nullptr), AA(nullptr), FuncInfo(funcinfo),        HasTailCall(false) {    } -  void init(GCFunctionInfo *gfi, AliasAnalysis &aa, +  void init(GCFunctionInfo *gfi, AliasAnalysis *AA,              const TargetLibraryInfo *li); -  /// clear - Clear out the current SelectionDAG and the associated -  /// state and prepare this SelectionDAGBuilder object to be used -  /// for a new block. This doesn't clear out information about -  /// additional blocks that are needed to complete switch lowering -  /// or PHI node updating; that information is cleared out as it is -  /// consumed. +  /// Clear out the current SelectionDAG and the associated state and prepare +  /// this SelectionDAGBuilder object to be used for a new block. This doesn't +  /// clear out information about additional blocks that are needed to complete +  /// switch lowering or PHI node updating; that information is cleared out as +  /// it is consumed.    void clear(); -  /// clearDanglingDebugInfo - Clear the dangling debug information -  /// map. This function is separated from the clear so that debug -  /// information that is dangling in a basic block can be properly -  /// resolved in a different basic block. This allows the -  /// SelectionDAG to resolve dangling debug information attached -  /// to PHI nodes. +  /// Clear the dangling debug information map. This function is separated from +  /// the clear so that debug information that is dangling in a basic block can +  /// be properly resolved in a different basic block. This allows the +  /// SelectionDAG to resolve dangling debug information attached to PHI nodes.    void clearDanglingDebugInfo(); -  /// getRoot - Return the current virtual root of the Selection DAG, -  /// flushing any PendingLoad items. This must be done before emitting -  /// a store or any other node that may need to be ordered after any -  /// prior load instructions. -  /// +  /// Return the current virtual root of the Selection DAG, flushing any +  /// PendingLoad items. This must be done before emitting a store or any other +  /// node that may need to be ordered after any prior load instructions.    SDValue getRoot(); -  /// getControlRoot - Similar to getRoot, but instead of flushing all the -  /// PendingLoad items, flush all the PendingExports items. It is necessary -  /// to do this before emitting a terminator instruction. -  /// +  /// Similar to getRoot, but instead of flushing all the PendingLoad items, +  /// flush all the PendingExports items. It is necessary to do this before +  /// emitting a terminator instruction.    SDValue getControlRoot();    SDLoc getCurSDLoc() const { @@ -688,12 +677,13 @@ public:                              MachineBasicBlock *FBB, MachineBasicBlock *CurBB,                              MachineBasicBlock *SwitchBB,                              Instruction::BinaryOps Opc, BranchProbability TW, -                            BranchProbability FW); +                            BranchProbability FW, bool InvertCond);    void EmitBranchForMergedCondition(const Value *Cond, MachineBasicBlock *TBB,                                      MachineBasicBlock *FBB,                                      MachineBasicBlock *CurBB,                                      MachineBasicBlock *SwitchBB, -                                    BranchProbability TW, BranchProbability FW); +                                    BranchProbability TW, BranchProbability FW, +                                    bool InvertCond);    bool ShouldEmitAsBranches(const std::vector<CaseBlock> &Cases);    bool isExportableFromCurrentBlock(const Value *V, const BasicBlock *FromBB);    void CopyToExportRegsIfNeeded(const Value *V); @@ -782,6 +772,11 @@ public:                                          bool VarArgDisallowed,                                          bool ForceVoidReturnTy); +  /// Returns the type of FrameIndex and TargetFrameIndex nodes. +  MVT getFrameIndexTy() { +    return DAG.getTargetLoweringInfo().getFrameIndexTy(DAG.getDataLayout()); +  } +  private:    // Terminator instructions.    void visitRet(const ReturnInst &I); @@ -900,6 +895,7 @@ private:    void visitInlineAsm(ImmutableCallSite CS);    const char *visitIntrinsicCall(const CallInst &I, unsigned Intrinsic);    void visitTargetIntrinsic(const CallInst &I, unsigned Intrinsic); +  void visitConstrainedFPIntrinsic(const ConstrainedFPIntrinsic &FPI);    void visitVAStart(const CallInst &I);    void visitVAArg(const VAArgInst &I); @@ -913,6 +909,8 @@ private:    void visitGCRelocate(const GCRelocateInst &I);    void visitGCResult(const GCResultInst &I); +  void visitVectorReduce(const CallInst &I, unsigned Intrinsic); +    void visitUserOp1(const Instruction &I) {      llvm_unreachable("UserOp1 should not exist at instruction selection time!");    } @@ -932,7 +930,7 @@ private:    /// instruction selection, they will be inserted to the entry BB.    bool EmitFuncArgumentDbgValue(const Value *V, DILocalVariable *Variable,                                  DIExpression *Expr, DILocation *DL, -                                int64_t Offset, bool IsIndirect, +                                int64_t Offset, bool IsDbgDeclare,                                  const SDValue &N);    /// Return the next block after MBB, or nullptr if there is none. @@ -944,8 +942,8 @@ private:    /// Return the appropriate SDDbgValue based on N.    SDDbgValue *getDbgValue(SDValue N, DILocalVariable *Variable, -                          DIExpression *Expr, int64_t Offset, DebugLoc dl, -                          unsigned DbgSDNodeOrder); +                          DIExpression *Expr, int64_t Offset, +                          const DebugLoc &dl, unsigned DbgSDNodeOrder);  };  /// RegsForValue - This struct represents the registers (physical or virtual) @@ -958,62 +956,69 @@ private:  /// type.  ///  struct RegsForValue { -  /// ValueVTs - The value types of the values, which may not be legal, and +  /// The value types of the values, which may not be legal, and    /// may need be promoted or synthesized from one or more registers. -  ///    SmallVector<EVT, 4> ValueVTs; -  /// RegVTs - The value types of the registers. This is the same size as -  /// ValueVTs and it records, for each value, what the type of the assigned -  /// register or registers are. (Individual values are never synthesized -  /// from more than one type of register.) +  /// The value types of the registers. This is the same size as ValueVTs and it +  /// records, for each value, what the type of the assigned register or +  /// registers are. (Individual values are never synthesized from more than one +  /// type of register.)    ///    /// With virtual registers, the contents of RegVTs is redundant with TLI's    /// getRegisterType member function, however when with physical registers    /// it is necessary to have a separate record of the types. -  ///    SmallVector<MVT, 4> RegVTs; -  /// Regs - This list holds the registers assigned to the values. +  /// This list holds the registers assigned to the values.    /// Each legal or promoted value requires one register, and each    /// expanded value requires multiple registers. -  ///    SmallVector<unsigned, 4> Regs; +  /// This list holds the number of registers for each value. +  SmallVector<unsigned, 4> RegCount; + +  /// Records if this value needs to be treated in an ABI dependant manner, +  /// different to normal type legalization. +  bool IsABIMangled; +    RegsForValue(); -  RegsForValue(const SmallVector<unsigned, 4> ®s, MVT regvt, EVT valuevt); +  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); +               const DataLayout &DL, unsigned Reg, Type *Ty, +               bool IsABIMangledValue = false); -  /// append - Add the specified values to this one. +  /// Add the specified values to this one.    void append(const RegsForValue &RHS) {      ValueVTs.append(RHS.ValueVTs.begin(), RHS.ValueVTs.end());      RegVTs.append(RHS.RegVTs.begin(), RHS.RegVTs.end());      Regs.append(RHS.Regs.begin(), RHS.Regs.end()); +    RegCount.push_back(RHS.Regs.size());    } -  /// getCopyFromRegs - Emit a series of CopyFromReg nodes that copies from -  /// this value and returns the result as a ValueVTs value.  This uses -  /// Chain/Flag as the input and updates them for the output Chain/Flag. -  /// If the Flag pointer is NULL, no flag is used. +  /// Emit a series of CopyFromReg nodes that copies from this value and returns +  /// the result as a ValueVTs value. This uses Chain/Flag as the input and +  /// updates them for the output Chain/Flag. If the Flag pointer is NULL, no +  /// flag is used.    SDValue getCopyFromRegs(SelectionDAG &DAG, FunctionLoweringInfo &FuncInfo,                            const SDLoc &dl, SDValue &Chain, SDValue *Flag,                            const Value *V = nullptr) const; -  /// getCopyToRegs - Emit a series of CopyToReg nodes that copies the specified -  /// value into the registers specified by this object.  This uses Chain/Flag -  /// as the input and updates them for the output Chain/Flag.  If the Flag -  /// pointer is nullptr, no flag is used.  If V is not nullptr, then it is used -  /// in printing better diagnostic messages on error. +  /// Emit a series of CopyToReg nodes that copies the specified value into the +  /// registers specified by this object. This uses Chain/Flag as the input and +  /// updates them for the output Chain/Flag. If the Flag pointer is nullptr, no +  /// flag is used. If V is not nullptr, then it is used in printing better +  /// diagnostic messages on error.    void getCopyToRegs(SDValue Val, SelectionDAG &DAG, const SDLoc &dl,                       SDValue &Chain, SDValue *Flag, const Value *V = nullptr,                       ISD::NodeType PreferredExtendType = ISD::ANY_EXTEND) const; -  /// AddInlineAsmOperands - Add this value to the specified inlineasm node -  /// operand list.  This adds the code marker, matching input operand index -  /// (if applicable), and includes the number of values added into it. +  /// Add this value to the specified inlineasm node operand list. This adds the +  /// code marker, matching input operand index (if applicable), and includes +  /// the number of values added into it.    void AddInlineAsmOperands(unsigned Kind, bool HasMatching,                              unsigned MatchingIdx, const SDLoc &dl,                              SelectionDAG &DAG, std::vector<SDValue> &Ops) const;  | 
