LCOV - code coverage report
Current view: top level - lib/CodeGen/SelectionDAG - LegalizeTypes.h (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 86 86 100.0 %
Date: 2018-06-17 00:07:59 Functions: 18 18 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===-- LegalizeTypes.h - DAG Type Legalizer class definition ---*- C++ -*-===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : //
      10             : // This file defines the DAGTypeLegalizer class.  This is a private interface
      11             : // shared between the code that implements the SelectionDAG::LegalizeTypes
      12             : // method.
      13             : //
      14             : //===----------------------------------------------------------------------===//
      15             : 
      16             : #ifndef LLVM_LIB_CODEGEN_SELECTIONDAG_LEGALIZETYPES_H
      17             : #define LLVM_LIB_CODEGEN_SELECTIONDAG_LEGALIZETYPES_H
      18             : 
      19             : #include "llvm/ADT/DenseMap.h"
      20             : #include "llvm/CodeGen/SelectionDAG.h"
      21             : #include "llvm/CodeGen/TargetLowering.h"
      22             : #include "llvm/Support/Compiler.h"
      23             : #include "llvm/Support/Debug.h"
      24             : 
      25             : namespace llvm {
      26             : 
      27             : //===----------------------------------------------------------------------===//
      28             : /// This takes an arbitrary SelectionDAG as input and hacks on it until only
      29             : /// value types the target machine can handle are left. This involves promoting
      30             : /// small sizes to large sizes or splitting up large values into small values.
      31             : ///
      32      778432 : class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
      33             :   const TargetLowering &TLI;
      34             :   SelectionDAG &DAG;
      35             : public:
      36             :   /// This pass uses the NodeId on the SDNodes to hold information about the
      37             :   /// state of the node. The enum has all the values.
      38             :   enum NodeIdFlags {
      39             :     /// All operands have been processed, so this node is ready to be handled.
      40             :     ReadyToProcess = 0,
      41             : 
      42             :     /// This is a new node, not before seen, that was created in the process of
      43             :     /// legalizing some other node.
      44             :     NewNode = -1,
      45             : 
      46             :     /// This node's ID needs to be set to the number of its unprocessed
      47             :     /// operands.
      48             :     Unanalyzed = -2,
      49             : 
      50             :     /// This is a node that has already been processed.
      51             :     Processed = -3
      52             : 
      53             :     // 1+ - This is a node which has this many unprocessed operands.
      54             :   };
      55             : private:
      56             : 
      57             :   /// This is a bitvector that contains two bits for each simple value type,
      58             :   /// where the two bits correspond to the LegalizeAction enum from
      59             :   /// TargetLowering. This can be queried with "getTypeAction(VT)".
      60             :   TargetLowering::ValueTypeActionImpl ValueTypeActions;
      61             : 
      62             :   /// Return how we should legalize values of this type.
      63             :   TargetLowering::LegalizeTypeAction getTypeAction(EVT VT) const {
      64    26867844 :     return TLI.getTypeAction(*DAG.getContext(), VT);
      65             :   }
      66             : 
      67             :   /// Return true if this type is legal on this target.
      68             :   bool isTypeLegal(EVT VT) const {
      69       67312 :     return TLI.getTypeAction(*DAG.getContext(), VT) == TargetLowering::TypeLegal;
      70             :   }
      71             : 
      72             :   /// Return true if this is a simple legal type.
      73             :   bool isSimpleLegalType(EVT VT) const {
      74        3253 :     return VT.isSimple() && TLI.isTypeLegal(VT);
      75             :   }
      76             : 
      77             :   /// Return true if this type can be passed in registers.
      78             :   /// For example, x86_64's f128, should to be legally in registers
      79             :   /// and only some operations converted to library calls or integer
      80             :   /// bitwise operations.
      81        5450 :   bool isLegalInHWReg(EVT VT) const {
      82        5450 :     EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
      83        5450 :     return VT == NVT && isSimpleLegalType(VT);
      84             :   }
      85             : 
      86      177565 :   EVT getSetCCResultType(EVT VT) const {
      87      355130 :     return TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
      88             :   }
      89             : 
      90             :   /// Pretend all of this node's results are legal.
      91             :   bool IgnoreNodeResults(SDNode *N) const {
      92    57311870 :     return N->getOpcode() == ISD::TargetConstant ||
      93             :            N->getOpcode() == ISD::Register;
      94             :   }
      95             : 
      96             :   // Bijection from SDValue to unique id. As each created node gets a
      97             :   // new id we do not need to worry about reuse expunging.  Should we
      98             :   // run out of ids, we can do a one time expensive compactifcation.
      99             :   typedef unsigned TableId;
     100             : 
     101             :   TableId NextValueId = 1;
     102             : 
     103             :   SmallDenseMap<SDValue, TableId, 8> ValueToIdMap;
     104             :   SmallDenseMap<TableId, SDValue, 8> IdToValueMap;
     105             : 
     106             :   /// For integer nodes that are below legal width, this map indicates what
     107             :   /// promoted value to use.
     108             :   SmallDenseMap<TableId, TableId, 8> PromotedIntegers;
     109             : 
     110             :   /// For integer nodes that need to be expanded this map indicates which
     111             :   /// operands are the expanded version of the input.
     112             :   SmallDenseMap<TableId, std::pair<TableId, TableId>, 8> ExpandedIntegers;
     113             : 
     114             :   /// For floating-point nodes converted to integers of the same size, this map
     115             :   /// indicates the converted value to use.
     116             :   SmallDenseMap<TableId, TableId, 8> SoftenedFloats;
     117             : 
     118             :   /// For floating-point nodes that have a smaller precision than the smallest
     119             :   /// supported precision, this map indicates what promoted value to use.
     120             :   SmallDenseMap<TableId, TableId, 8> PromotedFloats;
     121             : 
     122             :   /// For float nodes that need to be expanded this map indicates which operands
     123             :   /// are the expanded version of the input.
     124             :   SmallDenseMap<TableId, std::pair<TableId, TableId>, 8> ExpandedFloats;
     125             : 
     126             :   /// For nodes that are <1 x ty>, this map indicates the scalar value of type
     127             :   /// 'ty' to use.
     128             :   SmallDenseMap<TableId, TableId, 8> ScalarizedVectors;
     129             : 
     130             :   /// For nodes that need to be split this map indicates which operands are the
     131             :   /// expanded version of the input.
     132             :   SmallDenseMap<TableId, std::pair<TableId, TableId>, 8> SplitVectors;
     133             : 
     134             :   /// For vector nodes that need to be widened, indicates the widened value to
     135             :   /// use.
     136             :   SmallDenseMap<TableId, TableId, 8> WidenedVectors;
     137             : 
     138             :   /// For values that have been replaced with another, indicates the replacement
     139             :   /// value to use.
     140             :   SmallDenseMap<TableId, TableId, 8> ReplacedValues;
     141             : 
     142             :   /// This defines a worklist of nodes to process. In order to be pushed onto
     143             :   /// this worklist, all operands of a node must have already been processed.
     144             :   SmallVector<SDNode*, 128> Worklist;
     145             : 
     146     6878156 :   TableId getTableId(SDValue V) {
     147             :     assert(V.getNode() && "Getting TableId on SDValue()");
     148             : 
     149     6878156 :     auto I = ValueToIdMap.find(V);
     150     6878156 :     if (I != ValueToIdMap.end()) {
     151             :       // replace if there's been a shift.
     152     3963601 :       RemapId(I->second);
     153             :       assert(I->second && "All Ids should be nonzero");
     154     3963601 :       return I->second;
     155             :     }
     156             :     // Add if it's not there.
     157     5829110 :     ValueToIdMap.insert(std::make_pair(V, NextValueId));
     158     5829110 :     IdToValueMap.insert(std::make_pair(NextValueId, V));
     159     2914555 :     ++NextValueId;
     160             :     assert(NextValueId != 0 &&
     161             :            "Ran out of Ids. Increase id type size or add compactification");
     162     2914555 :     return NextValueId - 1;
     163             :   }
     164             : 
     165             :   const SDValue &getSDValue(TableId &Id) {
     166     4747398 :     RemapId(Id);
     167             :     assert(Id && "TableId should be non-zero");
     168     4146559 :     return IdToValueMap[Id];
     169             :   }
     170             : 
     171             : public:
     172      389216 :   explicit DAGTypeLegalizer(SelectionDAG &dag)
     173      389216 :     : TLI(dag.getTargetLoweringInfo()), DAG(dag),
     174     4281376 :     ValueTypeActions(TLI.getValueTypeActions()) {
     175             :     static_assert(MVT::LAST_VALUETYPE <= MVT::MAX_ALLOWED_VALUETYPE,
     176             :                   "Too many value types for ValueTypeActions to hold!");
     177      389216 :   }
     178             : 
     179             :   /// This is the main entry point for the type legalizer.  This does a
     180             :   /// top-down traversal of the dag, legalizing types as it goes.  Returns
     181             :   /// "true" if it made any changes.
     182             :   bool run();
     183             : 
     184         293 :   void NoteDeletion(SDNode *Old, SDNode *New) {
     185        1174 :     for (unsigned i = 0, e = Old->getNumValues(); i != e; ++i) {
     186         294 :       TableId NewId = getTableId(SDValue(New, i));
     187         294 :       TableId OldId = getTableId(SDValue(Old, i));
     188             : 
     189         588 :       ReplacedValues[OldId] = NewId;
     190             : 
     191             :       // Delete Node from tables.
     192         588 :       ValueToIdMap.erase(SDValue(Old, i));
     193         294 :       IdToValueMap.erase(OldId);
     194         294 :       PromotedIntegers.erase(OldId);
     195         294 :       ExpandedIntegers.erase(OldId);
     196         294 :       SoftenedFloats.erase(OldId);
     197         294 :       PromotedFloats.erase(OldId);
     198         294 :       ExpandedFloats.erase(OldId);
     199         294 :       ScalarizedVectors.erase(OldId);
     200         294 :       SplitVectors.erase(OldId);
     201         294 :       WidenedVectors.erase(OldId);
     202             :     }
     203         293 :   }
     204             : 
     205             :   SelectionDAG &getDAG() const { return DAG; }
     206             : 
     207             : private:
     208             :   SDNode *AnalyzeNewNode(SDNode *N);
     209             :   void AnalyzeNewValue(SDValue &Val);
     210             :   void PerformExpensiveChecks();
     211             :   void RemapId(TableId &N);
     212             :   void RemapValue(SDValue &V);
     213             : 
     214             :   // Common routines.
     215             :   SDValue BitConvertToInteger(SDValue Op);
     216             :   SDValue BitConvertVectorToIntegerVector(SDValue Op);
     217             :   SDValue CreateStackStoreLoad(SDValue Op, EVT DestVT);
     218             :   bool CustomLowerNode(SDNode *N, EVT VT, bool LegalizeResult);
     219             :   bool CustomWidenLowerNode(SDNode *N, EVT VT);
     220             : 
     221             :   /// Replace each result of the given MERGE_VALUES node with the corresponding
     222             :   /// input operand, except for the result 'ResNo', for which the corresponding
     223             :   /// input operand is returned.
     224             :   SDValue DisintegrateMERGE_VALUES(SDNode *N, unsigned ResNo);
     225             : 
     226             :   SDValue JoinIntegers(SDValue Lo, SDValue Hi);
     227             :   SDValue LibCallify(RTLIB::Libcall LC, SDNode *N, bool isSigned);
     228             : 
     229             :   std::pair<SDValue, SDValue> ExpandChainLibCall(RTLIB::Libcall LC,
     230             :                                                  SDNode *Node, bool isSigned);
     231             :   std::pair<SDValue, SDValue> ExpandAtomic(SDNode *Node);
     232             : 
     233             :   SDValue PromoteTargetBoolean(SDValue Bool, EVT ValVT);
     234             : 
     235             :   void ReplaceValueWith(SDValue From, SDValue To);
     236             :   void SplitInteger(SDValue Op, SDValue &Lo, SDValue &Hi);
     237             :   void SplitInteger(SDValue Op, EVT LoVT, EVT HiVT,
     238             :                     SDValue &Lo, SDValue &Hi);
     239             : 
     240             :   void AddToWorklist(SDNode *N) {
     241             :     N->setNodeId(ReadyToProcess);
     242     4167306 :     Worklist.push_back(N);
     243             :   }
     244             : 
     245             :   //===--------------------------------------------------------------------===//
     246             :   // Integer Promotion Support: LegalizeIntegerTypes.cpp
     247             :   //===--------------------------------------------------------------------===//
     248             : 
     249             :   /// Given a processed operand Op which was promoted to a larger integer type,
     250             :   /// this returns the promoted value. The low bits of the promoted value
     251             :   /// corresponding to the original type are exactly equal to Op.
     252             :   /// The extra bits contain rubbish, so the promoted value may need to be zero-
     253             :   /// or sign-extended from the original type before it is usable (the helpers
     254             :   /// SExtPromotedInteger and ZExtPromotedInteger can do this for you).
     255             :   /// For example, if Op is an i16 and was promoted to an i32, then this method
     256             :   /// returns an i32, the lower 16 bits of which coincide with Op, and the upper
     257             :   /// 16 bits of which contain rubbish.
     258      201190 :   SDValue GetPromotedInteger(SDValue Op) {
     259      402380 :     TableId &PromotedId = PromotedIntegers[getTableId(Op)];
     260      201190 :     SDValue PromotedOp = getSDValue(PromotedId);
     261             :     assert(PromotedOp.getNode() && "Operand wasn't promoted?");
     262      201190 :     return PromotedOp;
     263             :   }
     264             :   void SetPromotedInteger(SDValue Op, SDValue Result);
     265             : 
     266             :   /// Get a promoted operand and sign extend it to the final size.
     267        2003 :   SDValue SExtPromotedInteger(SDValue Op) {
     268        2003 :     EVT OldVT = Op.getValueType();
     269             :     SDLoc dl(Op);
     270        2003 :     Op = GetPromotedInteger(Op);
     271        2003 :     return DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Op.getValueType(), Op,
     272        6009 :                        DAG.getValueType(OldVT));
     273             :   }
     274             : 
     275             :   /// Get a promoted operand and zero extend it to the final size.
     276       13803 :   SDValue ZExtPromotedInteger(SDValue Op) {
     277       13803 :     EVT OldVT = Op.getValueType();
     278             :     SDLoc dl(Op);
     279       13803 :     Op = GetPromotedInteger(Op);
     280       27606 :     return DAG.getZeroExtendInReg(Op, dl, OldVT.getScalarType());
     281             :   }
     282             : 
     283             :   // Integer Result Promotion.
     284             :   void PromoteIntegerResult(SDNode *N, unsigned ResNo);
     285             :   SDValue PromoteIntRes_MERGE_VALUES(SDNode *N, unsigned ResNo);
     286             :   SDValue PromoteIntRes_AssertSext(SDNode *N);
     287             :   SDValue PromoteIntRes_AssertZext(SDNode *N);
     288             :   SDValue PromoteIntRes_Atomic0(AtomicSDNode *N);
     289             :   SDValue PromoteIntRes_Atomic1(AtomicSDNode *N);
     290             :   SDValue PromoteIntRes_AtomicCmpSwap(AtomicSDNode *N, unsigned ResNo);
     291             :   SDValue PromoteIntRes_EXTRACT_SUBVECTOR(SDNode *N);
     292             :   SDValue PromoteIntRes_VECTOR_SHUFFLE(SDNode *N);
     293             :   SDValue PromoteIntRes_BUILD_VECTOR(SDNode *N);
     294             :   SDValue PromoteIntRes_SCALAR_TO_VECTOR(SDNode *N);
     295             :   SDValue PromoteIntRes_EXTEND_VECTOR_INREG(SDNode *N);
     296             :   SDValue PromoteIntRes_INSERT_VECTOR_ELT(SDNode *N);
     297             :   SDValue PromoteIntRes_CONCAT_VECTORS(SDNode *N);
     298             :   SDValue PromoteIntRes_BITCAST(SDNode *N);
     299             :   SDValue PromoteIntRes_BSWAP(SDNode *N);
     300             :   SDValue PromoteIntRes_BITREVERSE(SDNode *N);
     301             :   SDValue PromoteIntRes_BUILD_PAIR(SDNode *N);
     302             :   SDValue PromoteIntRes_Constant(SDNode *N);
     303             :   SDValue PromoteIntRes_CTLZ(SDNode *N);
     304             :   SDValue PromoteIntRes_CTPOP(SDNode *N);
     305             :   SDValue PromoteIntRes_CTTZ(SDNode *N);
     306             :   SDValue PromoteIntRes_EXTRACT_VECTOR_ELT(SDNode *N);
     307             :   SDValue PromoteIntRes_FP_TO_XINT(SDNode *N);
     308             :   SDValue PromoteIntRes_FP_TO_FP16(SDNode *N);
     309             :   SDValue PromoteIntRes_INT_EXTEND(SDNode *N);
     310             :   SDValue PromoteIntRes_LOAD(LoadSDNode *N);
     311             :   SDValue PromoteIntRes_MLOAD(MaskedLoadSDNode *N);
     312             :   SDValue PromoteIntRes_MGATHER(MaskedGatherSDNode *N);
     313             :   SDValue PromoteIntRes_Overflow(SDNode *N);
     314             :   SDValue PromoteIntRes_SADDSUBO(SDNode *N, unsigned ResNo);
     315             :   SDValue PromoteIntRes_SELECT(SDNode *N);
     316             :   SDValue PromoteIntRes_VSELECT(SDNode *N);
     317             :   SDValue PromoteIntRes_SELECT_CC(SDNode *N);
     318             :   SDValue PromoteIntRes_SETCC(SDNode *N);
     319             :   SDValue PromoteIntRes_SHL(SDNode *N);
     320             :   SDValue PromoteIntRes_SimpleIntBinOp(SDNode *N);
     321             :   SDValue PromoteIntRes_ZExtIntBinOp(SDNode *N);
     322             :   SDValue PromoteIntRes_SExtIntBinOp(SDNode *N);
     323             :   SDValue PromoteIntRes_SIGN_EXTEND_INREG(SDNode *N);
     324             :   SDValue PromoteIntRes_SRA(SDNode *N);
     325             :   SDValue PromoteIntRes_SRL(SDNode *N);
     326             :   SDValue PromoteIntRes_TRUNCATE(SDNode *N);
     327             :   SDValue PromoteIntRes_UADDSUBO(SDNode *N, unsigned ResNo);
     328             :   SDValue PromoteIntRes_ADDSUBCARRY(SDNode *N, unsigned ResNo);
     329             :   SDValue PromoteIntRes_UNDEF(SDNode *N);
     330             :   SDValue PromoteIntRes_VAARG(SDNode *N);
     331             :   SDValue PromoteIntRes_XMULO(SDNode *N, unsigned ResNo);
     332             : 
     333             :   // Integer Operand Promotion.
     334             :   bool PromoteIntegerOperand(SDNode *N, unsigned OperandNo);
     335             :   SDValue PromoteIntOp_ANY_EXTEND(SDNode *N);
     336             :   SDValue PromoteIntOp_ATOMIC_STORE(AtomicSDNode *N);
     337             :   SDValue PromoteIntOp_BITCAST(SDNode *N);
     338             :   SDValue PromoteIntOp_BUILD_PAIR(SDNode *N);
     339             :   SDValue PromoteIntOp_BR_CC(SDNode *N, unsigned OpNo);
     340             :   SDValue PromoteIntOp_BRCOND(SDNode *N, unsigned OpNo);
     341             :   SDValue PromoteIntOp_BUILD_VECTOR(SDNode *N);
     342             :   SDValue PromoteIntOp_INSERT_VECTOR_ELT(SDNode *N, unsigned OpNo);
     343             :   SDValue PromoteIntOp_EXTRACT_VECTOR_ELT(SDNode *N);
     344             :   SDValue PromoteIntOp_EXTRACT_SUBVECTOR(SDNode *N);
     345             :   SDValue PromoteIntOp_CONCAT_VECTORS(SDNode *N);
     346             :   SDValue PromoteIntOp_SCALAR_TO_VECTOR(SDNode *N);
     347             :   SDValue PromoteIntOp_SELECT(SDNode *N, unsigned OpNo);
     348             :   SDValue PromoteIntOp_SELECT_CC(SDNode *N, unsigned OpNo);
     349             :   SDValue PromoteIntOp_SETCC(SDNode *N, unsigned OpNo);
     350             :   SDValue PromoteIntOp_Shift(SDNode *N);
     351             :   SDValue PromoteIntOp_SIGN_EXTEND(SDNode *N);
     352             :   SDValue PromoteIntOp_SINT_TO_FP(SDNode *N);
     353             :   SDValue PromoteIntOp_STORE(StoreSDNode *N, unsigned OpNo);
     354             :   SDValue PromoteIntOp_TRUNCATE(SDNode *N);
     355             :   SDValue PromoteIntOp_UINT_TO_FP(SDNode *N);
     356             :   SDValue PromoteIntOp_ZERO_EXTEND(SDNode *N);
     357             :   SDValue PromoteIntOp_MSTORE(MaskedStoreSDNode *N, unsigned OpNo);
     358             :   SDValue PromoteIntOp_MLOAD(MaskedLoadSDNode *N, unsigned OpNo);
     359             :   SDValue PromoteIntOp_MSCATTER(MaskedScatterSDNode *N, unsigned OpNo);
     360             :   SDValue PromoteIntOp_MGATHER(MaskedGatherSDNode *N, unsigned OpNo);
     361             :   SDValue PromoteIntOp_ADDSUBCARRY(SDNode *N, unsigned OpNo);
     362             : 
     363             :   void PromoteSetCCOperands(SDValue &LHS,SDValue &RHS, ISD::CondCode Code);
     364             : 
     365             :   //===--------------------------------------------------------------------===//
     366             :   // Integer Expansion Support: LegalizeIntegerTypes.cpp
     367             :   //===--------------------------------------------------------------------===//
     368             : 
     369             :   /// Given a processed operand Op which was expanded into two integers of half
     370             :   /// the size, this returns the two halves. The low bits of Op are exactly
     371             :   /// equal to the bits of Lo; the high bits exactly equal Hi.
     372             :   /// For example, if Op is an i64 which was expanded into two i32's, then this
     373             :   /// method returns the two i32's, with Lo being equal to the lower 32 bits of
     374             :   /// Op, and Hi being equal to the upper 32 bits.
     375             :   void GetExpandedInteger(SDValue Op, SDValue &Lo, SDValue &Hi);
     376             :   void SetExpandedInteger(SDValue Op, SDValue Lo, SDValue Hi);
     377             : 
     378             :   // Integer Result Expansion.
     379             :   void ExpandIntegerResult(SDNode *N, unsigned ResNo);
     380             :   void ExpandIntRes_ANY_EXTEND        (SDNode *N, SDValue &Lo, SDValue &Hi);
     381             :   void ExpandIntRes_AssertSext        (SDNode *N, SDValue &Lo, SDValue &Hi);
     382             :   void ExpandIntRes_AssertZext        (SDNode *N, SDValue &Lo, SDValue &Hi);
     383             :   void ExpandIntRes_Constant          (SDNode *N, SDValue &Lo, SDValue &Hi);
     384             :   void ExpandIntRes_CTLZ              (SDNode *N, SDValue &Lo, SDValue &Hi);
     385             :   void ExpandIntRes_CTPOP             (SDNode *N, SDValue &Lo, SDValue &Hi);
     386             :   void ExpandIntRes_CTTZ              (SDNode *N, SDValue &Lo, SDValue &Hi);
     387             :   void ExpandIntRes_LOAD          (LoadSDNode *N, SDValue &Lo, SDValue &Hi);
     388             :   void ExpandIntRes_READCYCLECOUNTER  (SDNode *N, SDValue &Lo, SDValue &Hi);
     389             :   void ExpandIntRes_SIGN_EXTEND       (SDNode *N, SDValue &Lo, SDValue &Hi);
     390             :   void ExpandIntRes_SIGN_EXTEND_INREG (SDNode *N, SDValue &Lo, SDValue &Hi);
     391             :   void ExpandIntRes_TRUNCATE          (SDNode *N, SDValue &Lo, SDValue &Hi);
     392             :   void ExpandIntRes_ZERO_EXTEND       (SDNode *N, SDValue &Lo, SDValue &Hi);
     393             :   void ExpandIntRes_FLT_ROUNDS        (SDNode *N, SDValue &Lo, SDValue &Hi);
     394             :   void ExpandIntRes_FP_TO_SINT        (SDNode *N, SDValue &Lo, SDValue &Hi);
     395             :   void ExpandIntRes_FP_TO_UINT        (SDNode *N, SDValue &Lo, SDValue &Hi);
     396             : 
     397             :   void ExpandIntRes_Logical           (SDNode *N, SDValue &Lo, SDValue &Hi);
     398             :   void ExpandIntRes_ADDSUB            (SDNode *N, SDValue &Lo, SDValue &Hi);
     399             :   void ExpandIntRes_ADDSUBC           (SDNode *N, SDValue &Lo, SDValue &Hi);
     400             :   void ExpandIntRes_ADDSUBE           (SDNode *N, SDValue &Lo, SDValue &Hi);
     401             :   void ExpandIntRes_ADDSUBCARRY       (SDNode *N, SDValue &Lo, SDValue &Hi);
     402             :   void ExpandIntRes_BITREVERSE        (SDNode *N, SDValue &Lo, SDValue &Hi);
     403             :   void ExpandIntRes_BSWAP             (SDNode *N, SDValue &Lo, SDValue &Hi);
     404             :   void ExpandIntRes_MUL               (SDNode *N, SDValue &Lo, SDValue &Hi);
     405             :   void ExpandIntRes_SDIV              (SDNode *N, SDValue &Lo, SDValue &Hi);
     406             :   void ExpandIntRes_SREM              (SDNode *N, SDValue &Lo, SDValue &Hi);
     407             :   void ExpandIntRes_UDIV              (SDNode *N, SDValue &Lo, SDValue &Hi);
     408             :   void ExpandIntRes_UREM              (SDNode *N, SDValue &Lo, SDValue &Hi);
     409             :   void ExpandIntRes_Shift             (SDNode *N, SDValue &Lo, SDValue &Hi);
     410             : 
     411             :   void ExpandIntRes_MINMAX            (SDNode *N, SDValue &Lo, SDValue &Hi);
     412             : 
     413             :   void ExpandIntRes_SADDSUBO          (SDNode *N, SDValue &Lo, SDValue &Hi);
     414             :   void ExpandIntRes_UADDSUBO          (SDNode *N, SDValue &Lo, SDValue &Hi);
     415             :   void ExpandIntRes_XMULO             (SDNode *N, SDValue &Lo, SDValue &Hi);
     416             : 
     417             :   void ExpandIntRes_ATOMIC_LOAD       (SDNode *N, SDValue &Lo, SDValue &Hi);
     418             : 
     419             :   void ExpandShiftByConstant(SDNode *N, const APInt &Amt,
     420             :                              SDValue &Lo, SDValue &Hi);
     421             :   bool ExpandShiftWithKnownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi);
     422             :   bool ExpandShiftWithUnknownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi);
     423             : 
     424             :   // Integer Operand Expansion.
     425             :   bool ExpandIntegerOperand(SDNode *N, unsigned OperandNo);
     426             :   SDValue ExpandIntOp_BR_CC(SDNode *N);
     427             :   SDValue ExpandIntOp_SELECT_CC(SDNode *N);
     428             :   SDValue ExpandIntOp_SETCC(SDNode *N);
     429             :   SDValue ExpandIntOp_SETCCCARRY(SDNode *N);
     430             :   SDValue ExpandIntOp_Shift(SDNode *N);
     431             :   SDValue ExpandIntOp_SINT_TO_FP(SDNode *N);
     432             :   SDValue ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo);
     433             :   SDValue ExpandIntOp_TRUNCATE(SDNode *N);
     434             :   SDValue ExpandIntOp_UINT_TO_FP(SDNode *N);
     435             :   SDValue ExpandIntOp_RETURNADDR(SDNode *N);
     436             :   SDValue ExpandIntOp_ATOMIC_STORE(SDNode *N);
     437             : 
     438             :   void IntegerExpandSetCCOperands(SDValue &NewLHS, SDValue &NewRHS,
     439             :                                   ISD::CondCode &CCCode, const SDLoc &dl);
     440             : 
     441             :   //===--------------------------------------------------------------------===//
     442             :   // Float to Integer Conversion Support: LegalizeFloatTypes.cpp
     443             :   //===--------------------------------------------------------------------===//
     444             : 
     445             :   /// Given an operand Op of Float type, returns the integer if the Op is not
     446             :   /// supported in target HW and converted to the integer.
     447             :   /// The integer contains exactly the same bits as Op - only the type changed.
     448             :   /// For example, if Op is an f32 which was softened to an i32, then this
     449             :   /// method returns an i32, the bits of which coincide with those of Op.
     450             :   /// If the Op can be efficiently supported in target HW or the operand must
     451             :   /// stay in a register, the Op is not converted to an integer.
     452             :   /// In that case, the given op is returned.
     453        3936 :   SDValue GetSoftenedFloat(SDValue Op) {
     454        3936 :     TableId Id = getTableId(Op);
     455        3936 :     auto Iter = SoftenedFloats.find(Id);
     456        3936 :     if (Iter == SoftenedFloats.end()) {
     457             :       assert(isSimpleLegalType(Op.getValueType()) &&
     458             :              "Operand wasn't converted to integer?");
     459         609 :       return Op;
     460             :     }
     461        6654 :     SDValue SoftenedOp = getSDValue(Iter->second);
     462             :     assert(SoftenedOp.getNode() && "Unconverted op in SoftenedFloats?");
     463        3327 :     return SoftenedOp;
     464             :   }
     465             :   void SetSoftenedFloat(SDValue Op, SDValue Result);
     466             : 
     467             :   // Convert Float Results to Integer for Non-HW-supported Operations.
     468             :   bool SoftenFloatResult(SDNode *N, unsigned ResNo);
     469             :   SDValue SoftenFloatRes_MERGE_VALUES(SDNode *N, unsigned ResNo);
     470             :   SDValue SoftenFloatRes_BITCAST(SDNode *N, unsigned ResNo);
     471             :   SDValue SoftenFloatRes_BUILD_PAIR(SDNode *N);
     472             :   SDValue SoftenFloatRes_ConstantFP(SDNode *N, unsigned ResNo);
     473             :   SDValue SoftenFloatRes_EXTRACT_VECTOR_ELT(SDNode *N, unsigned ResNo);
     474             :   SDValue SoftenFloatRes_FABS(SDNode *N, unsigned ResNo);
     475             :   SDValue SoftenFloatRes_FMINNUM(SDNode *N);
     476             :   SDValue SoftenFloatRes_FMAXNUM(SDNode *N);
     477             :   SDValue SoftenFloatRes_FADD(SDNode *N);
     478             :   SDValue SoftenFloatRes_FCEIL(SDNode *N);
     479             :   SDValue SoftenFloatRes_FCOPYSIGN(SDNode *N, unsigned ResNo);
     480             :   SDValue SoftenFloatRes_FCOS(SDNode *N);
     481             :   SDValue SoftenFloatRes_FDIV(SDNode *N);
     482             :   SDValue SoftenFloatRes_FEXP(SDNode *N);
     483             :   SDValue SoftenFloatRes_FEXP2(SDNode *N);
     484             :   SDValue SoftenFloatRes_FFLOOR(SDNode *N);
     485             :   SDValue SoftenFloatRes_FLOG(SDNode *N);
     486             :   SDValue SoftenFloatRes_FLOG2(SDNode *N);
     487             :   SDValue SoftenFloatRes_FLOG10(SDNode *N);
     488             :   SDValue SoftenFloatRes_FMA(SDNode *N);
     489             :   SDValue SoftenFloatRes_FMUL(SDNode *N);
     490             :   SDValue SoftenFloatRes_FNEARBYINT(SDNode *N);
     491             :   SDValue SoftenFloatRes_FNEG(SDNode *N, unsigned ResNo);
     492             :   SDValue SoftenFloatRes_FP_EXTEND(SDNode *N);
     493             :   SDValue SoftenFloatRes_FP16_TO_FP(SDNode *N);
     494             :   SDValue SoftenFloatRes_FP_ROUND(SDNode *N);
     495             :   SDValue SoftenFloatRes_FPOW(SDNode *N);
     496             :   SDValue SoftenFloatRes_FPOWI(SDNode *N);
     497             :   SDValue SoftenFloatRes_FREM(SDNode *N);
     498             :   SDValue SoftenFloatRes_FRINT(SDNode *N);
     499             :   SDValue SoftenFloatRes_FROUND(SDNode *N);
     500             :   SDValue SoftenFloatRes_FSIN(SDNode *N);
     501             :   SDValue SoftenFloatRes_FSQRT(SDNode *N);
     502             :   SDValue SoftenFloatRes_FSUB(SDNode *N);
     503             :   SDValue SoftenFloatRes_FTRUNC(SDNode *N);
     504             :   SDValue SoftenFloatRes_LOAD(SDNode *N, unsigned ResNo);
     505             :   SDValue SoftenFloatRes_SELECT(SDNode *N, unsigned ResNo);
     506             :   SDValue SoftenFloatRes_SELECT_CC(SDNode *N, unsigned ResNo);
     507             :   SDValue SoftenFloatRes_UNDEF(SDNode *N);
     508             :   SDValue SoftenFloatRes_VAARG(SDNode *N);
     509             :   SDValue SoftenFloatRes_XINT_TO_FP(SDNode *N);
     510             : 
     511             :   // Return true if we can skip softening the given operand or SDNode because
     512             :   // either it was soften before by SoftenFloatResult and references to the 
     513             :   // operand were replaced by ReplaceValueWith or it's value type is legal in HW
     514             :   // registers and the operand can be left unchanged.
     515             :   bool CanSkipSoftenFloatOperand(SDNode *N, unsigned OpNo);
     516             : 
     517             :   // Convert Float Operand to Integer for Non-HW-supported Operations.
     518             :   bool SoftenFloatOperand(SDNode *N, unsigned OpNo);
     519             :   SDValue SoftenFloatOp_BITCAST(SDNode *N);
     520             :   SDValue SoftenFloatOp_COPY_TO_REG(SDNode *N);
     521             :   SDValue SoftenFloatOp_BR_CC(SDNode *N);
     522             :   SDValue SoftenFloatOp_FABS(SDNode *N);
     523             :   SDValue SoftenFloatOp_FCOPYSIGN(SDNode *N);
     524             :   SDValue SoftenFloatOp_FNEG(SDNode *N);
     525             :   SDValue SoftenFloatOp_FP_EXTEND(SDNode *N);
     526             :   SDValue SoftenFloatOp_FP_ROUND(SDNode *N);
     527             :   SDValue SoftenFloatOp_FP_TO_XINT(SDNode *N);
     528             :   SDValue SoftenFloatOp_SELECT(SDNode *N);
     529             :   SDValue SoftenFloatOp_SELECT_CC(SDNode *N);
     530             :   SDValue SoftenFloatOp_SETCC(SDNode *N);
     531             :   SDValue SoftenFloatOp_STORE(SDNode *N, unsigned OpNo);
     532             : 
     533             :   //===--------------------------------------------------------------------===//
     534             :   // Float Expansion Support: LegalizeFloatTypes.cpp
     535             :   //===--------------------------------------------------------------------===//
     536             : 
     537             :   /// Given a processed operand Op which was expanded into two floating-point
     538             :   /// values of half the size, this returns the two halves.
     539             :   /// The low bits of Op are exactly equal to the bits of Lo; the high bits
     540             :   /// exactly equal Hi.  For example, if Op is a ppcf128 which was expanded
     541             :   /// into two f64's, then this method returns the two f64's, with Lo being
     542             :   /// equal to the lower 64 bits of Op, and Hi to the upper 64 bits.
     543             :   void GetExpandedFloat(SDValue Op, SDValue &Lo, SDValue &Hi);
     544             :   void SetExpandedFloat(SDValue Op, SDValue Lo, SDValue Hi);
     545             : 
     546             :   // Float Result Expansion.
     547             :   void ExpandFloatResult(SDNode *N, unsigned ResNo);
     548             :   void ExpandFloatRes_ConstantFP(SDNode *N, SDValue &Lo, SDValue &Hi);
     549             :   void ExpandFloatRes_FABS      (SDNode *N, SDValue &Lo, SDValue &Hi);
     550             :   void ExpandFloatRes_FMINNUM   (SDNode *N, SDValue &Lo, SDValue &Hi);
     551             :   void ExpandFloatRes_FMAXNUM   (SDNode *N, SDValue &Lo, SDValue &Hi);
     552             :   void ExpandFloatRes_FADD      (SDNode *N, SDValue &Lo, SDValue &Hi);
     553             :   void ExpandFloatRes_FCEIL     (SDNode *N, SDValue &Lo, SDValue &Hi);
     554             :   void ExpandFloatRes_FCOPYSIGN (SDNode *N, SDValue &Lo, SDValue &Hi);
     555             :   void ExpandFloatRes_FCOS      (SDNode *N, SDValue &Lo, SDValue &Hi);
     556             :   void ExpandFloatRes_FDIV      (SDNode *N, SDValue &Lo, SDValue &Hi);
     557             :   void ExpandFloatRes_FEXP      (SDNode *N, SDValue &Lo, SDValue &Hi);
     558             :   void ExpandFloatRes_FEXP2     (SDNode *N, SDValue &Lo, SDValue &Hi);
     559             :   void ExpandFloatRes_FFLOOR    (SDNode *N, SDValue &Lo, SDValue &Hi);
     560             :   void ExpandFloatRes_FLOG      (SDNode *N, SDValue &Lo, SDValue &Hi);
     561             :   void ExpandFloatRes_FLOG2     (SDNode *N, SDValue &Lo, SDValue &Hi);
     562             :   void ExpandFloatRes_FLOG10    (SDNode *N, SDValue &Lo, SDValue &Hi);
     563             :   void ExpandFloatRes_FMA       (SDNode *N, SDValue &Lo, SDValue &Hi);
     564             :   void ExpandFloatRes_FMUL      (SDNode *N, SDValue &Lo, SDValue &Hi);
     565             :   void ExpandFloatRes_FNEARBYINT(SDNode *N, SDValue &Lo, SDValue &Hi);
     566             :   void ExpandFloatRes_FNEG      (SDNode *N, SDValue &Lo, SDValue &Hi);
     567             :   void ExpandFloatRes_FP_EXTEND (SDNode *N, SDValue &Lo, SDValue &Hi);
     568             :   void ExpandFloatRes_FPOW      (SDNode *N, SDValue &Lo, SDValue &Hi);
     569             :   void ExpandFloatRes_FPOWI     (SDNode *N, SDValue &Lo, SDValue &Hi);
     570             :   void ExpandFloatRes_FREM      (SDNode *N, SDValue &Lo, SDValue &Hi);
     571             :   void ExpandFloatRes_FRINT     (SDNode *N, SDValue &Lo, SDValue &Hi);
     572             :   void ExpandFloatRes_FROUND    (SDNode *N, SDValue &Lo, SDValue &Hi);
     573             :   void ExpandFloatRes_FSIN      (SDNode *N, SDValue &Lo, SDValue &Hi);
     574             :   void ExpandFloatRes_FSQRT     (SDNode *N, SDValue &Lo, SDValue &Hi);
     575             :   void ExpandFloatRes_FSUB      (SDNode *N, SDValue &Lo, SDValue &Hi);
     576             :   void ExpandFloatRes_FTRUNC    (SDNode *N, SDValue &Lo, SDValue &Hi);
     577             :   void ExpandFloatRes_LOAD      (SDNode *N, SDValue &Lo, SDValue &Hi);
     578             :   void ExpandFloatRes_XINT_TO_FP(SDNode *N, SDValue &Lo, SDValue &Hi);
     579             : 
     580             :   // Float Operand Expansion.
     581             :   bool ExpandFloatOperand(SDNode *N, unsigned OperandNo);
     582             :   SDValue ExpandFloatOp_BR_CC(SDNode *N);
     583             :   SDValue ExpandFloatOp_FCOPYSIGN(SDNode *N);
     584             :   SDValue ExpandFloatOp_FP_ROUND(SDNode *N);
     585             :   SDValue ExpandFloatOp_FP_TO_SINT(SDNode *N);
     586             :   SDValue ExpandFloatOp_FP_TO_UINT(SDNode *N);
     587             :   SDValue ExpandFloatOp_SELECT_CC(SDNode *N);
     588             :   SDValue ExpandFloatOp_SETCC(SDNode *N);
     589             :   SDValue ExpandFloatOp_STORE(SDNode *N, unsigned OpNo);
     590             : 
     591             :   void FloatExpandSetCCOperands(SDValue &NewLHS, SDValue &NewRHS,
     592             :                                 ISD::CondCode &CCCode, const SDLoc &dl);
     593             : 
     594             :   //===--------------------------------------------------------------------===//
     595             :   // Float promotion support: LegalizeFloatTypes.cpp
     596             :   //===--------------------------------------------------------------------===//
     597             : 
     598        5598 :   SDValue GetPromotedFloat(SDValue Op) {
     599       11196 :     TableId &PromotedId = PromotedFloats[getTableId(Op)];
     600        5598 :     SDValue PromotedOp = getSDValue(PromotedId);
     601             :     assert(PromotedOp.getNode() && "Operand wasn't promoted?");
     602        5598 :     return PromotedOp;
     603             :   }
     604             :   void SetPromotedFloat(SDValue Op, SDValue Result);
     605             : 
     606             :   void PromoteFloatResult(SDNode *N, unsigned ResNo);
     607             :   SDValue PromoteFloatRes_BITCAST(SDNode *N);
     608             :   SDValue PromoteFloatRes_BinOp(SDNode *N);
     609             :   SDValue PromoteFloatRes_ConstantFP(SDNode *N);
     610             :   SDValue PromoteFloatRes_EXTRACT_VECTOR_ELT(SDNode *N);
     611             :   SDValue PromoteFloatRes_FCOPYSIGN(SDNode *N);
     612             :   SDValue PromoteFloatRes_FMAD(SDNode *N);
     613             :   SDValue PromoteFloatRes_FPOWI(SDNode *N);
     614             :   SDValue PromoteFloatRes_FP_ROUND(SDNode *N);
     615             :   SDValue PromoteFloatRes_LOAD(SDNode *N);
     616             :   SDValue PromoteFloatRes_SELECT(SDNode *N);
     617             :   SDValue PromoteFloatRes_SELECT_CC(SDNode *N);
     618             :   SDValue PromoteFloatRes_UnaryOp(SDNode *N);
     619             :   SDValue PromoteFloatRes_UNDEF(SDNode *N);
     620             :   SDValue PromoteFloatRes_XINT_TO_FP(SDNode *N);
     621             : 
     622             :   bool PromoteFloatOperand(SDNode *N, unsigned ResNo);
     623             :   SDValue PromoteFloatOp_BITCAST(SDNode *N, unsigned OpNo);
     624             :   SDValue PromoteFloatOp_FCOPYSIGN(SDNode *N, unsigned OpNo);
     625             :   SDValue PromoteFloatOp_FP_EXTEND(SDNode *N, unsigned OpNo);
     626             :   SDValue PromoteFloatOp_FP_TO_XINT(SDNode *N, unsigned OpNo);
     627             :   SDValue PromoteFloatOp_STORE(SDNode *N, unsigned OpNo);
     628             :   SDValue PromoteFloatOp_SELECT_CC(SDNode *N, unsigned OpNo);
     629             :   SDValue PromoteFloatOp_SETCC(SDNode *N, unsigned OpNo);
     630             : 
     631             :   //===--------------------------------------------------------------------===//
     632             :   // Scalarization Support: LegalizeVectorTypes.cpp
     633             :   //===--------------------------------------------------------------------===//
     634             : 
     635             :   /// Given a processed one-element vector Op which was scalarized to its
     636             :   /// element type, this returns the element. For example, if Op is a v1i32,
     637             :   /// Op = < i32 val >, this method returns val, an i32.
     638       55725 :   SDValue GetScalarizedVector(SDValue Op) {
     639      111450 :     TableId &ScalarizedId = ScalarizedVectors[getTableId(Op)];
     640       55725 :     SDValue ScalarizedOp = getSDValue(ScalarizedId);
     641             :     assert(ScalarizedOp.getNode() && "Operand wasn't scalarized?");
     642       55725 :     return ScalarizedOp;
     643             :   }
     644             :   void SetScalarizedVector(SDValue Op, SDValue Result);
     645             : 
     646             :   // Vector Result Scalarization: <1 x ty> -> ty.
     647             :   void ScalarizeVectorResult(SDNode *N, unsigned OpNo);
     648             :   SDValue ScalarizeVecRes_MERGE_VALUES(SDNode *N, unsigned ResNo);
     649             :   SDValue ScalarizeVecRes_BinOp(SDNode *N);
     650             :   SDValue ScalarizeVecRes_TernaryOp(SDNode *N);
     651             :   SDValue ScalarizeVecRes_UnaryOp(SDNode *N);
     652             :   SDValue ScalarizeVecRes_InregOp(SDNode *N);
     653             :   SDValue ScalarizeVecRes_VecInregOp(SDNode *N);
     654             : 
     655             :   SDValue ScalarizeVecRes_BITCAST(SDNode *N);
     656             :   SDValue ScalarizeVecRes_BUILD_VECTOR(SDNode *N);
     657             :   SDValue ScalarizeVecRes_EXTRACT_SUBVECTOR(SDNode *N);
     658             :   SDValue ScalarizeVecRes_FP_ROUND(SDNode *N);
     659             :   SDValue ScalarizeVecRes_FPOWI(SDNode *N);
     660             :   SDValue ScalarizeVecRes_INSERT_VECTOR_ELT(SDNode *N);
     661             :   SDValue ScalarizeVecRes_LOAD(LoadSDNode *N);
     662             :   SDValue ScalarizeVecRes_SCALAR_TO_VECTOR(SDNode *N);
     663             :   SDValue ScalarizeVecRes_VSELECT(SDNode *N);
     664             :   SDValue ScalarizeVecRes_SELECT(SDNode *N);
     665             :   SDValue ScalarizeVecRes_SELECT_CC(SDNode *N);
     666             :   SDValue ScalarizeVecRes_SETCC(SDNode *N);
     667             :   SDValue ScalarizeVecRes_UNDEF(SDNode *N);
     668             :   SDValue ScalarizeVecRes_VECTOR_SHUFFLE(SDNode *N);
     669             : 
     670             :   // Vector Operand Scalarization: <1 x ty> -> ty.
     671             :   bool ScalarizeVectorOperand(SDNode *N, unsigned OpNo);
     672             :   SDValue ScalarizeVecOp_BITCAST(SDNode *N);
     673             :   SDValue ScalarizeVecOp_UnaryOp(SDNode *N);
     674             :   SDValue ScalarizeVecOp_CONCAT_VECTORS(SDNode *N);
     675             :   SDValue ScalarizeVecOp_EXTRACT_VECTOR_ELT(SDNode *N);
     676             :   SDValue ScalarizeVecOp_VSELECT(SDNode *N);
     677             :   SDValue ScalarizeVecOp_VSETCC(SDNode *N);
     678             :   SDValue ScalarizeVecOp_STORE(StoreSDNode *N, unsigned OpNo);
     679             :   SDValue ScalarizeVecOp_FP_ROUND(SDNode *N, unsigned OpNo);
     680             : 
     681             :   //===--------------------------------------------------------------------===//
     682             :   // Vector Splitting Support: LegalizeVectorTypes.cpp
     683             :   //===--------------------------------------------------------------------===//
     684             : 
     685             :   /// Given a processed vector Op which was split into vectors of half the size,
     686             :   /// this method returns the halves. The first elements of Op coincide with the
     687             :   /// elements of Lo; the remaining elements of Op coincide with the elements of
     688             :   /// Hi: Op is what you would get by concatenating Lo and Hi.
     689             :   /// For example, if Op is a v8i32 that was split into two v4i32's, then this
     690             :   /// method returns the two v4i32's, with Lo corresponding to the first 4
     691             :   /// elements of Op, and Hi to the last 4 elements.
     692             :   void GetSplitVector(SDValue Op, SDValue &Lo, SDValue &Hi);
     693             :   void SetSplitVector(SDValue Op, SDValue Lo, SDValue Hi);
     694             : 
     695             :   // Vector Result Splitting: <128 x ty> -> 2 x <64 x ty>.
     696             :   void SplitVectorResult(SDNode *N, unsigned OpNo);
     697             :   void SplitVecRes_BinOp(SDNode *N, SDValue &Lo, SDValue &Hi);
     698             :   void SplitVecRes_TernaryOp(SDNode *N, SDValue &Lo, SDValue &Hi);
     699             :   void SplitVecRes_UnaryOp(SDNode *N, SDValue &Lo, SDValue &Hi);
     700             :   void SplitVecRes_ExtendOp(SDNode *N, SDValue &Lo, SDValue &Hi);
     701             :   void SplitVecRes_InregOp(SDNode *N, SDValue &Lo, SDValue &Hi);
     702             :   void SplitVecRes_ExtVecInRegOp(SDNode *N, SDValue &Lo, SDValue &Hi);
     703             : 
     704             :   void SplitVecRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi);
     705             :   void SplitVecRes_BUILD_VECTOR(SDNode *N, SDValue &Lo, SDValue &Hi);
     706             :   void SplitVecRes_CONCAT_VECTORS(SDNode *N, SDValue &Lo, SDValue &Hi);
     707             :   void SplitVecRes_EXTRACT_SUBVECTOR(SDNode *N, SDValue &Lo, SDValue &Hi);
     708             :   void SplitVecRes_INSERT_SUBVECTOR(SDNode *N, SDValue &Lo, SDValue &Hi);
     709             :   void SplitVecRes_FPOWI(SDNode *N, SDValue &Lo, SDValue &Hi);
     710             :   void SplitVecRes_FCOPYSIGN(SDNode *N, SDValue &Lo, SDValue &Hi);
     711             :   void SplitVecRes_INSERT_VECTOR_ELT(SDNode *N, SDValue &Lo, SDValue &Hi);
     712             :   void SplitVecRes_LOAD(LoadSDNode *N, SDValue &Lo, SDValue &Hi);
     713             :   void SplitVecRes_MLOAD(MaskedLoadSDNode *N, SDValue &Lo, SDValue &Hi);
     714             :   void SplitVecRes_MGATHER(MaskedGatherSDNode *N, SDValue &Lo, SDValue &Hi);
     715             :   void SplitVecRes_SCALAR_TO_VECTOR(SDNode *N, SDValue &Lo, SDValue &Hi);
     716             :   void SplitVecRes_SETCC(SDNode *N, SDValue &Lo, SDValue &Hi);
     717             :   void SplitVecRes_VECTOR_SHUFFLE(ShuffleVectorSDNode *N, SDValue &Lo,
     718             :                                   SDValue &Hi);
     719             : 
     720             :   // Vector Operand Splitting: <128 x ty> -> 2 x <64 x ty>.
     721             :   bool SplitVectorOperand(SDNode *N, unsigned OpNo);
     722             :   SDValue SplitVecOp_VSELECT(SDNode *N, unsigned OpNo);
     723             :   SDValue SplitVecOp_VECREDUCE(SDNode *N, unsigned OpNo);
     724             :   SDValue SplitVecOp_UnaryOp(SDNode *N);
     725             :   SDValue SplitVecOp_TruncateHelper(SDNode *N);
     726             : 
     727             :   SDValue SplitVecOp_BITCAST(SDNode *N);
     728             :   SDValue SplitVecOp_EXTRACT_SUBVECTOR(SDNode *N);
     729             :   SDValue SplitVecOp_EXTRACT_VECTOR_ELT(SDNode *N);
     730             :   SDValue SplitVecOp_ExtVecInRegOp(SDNode *N);
     731             :   SDValue SplitVecOp_STORE(StoreSDNode *N, unsigned OpNo);
     732             :   SDValue SplitVecOp_MSTORE(MaskedStoreSDNode *N, unsigned OpNo);
     733             :   SDValue SplitVecOp_MSCATTER(MaskedScatterSDNode *N, unsigned OpNo);
     734             :   SDValue SplitVecOp_MGATHER(MaskedGatherSDNode *N, unsigned OpNo);
     735             :   SDValue SplitVecOp_CONCAT_VECTORS(SDNode *N);
     736             :   SDValue SplitVecOp_VSETCC(SDNode *N);
     737             :   SDValue SplitVecOp_FP_ROUND(SDNode *N);
     738             :   SDValue SplitVecOp_FCOPYSIGN(SDNode *N);
     739             : 
     740             :   //===--------------------------------------------------------------------===//
     741             :   // Vector Widening Support: LegalizeVectorTypes.cpp
     742             :   //===--------------------------------------------------------------------===//
     743             : 
     744             :   /// Given a processed vector Op which was widened into a larger vector, this
     745             :   /// method returns the larger vector. The elements of the returned vector
     746             :   /// consist of the elements of Op followed by elements containing rubbish.
     747             :   /// For example, if Op is a v2i32 that was widened to a v4i32, then this
     748             :   /// method returns a v4i32 for which the first two elements are the same as
     749             :   /// those of Op, while the last two elements contain rubbish.
     750        9995 :   SDValue GetWidenedVector(SDValue Op) {
     751       19990 :     TableId &WidenedId = WidenedVectors[getTableId(Op)];
     752        9995 :     SDValue WidenedOp = getSDValue(WidenedId);
     753             :     assert(WidenedOp.getNode() && "Operand wasn't widened?");
     754        9995 :     return WidenedOp;
     755             :   }
     756             :   void SetWidenedVector(SDValue Op, SDValue Result);
     757             : 
     758             :   // Widen Vector Result Promotion.
     759             :   void WidenVectorResult(SDNode *N, unsigned ResNo);
     760             :   SDValue WidenVecRes_MERGE_VALUES(SDNode* N, unsigned ResNo);
     761             :   SDValue WidenVecRes_BITCAST(SDNode* N);
     762             :   SDValue WidenVecRes_BUILD_VECTOR(SDNode* N);
     763             :   SDValue WidenVecRes_CONCAT_VECTORS(SDNode* N);
     764             :   SDValue WidenVecRes_EXTEND_VECTOR_INREG(SDNode* N);
     765             :   SDValue WidenVecRes_EXTRACT_SUBVECTOR(SDNode* N);
     766             :   SDValue WidenVecRes_INSERT_VECTOR_ELT(SDNode* N);
     767             :   SDValue WidenVecRes_LOAD(SDNode* N);
     768             :   SDValue WidenVecRes_MLOAD(MaskedLoadSDNode* N);
     769             :   SDValue WidenVecRes_MGATHER(MaskedGatherSDNode* N);
     770             :   SDValue WidenVecRes_SCALAR_TO_VECTOR(SDNode* N);
     771             :   SDValue WidenVecRes_SELECT(SDNode* N);
     772             :   SDValue WidenVSELECTAndMask(SDNode *N);
     773             :   SDValue WidenVecRes_SELECT_CC(SDNode* N);
     774             :   SDValue WidenVecRes_SETCC(SDNode* N);
     775             :   SDValue WidenVecRes_UNDEF(SDNode *N);
     776             :   SDValue WidenVecRes_VECTOR_SHUFFLE(ShuffleVectorSDNode *N);
     777             : 
     778             :   SDValue WidenVecRes_Ternary(SDNode *N);
     779             :   SDValue WidenVecRes_Binary(SDNode *N);
     780             :   SDValue WidenVecRes_BinaryCanTrap(SDNode *N);
     781             :   SDValue WidenVecRes_Convert(SDNode *N);
     782             :   SDValue WidenVecRes_FCOPYSIGN(SDNode *N);
     783             :   SDValue WidenVecRes_POWI(SDNode *N);
     784             :   SDValue WidenVecRes_Shift(SDNode *N);
     785             :   SDValue WidenVecRes_Unary(SDNode *N);
     786             :   SDValue WidenVecRes_InregOp(SDNode *N);
     787             : 
     788             :   // Widen Vector Operand.
     789             :   bool WidenVectorOperand(SDNode *N, unsigned OpNo);
     790             :   SDValue WidenVecOp_BITCAST(SDNode *N);
     791             :   SDValue WidenVecOp_CONCAT_VECTORS(SDNode *N);
     792             :   SDValue WidenVecOp_EXTEND(SDNode *N);
     793             :   SDValue WidenVecOp_EXTRACT_VECTOR_ELT(SDNode *N);
     794             :   SDValue WidenVecOp_EXTRACT_SUBVECTOR(SDNode *N);
     795             :   SDValue WidenVecOp_STORE(SDNode* N);
     796             :   SDValue WidenVecOp_MSTORE(SDNode* N, unsigned OpNo);
     797             :   SDValue WidenVecOp_MSCATTER(SDNode* N, unsigned OpNo);
     798             :   SDValue WidenVecOp_SETCC(SDNode* N);
     799             : 
     800             :   SDValue WidenVecOp_Convert(SDNode *N);
     801             :   SDValue WidenVecOp_FCOPYSIGN(SDNode *N);
     802             : 
     803             :   //===--------------------------------------------------------------------===//
     804             :   // Vector Widening Utilities Support: LegalizeVectorTypes.cpp
     805             :   //===--------------------------------------------------------------------===//
     806             : 
     807             :   /// Helper function to generate a set of loads to load a vector with a
     808             :   /// resulting wider type. It takes:
     809             :   ///   LdChain: list of chains for the load to be generated.
     810             :   ///   Ld:      load to widen
     811             :   SDValue GenWidenVectorLoads(SmallVectorImpl<SDValue> &LdChain,
     812             :                               LoadSDNode *LD);
     813             : 
     814             :   /// Helper function to generate a set of extension loads to load a vector with
     815             :   /// a resulting wider type. It takes:
     816             :   ///   LdChain: list of chains for the load to be generated.
     817             :   ///   Ld:      load to widen
     818             :   ///   ExtType: extension element type
     819             :   SDValue GenWidenVectorExtLoads(SmallVectorImpl<SDValue> &LdChain,
     820             :                                  LoadSDNode *LD, ISD::LoadExtType ExtType);
     821             : 
     822             :   /// Helper function to generate a set of stores to store a widen vector into
     823             :   /// non-widen memory.
     824             :   ///   StChain: list of chains for the stores we have generated
     825             :   ///   ST:      store of a widen value
     826             :   void GenWidenVectorStores(SmallVectorImpl<SDValue> &StChain, StoreSDNode *ST);
     827             : 
     828             :   /// Helper function to generate a set of stores to store a truncate widen
     829             :   /// vector into non-widen memory.
     830             :   ///   StChain: list of chains for the stores we have generated
     831             :   ///   ST:      store of a widen value
     832             :   void GenWidenVectorTruncStores(SmallVectorImpl<SDValue> &StChain,
     833             :                                  StoreSDNode *ST);
     834             : 
     835             :   /// Modifies a vector input (widen or narrows) to a vector of NVT.  The
     836             :   /// input vector must have the same element type as NVT.
     837             :   /// When FillWithZeroes is "on" the vector will be widened with zeroes.
     838             :   /// By default, the vector will be widened with undefined values.
     839             :   SDValue ModifyToType(SDValue InOp, EVT NVT, bool FillWithZeroes = false);
     840             : 
     841             :   /// Return a mask of vector type MaskVT to replace InMask. Also adjust
     842             :   /// MaskVT to ToMaskVT if needed with vector extension or truncation.
     843             :   SDValue convertMask(SDValue InMask, EVT MaskVT, EVT ToMaskVT);
     844             : 
     845             :   /// Get the target mask VT, and widen if needed.
     846             :   EVT getSETCCWidenedResultTy(SDValue SetCC);
     847             : 
     848             :   //===--------------------------------------------------------------------===//
     849             :   // Generic Splitting: LegalizeTypesGeneric.cpp
     850             :   //===--------------------------------------------------------------------===//
     851             : 
     852             :   // Legalization methods which only use that the illegal type is split into two
     853             :   // not necessarily identical types.  As such they can be used for splitting
     854             :   // vectors and expanding integers and floats.
     855             : 
     856        4639 :   void GetSplitOp(SDValue Op, SDValue &Lo, SDValue &Hi) {
     857        9278 :     if (Op.getValueType().isVector())
     858        2242 :       GetSplitVector(Op, Lo, Hi);
     859        2397 :     else if (Op.getValueType().isInteger())
     860        2383 :       GetExpandedInteger(Op, Lo, Hi);
     861             :     else
     862          14 :       GetExpandedFloat(Op, Lo, Hi);
     863        4639 :   }
     864             : 
     865             :   /// Use ISD::EXTRACT_ELEMENT nodes to extract the low and high parts of the
     866             :   /// given value.
     867             :   void GetPairElements(SDValue Pair, SDValue &Lo, SDValue &Hi);
     868             : 
     869             :   // Generic Result Splitting.
     870             :   void SplitRes_MERGE_VALUES(SDNode *N, unsigned ResNo,
     871             :                              SDValue &Lo, SDValue &Hi);
     872             :   void SplitRes_SELECT      (SDNode *N, SDValue &Lo, SDValue &Hi);
     873             :   void SplitRes_SELECT_CC   (SDNode *N, SDValue &Lo, SDValue &Hi);
     874             :   void SplitRes_UNDEF       (SDNode *N, SDValue &Lo, SDValue &Hi);
     875             : 
     876             :   //===--------------------------------------------------------------------===//
     877             :   // Generic Expansion: LegalizeTypesGeneric.cpp
     878             :   //===--------------------------------------------------------------------===//
     879             : 
     880             :   // Legalization methods which only use that the illegal type is split into two
     881             :   // identical types of half the size, and that the Lo/Hi part is stored first
     882             :   // in memory on little/big-endian machines, followed by the Hi/Lo part.  As
     883             :   // such they can be used for expanding integers and floats.
     884             : 
     885      129946 :   void GetExpandedOp(SDValue Op, SDValue &Lo, SDValue &Hi) {
     886      259892 :     if (Op.getValueType().isInteger())
     887      129731 :       GetExpandedInteger(Op, Lo, Hi);
     888             :     else
     889         215 :       GetExpandedFloat(Op, Lo, Hi);
     890      129946 :   }
     891             : 
     892             : 
     893             :   /// This function will split the integer \p Op into \p NumElements
     894             :   /// operations of type \p EltVT and store them in \p Ops.
     895             :   void IntegerToVector(SDValue Op, unsigned NumElements,
     896             :                        SmallVectorImpl<SDValue> &Ops, EVT EltVT);
     897             : 
     898             :   // Generic Result Expansion.
     899             :   void ExpandRes_MERGE_VALUES      (SDNode *N, unsigned ResNo,
     900             :                                     SDValue &Lo, SDValue &Hi);
     901             :   void ExpandRes_BITCAST           (SDNode *N, SDValue &Lo, SDValue &Hi);
     902             :   void ExpandRes_BUILD_PAIR        (SDNode *N, SDValue &Lo, SDValue &Hi);
     903             :   void ExpandRes_EXTRACT_ELEMENT   (SDNode *N, SDValue &Lo, SDValue &Hi);
     904             :   void ExpandRes_EXTRACT_VECTOR_ELT(SDNode *N, SDValue &Lo, SDValue &Hi);
     905             :   void ExpandRes_NormalLoad        (SDNode *N, SDValue &Lo, SDValue &Hi);
     906             :   void ExpandRes_VAARG             (SDNode *N, SDValue &Lo, SDValue &Hi);
     907             : 
     908             :   // Generic Operand Expansion.
     909             :   SDValue ExpandOp_BITCAST          (SDNode *N);
     910             :   SDValue ExpandOp_BUILD_VECTOR     (SDNode *N);
     911             :   SDValue ExpandOp_EXTRACT_ELEMENT  (SDNode *N);
     912             :   SDValue ExpandOp_INSERT_VECTOR_ELT(SDNode *N);
     913             :   SDValue ExpandOp_SCALAR_TO_VECTOR (SDNode *N);
     914             :   SDValue ExpandOp_NormalStore      (SDNode *N, unsigned OpNo);
     915             : };
     916             : 
     917             : } // end namespace llvm.
     918             : 
     919             : #endif

Generated by: LCOV version 1.13