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

Generated by: LCOV version 1.13