xref: /freebsd/contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (revision 700637cbb5e582861067a11aaca4d053546871d2)
1 //===- LegalizeDAG.cpp - Implement SelectionDAG::Legalize -----------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements the SelectionDAG::Legalize method.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "llvm/ADT/APFloat.h"
14 #include "llvm/ADT/APInt.h"
15 #include "llvm/ADT/ArrayRef.h"
16 #include "llvm/ADT/FloatingPointMode.h"
17 #include "llvm/ADT/SetVector.h"
18 #include "llvm/ADT/SmallPtrSet.h"
19 #include "llvm/ADT/SmallSet.h"
20 #include "llvm/ADT/SmallVector.h"
21 #include "llvm/Analysis/ConstantFolding.h"
22 #include "llvm/Analysis/TargetLibraryInfo.h"
23 #include "llvm/CodeGen/ISDOpcodes.h"
24 #include "llvm/CodeGen/MachineFrameInfo.h"
25 #include "llvm/CodeGen/MachineFunction.h"
26 #include "llvm/CodeGen/MachineJumpTableInfo.h"
27 #include "llvm/CodeGen/MachineMemOperand.h"
28 #include "llvm/CodeGen/RuntimeLibcallUtil.h"
29 #include "llvm/CodeGen/SelectionDAG.h"
30 #include "llvm/CodeGen/SelectionDAGNodes.h"
31 #include "llvm/CodeGen/TargetFrameLowering.h"
32 #include "llvm/CodeGen/TargetLowering.h"
33 #include "llvm/CodeGen/TargetSubtargetInfo.h"
34 #include "llvm/CodeGen/ValueTypes.h"
35 #include "llvm/CodeGenTypes/MachineValueType.h"
36 #include "llvm/IR/CallingConv.h"
37 #include "llvm/IR/Constants.h"
38 #include "llvm/IR/DataLayout.h"
39 #include "llvm/IR/DerivedTypes.h"
40 #include "llvm/IR/Function.h"
41 #include "llvm/IR/Metadata.h"
42 #include "llvm/IR/Type.h"
43 #include "llvm/Support/Casting.h"
44 #include "llvm/Support/Compiler.h"
45 #include "llvm/Support/Debug.h"
46 #include "llvm/Support/ErrorHandling.h"
47 #include "llvm/Support/MathExtras.h"
48 #include "llvm/Support/raw_ostream.h"
49 #include "llvm/Target/TargetMachine.h"
50 #include "llvm/Target/TargetOptions.h"
51 #include <cassert>
52 #include <cstdint>
53 #include <tuple>
54 #include <utility>
55 
56 using namespace llvm;
57 
58 #define DEBUG_TYPE "legalizedag"
59 
60 namespace {
61 
62 /// Keeps track of state when getting the sign of a floating-point value as an
63 /// integer.
64 struct FloatSignAsInt {
65   EVT FloatVT;
66   SDValue Chain;
67   SDValue FloatPtr;
68   SDValue IntPtr;
69   MachinePointerInfo IntPointerInfo;
70   MachinePointerInfo FloatPointerInfo;
71   SDValue IntValue;
72   APInt SignMask;
73   uint8_t SignBit;
74 };
75 
76 //===----------------------------------------------------------------------===//
77 /// This takes an arbitrary SelectionDAG as input and
78 /// hacks on it until the target machine can handle it.  This involves
79 /// eliminating value sizes the machine cannot handle (promoting small sizes to
80 /// large sizes or splitting up large values into small values) as well as
81 /// eliminating operations the machine cannot handle.
82 ///
83 /// This code also does a small amount of optimization and recognition of idioms
84 /// as part of its processing.  For example, if a target does not support a
85 /// 'setcc' instruction efficiently, but does support 'brcc' instruction, this
86 /// will attempt merge setcc and brc instructions into brcc's.
87 class SelectionDAGLegalize {
88   const TargetMachine &TM;
89   const TargetLowering &TLI;
90   SelectionDAG &DAG;
91 
92   /// The set of nodes which have already been legalized. We hold a
93   /// reference to it in order to update as necessary on node deletion.
94   SmallPtrSetImpl<SDNode *> &LegalizedNodes;
95 
96   /// A set of all the nodes updated during legalization.
97   SmallSetVector<SDNode *, 16> *UpdatedNodes;
98 
getSetCCResultType(EVT VT) const99   EVT getSetCCResultType(EVT VT) const {
100     return TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
101   }
102 
103   // Libcall insertion helpers.
104 
105 public:
SelectionDAGLegalize(SelectionDAG & DAG,SmallPtrSetImpl<SDNode * > & LegalizedNodes,SmallSetVector<SDNode *,16> * UpdatedNodes=nullptr)106   SelectionDAGLegalize(SelectionDAG &DAG,
107                        SmallPtrSetImpl<SDNode *> &LegalizedNodes,
108                        SmallSetVector<SDNode *, 16> *UpdatedNodes = nullptr)
109       : TM(DAG.getTarget()), TLI(DAG.getTargetLoweringInfo()), DAG(DAG),
110         LegalizedNodes(LegalizedNodes), UpdatedNodes(UpdatedNodes) {}
111 
112   /// Legalizes the given operation.
113   void LegalizeOp(SDNode *Node);
114 
115 private:
116   SDValue OptimizeFloatStore(StoreSDNode *ST);
117 
118   void LegalizeLoadOps(SDNode *Node);
119   void LegalizeStoreOps(SDNode *Node);
120 
121   SDValue ExpandINSERT_VECTOR_ELT(SDValue Op);
122 
123   /// Return a vector shuffle operation which
124   /// performs the same shuffe in terms of order or result bytes, but on a type
125   /// whose vector element type is narrower than the original shuffle type.
126   /// e.g. <v4i32> <0, 1, 0, 1> -> v8i16 <0, 1, 2, 3, 0, 1, 2, 3>
127   SDValue ShuffleWithNarrowerEltType(EVT NVT, EVT VT, const SDLoc &dl,
128                                      SDValue N1, SDValue N2,
129                                      ArrayRef<int> Mask) const;
130 
131   std::pair<SDValue, SDValue> ExpandLibCall(RTLIB::Libcall LC, SDNode *Node,
132                                             TargetLowering::ArgListTy &&Args,
133                                             bool IsSigned, EVT RetVT);
134   std::pair<SDValue, SDValue> ExpandLibCall(RTLIB::Libcall LC, SDNode *Node, bool isSigned);
135 
136   void ExpandFPLibCall(SDNode *Node, RTLIB::Libcall LC,
137                        SmallVectorImpl<SDValue> &Results);
138   void ExpandFPLibCall(SDNode *Node, RTLIB::Libcall Call_F32,
139                        RTLIB::Libcall Call_F64, RTLIB::Libcall Call_F80,
140                        RTLIB::Libcall Call_F128,
141                        RTLIB::Libcall Call_PPCF128,
142                        SmallVectorImpl<SDValue> &Results);
143 
144   void
145   ExpandFastFPLibCall(SDNode *Node, bool IsFast,
146                       std::pair<RTLIB::Libcall, RTLIB::Libcall> Call_F32,
147                       std::pair<RTLIB::Libcall, RTLIB::Libcall> Call_F64,
148                       std::pair<RTLIB::Libcall, RTLIB::Libcall> Call_F80,
149                       std::pair<RTLIB::Libcall, RTLIB::Libcall> Call_F128,
150                       std::pair<RTLIB::Libcall, RTLIB::Libcall> Call_PPCF128,
151                       SmallVectorImpl<SDValue> &Results);
152 
153   SDValue ExpandIntLibCall(SDNode *Node, bool isSigned, RTLIB::Libcall Call_I8,
154                            RTLIB::Libcall Call_I16, RTLIB::Libcall Call_I32,
155                            RTLIB::Libcall Call_I64, RTLIB::Libcall Call_I128);
156   void ExpandArgFPLibCall(SDNode *Node,
157                           RTLIB::Libcall Call_F32, RTLIB::Libcall Call_F64,
158                           RTLIB::Libcall Call_F80, RTLIB::Libcall Call_F128,
159                           RTLIB::Libcall Call_PPCF128,
160                           SmallVectorImpl<SDValue> &Results);
161   SDValue ExpandBitCountingLibCall(SDNode *Node, RTLIB::Libcall CallI32,
162                                    RTLIB::Libcall CallI64,
163                                    RTLIB::Libcall CallI128);
164   void ExpandDivRemLibCall(SDNode *Node, SmallVectorImpl<SDValue> &Results);
165 
166   SDValue EmitStackConvert(SDValue SrcOp, EVT SlotVT, EVT DestVT,
167                            const SDLoc &dl);
168   SDValue EmitStackConvert(SDValue SrcOp, EVT SlotVT, EVT DestVT,
169                            const SDLoc &dl, SDValue ChainIn);
170   SDValue ExpandBUILD_VECTOR(SDNode *Node);
171   SDValue ExpandSPLAT_VECTOR(SDNode *Node);
172   SDValue ExpandSCALAR_TO_VECTOR(SDNode *Node);
173   void ExpandDYNAMIC_STACKALLOC(SDNode *Node,
174                                 SmallVectorImpl<SDValue> &Results);
175   void getSignAsIntValue(FloatSignAsInt &State, const SDLoc &DL,
176                          SDValue Value) const;
177   SDValue modifySignAsInt(const FloatSignAsInt &State, const SDLoc &DL,
178                           SDValue NewIntValue) const;
179   SDValue ExpandFCOPYSIGN(SDNode *Node) const;
180   SDValue ExpandFABS(SDNode *Node) const;
181   SDValue ExpandFNEG(SDNode *Node) const;
182   SDValue expandLdexp(SDNode *Node) const;
183   SDValue expandFrexp(SDNode *Node) const;
184 
185   SDValue ExpandLegalINT_TO_FP(SDNode *Node, SDValue &Chain);
186   void PromoteLegalINT_TO_FP(SDNode *N, const SDLoc &dl,
187                              SmallVectorImpl<SDValue> &Results);
188   void PromoteLegalFP_TO_INT(SDNode *N, const SDLoc &dl,
189                              SmallVectorImpl<SDValue> &Results);
190   SDValue PromoteLegalFP_TO_INT_SAT(SDNode *Node, const SDLoc &dl);
191 
192   /// Implements vector reduce operation promotion.
193   ///
194   /// All vector operands are promoted to a vector type with larger element
195   /// type, and the start value is promoted to a larger scalar type. Then the
196   /// result is truncated back to the original scalar type.
197   SDValue PromoteReduction(SDNode *Node);
198 
199   SDValue ExpandPARITY(SDValue Op, const SDLoc &dl);
200 
201   SDValue ExpandExtractFromVectorThroughStack(SDValue Op);
202   SDValue ExpandInsertToVectorThroughStack(SDValue Op);
203   SDValue ExpandVectorBuildThroughStack(SDNode* Node);
204   SDValue ExpandConcatVectors(SDNode *Node);
205 
206   SDValue ExpandConstantFP(ConstantFPSDNode *CFP, bool UseCP);
207   SDValue ExpandConstant(ConstantSDNode *CP);
208 
209   // if ExpandNode returns false, LegalizeOp falls back to ConvertNodeToLibcall
210   bool ExpandNode(SDNode *Node);
211   void ConvertNodeToLibcall(SDNode *Node);
212   void PromoteNode(SDNode *Node);
213 
214 public:
215   // Node replacement helpers
216 
ReplacedNode(SDNode * N)217   void ReplacedNode(SDNode *N) {
218     LegalizedNodes.erase(N);
219     if (UpdatedNodes)
220       UpdatedNodes->insert(N);
221   }
222 
ReplaceNode(SDNode * Old,SDNode * New)223   void ReplaceNode(SDNode *Old, SDNode *New) {
224     LLVM_DEBUG(dbgs() << " ... replacing: "; Old->dump(&DAG);
225                dbgs() << "     with:      "; New->dump(&DAG));
226 
227     assert(Old->getNumValues() == New->getNumValues() &&
228            "Replacing one node with another that produces a different number "
229            "of values!");
230     DAG.ReplaceAllUsesWith(Old, New);
231     if (UpdatedNodes)
232       UpdatedNodes->insert(New);
233     ReplacedNode(Old);
234   }
235 
ReplaceNode(SDValue Old,SDValue New)236   void ReplaceNode(SDValue Old, SDValue New) {
237     LLVM_DEBUG(dbgs() << " ... replacing: "; Old->dump(&DAG);
238                dbgs() << "     with:      "; New->dump(&DAG));
239 
240     DAG.ReplaceAllUsesWith(Old, New);
241     if (UpdatedNodes)
242       UpdatedNodes->insert(New.getNode());
243     ReplacedNode(Old.getNode());
244   }
245 
ReplaceNode(SDNode * Old,const SDValue * New)246   void ReplaceNode(SDNode *Old, const SDValue *New) {
247     LLVM_DEBUG(dbgs() << " ... replacing: "; Old->dump(&DAG));
248 
249     DAG.ReplaceAllUsesWith(Old, New);
250     for (unsigned i = 0, e = Old->getNumValues(); i != e; ++i) {
251       LLVM_DEBUG(dbgs() << (i == 0 ? "     with:      " : "      and:      ");
252                  New[i]->dump(&DAG));
253       if (UpdatedNodes)
254         UpdatedNodes->insert(New[i].getNode());
255     }
256     ReplacedNode(Old);
257   }
258 
ReplaceNodeWithValue(SDValue Old,SDValue New)259   void ReplaceNodeWithValue(SDValue Old, SDValue New) {
260     LLVM_DEBUG(dbgs() << " ... replacing: "; Old->dump(&DAG);
261                dbgs() << "     with:      "; New->dump(&DAG));
262 
263     DAG.ReplaceAllUsesOfValueWith(Old, New);
264     if (UpdatedNodes)
265       UpdatedNodes->insert(New.getNode());
266     ReplacedNode(Old.getNode());
267   }
268 };
269 
270 } // end anonymous namespace
271 
272 // Helper function that generates an MMO that considers the alignment of the
273 // stack, and the size of the stack object
getStackAlignedMMO(SDValue StackPtr,MachineFunction & MF,bool isObjectScalable)274 static MachineMemOperand *getStackAlignedMMO(SDValue StackPtr,
275                                              MachineFunction &MF,
276                                              bool isObjectScalable) {
277   auto &MFI = MF.getFrameInfo();
278   int FI = cast<FrameIndexSDNode>(StackPtr)->getIndex();
279   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(MF, FI);
280   LocationSize ObjectSize = isObjectScalable
281                                 ? LocationSize::beforeOrAfterPointer()
282                                 : LocationSize::precise(MFI.getObjectSize(FI));
283   return MF.getMachineMemOperand(PtrInfo, MachineMemOperand::MOStore,
284                                  ObjectSize, MFI.getObjectAlign(FI));
285 }
286 
287 /// Return a vector shuffle operation which
288 /// performs the same shuffle in terms of order or result bytes, but on a type
289 /// whose vector element type is narrower than the original shuffle type.
290 /// e.g. <v4i32> <0, 1, 0, 1> -> v8i16 <0, 1, 2, 3, 0, 1, 2, 3>
ShuffleWithNarrowerEltType(EVT NVT,EVT VT,const SDLoc & dl,SDValue N1,SDValue N2,ArrayRef<int> Mask) const291 SDValue SelectionDAGLegalize::ShuffleWithNarrowerEltType(
292     EVT NVT, EVT VT, const SDLoc &dl, SDValue N1, SDValue N2,
293     ArrayRef<int> Mask) const {
294   unsigned NumMaskElts = VT.getVectorNumElements();
295   unsigned NumDestElts = NVT.getVectorNumElements();
296   unsigned NumEltsGrowth = NumDestElts / NumMaskElts;
297 
298   assert(NumEltsGrowth && "Cannot promote to vector type with fewer elts!");
299 
300   if (NumEltsGrowth == 1)
301     return DAG.getVectorShuffle(NVT, dl, N1, N2, Mask);
302 
303   SmallVector<int, 8> NewMask;
304   for (unsigned i = 0; i != NumMaskElts; ++i) {
305     int Idx = Mask[i];
306     for (unsigned j = 0; j != NumEltsGrowth; ++j) {
307       if (Idx < 0)
308         NewMask.push_back(-1);
309       else
310         NewMask.push_back(Idx * NumEltsGrowth + j);
311     }
312   }
313   assert(NewMask.size() == NumDestElts && "Non-integer NumEltsGrowth?");
314   assert(TLI.isShuffleMaskLegal(NewMask, NVT) && "Shuffle not legal?");
315   return DAG.getVectorShuffle(NVT, dl, N1, N2, NewMask);
316 }
317 
318 /// Expands the ConstantFP node to an integer constant or
319 /// a load from the constant pool.
320 SDValue
ExpandConstantFP(ConstantFPSDNode * CFP,bool UseCP)321 SelectionDAGLegalize::ExpandConstantFP(ConstantFPSDNode *CFP, bool UseCP) {
322   bool Extend = false;
323   SDLoc dl(CFP);
324 
325   // If a FP immediate is precise when represented as a float and if the
326   // target can do an extending load from float to double, we put it into
327   // the constant pool as a float, even if it's is statically typed as a
328   // double.  This shrinks FP constants and canonicalizes them for targets where
329   // an FP extending load is the same cost as a normal load (such as on the x87
330   // fp stack or PPC FP unit).
331   EVT VT = CFP->getValueType(0);
332   ConstantFP *LLVMC = const_cast<ConstantFP*>(CFP->getConstantFPValue());
333   if (!UseCP) {
334     assert((VT == MVT::f64 || VT == MVT::f32) && "Invalid type expansion");
335     return DAG.getConstant(LLVMC->getValueAPF().bitcastToAPInt(), dl,
336                            (VT == MVT::f64) ? MVT::i64 : MVT::i32);
337   }
338 
339   APFloat APF = CFP->getValueAPF();
340   EVT OrigVT = VT;
341   EVT SVT = VT;
342 
343   // We don't want to shrink SNaNs. Converting the SNaN back to its real type
344   // can cause it to be changed into a QNaN on some platforms (e.g. on SystemZ).
345   if (!APF.isSignaling()) {
346     while (SVT != MVT::f32 && SVT != MVT::f16 && SVT != MVT::bf16) {
347       SVT = (MVT::SimpleValueType)(SVT.getSimpleVT().SimpleTy - 1);
348       if (ConstantFPSDNode::isValueValidForType(SVT, APF) &&
349           // Only do this if the target has a native EXTLOAD instruction from
350           // smaller type.
351           TLI.isLoadExtLegal(ISD::EXTLOAD, OrigVT, SVT) &&
352           TLI.ShouldShrinkFPConstant(OrigVT)) {
353         Type *SType = SVT.getTypeForEVT(*DAG.getContext());
354         LLVMC = cast<ConstantFP>(ConstantFoldCastOperand(
355             Instruction::FPTrunc, LLVMC, SType, DAG.getDataLayout()));
356         VT = SVT;
357         Extend = true;
358       }
359     }
360   }
361 
362   SDValue CPIdx =
363       DAG.getConstantPool(LLVMC, TLI.getPointerTy(DAG.getDataLayout()));
364   Align Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlign();
365   if (Extend) {
366     SDValue Result = DAG.getExtLoad(
367         ISD::EXTLOAD, dl, OrigVT, DAG.getEntryNode(), CPIdx,
368         MachinePointerInfo::getConstantPool(DAG.getMachineFunction()), VT,
369         Alignment);
370     return Result;
371   }
372   SDValue Result = DAG.getLoad(
373       OrigVT, dl, DAG.getEntryNode(), CPIdx,
374       MachinePointerInfo::getConstantPool(DAG.getMachineFunction()), Alignment);
375   return Result;
376 }
377 
378 /// Expands the Constant node to a load from the constant pool.
ExpandConstant(ConstantSDNode * CP)379 SDValue SelectionDAGLegalize::ExpandConstant(ConstantSDNode *CP) {
380   SDLoc dl(CP);
381   EVT VT = CP->getValueType(0);
382   SDValue CPIdx = DAG.getConstantPool(CP->getConstantIntValue(),
383                                       TLI.getPointerTy(DAG.getDataLayout()));
384   Align Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlign();
385   SDValue Result = DAG.getLoad(
386       VT, dl, DAG.getEntryNode(), CPIdx,
387       MachinePointerInfo::getConstantPool(DAG.getMachineFunction()), Alignment);
388   return Result;
389 }
390 
ExpandINSERT_VECTOR_ELT(SDValue Op)391 SDValue SelectionDAGLegalize::ExpandINSERT_VECTOR_ELT(SDValue Op) {
392   SDValue Vec = Op.getOperand(0);
393   SDValue Val = Op.getOperand(1);
394   SDValue Idx = Op.getOperand(2);
395   SDLoc dl(Op);
396 
397   if (ConstantSDNode *InsertPos = dyn_cast<ConstantSDNode>(Idx)) {
398     // SCALAR_TO_VECTOR requires that the type of the value being inserted
399     // match the element type of the vector being created, except for
400     // integers in which case the inserted value can be over width.
401     EVT EltVT = Vec.getValueType().getVectorElementType();
402     if (Val.getValueType() == EltVT ||
403         (EltVT.isInteger() && Val.getValueType().bitsGE(EltVT))) {
404       SDValue ScVec = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl,
405                                   Vec.getValueType(), Val);
406 
407       unsigned NumElts = Vec.getValueType().getVectorNumElements();
408       // We generate a shuffle of InVec and ScVec, so the shuffle mask
409       // should be 0,1,2,3,4,5... with the appropriate element replaced with
410       // elt 0 of the RHS.
411       SmallVector<int, 8> ShufOps;
412       for (unsigned i = 0; i != NumElts; ++i)
413         ShufOps.push_back(i != InsertPos->getZExtValue() ? i : NumElts);
414 
415       return DAG.getVectorShuffle(Vec.getValueType(), dl, Vec, ScVec, ShufOps);
416     }
417   }
418   return ExpandInsertToVectorThroughStack(Op);
419 }
420 
OptimizeFloatStore(StoreSDNode * ST)421 SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
422   if (!ISD::isNormalStore(ST))
423     return SDValue();
424 
425   LLVM_DEBUG(dbgs() << "Optimizing float store operations\n");
426   // Turn 'store float 1.0, Ptr' -> 'store int 0x12345678, Ptr'
427   // FIXME: move this to the DAG Combiner!  Note that we can't regress due
428   // to phase ordering between legalized code and the dag combiner.  This
429   // probably means that we need to integrate dag combiner and legalizer
430   // together.
431   // We generally can't do this one for long doubles.
432   SDValue Chain = ST->getChain();
433   SDValue Ptr = ST->getBasePtr();
434   SDValue Value = ST->getValue();
435   MachineMemOperand::Flags MMOFlags = ST->getMemOperand()->getFlags();
436   AAMDNodes AAInfo = ST->getAAInfo();
437   SDLoc dl(ST);
438 
439   // Don't optimise TargetConstantFP
440   if (Value.getOpcode() == ISD::TargetConstantFP)
441     return SDValue();
442 
443   if (ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(Value)) {
444     if (CFP->getValueType(0) == MVT::f32 &&
445         TLI.isTypeLegal(MVT::i32)) {
446       SDValue Con = DAG.getConstant(CFP->getValueAPF().
447                                       bitcastToAPInt().zextOrTrunc(32),
448                                     SDLoc(CFP), MVT::i32);
449       return DAG.getStore(Chain, dl, Con, Ptr, ST->getPointerInfo(),
450                           ST->getBaseAlign(), MMOFlags, AAInfo);
451     }
452 
453     if (CFP->getValueType(0) == MVT::f64 &&
454         !TLI.isFPImmLegal(CFP->getValueAPF(), MVT::f64)) {
455       // If this target supports 64-bit registers, do a single 64-bit store.
456       if (TLI.isTypeLegal(MVT::i64)) {
457         SDValue Con = DAG.getConstant(CFP->getValueAPF().bitcastToAPInt().
458                                       zextOrTrunc(64), SDLoc(CFP), MVT::i64);
459         return DAG.getStore(Chain, dl, Con, Ptr, ST->getPointerInfo(),
460                             ST->getBaseAlign(), MMOFlags, AAInfo);
461       }
462 
463       if (TLI.isTypeLegal(MVT::i32) && !ST->isVolatile()) {
464         // Otherwise, if the target supports 32-bit registers, use 2 32-bit
465         // stores.  If the target supports neither 32- nor 64-bits, this
466         // xform is certainly not worth it.
467         const APInt &IntVal = CFP->getValueAPF().bitcastToAPInt();
468         SDValue Lo = DAG.getConstant(IntVal.trunc(32), dl, MVT::i32);
469         SDValue Hi = DAG.getConstant(IntVal.lshr(32).trunc(32), dl, MVT::i32);
470         if (DAG.getDataLayout().isBigEndian())
471           std::swap(Lo, Hi);
472 
473         Lo = DAG.getStore(Chain, dl, Lo, Ptr, ST->getPointerInfo(),
474                           ST->getBaseAlign(), MMOFlags, AAInfo);
475         Ptr = DAG.getMemBasePlusOffset(Ptr, TypeSize::getFixed(4), dl);
476         Hi = DAG.getStore(Chain, dl, Hi, Ptr,
477                           ST->getPointerInfo().getWithOffset(4),
478                           ST->getBaseAlign(), MMOFlags, AAInfo);
479 
480         return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
481       }
482     }
483   }
484   return SDValue();
485 }
486 
LegalizeStoreOps(SDNode * Node)487 void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {
488   StoreSDNode *ST = cast<StoreSDNode>(Node);
489   SDValue Chain = ST->getChain();
490   SDValue Ptr = ST->getBasePtr();
491   SDLoc dl(Node);
492 
493   MachineMemOperand::Flags MMOFlags = ST->getMemOperand()->getFlags();
494   AAMDNodes AAInfo = ST->getAAInfo();
495 
496   if (!ST->isTruncatingStore()) {
497     LLVM_DEBUG(dbgs() << "Legalizing store operation\n");
498     if (SDNode *OptStore = OptimizeFloatStore(ST).getNode()) {
499       ReplaceNode(ST, OptStore);
500       return;
501     }
502 
503     SDValue Value = ST->getValue();
504     MVT VT = Value.getSimpleValueType();
505     switch (TLI.getOperationAction(ISD::STORE, VT)) {
506     default: llvm_unreachable("This action is not supported yet!");
507     case TargetLowering::Legal: {
508       // If this is an unaligned store and the target doesn't support it,
509       // expand it.
510       EVT MemVT = ST->getMemoryVT();
511       const DataLayout &DL = DAG.getDataLayout();
512       if (!TLI.allowsMemoryAccessForAlignment(*DAG.getContext(), DL, MemVT,
513                                               *ST->getMemOperand())) {
514         LLVM_DEBUG(dbgs() << "Expanding unsupported unaligned store\n");
515         SDValue Result = TLI.expandUnalignedStore(ST, DAG);
516         ReplaceNode(SDValue(ST, 0), Result);
517       } else
518         LLVM_DEBUG(dbgs() << "Legal store\n");
519       break;
520     }
521     case TargetLowering::Custom: {
522       LLVM_DEBUG(dbgs() << "Trying custom lowering\n");
523       SDValue Res = TLI.LowerOperation(SDValue(Node, 0), DAG);
524       if (Res && Res != SDValue(Node, 0))
525         ReplaceNode(SDValue(Node, 0), Res);
526       return;
527     }
528     case TargetLowering::Promote: {
529       MVT NVT = TLI.getTypeToPromoteTo(ISD::STORE, VT);
530       assert(NVT.getSizeInBits() == VT.getSizeInBits() &&
531              "Can only promote stores to same size type");
532       Value = DAG.getNode(ISD::BITCAST, dl, NVT, Value);
533       SDValue Result = DAG.getStore(Chain, dl, Value, Ptr, ST->getPointerInfo(),
534                                     ST->getBaseAlign(), MMOFlags, AAInfo);
535       ReplaceNode(SDValue(Node, 0), Result);
536       break;
537     }
538     }
539     return;
540   }
541 
542   LLVM_DEBUG(dbgs() << "Legalizing truncating store operations\n");
543   SDValue Value = ST->getValue();
544   EVT StVT = ST->getMemoryVT();
545   TypeSize StWidth = StVT.getSizeInBits();
546   TypeSize StSize = StVT.getStoreSizeInBits();
547   auto &DL = DAG.getDataLayout();
548 
549   if (StWidth != StSize) {
550     // Promote to a byte-sized store with upper bits zero if not
551     // storing an integral number of bytes.  For example, promote
552     // TRUNCSTORE:i1 X -> TRUNCSTORE:i8 (and X, 1)
553     EVT NVT = EVT::getIntegerVT(*DAG.getContext(), StSize.getFixedValue());
554     Value = DAG.getZeroExtendInReg(Value, dl, StVT);
555     SDValue Result =
556         DAG.getTruncStore(Chain, dl, Value, Ptr, ST->getPointerInfo(), NVT,
557                           ST->getBaseAlign(), MMOFlags, AAInfo);
558     ReplaceNode(SDValue(Node, 0), Result);
559   } else if (!StVT.isVector() && !isPowerOf2_64(StWidth.getFixedValue())) {
560     // If not storing a power-of-2 number of bits, expand as two stores.
561     assert(!StVT.isVector() && "Unsupported truncstore!");
562     unsigned StWidthBits = StWidth.getFixedValue();
563     unsigned LogStWidth = Log2_32(StWidthBits);
564     assert(LogStWidth < 32);
565     unsigned RoundWidth = 1 << LogStWidth;
566     assert(RoundWidth < StWidthBits);
567     unsigned ExtraWidth = StWidthBits - RoundWidth;
568     assert(ExtraWidth < RoundWidth);
569     assert(!(RoundWidth % 8) && !(ExtraWidth % 8) &&
570            "Store size not an integral number of bytes!");
571     EVT RoundVT = EVT::getIntegerVT(*DAG.getContext(), RoundWidth);
572     EVT ExtraVT = EVT::getIntegerVT(*DAG.getContext(), ExtraWidth);
573     SDValue Lo, Hi;
574     unsigned IncrementSize;
575 
576     if (DL.isLittleEndian()) {
577       // TRUNCSTORE:i24 X -> TRUNCSTORE:i16 X, TRUNCSTORE@+2:i8 (srl X, 16)
578       // Store the bottom RoundWidth bits.
579       Lo = DAG.getTruncStore(Chain, dl, Value, Ptr, ST->getPointerInfo(),
580                              RoundVT, ST->getBaseAlign(), MMOFlags, AAInfo);
581 
582       // Store the remaining ExtraWidth bits.
583       IncrementSize = RoundWidth / 8;
584       Ptr =
585           DAG.getMemBasePlusOffset(Ptr, TypeSize::getFixed(IncrementSize), dl);
586       Hi = DAG.getNode(
587           ISD::SRL, dl, Value.getValueType(), Value,
588           DAG.getConstant(RoundWidth, dl,
589                           TLI.getShiftAmountTy(Value.getValueType(), DL)));
590       Hi = DAG.getTruncStore(Chain, dl, Hi, Ptr,
591                              ST->getPointerInfo().getWithOffset(IncrementSize),
592                              ExtraVT, ST->getBaseAlign(), MMOFlags, AAInfo);
593     } else {
594       // Big endian - avoid unaligned stores.
595       // TRUNCSTORE:i24 X -> TRUNCSTORE:i16 (srl X, 8), TRUNCSTORE@+2:i8 X
596       // Store the top RoundWidth bits.
597       Hi = DAG.getNode(
598           ISD::SRL, dl, Value.getValueType(), Value,
599           DAG.getConstant(ExtraWidth, dl,
600                           TLI.getShiftAmountTy(Value.getValueType(), DL)));
601       Hi = DAG.getTruncStore(Chain, dl, Hi, Ptr, ST->getPointerInfo(), RoundVT,
602                              ST->getBaseAlign(), MMOFlags, AAInfo);
603 
604       // Store the remaining ExtraWidth bits.
605       IncrementSize = RoundWidth / 8;
606       Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
607                         DAG.getConstant(IncrementSize, dl,
608                                         Ptr.getValueType()));
609       Lo = DAG.getTruncStore(Chain, dl, Value, Ptr,
610                              ST->getPointerInfo().getWithOffset(IncrementSize),
611                              ExtraVT, ST->getBaseAlign(), MMOFlags, AAInfo);
612     }
613 
614     // The order of the stores doesn't matter.
615     SDValue Result = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
616     ReplaceNode(SDValue(Node, 0), Result);
617   } else {
618     switch (TLI.getTruncStoreAction(ST->getValue().getValueType(), StVT)) {
619     default: llvm_unreachable("This action is not supported yet!");
620     case TargetLowering::Legal: {
621       EVT MemVT = ST->getMemoryVT();
622       // If this is an unaligned store and the target doesn't support it,
623       // expand it.
624       if (!TLI.allowsMemoryAccessForAlignment(*DAG.getContext(), DL, MemVT,
625                                               *ST->getMemOperand())) {
626         SDValue Result = TLI.expandUnalignedStore(ST, DAG);
627         ReplaceNode(SDValue(ST, 0), Result);
628       }
629       break;
630     }
631     case TargetLowering::Custom: {
632       SDValue Res = TLI.LowerOperation(SDValue(Node, 0), DAG);
633       if (Res && Res != SDValue(Node, 0))
634         ReplaceNode(SDValue(Node, 0), Res);
635       return;
636     }
637     case TargetLowering::Expand:
638       assert(!StVT.isVector() &&
639              "Vector Stores are handled in LegalizeVectorOps");
640 
641       SDValue Result;
642 
643       // TRUNCSTORE:i16 i32 -> STORE i16
644       if (TLI.isTypeLegal(StVT)) {
645         Value = DAG.getNode(ISD::TRUNCATE, dl, StVT, Value);
646         Result = DAG.getStore(Chain, dl, Value, Ptr, ST->getPointerInfo(),
647                               ST->getBaseAlign(), MMOFlags, AAInfo);
648       } else {
649         // The in-memory type isn't legal. Truncate to the type it would promote
650         // to, and then do a truncstore.
651         Value = DAG.getNode(ISD::TRUNCATE, dl,
652                             TLI.getTypeToTransformTo(*DAG.getContext(), StVT),
653                             Value);
654         Result = DAG.getTruncStore(Chain, dl, Value, Ptr, ST->getPointerInfo(),
655                                    StVT, ST->getBaseAlign(), MMOFlags, AAInfo);
656       }
657 
658       ReplaceNode(SDValue(Node, 0), Result);
659       break;
660     }
661   }
662 }
663 
LegalizeLoadOps(SDNode * Node)664 void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) {
665   LoadSDNode *LD = cast<LoadSDNode>(Node);
666   SDValue Chain = LD->getChain();  // The chain.
667   SDValue Ptr = LD->getBasePtr();  // The base pointer.
668   SDValue Value;                   // The value returned by the load op.
669   SDLoc dl(Node);
670 
671   ISD::LoadExtType ExtType = LD->getExtensionType();
672   if (ExtType == ISD::NON_EXTLOAD) {
673     LLVM_DEBUG(dbgs() << "Legalizing non-extending load operation\n");
674     MVT VT = Node->getSimpleValueType(0);
675     SDValue RVal = SDValue(Node, 0);
676     SDValue RChain = SDValue(Node, 1);
677 
678     switch (TLI.getOperationAction(Node->getOpcode(), VT)) {
679     default: llvm_unreachable("This action is not supported yet!");
680     case TargetLowering::Legal: {
681       EVT MemVT = LD->getMemoryVT();
682       const DataLayout &DL = DAG.getDataLayout();
683       // If this is an unaligned load and the target doesn't support it,
684       // expand it.
685       if (!TLI.allowsMemoryAccessForAlignment(*DAG.getContext(), DL, MemVT,
686                                               *LD->getMemOperand())) {
687         std::tie(RVal, RChain) = TLI.expandUnalignedLoad(LD, DAG);
688       }
689       break;
690     }
691     case TargetLowering::Custom:
692       if (SDValue Res = TLI.LowerOperation(RVal, DAG)) {
693         RVal = Res;
694         RChain = Res.getValue(1);
695       }
696       break;
697 
698     case TargetLowering::Promote: {
699       MVT NVT = TLI.getTypeToPromoteTo(Node->getOpcode(), VT);
700       assert(NVT.getSizeInBits() == VT.getSizeInBits() &&
701              "Can only promote loads to same size type");
702 
703       // If the range metadata type does not match the legalized memory
704       // operation type, remove the range metadata.
705       if (const MDNode *MD = LD->getRanges()) {
706         ConstantInt *Lower = mdconst::extract<ConstantInt>(MD->getOperand(0));
707         if (Lower->getBitWidth() != NVT.getScalarSizeInBits() ||
708             !NVT.isInteger())
709           LD->getMemOperand()->clearRanges();
710       }
711       SDValue Res = DAG.getLoad(NVT, dl, Chain, Ptr, LD->getMemOperand());
712       RVal = DAG.getNode(ISD::BITCAST, dl, VT, Res);
713       RChain = Res.getValue(1);
714       break;
715     }
716     }
717     if (RChain.getNode() != Node) {
718       assert(RVal.getNode() != Node && "Load must be completely replaced");
719       DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 0), RVal);
720       DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 1), RChain);
721       if (UpdatedNodes) {
722         UpdatedNodes->insert(RVal.getNode());
723         UpdatedNodes->insert(RChain.getNode());
724       }
725       ReplacedNode(Node);
726     }
727     return;
728   }
729 
730   LLVM_DEBUG(dbgs() << "Legalizing extending load operation\n");
731   EVT SrcVT = LD->getMemoryVT();
732   TypeSize SrcWidth = SrcVT.getSizeInBits();
733   MachineMemOperand::Flags MMOFlags = LD->getMemOperand()->getFlags();
734   AAMDNodes AAInfo = LD->getAAInfo();
735 
736   if (SrcWidth != SrcVT.getStoreSizeInBits() &&
737       // Some targets pretend to have an i1 loading operation, and actually
738       // load an i8.  This trick is correct for ZEXTLOAD because the top 7
739       // bits are guaranteed to be zero; it helps the optimizers understand
740       // that these bits are zero.  It is also useful for EXTLOAD, since it
741       // tells the optimizers that those bits are undefined.  It would be
742       // nice to have an effective generic way of getting these benefits...
743       // Until such a way is found, don't insist on promoting i1 here.
744       (SrcVT != MVT::i1 ||
745        TLI.getLoadExtAction(ExtType, Node->getValueType(0), MVT::i1) ==
746          TargetLowering::Promote)) {
747     // Promote to a byte-sized load if not loading an integral number of
748     // bytes.  For example, promote EXTLOAD:i20 -> EXTLOAD:i24.
749     unsigned NewWidth = SrcVT.getStoreSizeInBits();
750     EVT NVT = EVT::getIntegerVT(*DAG.getContext(), NewWidth);
751     SDValue Ch;
752 
753     // The extra bits are guaranteed to be zero, since we stored them that
754     // way.  A zext load from NVT thus automatically gives zext from SrcVT.
755 
756     ISD::LoadExtType NewExtType =
757       ExtType == ISD::ZEXTLOAD ? ISD::ZEXTLOAD : ISD::EXTLOAD;
758 
759     SDValue Result = DAG.getExtLoad(NewExtType, dl, Node->getValueType(0),
760                                     Chain, Ptr, LD->getPointerInfo(), NVT,
761                                     LD->getBaseAlign(), MMOFlags, AAInfo);
762 
763     Ch = Result.getValue(1); // The chain.
764 
765     if (ExtType == ISD::SEXTLOAD)
766       // Having the top bits zero doesn't help when sign extending.
767       Result = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl,
768                            Result.getValueType(),
769                            Result, DAG.getValueType(SrcVT));
770     else if (ExtType == ISD::ZEXTLOAD || NVT == Result.getValueType())
771       // All the top bits are guaranteed to be zero - inform the optimizers.
772       Result = DAG.getNode(ISD::AssertZext, dl,
773                            Result.getValueType(), Result,
774                            DAG.getValueType(SrcVT));
775 
776     Value = Result;
777     Chain = Ch;
778   } else if (!isPowerOf2_64(SrcWidth.getKnownMinValue())) {
779     // If not loading a power-of-2 number of bits, expand as two loads.
780     assert(!SrcVT.isVector() && "Unsupported extload!");
781     unsigned SrcWidthBits = SrcWidth.getFixedValue();
782     unsigned LogSrcWidth = Log2_32(SrcWidthBits);
783     assert(LogSrcWidth < 32);
784     unsigned RoundWidth = 1 << LogSrcWidth;
785     assert(RoundWidth < SrcWidthBits);
786     unsigned ExtraWidth = SrcWidthBits - RoundWidth;
787     assert(ExtraWidth < RoundWidth);
788     assert(!(RoundWidth % 8) && !(ExtraWidth % 8) &&
789            "Load size not an integral number of bytes!");
790     EVT RoundVT = EVT::getIntegerVT(*DAG.getContext(), RoundWidth);
791     EVT ExtraVT = EVT::getIntegerVT(*DAG.getContext(), ExtraWidth);
792     SDValue Lo, Hi, Ch;
793     unsigned IncrementSize;
794     auto &DL = DAG.getDataLayout();
795 
796     if (DL.isLittleEndian()) {
797       // EXTLOAD:i24 -> ZEXTLOAD:i16 | (shl EXTLOAD@+2:i8, 16)
798       // Load the bottom RoundWidth bits.
799       Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, Node->getValueType(0), Chain, Ptr,
800                           LD->getPointerInfo(), RoundVT, LD->getBaseAlign(),
801                           MMOFlags, AAInfo);
802 
803       // Load the remaining ExtraWidth bits.
804       IncrementSize = RoundWidth / 8;
805       Ptr =
806           DAG.getMemBasePlusOffset(Ptr, TypeSize::getFixed(IncrementSize), dl);
807       Hi = DAG.getExtLoad(ExtType, dl, Node->getValueType(0), Chain, Ptr,
808                           LD->getPointerInfo().getWithOffset(IncrementSize),
809                           ExtraVT, LD->getBaseAlign(), MMOFlags, AAInfo);
810 
811       // Build a factor node to remember that this load is independent of
812       // the other one.
813       Ch = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
814                        Hi.getValue(1));
815 
816       // Move the top bits to the right place.
817       Hi = DAG.getNode(
818           ISD::SHL, dl, Hi.getValueType(), Hi,
819           DAG.getConstant(RoundWidth, dl,
820                           TLI.getShiftAmountTy(Hi.getValueType(), DL)));
821 
822       // Join the hi and lo parts.
823       Value = DAG.getNode(ISD::OR, dl, Node->getValueType(0), Lo, Hi);
824     } else {
825       // Big endian - avoid unaligned loads.
826       // EXTLOAD:i24 -> (shl EXTLOAD:i16, 8) | ZEXTLOAD@+2:i8
827       // Load the top RoundWidth bits.
828       Hi = DAG.getExtLoad(ExtType, dl, Node->getValueType(0), Chain, Ptr,
829                           LD->getPointerInfo(), RoundVT, LD->getBaseAlign(),
830                           MMOFlags, AAInfo);
831 
832       // Load the remaining ExtraWidth bits.
833       IncrementSize = RoundWidth / 8;
834       Ptr =
835           DAG.getMemBasePlusOffset(Ptr, TypeSize::getFixed(IncrementSize), dl);
836       Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, Node->getValueType(0), Chain, Ptr,
837                           LD->getPointerInfo().getWithOffset(IncrementSize),
838                           ExtraVT, LD->getBaseAlign(), MMOFlags, AAInfo);
839 
840       // Build a factor node to remember that this load is independent of
841       // the other one.
842       Ch = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
843                        Hi.getValue(1));
844 
845       // Move the top bits to the right place.
846       Hi = DAG.getNode(
847           ISD::SHL, dl, Hi.getValueType(), Hi,
848           DAG.getConstant(ExtraWidth, dl,
849                           TLI.getShiftAmountTy(Hi.getValueType(), DL)));
850 
851       // Join the hi and lo parts.
852       Value = DAG.getNode(ISD::OR, dl, Node->getValueType(0), Lo, Hi);
853     }
854 
855     Chain = Ch;
856   } else {
857     bool isCustom = false;
858     switch (TLI.getLoadExtAction(ExtType, Node->getValueType(0),
859                                  SrcVT.getSimpleVT())) {
860     default: llvm_unreachable("This action is not supported yet!");
861     case TargetLowering::Custom:
862       isCustom = true;
863       [[fallthrough]];
864     case TargetLowering::Legal:
865       Value = SDValue(Node, 0);
866       Chain = SDValue(Node, 1);
867 
868       if (isCustom) {
869         if (SDValue Res = TLI.LowerOperation(SDValue(Node, 0), DAG)) {
870           Value = Res;
871           Chain = Res.getValue(1);
872         }
873       } else {
874         // If this is an unaligned load and the target doesn't support it,
875         // expand it.
876         EVT MemVT = LD->getMemoryVT();
877         const DataLayout &DL = DAG.getDataLayout();
878         if (!TLI.allowsMemoryAccess(*DAG.getContext(), DL, MemVT,
879                                     *LD->getMemOperand())) {
880           std::tie(Value, Chain) = TLI.expandUnalignedLoad(LD, DAG);
881         }
882       }
883       break;
884 
885     case TargetLowering::Expand: {
886       EVT DestVT = Node->getValueType(0);
887       if (!TLI.isLoadExtLegal(ISD::EXTLOAD, DestVT, SrcVT)) {
888         // If the source type is not legal, see if there is a legal extload to
889         // an intermediate type that we can then extend further.
890         EVT LoadVT = TLI.getRegisterType(SrcVT.getSimpleVT());
891         if ((LoadVT.isFloatingPoint() == SrcVT.isFloatingPoint()) &&
892             (TLI.isTypeLegal(SrcVT) || // Same as SrcVT == LoadVT?
893              TLI.isLoadExtLegal(ExtType, LoadVT, SrcVT))) {
894           // If we are loading a legal type, this is a non-extload followed by a
895           // full extend.
896           ISD::LoadExtType MidExtType =
897               (LoadVT == SrcVT) ? ISD::NON_EXTLOAD : ExtType;
898 
899           SDValue Load = DAG.getExtLoad(MidExtType, dl, LoadVT, Chain, Ptr,
900                                         SrcVT, LD->getMemOperand());
901           unsigned ExtendOp =
902               ISD::getExtForLoadExtType(SrcVT.isFloatingPoint(), ExtType);
903           Value = DAG.getNode(ExtendOp, dl, Node->getValueType(0), Load);
904           Chain = Load.getValue(1);
905           break;
906         }
907 
908         // Handle the special case of fp16 extloads. EXTLOAD doesn't have the
909         // normal undefined upper bits behavior to allow using an in-reg extend
910         // with the illegal FP type, so load as an integer and do the
911         // from-integer conversion.
912         EVT SVT = SrcVT.getScalarType();
913         if (SVT == MVT::f16 || SVT == MVT::bf16) {
914           EVT ISrcVT = SrcVT.changeTypeToInteger();
915           EVT IDestVT = DestVT.changeTypeToInteger();
916           EVT ILoadVT = TLI.getRegisterType(IDestVT.getSimpleVT());
917 
918           SDValue Result = DAG.getExtLoad(ISD::ZEXTLOAD, dl, ILoadVT, Chain,
919                                           Ptr, ISrcVT, LD->getMemOperand());
920           Value =
921               DAG.getNode(SVT == MVT::f16 ? ISD::FP16_TO_FP : ISD::BF16_TO_FP,
922                           dl, DestVT, Result);
923           Chain = Result.getValue(1);
924           break;
925         }
926       }
927 
928       assert(!SrcVT.isVector() &&
929              "Vector Loads are handled in LegalizeVectorOps");
930 
931       // FIXME: This does not work for vectors on most targets.  Sign-
932       // and zero-extend operations are currently folded into extending
933       // loads, whether they are legal or not, and then we end up here
934       // without any support for legalizing them.
935       assert(ExtType != ISD::EXTLOAD &&
936              "EXTLOAD should always be supported!");
937       // Turn the unsupported load into an EXTLOAD followed by an
938       // explicit zero/sign extend inreg.
939       SDValue Result = DAG.getExtLoad(ISD::EXTLOAD, dl,
940                                       Node->getValueType(0),
941                                       Chain, Ptr, SrcVT,
942                                       LD->getMemOperand());
943       SDValue ValRes;
944       if (ExtType == ISD::SEXTLOAD)
945         ValRes = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl,
946                              Result.getValueType(),
947                              Result, DAG.getValueType(SrcVT));
948       else
949         ValRes = DAG.getZeroExtendInReg(Result, dl, SrcVT);
950       Value = ValRes;
951       Chain = Result.getValue(1);
952       break;
953     }
954     }
955   }
956 
957   // Since loads produce two values, make sure to remember that we legalized
958   // both of them.
959   if (Chain.getNode() != Node) {
960     assert(Value.getNode() != Node && "Load must be completely replaced");
961     DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 0), Value);
962     DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 1), Chain);
963     if (UpdatedNodes) {
964       UpdatedNodes->insert(Value.getNode());
965       UpdatedNodes->insert(Chain.getNode());
966     }
967     ReplacedNode(Node);
968   }
969 }
970 
971 /// Return a legal replacement for the given operation, with all legal operands.
LegalizeOp(SDNode * Node)972 void SelectionDAGLegalize::LegalizeOp(SDNode *Node) {
973   LLVM_DEBUG(dbgs() << "\nLegalizing: "; Node->dump(&DAG));
974 
975   // Allow illegal target nodes and illegal registers.
976   if (Node->getOpcode() == ISD::TargetConstant ||
977       Node->getOpcode() == ISD::Register)
978     return;
979 
980 #ifndef NDEBUG
981   for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i)
982     assert(TLI.getTypeAction(*DAG.getContext(), Node->getValueType(i)) ==
983              TargetLowering::TypeLegal &&
984            "Unexpected illegal type!");
985 
986   for (const SDValue &Op : Node->op_values())
987     assert((TLI.getTypeAction(*DAG.getContext(), Op.getValueType()) ==
988               TargetLowering::TypeLegal ||
989             Op.getOpcode() == ISD::TargetConstant ||
990             Op.getOpcode() == ISD::Register) &&
991             "Unexpected illegal type!");
992 #endif
993 
994   // Figure out the correct action; the way to query this varies by opcode
995   TargetLowering::LegalizeAction Action = TargetLowering::Legal;
996   bool SimpleFinishLegalizing = true;
997   switch (Node->getOpcode()) {
998   // TODO: Currently, POISON is being lowered to UNDEF here. However, there is
999   // an open concern that this transformation may not be ideal, as targets
1000   // should ideally handle POISON directly. Changing this behavior would require
1001   // adding support for POISON in TableGen, which is a large change.
1002   // Additionally, many existing test cases rely on the current behavior (e.g.,
1003   // llvm/test/CodeGen/PowerPC/vec_shuffle.ll). A broader discussion and
1004   // incremental changes might be needed to properly
1005   // support POISON without breaking existing targets and tests.
1006   case ISD::POISON: {
1007     SDValue UndefNode = DAG.getUNDEF(Node->getValueType(0));
1008     ReplaceNode(Node, UndefNode.getNode());
1009     break;
1010   }
1011   case ISD::INTRINSIC_W_CHAIN:
1012   case ISD::INTRINSIC_WO_CHAIN:
1013   case ISD::INTRINSIC_VOID:
1014   case ISD::STACKSAVE:
1015     Action = TLI.getOperationAction(Node->getOpcode(), MVT::Other);
1016     break;
1017   case ISD::GET_DYNAMIC_AREA_OFFSET:
1018     Action = TLI.getOperationAction(Node->getOpcode(),
1019                                     Node->getValueType(0));
1020     break;
1021   case ISD::VAARG:
1022     Action = TLI.getOperationAction(Node->getOpcode(),
1023                                     Node->getValueType(0));
1024     if (Action != TargetLowering::Promote)
1025       Action = TLI.getOperationAction(Node->getOpcode(), MVT::Other);
1026     break;
1027   case ISD::SET_FPENV:
1028   case ISD::SET_FPMODE:
1029     Action = TLI.getOperationAction(Node->getOpcode(),
1030                                     Node->getOperand(1).getValueType());
1031     break;
1032   case ISD::FP_TO_FP16:
1033   case ISD::FP_TO_BF16:
1034   case ISD::SINT_TO_FP:
1035   case ISD::UINT_TO_FP:
1036   case ISD::EXTRACT_VECTOR_ELT:
1037   case ISD::LROUND:
1038   case ISD::LLROUND:
1039   case ISD::LRINT:
1040   case ISD::LLRINT:
1041     Action = TLI.getOperationAction(Node->getOpcode(),
1042                                     Node->getOperand(0).getValueType());
1043     break;
1044   case ISD::STRICT_FP_TO_FP16:
1045   case ISD::STRICT_FP_TO_BF16:
1046   case ISD::STRICT_SINT_TO_FP:
1047   case ISD::STRICT_UINT_TO_FP:
1048   case ISD::STRICT_LRINT:
1049   case ISD::STRICT_LLRINT:
1050   case ISD::STRICT_LROUND:
1051   case ISD::STRICT_LLROUND:
1052     // These pseudo-ops are the same as the other STRICT_ ops except
1053     // they are registered with setOperationAction() using the input type
1054     // instead of the output type.
1055     Action = TLI.getOperationAction(Node->getOpcode(),
1056                                     Node->getOperand(1).getValueType());
1057     break;
1058   case ISD::SIGN_EXTEND_INREG: {
1059     EVT InnerType = cast<VTSDNode>(Node->getOperand(1))->getVT();
1060     Action = TLI.getOperationAction(Node->getOpcode(), InnerType);
1061     break;
1062   }
1063   case ISD::ATOMIC_STORE:
1064     Action = TLI.getOperationAction(Node->getOpcode(),
1065                                     Node->getOperand(1).getValueType());
1066     break;
1067   case ISD::SELECT_CC:
1068   case ISD::STRICT_FSETCC:
1069   case ISD::STRICT_FSETCCS:
1070   case ISD::SETCC:
1071   case ISD::SETCCCARRY:
1072   case ISD::VP_SETCC:
1073   case ISD::BR_CC: {
1074     unsigned Opc = Node->getOpcode();
1075     unsigned CCOperand = Opc == ISD::SELECT_CC                         ? 4
1076                          : Opc == ISD::STRICT_FSETCC                   ? 3
1077                          : Opc == ISD::STRICT_FSETCCS                  ? 3
1078                          : Opc == ISD::SETCCCARRY                      ? 3
1079                          : (Opc == ISD::SETCC || Opc == ISD::VP_SETCC) ? 2
1080                                                                        : 1;
1081     unsigned CompareOperand = Opc == ISD::BR_CC            ? 2
1082                               : Opc == ISD::STRICT_FSETCC  ? 1
1083                               : Opc == ISD::STRICT_FSETCCS ? 1
1084                                                            : 0;
1085     MVT OpVT = Node->getOperand(CompareOperand).getSimpleValueType();
1086     ISD::CondCode CCCode =
1087         cast<CondCodeSDNode>(Node->getOperand(CCOperand))->get();
1088     Action = TLI.getCondCodeAction(CCCode, OpVT);
1089     if (Action == TargetLowering::Legal) {
1090       if (Node->getOpcode() == ISD::SELECT_CC)
1091         Action = TLI.getOperationAction(Node->getOpcode(),
1092                                         Node->getValueType(0));
1093       else
1094         Action = TLI.getOperationAction(Node->getOpcode(), OpVT);
1095     }
1096     break;
1097   }
1098   case ISD::LOAD:
1099   case ISD::STORE:
1100     // FIXME: Model these properly.  LOAD and STORE are complicated, and
1101     // STORE expects the unlegalized operand in some cases.
1102     SimpleFinishLegalizing = false;
1103     break;
1104   case ISD::CALLSEQ_START:
1105   case ISD::CALLSEQ_END:
1106     // FIXME: This shouldn't be necessary.  These nodes have special properties
1107     // dealing with the recursive nature of legalization.  Removing this
1108     // special case should be done as part of making LegalizeDAG non-recursive.
1109     SimpleFinishLegalizing = false;
1110     break;
1111   case ISD::EXTRACT_ELEMENT:
1112   case ISD::GET_ROUNDING:
1113   case ISD::MERGE_VALUES:
1114   case ISD::EH_RETURN:
1115   case ISD::FRAME_TO_ARGS_OFFSET:
1116   case ISD::EH_DWARF_CFA:
1117   case ISD::EH_SJLJ_SETJMP:
1118   case ISD::EH_SJLJ_LONGJMP:
1119   case ISD::EH_SJLJ_SETUP_DISPATCH:
1120     // These operations lie about being legal: when they claim to be legal,
1121     // they should actually be expanded.
1122     Action = TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0));
1123     if (Action == TargetLowering::Legal)
1124       Action = TargetLowering::Expand;
1125     break;
1126   case ISD::INIT_TRAMPOLINE:
1127   case ISD::ADJUST_TRAMPOLINE:
1128   case ISD::FRAMEADDR:
1129   case ISD::RETURNADDR:
1130   case ISD::ADDROFRETURNADDR:
1131   case ISD::SPONENTRY:
1132     // These operations lie about being legal: when they claim to be legal,
1133     // they should actually be custom-lowered.
1134     Action = TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0));
1135     if (Action == TargetLowering::Legal)
1136       Action = TargetLowering::Custom;
1137     break;
1138   case ISD::CLEAR_CACHE:
1139     // This operation is typically going to be LibCall unless the target wants
1140     // something differrent.
1141     Action = TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0));
1142     break;
1143   case ISD::READCYCLECOUNTER:
1144   case ISD::READSTEADYCOUNTER:
1145     // READCYCLECOUNTER and READSTEADYCOUNTER return a i64, even if type
1146     // legalization might have expanded that to several smaller types.
1147     Action = TLI.getOperationAction(Node->getOpcode(), MVT::i64);
1148     break;
1149   case ISD::READ_REGISTER:
1150   case ISD::WRITE_REGISTER:
1151     // Named register is legal in the DAG, but blocked by register name
1152     // selection if not implemented by target (to chose the correct register)
1153     // They'll be converted to Copy(To/From)Reg.
1154     Action = TargetLowering::Legal;
1155     break;
1156   case ISD::UBSANTRAP:
1157     Action = TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0));
1158     if (Action == TargetLowering::Expand) {
1159       // replace ISD::UBSANTRAP with ISD::TRAP
1160       SDValue NewVal;
1161       NewVal = DAG.getNode(ISD::TRAP, SDLoc(Node), Node->getVTList(),
1162                            Node->getOperand(0));
1163       ReplaceNode(Node, NewVal.getNode());
1164       LegalizeOp(NewVal.getNode());
1165       return;
1166     }
1167     break;
1168   case ISD::DEBUGTRAP:
1169     Action = TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0));
1170     if (Action == TargetLowering::Expand) {
1171       // replace ISD::DEBUGTRAP with ISD::TRAP
1172       SDValue NewVal;
1173       NewVal = DAG.getNode(ISD::TRAP, SDLoc(Node), Node->getVTList(),
1174                            Node->getOperand(0));
1175       ReplaceNode(Node, NewVal.getNode());
1176       LegalizeOp(NewVal.getNode());
1177       return;
1178     }
1179     break;
1180   case ISD::SADDSAT:
1181   case ISD::UADDSAT:
1182   case ISD::SSUBSAT:
1183   case ISD::USUBSAT:
1184   case ISD::SSHLSAT:
1185   case ISD::USHLSAT:
1186   case ISD::SCMP:
1187   case ISD::UCMP:
1188   case ISD::FP_TO_SINT_SAT:
1189   case ISD::FP_TO_UINT_SAT:
1190     Action = TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0));
1191     break;
1192   case ISD::SMULFIX:
1193   case ISD::SMULFIXSAT:
1194   case ISD::UMULFIX:
1195   case ISD::UMULFIXSAT:
1196   case ISD::SDIVFIX:
1197   case ISD::SDIVFIXSAT:
1198   case ISD::UDIVFIX:
1199   case ISD::UDIVFIXSAT: {
1200     unsigned Scale = Node->getConstantOperandVal(2);
1201     Action = TLI.getFixedPointOperationAction(Node->getOpcode(),
1202                                               Node->getValueType(0), Scale);
1203     break;
1204   }
1205   case ISD::MSCATTER:
1206     Action = TLI.getOperationAction(Node->getOpcode(),
1207                     cast<MaskedScatterSDNode>(Node)->getValue().getValueType());
1208     break;
1209   case ISD::MSTORE:
1210     Action = TLI.getOperationAction(Node->getOpcode(),
1211                     cast<MaskedStoreSDNode>(Node)->getValue().getValueType());
1212     break;
1213   case ISD::VP_SCATTER:
1214     Action = TLI.getOperationAction(
1215         Node->getOpcode(),
1216         cast<VPScatterSDNode>(Node)->getValue().getValueType());
1217     break;
1218   case ISD::VP_STORE:
1219     Action = TLI.getOperationAction(
1220         Node->getOpcode(),
1221         cast<VPStoreSDNode>(Node)->getValue().getValueType());
1222     break;
1223   case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
1224     Action = TLI.getOperationAction(
1225         Node->getOpcode(),
1226         cast<VPStridedStoreSDNode>(Node)->getValue().getValueType());
1227     break;
1228   case ISD::VECREDUCE_FADD:
1229   case ISD::VECREDUCE_FMUL:
1230   case ISD::VECREDUCE_ADD:
1231   case ISD::VECREDUCE_MUL:
1232   case ISD::VECREDUCE_AND:
1233   case ISD::VECREDUCE_OR:
1234   case ISD::VECREDUCE_XOR:
1235   case ISD::VECREDUCE_SMAX:
1236   case ISD::VECREDUCE_SMIN:
1237   case ISD::VECREDUCE_UMAX:
1238   case ISD::VECREDUCE_UMIN:
1239   case ISD::VECREDUCE_FMAX:
1240   case ISD::VECREDUCE_FMIN:
1241   case ISD::VECREDUCE_FMAXIMUM:
1242   case ISD::VECREDUCE_FMINIMUM:
1243   case ISD::IS_FPCLASS:
1244     Action = TLI.getOperationAction(
1245         Node->getOpcode(), Node->getOperand(0).getValueType());
1246     break;
1247   case ISD::VECREDUCE_SEQ_FADD:
1248   case ISD::VECREDUCE_SEQ_FMUL:
1249   case ISD::VP_REDUCE_FADD:
1250   case ISD::VP_REDUCE_FMUL:
1251   case ISD::VP_REDUCE_ADD:
1252   case ISD::VP_REDUCE_MUL:
1253   case ISD::VP_REDUCE_AND:
1254   case ISD::VP_REDUCE_OR:
1255   case ISD::VP_REDUCE_XOR:
1256   case ISD::VP_REDUCE_SMAX:
1257   case ISD::VP_REDUCE_SMIN:
1258   case ISD::VP_REDUCE_UMAX:
1259   case ISD::VP_REDUCE_UMIN:
1260   case ISD::VP_REDUCE_FMAX:
1261   case ISD::VP_REDUCE_FMIN:
1262   case ISD::VP_REDUCE_FMAXIMUM:
1263   case ISD::VP_REDUCE_FMINIMUM:
1264   case ISD::VP_REDUCE_SEQ_FADD:
1265   case ISD::VP_REDUCE_SEQ_FMUL:
1266     Action = TLI.getOperationAction(
1267         Node->getOpcode(), Node->getOperand(1).getValueType());
1268     break;
1269   case ISD::VP_CTTZ_ELTS:
1270   case ISD::VP_CTTZ_ELTS_ZERO_UNDEF:
1271     Action = TLI.getOperationAction(Node->getOpcode(),
1272                                     Node->getOperand(0).getValueType());
1273     break;
1274   case ISD::EXPERIMENTAL_VECTOR_HISTOGRAM:
1275     Action = TLI.getOperationAction(
1276         Node->getOpcode(),
1277         cast<MaskedHistogramSDNode>(Node)->getIndex().getValueType());
1278     break;
1279   default:
1280     if (Node->getOpcode() >= ISD::BUILTIN_OP_END) {
1281       Action = TLI.getCustomOperationAction(*Node);
1282     } else {
1283       Action = TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0));
1284     }
1285     break;
1286   }
1287 
1288   if (SimpleFinishLegalizing) {
1289     SDNode *NewNode = Node;
1290     switch (Node->getOpcode()) {
1291     default: break;
1292     case ISD::SHL:
1293     case ISD::SRL:
1294     case ISD::SRA:
1295     case ISD::ROTL:
1296     case ISD::ROTR: {
1297       // Legalizing shifts/rotates requires adjusting the shift amount
1298       // to the appropriate width.
1299       SDValue Op0 = Node->getOperand(0);
1300       SDValue Op1 = Node->getOperand(1);
1301       if (!Op1.getValueType().isVector()) {
1302         SDValue SAO = DAG.getShiftAmountOperand(Op0.getValueType(), Op1);
1303         // The getShiftAmountOperand() may create a new operand node or
1304         // return the existing one. If new operand is created we need
1305         // to update the parent node.
1306         // Do not try to legalize SAO here! It will be automatically legalized
1307         // in the next round.
1308         if (SAO != Op1)
1309           NewNode = DAG.UpdateNodeOperands(Node, Op0, SAO);
1310       }
1311     }
1312     break;
1313     case ISD::FSHL:
1314     case ISD::FSHR:
1315     case ISD::SRL_PARTS:
1316     case ISD::SRA_PARTS:
1317     case ISD::SHL_PARTS: {
1318       // Legalizing shifts/rotates requires adjusting the shift amount
1319       // to the appropriate width.
1320       SDValue Op0 = Node->getOperand(0);
1321       SDValue Op1 = Node->getOperand(1);
1322       SDValue Op2 = Node->getOperand(2);
1323       if (!Op2.getValueType().isVector()) {
1324         SDValue SAO = DAG.getShiftAmountOperand(Op0.getValueType(), Op2);
1325         // The getShiftAmountOperand() may create a new operand node or
1326         // return the existing one. If new operand is created we need
1327         // to update the parent node.
1328         if (SAO != Op2)
1329           NewNode = DAG.UpdateNodeOperands(Node, Op0, Op1, SAO);
1330       }
1331       break;
1332     }
1333     }
1334 
1335     if (NewNode != Node) {
1336       ReplaceNode(Node, NewNode);
1337       Node = NewNode;
1338     }
1339     switch (Action) {
1340     case TargetLowering::Legal:
1341       LLVM_DEBUG(dbgs() << "Legal node: nothing to do\n");
1342       return;
1343     case TargetLowering::Custom:
1344       LLVM_DEBUG(dbgs() << "Trying custom legalization\n");
1345       // FIXME: The handling for custom lowering with multiple results is
1346       // a complete mess.
1347       if (SDValue Res = TLI.LowerOperation(SDValue(Node, 0), DAG)) {
1348         if (!(Res.getNode() != Node || Res.getResNo() != 0))
1349           return;
1350 
1351         if (Node->getNumValues() == 1) {
1352           // Verify the new types match the original. Glue is waived because
1353           // ISD::ADDC can be legalized by replacing Glue with an integer type.
1354           assert((Res.getValueType() == Node->getValueType(0) ||
1355                   Node->getValueType(0) == MVT::Glue) &&
1356                  "Type mismatch for custom legalized operation");
1357           LLVM_DEBUG(dbgs() << "Successfully custom legalized node\n");
1358           // We can just directly replace this node with the lowered value.
1359           ReplaceNode(SDValue(Node, 0), Res);
1360           return;
1361         }
1362 
1363         SmallVector<SDValue, 8> ResultVals;
1364         for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i) {
1365           // Verify the new types match the original. Glue is waived because
1366           // ISD::ADDC can be legalized by replacing Glue with an integer type.
1367           assert((Res->getValueType(i) == Node->getValueType(i) ||
1368                   Node->getValueType(i) == MVT::Glue) &&
1369                  "Type mismatch for custom legalized operation");
1370           ResultVals.push_back(Res.getValue(i));
1371         }
1372         LLVM_DEBUG(dbgs() << "Successfully custom legalized node\n");
1373         ReplaceNode(Node, ResultVals.data());
1374         return;
1375       }
1376       LLVM_DEBUG(dbgs() << "Could not custom legalize node\n");
1377       [[fallthrough]];
1378     case TargetLowering::Expand:
1379       if (ExpandNode(Node))
1380         return;
1381       [[fallthrough]];
1382     case TargetLowering::LibCall:
1383       ConvertNodeToLibcall(Node);
1384       return;
1385     case TargetLowering::Promote:
1386       PromoteNode(Node);
1387       return;
1388     }
1389   }
1390 
1391   switch (Node->getOpcode()) {
1392   default:
1393 #ifndef NDEBUG
1394     dbgs() << "NODE: ";
1395     Node->dump( &DAG);
1396     dbgs() << "\n";
1397 #endif
1398     llvm_unreachable("Do not know how to legalize this operator!");
1399 
1400   case ISD::CALLSEQ_START:
1401   case ISD::CALLSEQ_END:
1402     break;
1403   case ISD::LOAD:
1404     return LegalizeLoadOps(Node);
1405   case ISD::STORE:
1406     return LegalizeStoreOps(Node);
1407   }
1408 }
1409 
ExpandExtractFromVectorThroughStack(SDValue Op)1410 SDValue SelectionDAGLegalize::ExpandExtractFromVectorThroughStack(SDValue Op) {
1411   SDValue Vec = Op.getOperand(0);
1412   SDValue Idx = Op.getOperand(1);
1413   SDLoc dl(Op);
1414 
1415   // Before we generate a new store to a temporary stack slot, see if there is
1416   // already one that we can use. There often is because when we scalarize
1417   // vector operations (using SelectionDAG::UnrollVectorOp for example) a whole
1418   // series of EXTRACT_VECTOR_ELT nodes are generated, one for each element in
1419   // the vector. If all are expanded here, we don't want one store per vector
1420   // element.
1421 
1422   // Caches for hasPredecessorHelper
1423   SmallPtrSet<const SDNode *, 32> Visited;
1424   SmallVector<const SDNode *, 16> Worklist;
1425   Visited.insert(Op.getNode());
1426   Worklist.push_back(Idx.getNode());
1427   SDValue StackPtr, Ch;
1428   for (SDNode *User : Vec.getNode()->users()) {
1429     if (StoreSDNode *ST = dyn_cast<StoreSDNode>(User)) {
1430       if (ST->isIndexed() || ST->isTruncatingStore() ||
1431           ST->getValue() != Vec)
1432         continue;
1433 
1434       // Make sure that nothing else could have stored into the destination of
1435       // this store.
1436       if (!ST->getChain().reachesChainWithoutSideEffects(DAG.getEntryNode()))
1437         continue;
1438 
1439       // If the index is dependent on the store we will introduce a cycle when
1440       // creating the load (the load uses the index, and by replacing the chain
1441       // we will make the index dependent on the load). Also, the store might be
1442       // dependent on the extractelement and introduce a cycle when creating
1443       // the load.
1444       if (SDNode::hasPredecessorHelper(ST, Visited, Worklist) ||
1445           ST->hasPredecessor(Op.getNode()))
1446         continue;
1447 
1448       StackPtr = ST->getBasePtr();
1449       Ch = SDValue(ST, 0);
1450       break;
1451     }
1452   }
1453 
1454   EVT VecVT = Vec.getValueType();
1455 
1456   if (!Ch.getNode()) {
1457     // Store the value to a temporary stack slot, then LOAD the returned part.
1458     StackPtr = DAG.CreateStackTemporary(VecVT);
1459     MachineMemOperand *StoreMMO = getStackAlignedMMO(
1460         StackPtr, DAG.getMachineFunction(), VecVT.isScalableVector());
1461     Ch = DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr, StoreMMO);
1462   }
1463 
1464   SDValue NewLoad;
1465   Align ElementAlignment =
1466       std::min(cast<StoreSDNode>(Ch)->getAlign(),
1467                DAG.getDataLayout().getPrefTypeAlign(
1468                    Op.getValueType().getTypeForEVT(*DAG.getContext())));
1469 
1470   if (Op.getValueType().isVector()) {
1471     StackPtr = TLI.getVectorSubVecPointer(DAG, StackPtr, VecVT,
1472                                           Op.getValueType(), Idx);
1473     NewLoad = DAG.getLoad(Op.getValueType(), dl, Ch, StackPtr,
1474                           MachinePointerInfo(), ElementAlignment);
1475   } else {
1476     StackPtr = TLI.getVectorElementPointer(DAG, StackPtr, VecVT, Idx);
1477     NewLoad = DAG.getExtLoad(ISD::EXTLOAD, dl, Op.getValueType(), Ch, StackPtr,
1478                              MachinePointerInfo(), VecVT.getVectorElementType(),
1479                              ElementAlignment);
1480   }
1481 
1482   // Replace the chain going out of the store, by the one out of the load.
1483   DAG.ReplaceAllUsesOfValueWith(Ch, SDValue(NewLoad.getNode(), 1));
1484 
1485   // We introduced a cycle though, so update the loads operands, making sure
1486   // to use the original store's chain as an incoming chain.
1487   SmallVector<SDValue, 6> NewLoadOperands(NewLoad->ops());
1488   NewLoadOperands[0] = Ch;
1489   NewLoad =
1490       SDValue(DAG.UpdateNodeOperands(NewLoad.getNode(), NewLoadOperands), 0);
1491   return NewLoad;
1492 }
1493 
ExpandInsertToVectorThroughStack(SDValue Op)1494 SDValue SelectionDAGLegalize::ExpandInsertToVectorThroughStack(SDValue Op) {
1495   assert(Op.getValueType().isVector() && "Non-vector insert subvector!");
1496 
1497   SDValue Vec  = Op.getOperand(0);
1498   SDValue Part = Op.getOperand(1);
1499   SDValue Idx  = Op.getOperand(2);
1500   SDLoc dl(Op);
1501 
1502   // Store the value to a temporary stack slot, then LOAD the returned part.
1503   EVT VecVT = Vec.getValueType();
1504   EVT PartVT = Part.getValueType();
1505   SDValue StackPtr = DAG.CreateStackTemporary(VecVT);
1506   int FI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
1507   MachinePointerInfo PtrInfo =
1508       MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI);
1509 
1510   // First store the whole vector.
1511   Align BaseVecAlignment =
1512       DAG.getMachineFunction().getFrameInfo().getObjectAlign(FI);
1513   SDValue Ch = DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr, PtrInfo,
1514                             BaseVecAlignment);
1515 
1516   // Freeze the index so we don't poison the clamping code we're about to emit.
1517   Idx = DAG.getFreeze(Idx);
1518 
1519   Type *PartTy = PartVT.getTypeForEVT(*DAG.getContext());
1520   Align PartAlignment = DAG.getDataLayout().getPrefTypeAlign(PartTy);
1521 
1522   // Then store the inserted part.
1523   if (PartVT.isVector()) {
1524     SDValue SubStackPtr =
1525         TLI.getVectorSubVecPointer(DAG, StackPtr, VecVT, PartVT, Idx);
1526 
1527     // Store the subvector.
1528     Ch = DAG.getStore(
1529         Ch, dl, Part, SubStackPtr,
1530         MachinePointerInfo::getUnknownStack(DAG.getMachineFunction()),
1531         PartAlignment);
1532   } else {
1533     SDValue SubStackPtr =
1534         TLI.getVectorElementPointer(DAG, StackPtr, VecVT, Idx);
1535 
1536     // Store the scalar value.
1537     Ch = DAG.getTruncStore(
1538         Ch, dl, Part, SubStackPtr,
1539         MachinePointerInfo::getUnknownStack(DAG.getMachineFunction()),
1540         VecVT.getVectorElementType(), PartAlignment);
1541   }
1542 
1543   assert(cast<StoreSDNode>(Ch)->getAlign() == PartAlignment &&
1544          "ElementAlignment does not match!");
1545 
1546   // Finally, load the updated vector.
1547   return DAG.getLoad(Op.getValueType(), dl, Ch, StackPtr, PtrInfo,
1548                      BaseVecAlignment);
1549 }
1550 
ExpandConcatVectors(SDNode * Node)1551 SDValue SelectionDAGLegalize::ExpandConcatVectors(SDNode *Node) {
1552   assert(Node->getOpcode() == ISD::CONCAT_VECTORS && "Unexpected opcode!");
1553   SDLoc DL(Node);
1554   SmallVector<SDValue, 16> Ops;
1555   unsigned NumOperands = Node->getNumOperands();
1556   MVT VectorIdxType = TLI.getVectorIdxTy(DAG.getDataLayout());
1557   EVT VectorValueType = Node->getOperand(0).getValueType();
1558   unsigned NumSubElem = VectorValueType.getVectorNumElements();
1559   EVT ElementValueType = TLI.getTypeToTransformTo(
1560       *DAG.getContext(), VectorValueType.getVectorElementType());
1561   for (unsigned I = 0; I < NumOperands; ++I) {
1562     SDValue SubOp = Node->getOperand(I);
1563     for (unsigned Idx = 0; Idx < NumSubElem; ++Idx) {
1564       Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, ElementValueType,
1565                                 SubOp,
1566                                 DAG.getConstant(Idx, DL, VectorIdxType)));
1567     }
1568   }
1569   return DAG.getBuildVector(Node->getValueType(0), DL, Ops);
1570 }
1571 
ExpandVectorBuildThroughStack(SDNode * Node)1572 SDValue SelectionDAGLegalize::ExpandVectorBuildThroughStack(SDNode* Node) {
1573   assert((Node->getOpcode() == ISD::BUILD_VECTOR ||
1574           Node->getOpcode() == ISD::CONCAT_VECTORS) &&
1575          "Unexpected opcode!");
1576 
1577   // We can't handle this case efficiently.  Allocate a sufficiently
1578   // aligned object on the stack, store each operand into it, then load
1579   // the result as a vector.
1580   // Create the stack frame object.
1581   EVT VT = Node->getValueType(0);
1582   EVT MemVT = isa<BuildVectorSDNode>(Node) ? VT.getVectorElementType()
1583                                            : Node->getOperand(0).getValueType();
1584   SDLoc dl(Node);
1585   SDValue FIPtr = DAG.CreateStackTemporary(VT);
1586   int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
1587   MachinePointerInfo PtrInfo =
1588       MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI);
1589 
1590   // Emit a store of each element to the stack slot.
1591   SmallVector<SDValue, 8> Stores;
1592   unsigned TypeByteSize = MemVT.getSizeInBits() / 8;
1593   assert(TypeByteSize > 0 && "Vector element type too small for stack store!");
1594 
1595   // If the destination vector element type of a BUILD_VECTOR is narrower than
1596   // the source element type, only store the bits necessary.
1597   bool Truncate = isa<BuildVectorSDNode>(Node) &&
1598                   MemVT.bitsLT(Node->getOperand(0).getValueType());
1599 
1600   // Store (in the right endianness) the elements to memory.
1601   for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) {
1602     // Ignore undef elements.
1603     if (Node->getOperand(i).isUndef()) continue;
1604 
1605     unsigned Offset = TypeByteSize*i;
1606 
1607     SDValue Idx =
1608         DAG.getMemBasePlusOffset(FIPtr, TypeSize::getFixed(Offset), dl);
1609 
1610     if (Truncate)
1611       Stores.push_back(DAG.getTruncStore(DAG.getEntryNode(), dl,
1612                                          Node->getOperand(i), Idx,
1613                                          PtrInfo.getWithOffset(Offset), MemVT));
1614     else
1615       Stores.push_back(DAG.getStore(DAG.getEntryNode(), dl, Node->getOperand(i),
1616                                     Idx, PtrInfo.getWithOffset(Offset)));
1617   }
1618 
1619   SDValue StoreChain;
1620   if (!Stores.empty())    // Not all undef elements?
1621     StoreChain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Stores);
1622   else
1623     StoreChain = DAG.getEntryNode();
1624 
1625   // Result is a load from the stack slot.
1626   return DAG.getLoad(VT, dl, StoreChain, FIPtr, PtrInfo);
1627 }
1628 
1629 /// Bitcast a floating-point value to an integer value. Only bitcast the part
1630 /// containing the sign bit if the target has no integer value capable of
1631 /// holding all bits of the floating-point value.
getSignAsIntValue(FloatSignAsInt & State,const SDLoc & DL,SDValue Value) const1632 void SelectionDAGLegalize::getSignAsIntValue(FloatSignAsInt &State,
1633                                              const SDLoc &DL,
1634                                              SDValue Value) const {
1635   EVT FloatVT = Value.getValueType();
1636   unsigned NumBits = FloatVT.getScalarSizeInBits();
1637   State.FloatVT = FloatVT;
1638   EVT IVT = EVT::getIntegerVT(*DAG.getContext(), NumBits);
1639   // Convert to an integer of the same size.
1640   if (TLI.isTypeLegal(IVT)) {
1641     State.IntValue = DAG.getNode(ISD::BITCAST, DL, IVT, Value);
1642     State.SignMask = APInt::getSignMask(NumBits);
1643     State.SignBit = NumBits - 1;
1644     return;
1645   }
1646 
1647   auto &DataLayout = DAG.getDataLayout();
1648   // Store the float to memory, then load the sign part out as an integer.
1649   MVT LoadTy = TLI.getRegisterType(MVT::i8);
1650   // First create a temporary that is aligned for both the load and store.
1651   SDValue StackPtr = DAG.CreateStackTemporary(FloatVT, LoadTy);
1652   int FI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
1653   // Then store the float to it.
1654   State.FloatPtr = StackPtr;
1655   MachineFunction &MF = DAG.getMachineFunction();
1656   State.FloatPointerInfo = MachinePointerInfo::getFixedStack(MF, FI);
1657   State.Chain = DAG.getStore(DAG.getEntryNode(), DL, Value, State.FloatPtr,
1658                              State.FloatPointerInfo);
1659 
1660   SDValue IntPtr;
1661   if (DataLayout.isBigEndian()) {
1662     assert(FloatVT.isByteSized() && "Unsupported floating point type!");
1663     // Load out a legal integer with the same sign bit as the float.
1664     IntPtr = StackPtr;
1665     State.IntPointerInfo = State.FloatPointerInfo;
1666   } else {
1667     // Advance the pointer so that the loaded byte will contain the sign bit.
1668     unsigned ByteOffset = (NumBits / 8) - 1;
1669     IntPtr =
1670         DAG.getMemBasePlusOffset(StackPtr, TypeSize::getFixed(ByteOffset), DL);
1671     State.IntPointerInfo = MachinePointerInfo::getFixedStack(MF, FI,
1672                                                              ByteOffset);
1673   }
1674 
1675   State.IntPtr = IntPtr;
1676   State.IntValue = DAG.getExtLoad(ISD::EXTLOAD, DL, LoadTy, State.Chain, IntPtr,
1677                                   State.IntPointerInfo, MVT::i8);
1678   State.SignMask = APInt::getOneBitSet(LoadTy.getScalarSizeInBits(), 7);
1679   State.SignBit = 7;
1680 }
1681 
1682 /// Replace the integer value produced by getSignAsIntValue() with a new value
1683 /// and cast the result back to a floating-point type.
modifySignAsInt(const FloatSignAsInt & State,const SDLoc & DL,SDValue NewIntValue) const1684 SDValue SelectionDAGLegalize::modifySignAsInt(const FloatSignAsInt &State,
1685                                               const SDLoc &DL,
1686                                               SDValue NewIntValue) const {
1687   if (!State.Chain)
1688     return DAG.getNode(ISD::BITCAST, DL, State.FloatVT, NewIntValue);
1689 
1690   // Override the part containing the sign bit in the value stored on the stack.
1691   SDValue Chain = DAG.getTruncStore(State.Chain, DL, NewIntValue, State.IntPtr,
1692                                     State.IntPointerInfo, MVT::i8);
1693   return DAG.getLoad(State.FloatVT, DL, Chain, State.FloatPtr,
1694                      State.FloatPointerInfo);
1695 }
1696 
ExpandFCOPYSIGN(SDNode * Node) const1697 SDValue SelectionDAGLegalize::ExpandFCOPYSIGN(SDNode *Node) const {
1698   SDLoc DL(Node);
1699   SDValue Mag = Node->getOperand(0);
1700   SDValue Sign = Node->getOperand(1);
1701 
1702   // Get sign bit into an integer value.
1703   FloatSignAsInt SignAsInt;
1704   getSignAsIntValue(SignAsInt, DL, Sign);
1705 
1706   EVT IntVT = SignAsInt.IntValue.getValueType();
1707   SDValue SignMask = DAG.getConstant(SignAsInt.SignMask, DL, IntVT);
1708   SDValue SignBit = DAG.getNode(ISD::AND, DL, IntVT, SignAsInt.IntValue,
1709                                 SignMask);
1710 
1711   // If FABS is legal transform
1712   // FCOPYSIGN(x, y) => SignBit(y) ? -FABS(x) : FABS(x)
1713   EVT FloatVT = Mag.getValueType();
1714   if (TLI.isOperationLegalOrCustom(ISD::FABS, FloatVT) &&
1715       TLI.isOperationLegalOrCustom(ISD::FNEG, FloatVT)) {
1716     SDValue AbsValue = DAG.getNode(ISD::FABS, DL, FloatVT, Mag);
1717     SDValue NegValue = DAG.getNode(ISD::FNEG, DL, FloatVT, AbsValue);
1718     SDValue Cond = DAG.getSetCC(DL, getSetCCResultType(IntVT), SignBit,
1719                                 DAG.getConstant(0, DL, IntVT), ISD::SETNE);
1720     return DAG.getSelect(DL, FloatVT, Cond, NegValue, AbsValue);
1721   }
1722 
1723   // Transform Mag value to integer, and clear the sign bit.
1724   FloatSignAsInt MagAsInt;
1725   getSignAsIntValue(MagAsInt, DL, Mag);
1726   EVT MagVT = MagAsInt.IntValue.getValueType();
1727   SDValue ClearSignMask = DAG.getConstant(~MagAsInt.SignMask, DL, MagVT);
1728   SDValue ClearedSign = DAG.getNode(ISD::AND, DL, MagVT, MagAsInt.IntValue,
1729                                     ClearSignMask);
1730 
1731   // Get the signbit at the right position for MagAsInt.
1732   int ShiftAmount = SignAsInt.SignBit - MagAsInt.SignBit;
1733   EVT ShiftVT = IntVT;
1734   if (SignBit.getScalarValueSizeInBits() <
1735       ClearedSign.getScalarValueSizeInBits()) {
1736     SignBit = DAG.getNode(ISD::ZERO_EXTEND, DL, MagVT, SignBit);
1737     ShiftVT = MagVT;
1738   }
1739   if (ShiftAmount > 0) {
1740     SDValue ShiftCnst = DAG.getConstant(ShiftAmount, DL, ShiftVT);
1741     SignBit = DAG.getNode(ISD::SRL, DL, ShiftVT, SignBit, ShiftCnst);
1742   } else if (ShiftAmount < 0) {
1743     SDValue ShiftCnst = DAG.getConstant(-ShiftAmount, DL, ShiftVT);
1744     SignBit = DAG.getNode(ISD::SHL, DL, ShiftVT, SignBit, ShiftCnst);
1745   }
1746   if (SignBit.getScalarValueSizeInBits() >
1747       ClearedSign.getScalarValueSizeInBits()) {
1748     SignBit = DAG.getNode(ISD::TRUNCATE, DL, MagVT, SignBit);
1749   }
1750 
1751   // Store the part with the modified sign and convert back to float.
1752   SDValue CopiedSign = DAG.getNode(ISD::OR, DL, MagVT, ClearedSign, SignBit,
1753                                    SDNodeFlags::Disjoint);
1754 
1755   return modifySignAsInt(MagAsInt, DL, CopiedSign);
1756 }
1757 
ExpandFNEG(SDNode * Node) const1758 SDValue SelectionDAGLegalize::ExpandFNEG(SDNode *Node) const {
1759   // Get the sign bit as an integer.
1760   SDLoc DL(Node);
1761   FloatSignAsInt SignAsInt;
1762   getSignAsIntValue(SignAsInt, DL, Node->getOperand(0));
1763   EVT IntVT = SignAsInt.IntValue.getValueType();
1764 
1765   // Flip the sign.
1766   SDValue SignMask = DAG.getConstant(SignAsInt.SignMask, DL, IntVT);
1767   SDValue SignFlip =
1768       DAG.getNode(ISD::XOR, DL, IntVT, SignAsInt.IntValue, SignMask);
1769 
1770   // Convert back to float.
1771   return modifySignAsInt(SignAsInt, DL, SignFlip);
1772 }
1773 
ExpandFABS(SDNode * Node) const1774 SDValue SelectionDAGLegalize::ExpandFABS(SDNode *Node) const {
1775   SDLoc DL(Node);
1776   SDValue Value = Node->getOperand(0);
1777 
1778   // Transform FABS(x) => FCOPYSIGN(x, 0.0) if FCOPYSIGN is legal.
1779   EVT FloatVT = Value.getValueType();
1780   if (TLI.isOperationLegalOrCustom(ISD::FCOPYSIGN, FloatVT)) {
1781     SDValue Zero = DAG.getConstantFP(0.0, DL, FloatVT);
1782     return DAG.getNode(ISD::FCOPYSIGN, DL, FloatVT, Value, Zero);
1783   }
1784 
1785   // Transform value to integer, clear the sign bit and transform back.
1786   FloatSignAsInt ValueAsInt;
1787   getSignAsIntValue(ValueAsInt, DL, Value);
1788   EVT IntVT = ValueAsInt.IntValue.getValueType();
1789   SDValue ClearSignMask = DAG.getConstant(~ValueAsInt.SignMask, DL, IntVT);
1790   SDValue ClearedSign = DAG.getNode(ISD::AND, DL, IntVT, ValueAsInt.IntValue,
1791                                     ClearSignMask);
1792   return modifySignAsInt(ValueAsInt, DL, ClearedSign);
1793 }
1794 
ExpandDYNAMIC_STACKALLOC(SDNode * Node,SmallVectorImpl<SDValue> & Results)1795 void SelectionDAGLegalize::ExpandDYNAMIC_STACKALLOC(SDNode* Node,
1796                                            SmallVectorImpl<SDValue> &Results) {
1797   Register SPReg = TLI.getStackPointerRegisterToSaveRestore();
1798   assert(SPReg && "Target cannot require DYNAMIC_STACKALLOC expansion and"
1799           " not tell us which reg is the stack pointer!");
1800   SDLoc dl(Node);
1801   EVT VT = Node->getValueType(0);
1802   SDValue Tmp1 = SDValue(Node, 0);
1803   SDValue Tmp2 = SDValue(Node, 1);
1804   SDValue Tmp3 = Node->getOperand(2);
1805   SDValue Chain = Tmp1.getOperand(0);
1806 
1807   // Chain the dynamic stack allocation so that it doesn't modify the stack
1808   // pointer when other instructions are using the stack.
1809   Chain = DAG.getCALLSEQ_START(Chain, 0, 0, dl);
1810 
1811   SDValue Size  = Tmp2.getOperand(1);
1812   SDValue SP = DAG.getCopyFromReg(Chain, dl, SPReg, VT);
1813   Chain = SP.getValue(1);
1814   Align Alignment = cast<ConstantSDNode>(Tmp3)->getAlignValue();
1815   const TargetFrameLowering *TFL = DAG.getSubtarget().getFrameLowering();
1816   unsigned Opc =
1817     TFL->getStackGrowthDirection() == TargetFrameLowering::StackGrowsUp ?
1818     ISD::ADD : ISD::SUB;
1819 
1820   Align StackAlign = TFL->getStackAlign();
1821   Tmp1 = DAG.getNode(Opc, dl, VT, SP, Size);       // Value
1822   if (Alignment > StackAlign)
1823     Tmp1 = DAG.getNode(ISD::AND, dl, VT, Tmp1,
1824                        DAG.getSignedConstant(-Alignment.value(), dl, VT));
1825   Chain = DAG.getCopyToReg(Chain, dl, SPReg, Tmp1);     // Output chain
1826 
1827   Tmp2 = DAG.getCALLSEQ_END(Chain, 0, 0, SDValue(), dl);
1828 
1829   Results.push_back(Tmp1);
1830   Results.push_back(Tmp2);
1831 }
1832 
1833 /// Emit a store/load combination to the stack.  This stores
1834 /// SrcOp to a stack slot of type SlotVT, truncating it if needed.  It then does
1835 /// a load from the stack slot to DestVT, extending it if needed.
1836 /// The resultant code need not be legal.
EmitStackConvert(SDValue SrcOp,EVT SlotVT,EVT DestVT,const SDLoc & dl)1837 SDValue SelectionDAGLegalize::EmitStackConvert(SDValue SrcOp, EVT SlotVT,
1838                                                EVT DestVT, const SDLoc &dl) {
1839   return EmitStackConvert(SrcOp, SlotVT, DestVT, dl, DAG.getEntryNode());
1840 }
1841 
EmitStackConvert(SDValue SrcOp,EVT SlotVT,EVT DestVT,const SDLoc & dl,SDValue Chain)1842 SDValue SelectionDAGLegalize::EmitStackConvert(SDValue SrcOp, EVT SlotVT,
1843                                                EVT DestVT, const SDLoc &dl,
1844                                                SDValue Chain) {
1845   EVT SrcVT = SrcOp.getValueType();
1846   Type *DestType = DestVT.getTypeForEVT(*DAG.getContext());
1847   Align DestAlign = DAG.getDataLayout().getPrefTypeAlign(DestType);
1848 
1849   // Don't convert with stack if the load/store is expensive.
1850   if ((SrcVT.bitsGT(SlotVT) &&
1851        !TLI.isTruncStoreLegalOrCustom(SrcOp.getValueType(), SlotVT)) ||
1852       (SlotVT.bitsLT(DestVT) &&
1853        !TLI.isLoadExtLegalOrCustom(ISD::EXTLOAD, DestVT, SlotVT)))
1854     return SDValue();
1855 
1856   // Create the stack frame object.
1857   Align SrcAlign = DAG.getDataLayout().getPrefTypeAlign(
1858       SrcOp.getValueType().getTypeForEVT(*DAG.getContext()));
1859   SDValue FIPtr = DAG.CreateStackTemporary(SlotVT.getStoreSize(), SrcAlign);
1860 
1861   FrameIndexSDNode *StackPtrFI = cast<FrameIndexSDNode>(FIPtr);
1862   int SPFI = StackPtrFI->getIndex();
1863   MachinePointerInfo PtrInfo =
1864       MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
1865 
1866   // Emit a store to the stack slot.  Use a truncstore if the input value is
1867   // later than DestVT.
1868   SDValue Store;
1869 
1870   if (SrcVT.bitsGT(SlotVT))
1871     Store = DAG.getTruncStore(Chain, dl, SrcOp, FIPtr, PtrInfo,
1872                               SlotVT, SrcAlign);
1873   else {
1874     assert(SrcVT.bitsEq(SlotVT) && "Invalid store");
1875     Store = DAG.getStore(Chain, dl, SrcOp, FIPtr, PtrInfo, SrcAlign);
1876   }
1877 
1878   // Result is a load from the stack slot.
1879   if (SlotVT.bitsEq(DestVT))
1880     return DAG.getLoad(DestVT, dl, Store, FIPtr, PtrInfo, DestAlign);
1881 
1882   assert(SlotVT.bitsLT(DestVT) && "Unknown extension!");
1883   return DAG.getExtLoad(ISD::EXTLOAD, dl, DestVT, Store, FIPtr, PtrInfo, SlotVT,
1884                         DestAlign);
1885 }
1886 
ExpandSCALAR_TO_VECTOR(SDNode * Node)1887 SDValue SelectionDAGLegalize::ExpandSCALAR_TO_VECTOR(SDNode *Node) {
1888   SDLoc dl(Node);
1889   // Create a vector sized/aligned stack slot, store the value to element #0,
1890   // then load the whole vector back out.
1891   SDValue StackPtr = DAG.CreateStackTemporary(Node->getValueType(0));
1892 
1893   FrameIndexSDNode *StackPtrFI = cast<FrameIndexSDNode>(StackPtr);
1894   int SPFI = StackPtrFI->getIndex();
1895 
1896   SDValue Ch = DAG.getTruncStore(
1897       DAG.getEntryNode(), dl, Node->getOperand(0), StackPtr,
1898       MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI),
1899       Node->getValueType(0).getVectorElementType());
1900   return DAG.getLoad(
1901       Node->getValueType(0), dl, Ch, StackPtr,
1902       MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI));
1903 }
1904 
1905 static bool
ExpandBVWithShuffles(SDNode * Node,SelectionDAG & DAG,const TargetLowering & TLI,SDValue & Res)1906 ExpandBVWithShuffles(SDNode *Node, SelectionDAG &DAG,
1907                      const TargetLowering &TLI, SDValue &Res) {
1908   unsigned NumElems = Node->getNumOperands();
1909   SDLoc dl(Node);
1910   EVT VT = Node->getValueType(0);
1911 
1912   // Try to group the scalars into pairs, shuffle the pairs together, then
1913   // shuffle the pairs of pairs together, etc. until the vector has
1914   // been built. This will work only if all of the necessary shuffle masks
1915   // are legal.
1916 
1917   // We do this in two phases; first to check the legality of the shuffles,
1918   // and next, assuming that all shuffles are legal, to create the new nodes.
1919   for (int Phase = 0; Phase < 2; ++Phase) {
1920     SmallVector<std::pair<SDValue, SmallVector<int, 16>>, 16> IntermedVals,
1921                                                               NewIntermedVals;
1922     for (unsigned i = 0; i < NumElems; ++i) {
1923       SDValue V = Node->getOperand(i);
1924       if (V.isUndef())
1925         continue;
1926 
1927       SDValue Vec;
1928       if (Phase)
1929         Vec = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, V);
1930       IntermedVals.push_back(std::make_pair(Vec, SmallVector<int, 16>(1, i)));
1931     }
1932 
1933     while (IntermedVals.size() > 2) {
1934       NewIntermedVals.clear();
1935       for (unsigned i = 0, e = (IntermedVals.size() & ~1u); i < e; i += 2) {
1936         // This vector and the next vector are shuffled together (simply to
1937         // append the one to the other).
1938         SmallVector<int, 16> ShuffleVec(NumElems, -1);
1939 
1940         SmallVector<int, 16> FinalIndices;
1941         FinalIndices.reserve(IntermedVals[i].second.size() +
1942                              IntermedVals[i+1].second.size());
1943 
1944         int k = 0;
1945         for (unsigned j = 0, f = IntermedVals[i].second.size(); j != f;
1946              ++j, ++k) {
1947           ShuffleVec[k] = j;
1948           FinalIndices.push_back(IntermedVals[i].second[j]);
1949         }
1950         for (unsigned j = 0, f = IntermedVals[i+1].second.size(); j != f;
1951              ++j, ++k) {
1952           ShuffleVec[k] = NumElems + j;
1953           FinalIndices.push_back(IntermedVals[i+1].second[j]);
1954         }
1955 
1956         SDValue Shuffle;
1957         if (Phase)
1958           Shuffle = DAG.getVectorShuffle(VT, dl, IntermedVals[i].first,
1959                                          IntermedVals[i+1].first,
1960                                          ShuffleVec);
1961         else if (!TLI.isShuffleMaskLegal(ShuffleVec, VT))
1962           return false;
1963         NewIntermedVals.push_back(
1964             std::make_pair(Shuffle, std::move(FinalIndices)));
1965       }
1966 
1967       // If we had an odd number of defined values, then append the last
1968       // element to the array of new vectors.
1969       if ((IntermedVals.size() & 1) != 0)
1970         NewIntermedVals.push_back(IntermedVals.back());
1971 
1972       IntermedVals.swap(NewIntermedVals);
1973     }
1974 
1975     assert(IntermedVals.size() <= 2 && IntermedVals.size() > 0 &&
1976            "Invalid number of intermediate vectors");
1977     SDValue Vec1 = IntermedVals[0].first;
1978     SDValue Vec2;
1979     if (IntermedVals.size() > 1)
1980       Vec2 = IntermedVals[1].first;
1981     else if (Phase)
1982       Vec2 = DAG.getUNDEF(VT);
1983 
1984     SmallVector<int, 16> ShuffleVec(NumElems, -1);
1985     for (unsigned i = 0, e = IntermedVals[0].second.size(); i != e; ++i)
1986       ShuffleVec[IntermedVals[0].second[i]] = i;
1987     for (unsigned i = 0, e = IntermedVals[1].second.size(); i != e; ++i)
1988       ShuffleVec[IntermedVals[1].second[i]] = NumElems + i;
1989 
1990     if (Phase)
1991       Res = DAG.getVectorShuffle(VT, dl, Vec1, Vec2, ShuffleVec);
1992     else if (!TLI.isShuffleMaskLegal(ShuffleVec, VT))
1993       return false;
1994   }
1995 
1996   return true;
1997 }
1998 
1999 /// Expand a BUILD_VECTOR node on targets that don't
2000 /// support the operation, but do support the resultant vector type.
ExpandBUILD_VECTOR(SDNode * Node)2001 SDValue SelectionDAGLegalize::ExpandBUILD_VECTOR(SDNode *Node) {
2002   unsigned NumElems = Node->getNumOperands();
2003   SDValue Value1, Value2;
2004   SDLoc dl(Node);
2005   EVT VT = Node->getValueType(0);
2006   EVT OpVT = Node->getOperand(0).getValueType();
2007   EVT EltVT = VT.getVectorElementType();
2008 
2009   // If the only non-undef value is the low element, turn this into a
2010   // SCALAR_TO_VECTOR node.  If this is { X, X, X, X }, determine X.
2011   bool isOnlyLowElement = true;
2012   bool MoreThanTwoValues = false;
2013   bool isConstant = true;
2014   for (unsigned i = 0; i < NumElems; ++i) {
2015     SDValue V = Node->getOperand(i);
2016     if (V.isUndef())
2017       continue;
2018     if (i > 0)
2019       isOnlyLowElement = false;
2020     if (!isa<ConstantFPSDNode>(V) && !isa<ConstantSDNode>(V))
2021       isConstant = false;
2022 
2023     if (!Value1.getNode()) {
2024       Value1 = V;
2025     } else if (!Value2.getNode()) {
2026       if (V != Value1)
2027         Value2 = V;
2028     } else if (V != Value1 && V != Value2) {
2029       MoreThanTwoValues = true;
2030     }
2031   }
2032 
2033   if (!Value1.getNode())
2034     return DAG.getUNDEF(VT);
2035 
2036   if (isOnlyLowElement)
2037     return DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Node->getOperand(0));
2038 
2039   // If all elements are constants, create a load from the constant pool.
2040   if (isConstant) {
2041     SmallVector<Constant*, 16> CV;
2042     for (unsigned i = 0, e = NumElems; i != e; ++i) {
2043       if (ConstantFPSDNode *V =
2044           dyn_cast<ConstantFPSDNode>(Node->getOperand(i))) {
2045         CV.push_back(const_cast<ConstantFP *>(V->getConstantFPValue()));
2046       } else if (ConstantSDNode *V =
2047                  dyn_cast<ConstantSDNode>(Node->getOperand(i))) {
2048         if (OpVT==EltVT)
2049           CV.push_back(const_cast<ConstantInt *>(V->getConstantIntValue()));
2050         else {
2051           // If OpVT and EltVT don't match, EltVT is not legal and the
2052           // element values have been promoted/truncated earlier.  Undo this;
2053           // we don't want a v16i8 to become a v16i32 for example.
2054           const ConstantInt *CI = V->getConstantIntValue();
2055           CV.push_back(ConstantInt::get(EltVT.getTypeForEVT(*DAG.getContext()),
2056                                         CI->getZExtValue()));
2057         }
2058       } else {
2059         assert(Node->getOperand(i).isUndef());
2060         Type *OpNTy = EltVT.getTypeForEVT(*DAG.getContext());
2061         CV.push_back(UndefValue::get(OpNTy));
2062       }
2063     }
2064     Constant *CP = ConstantVector::get(CV);
2065     SDValue CPIdx =
2066         DAG.getConstantPool(CP, TLI.getPointerTy(DAG.getDataLayout()));
2067     Align Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlign();
2068     return DAG.getLoad(
2069         VT, dl, DAG.getEntryNode(), CPIdx,
2070         MachinePointerInfo::getConstantPool(DAG.getMachineFunction()),
2071         Alignment);
2072   }
2073 
2074   SmallSet<SDValue, 16> DefinedValues;
2075   for (unsigned i = 0; i < NumElems; ++i) {
2076     if (Node->getOperand(i).isUndef())
2077       continue;
2078     DefinedValues.insert(Node->getOperand(i));
2079   }
2080 
2081   if (TLI.shouldExpandBuildVectorWithShuffles(VT, DefinedValues.size())) {
2082     if (!MoreThanTwoValues) {
2083       SmallVector<int, 8> ShuffleVec(NumElems, -1);
2084       for (unsigned i = 0; i < NumElems; ++i) {
2085         SDValue V = Node->getOperand(i);
2086         if (V.isUndef())
2087           continue;
2088         ShuffleVec[i] = V == Value1 ? 0 : NumElems;
2089       }
2090       if (TLI.isShuffleMaskLegal(ShuffleVec, Node->getValueType(0))) {
2091         // Get the splatted value into the low element of a vector register.
2092         SDValue Vec1 = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Value1);
2093         SDValue Vec2;
2094         if (Value2.getNode())
2095           Vec2 = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Value2);
2096         else
2097           Vec2 = DAG.getUNDEF(VT);
2098 
2099         // Return shuffle(LowValVec, undef, <0,0,0,0>)
2100         return DAG.getVectorShuffle(VT, dl, Vec1, Vec2, ShuffleVec);
2101       }
2102     } else {
2103       SDValue Res;
2104       if (ExpandBVWithShuffles(Node, DAG, TLI, Res))
2105         return Res;
2106     }
2107   }
2108 
2109   // Otherwise, we can't handle this case efficiently.
2110   return ExpandVectorBuildThroughStack(Node);
2111 }
2112 
ExpandSPLAT_VECTOR(SDNode * Node)2113 SDValue SelectionDAGLegalize::ExpandSPLAT_VECTOR(SDNode *Node) {
2114   SDLoc DL(Node);
2115   EVT VT = Node->getValueType(0);
2116   SDValue SplatVal = Node->getOperand(0);
2117 
2118   return DAG.getSplatBuildVector(VT, DL, SplatVal);
2119 }
2120 
2121 // Expand a node into a call to a libcall, returning the value as the first
2122 // result and the chain as the second.  If the result value does not fit into a
2123 // register, return the lo part and set the hi part to the by-reg argument in
2124 // the first.  If it does fit into a single register, return the result and
2125 // leave the Hi part unset.
2126 std::pair<SDValue, SDValue>
ExpandLibCall(RTLIB::Libcall LC,SDNode * Node,TargetLowering::ArgListTy && Args,bool IsSigned,EVT RetVT)2127 SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, SDNode *Node,
2128                                     TargetLowering::ArgListTy &&Args,
2129                                     bool IsSigned, EVT RetVT) {
2130   EVT CodePtrTy = TLI.getPointerTy(DAG.getDataLayout());
2131   SDValue Callee;
2132   if (const char *LibcallName = TLI.getLibcallName(LC))
2133     Callee = DAG.getExternalSymbol(LibcallName, CodePtrTy);
2134   else {
2135     Callee = DAG.getUNDEF(CodePtrTy);
2136     DAG.getContext()->emitError(Twine("no libcall available for ") +
2137                                 Node->getOperationName(&DAG));
2138   }
2139 
2140   Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext());
2141 
2142   // By default, the input chain to this libcall is the entry node of the
2143   // function. If the libcall is going to be emitted as a tail call then
2144   // TLI.isUsedByReturnOnly will change it to the right chain if the return
2145   // node which is being folded has a non-entry input chain.
2146   SDValue InChain = DAG.getEntryNode();
2147 
2148   // isTailCall may be true since the callee does not reference caller stack
2149   // frame. Check if it's in the right position and that the return types match.
2150   SDValue TCChain = InChain;
2151   const Function &F = DAG.getMachineFunction().getFunction();
2152   bool isTailCall =
2153       TLI.isInTailCallPosition(DAG, Node, TCChain) &&
2154       (RetTy == F.getReturnType() || F.getReturnType()->isVoidTy());
2155   if (isTailCall)
2156     InChain = TCChain;
2157 
2158   TargetLowering::CallLoweringInfo CLI(DAG);
2159   bool signExtend = TLI.shouldSignExtendTypeInLibCall(RetTy, IsSigned);
2160   CLI.setDebugLoc(SDLoc(Node))
2161       .setChain(InChain)
2162       .setLibCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee,
2163                     std::move(Args))
2164       .setTailCall(isTailCall)
2165       .setSExtResult(signExtend)
2166       .setZExtResult(!signExtend)
2167       .setIsPostTypeLegalization(true);
2168 
2169   std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
2170 
2171   if (!CallInfo.second.getNode()) {
2172     LLVM_DEBUG(dbgs() << "Created tailcall: "; DAG.getRoot().dump(&DAG));
2173     // It's a tailcall, return the chain (which is the DAG root).
2174     return {DAG.getRoot(), DAG.getRoot()};
2175   }
2176 
2177   LLVM_DEBUG(dbgs() << "Created libcall: "; CallInfo.first.dump(&DAG));
2178   return CallInfo;
2179 }
2180 
ExpandLibCall(RTLIB::Libcall LC,SDNode * Node,bool isSigned)2181 std::pair<SDValue, SDValue> SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, SDNode *Node,
2182                                             bool isSigned) {
2183   TargetLowering::ArgListTy Args;
2184   TargetLowering::ArgListEntry Entry;
2185   for (const SDValue &Op : Node->op_values()) {
2186     EVT ArgVT = Op.getValueType();
2187     Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext());
2188     Entry.Node = Op;
2189     Entry.Ty = ArgTy;
2190     Entry.IsSExt = TLI.shouldSignExtendTypeInLibCall(ArgTy, isSigned);
2191     Entry.IsZExt = !Entry.IsSExt;
2192     Args.push_back(Entry);
2193   }
2194 
2195   return ExpandLibCall(LC, Node, std::move(Args), isSigned,
2196                        Node->getValueType(0));
2197 }
2198 
ExpandFPLibCall(SDNode * Node,RTLIB::Libcall LC,SmallVectorImpl<SDValue> & Results)2199 void SelectionDAGLegalize::ExpandFPLibCall(SDNode* Node,
2200                                            RTLIB::Libcall LC,
2201                                            SmallVectorImpl<SDValue> &Results) {
2202   if (LC == RTLIB::UNKNOWN_LIBCALL)
2203     llvm_unreachable("Can't create an unknown libcall!");
2204 
2205   if (Node->isStrictFPOpcode()) {
2206     EVT RetVT = Node->getValueType(0);
2207     SmallVector<SDValue, 4> Ops(drop_begin(Node->ops()));
2208     TargetLowering::MakeLibCallOptions CallOptions;
2209     CallOptions.IsPostTypeLegalization = true;
2210     // FIXME: This doesn't support tail calls.
2211     std::pair<SDValue, SDValue> Tmp = TLI.makeLibCall(DAG, LC, RetVT,
2212                                                       Ops, CallOptions,
2213                                                       SDLoc(Node),
2214                                                       Node->getOperand(0));
2215     Results.push_back(Tmp.first);
2216     Results.push_back(Tmp.second);
2217   } else {
2218     bool IsSignedArgument = Node->getOpcode() == ISD::FLDEXP;
2219     SDValue Tmp = ExpandLibCall(LC, Node, IsSignedArgument).first;
2220     Results.push_back(Tmp);
2221   }
2222 }
2223 
2224 /// Expand the node to a libcall based on the result type.
ExpandFPLibCall(SDNode * Node,RTLIB::Libcall Call_F32,RTLIB::Libcall Call_F64,RTLIB::Libcall Call_F80,RTLIB::Libcall Call_F128,RTLIB::Libcall Call_PPCF128,SmallVectorImpl<SDValue> & Results)2225 void SelectionDAGLegalize::ExpandFPLibCall(SDNode* Node,
2226                                            RTLIB::Libcall Call_F32,
2227                                            RTLIB::Libcall Call_F64,
2228                                            RTLIB::Libcall Call_F80,
2229                                            RTLIB::Libcall Call_F128,
2230                                            RTLIB::Libcall Call_PPCF128,
2231                                            SmallVectorImpl<SDValue> &Results) {
2232   RTLIB::Libcall LC = RTLIB::getFPLibCall(Node->getSimpleValueType(0),
2233                                           Call_F32, Call_F64, Call_F80,
2234                                           Call_F128, Call_PPCF128);
2235   ExpandFPLibCall(Node, LC, Results);
2236 }
2237 
ExpandFastFPLibCall(SDNode * Node,bool IsFast,std::pair<RTLIB::Libcall,RTLIB::Libcall> Call_F32,std::pair<RTLIB::Libcall,RTLIB::Libcall> Call_F64,std::pair<RTLIB::Libcall,RTLIB::Libcall> Call_F80,std::pair<RTLIB::Libcall,RTLIB::Libcall> Call_F128,std::pair<RTLIB::Libcall,RTLIB::Libcall> Call_PPCF128,SmallVectorImpl<SDValue> & Results)2238 void SelectionDAGLegalize::ExpandFastFPLibCall(
2239     SDNode *Node, bool IsFast,
2240     std::pair<RTLIB::Libcall, RTLIB::Libcall> Call_F32,
2241     std::pair<RTLIB::Libcall, RTLIB::Libcall> Call_F64,
2242     std::pair<RTLIB::Libcall, RTLIB::Libcall> Call_F80,
2243     std::pair<RTLIB::Libcall, RTLIB::Libcall> Call_F128,
2244     std::pair<RTLIB::Libcall, RTLIB::Libcall> Call_PPCF128,
2245     SmallVectorImpl<SDValue> &Results) {
2246 
2247   EVT VT = Node->getSimpleValueType(0);
2248 
2249   RTLIB::Libcall LC;
2250 
2251   // FIXME: Probably should define fast to respect nan/inf and only be
2252   // approximate functions.
2253 
2254   if (IsFast) {
2255     LC = RTLIB::getFPLibCall(VT, Call_F32.first, Call_F64.first, Call_F80.first,
2256                              Call_F128.first, Call_PPCF128.first);
2257   }
2258 
2259   if (!IsFast || TLI.getLibcallImpl(LC) == RTLIB::Unsupported) {
2260     // Fall back if we don't have a fast implementation.
2261     LC = RTLIB::getFPLibCall(VT, Call_F32.second, Call_F64.second,
2262                              Call_F80.second, Call_F128.second,
2263                              Call_PPCF128.second);
2264   }
2265 
2266   ExpandFPLibCall(Node, LC, Results);
2267 }
2268 
ExpandIntLibCall(SDNode * Node,bool isSigned,RTLIB::Libcall Call_I8,RTLIB::Libcall Call_I16,RTLIB::Libcall Call_I32,RTLIB::Libcall Call_I64,RTLIB::Libcall Call_I128)2269 SDValue SelectionDAGLegalize::ExpandIntLibCall(SDNode* Node, bool isSigned,
2270                                                RTLIB::Libcall Call_I8,
2271                                                RTLIB::Libcall Call_I16,
2272                                                RTLIB::Libcall Call_I32,
2273                                                RTLIB::Libcall Call_I64,
2274                                                RTLIB::Libcall Call_I128) {
2275   RTLIB::Libcall LC;
2276   switch (Node->getSimpleValueType(0).SimpleTy) {
2277   default: llvm_unreachable("Unexpected request for libcall!");
2278   case MVT::i8:   LC = Call_I8; break;
2279   case MVT::i16:  LC = Call_I16; break;
2280   case MVT::i32:  LC = Call_I32; break;
2281   case MVT::i64:  LC = Call_I64; break;
2282   case MVT::i128: LC = Call_I128; break;
2283   }
2284   return ExpandLibCall(LC, Node, isSigned).first;
2285 }
2286 
2287 /// Expand the node to a libcall based on first argument type (for instance
2288 /// lround and its variant).
ExpandArgFPLibCall(SDNode * Node,RTLIB::Libcall Call_F32,RTLIB::Libcall Call_F64,RTLIB::Libcall Call_F80,RTLIB::Libcall Call_F128,RTLIB::Libcall Call_PPCF128,SmallVectorImpl<SDValue> & Results)2289 void SelectionDAGLegalize::ExpandArgFPLibCall(SDNode* Node,
2290                                             RTLIB::Libcall Call_F32,
2291                                             RTLIB::Libcall Call_F64,
2292                                             RTLIB::Libcall Call_F80,
2293                                             RTLIB::Libcall Call_F128,
2294                                             RTLIB::Libcall Call_PPCF128,
2295                                             SmallVectorImpl<SDValue> &Results) {
2296   EVT InVT = Node->getOperand(Node->isStrictFPOpcode() ? 1 : 0).getValueType();
2297   RTLIB::Libcall LC = RTLIB::getFPLibCall(InVT.getSimpleVT(),
2298                                           Call_F32, Call_F64, Call_F80,
2299                                           Call_F128, Call_PPCF128);
2300   ExpandFPLibCall(Node, LC, Results);
2301 }
2302 
ExpandBitCountingLibCall(SDNode * Node,RTLIB::Libcall CallI32,RTLIB::Libcall CallI64,RTLIB::Libcall CallI128)2303 SDValue SelectionDAGLegalize::ExpandBitCountingLibCall(
2304     SDNode *Node, RTLIB::Libcall CallI32, RTLIB::Libcall CallI64,
2305     RTLIB::Libcall CallI128) {
2306   RTLIB::Libcall LC;
2307   switch (Node->getSimpleValueType(0).SimpleTy) {
2308   default:
2309     llvm_unreachable("Unexpected request for libcall!");
2310   case MVT::i32:
2311     LC = CallI32;
2312     break;
2313   case MVT::i64:
2314     LC = CallI64;
2315     break;
2316   case MVT::i128:
2317     LC = CallI128;
2318     break;
2319   }
2320 
2321   // Bit-counting libcalls have one unsigned argument and return `int`.
2322   // Note that `int` may be illegal on this target; ExpandLibCall will
2323   // take care of promoting it to a legal type.
2324   SDValue Op = Node->getOperand(0);
2325   EVT IntVT =
2326       EVT::getIntegerVT(*DAG.getContext(), DAG.getLibInfo().getIntSize());
2327 
2328   TargetLowering::ArgListEntry Arg;
2329   EVT ArgVT = Op.getValueType();
2330   Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext());
2331   Arg.Node = Op;
2332   Arg.Ty = ArgTy;
2333   Arg.IsSExt = TLI.shouldSignExtendTypeInLibCall(ArgTy, /*IsSigned=*/false);
2334   Arg.IsZExt = !Arg.IsSExt;
2335 
2336   SDValue Res = ExpandLibCall(LC, Node, TargetLowering::ArgListTy{Arg},
2337                               /*IsSigned=*/true, IntVT)
2338                     .first;
2339 
2340   // If ExpandLibCall created a tail call, the result was already
2341   // of the correct type. Otherwise, we need to sign extend it.
2342   if (Res.getValueType() != MVT::Other)
2343     Res = DAG.getSExtOrTrunc(Res, SDLoc(Node), Node->getValueType(0));
2344   return Res;
2345 }
2346 
2347 /// Issue libcalls to __{u}divmod to compute div / rem pairs.
2348 void
ExpandDivRemLibCall(SDNode * Node,SmallVectorImpl<SDValue> & Results)2349 SelectionDAGLegalize::ExpandDivRemLibCall(SDNode *Node,
2350                                           SmallVectorImpl<SDValue> &Results) {
2351   unsigned Opcode = Node->getOpcode();
2352   bool isSigned = Opcode == ISD::SDIVREM;
2353 
2354   RTLIB::Libcall LC;
2355   switch (Node->getSimpleValueType(0).SimpleTy) {
2356   default: llvm_unreachable("Unexpected request for libcall!");
2357   case MVT::i8:   LC= isSigned ? RTLIB::SDIVREM_I8  : RTLIB::UDIVREM_I8;  break;
2358   case MVT::i16:  LC= isSigned ? RTLIB::SDIVREM_I16 : RTLIB::UDIVREM_I16; break;
2359   case MVT::i32:  LC= isSigned ? RTLIB::SDIVREM_I32 : RTLIB::UDIVREM_I32; break;
2360   case MVT::i64:  LC= isSigned ? RTLIB::SDIVREM_I64 : RTLIB::UDIVREM_I64; break;
2361   case MVT::i128: LC= isSigned ? RTLIB::SDIVREM_I128:RTLIB::UDIVREM_I128; break;
2362   }
2363 
2364   // The input chain to this libcall is the entry node of the function.
2365   // Legalizing the call will automatically add the previous call to the
2366   // dependence.
2367   SDValue InChain = DAG.getEntryNode();
2368 
2369   EVT RetVT = Node->getValueType(0);
2370   Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext());
2371 
2372   TargetLowering::ArgListTy Args;
2373   TargetLowering::ArgListEntry Entry;
2374   for (const SDValue &Op : Node->op_values()) {
2375     EVT ArgVT = Op.getValueType();
2376     Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext());
2377     Entry.Node = Op;
2378     Entry.Ty = ArgTy;
2379     Entry.IsSExt = isSigned;
2380     Entry.IsZExt = !isSigned;
2381     Args.push_back(Entry);
2382   }
2383 
2384   // Also pass the return address of the remainder.
2385   SDValue FIPtr = DAG.CreateStackTemporary(RetVT);
2386   Entry.Node = FIPtr;
2387   Entry.Ty = PointerType::getUnqual(RetTy->getContext());
2388   Entry.IsSExt = isSigned;
2389   Entry.IsZExt = !isSigned;
2390   Args.push_back(Entry);
2391 
2392   SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC),
2393                                          TLI.getPointerTy(DAG.getDataLayout()));
2394 
2395   SDLoc dl(Node);
2396   TargetLowering::CallLoweringInfo CLI(DAG);
2397   CLI.setDebugLoc(dl)
2398       .setChain(InChain)
2399       .setLibCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee,
2400                     std::move(Args))
2401       .setSExtResult(isSigned)
2402       .setZExtResult(!isSigned);
2403 
2404   std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
2405 
2406   // Remainder is loaded back from the stack frame.
2407   SDValue Rem =
2408       DAG.getLoad(RetVT, dl, CallInfo.second, FIPtr, MachinePointerInfo());
2409   Results.push_back(CallInfo.first);
2410   Results.push_back(Rem);
2411 }
2412 
2413 /// Return true if sincos libcall is available.
isSinCosLibcallAvailable(SDNode * Node,const TargetLowering & TLI)2414 static bool isSinCosLibcallAvailable(SDNode *Node, const TargetLowering &TLI) {
2415   RTLIB::Libcall LC = RTLIB::getSINCOS(Node->getSimpleValueType(0).SimpleTy);
2416   return TLI.getLibcallName(LC) != nullptr;
2417 }
2418 
2419 /// Only issue sincos libcall if both sin and cos are needed.
useSinCos(SDNode * Node)2420 static bool useSinCos(SDNode *Node) {
2421   unsigned OtherOpcode = Node->getOpcode() == ISD::FSIN
2422     ? ISD::FCOS : ISD::FSIN;
2423 
2424   SDValue Op0 = Node->getOperand(0);
2425   for (const SDNode *User : Op0.getNode()->users()) {
2426     if (User == Node)
2427       continue;
2428     // The other user might have been turned into sincos already.
2429     if (User->getOpcode() == OtherOpcode || User->getOpcode() == ISD::FSINCOS)
2430       return true;
2431   }
2432   return false;
2433 }
2434 
expandLdexp(SDNode * Node) const2435 SDValue SelectionDAGLegalize::expandLdexp(SDNode *Node) const {
2436   SDLoc dl(Node);
2437   EVT VT = Node->getValueType(0);
2438   SDValue X = Node->getOperand(0);
2439   SDValue N = Node->getOperand(1);
2440   EVT ExpVT = N.getValueType();
2441   EVT AsIntVT = VT.changeTypeToInteger();
2442   if (AsIntVT == EVT()) // TODO: How to handle f80?
2443     return SDValue();
2444 
2445   if (Node->getOpcode() == ISD::STRICT_FLDEXP) // TODO
2446     return SDValue();
2447 
2448   SDNodeFlags NSW;
2449   NSW.setNoSignedWrap(true);
2450   SDNodeFlags NUW_NSW;
2451   NUW_NSW.setNoUnsignedWrap(true);
2452   NUW_NSW.setNoSignedWrap(true);
2453 
2454   EVT SetCCVT =
2455       TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), ExpVT);
2456   const fltSemantics &FltSem = VT.getFltSemantics();
2457 
2458   const APFloat::ExponentType MaxExpVal = APFloat::semanticsMaxExponent(FltSem);
2459   const APFloat::ExponentType MinExpVal = APFloat::semanticsMinExponent(FltSem);
2460   const int Precision = APFloat::semanticsPrecision(FltSem);
2461 
2462   const SDValue MaxExp = DAG.getSignedConstant(MaxExpVal, dl, ExpVT);
2463   const SDValue MinExp = DAG.getSignedConstant(MinExpVal, dl, ExpVT);
2464 
2465   const SDValue DoubleMaxExp = DAG.getSignedConstant(2 * MaxExpVal, dl, ExpVT);
2466 
2467   const APFloat One(FltSem, "1.0");
2468   APFloat ScaleUpK = scalbn(One, MaxExpVal, APFloat::rmNearestTiesToEven);
2469 
2470   // Offset by precision to avoid denormal range.
2471   APFloat ScaleDownK =
2472       scalbn(One, MinExpVal + Precision, APFloat::rmNearestTiesToEven);
2473 
2474   // TODO: Should really introduce control flow and use a block for the >
2475   // MaxExp, < MinExp cases
2476 
2477   // First, handle exponents Exp > MaxExp and scale down.
2478   SDValue NGtMaxExp = DAG.getSetCC(dl, SetCCVT, N, MaxExp, ISD::SETGT);
2479 
2480   SDValue DecN0 = DAG.getNode(ISD::SUB, dl, ExpVT, N, MaxExp, NSW);
2481   SDValue ClampMaxVal = DAG.getConstant(3 * MaxExpVal, dl, ExpVT);
2482   SDValue ClampN_Big = DAG.getNode(ISD::SMIN, dl, ExpVT, N, ClampMaxVal);
2483   SDValue DecN1 =
2484       DAG.getNode(ISD::SUB, dl, ExpVT, ClampN_Big, DoubleMaxExp, NSW);
2485 
2486   SDValue ScaleUpTwice =
2487       DAG.getSetCC(dl, SetCCVT, N, DoubleMaxExp, ISD::SETUGT);
2488 
2489   const SDValue ScaleUpVal = DAG.getConstantFP(ScaleUpK, dl, VT);
2490   SDValue ScaleUp0 = DAG.getNode(ISD::FMUL, dl, VT, X, ScaleUpVal);
2491   SDValue ScaleUp1 = DAG.getNode(ISD::FMUL, dl, VT, ScaleUp0, ScaleUpVal);
2492 
2493   SDValue SelectN_Big =
2494       DAG.getNode(ISD::SELECT, dl, ExpVT, ScaleUpTwice, DecN1, DecN0);
2495   SDValue SelectX_Big =
2496       DAG.getNode(ISD::SELECT, dl, VT, ScaleUpTwice, ScaleUp1, ScaleUp0);
2497 
2498   // Now handle exponents Exp < MinExp
2499   SDValue NLtMinExp = DAG.getSetCC(dl, SetCCVT, N, MinExp, ISD::SETLT);
2500 
2501   SDValue Increment0 = DAG.getConstant(-(MinExpVal + Precision), dl, ExpVT);
2502   SDValue Increment1 = DAG.getConstant(-2 * (MinExpVal + Precision), dl, ExpVT);
2503 
2504   SDValue IncN0 = DAG.getNode(ISD::ADD, dl, ExpVT, N, Increment0, NUW_NSW);
2505 
2506   SDValue ClampMinVal =
2507       DAG.getSignedConstant(3 * MinExpVal + 2 * Precision, dl, ExpVT);
2508   SDValue ClampN_Small = DAG.getNode(ISD::SMAX, dl, ExpVT, N, ClampMinVal);
2509   SDValue IncN1 =
2510       DAG.getNode(ISD::ADD, dl, ExpVT, ClampN_Small, Increment1, NSW);
2511 
2512   const SDValue ScaleDownVal = DAG.getConstantFP(ScaleDownK, dl, VT);
2513   SDValue ScaleDown0 = DAG.getNode(ISD::FMUL, dl, VT, X, ScaleDownVal);
2514   SDValue ScaleDown1 = DAG.getNode(ISD::FMUL, dl, VT, ScaleDown0, ScaleDownVal);
2515 
2516   SDValue ScaleDownTwice = DAG.getSetCC(
2517       dl, SetCCVT, N,
2518       DAG.getSignedConstant(2 * MinExpVal + Precision, dl, ExpVT), ISD::SETULT);
2519 
2520   SDValue SelectN_Small =
2521       DAG.getNode(ISD::SELECT, dl, ExpVT, ScaleDownTwice, IncN1, IncN0);
2522   SDValue SelectX_Small =
2523       DAG.getNode(ISD::SELECT, dl, VT, ScaleDownTwice, ScaleDown1, ScaleDown0);
2524 
2525   // Now combine the two out of range exponent handling cases with the base
2526   // case.
2527   SDValue NewX = DAG.getNode(
2528       ISD::SELECT, dl, VT, NGtMaxExp, SelectX_Big,
2529       DAG.getNode(ISD::SELECT, dl, VT, NLtMinExp, SelectX_Small, X));
2530 
2531   SDValue NewN = DAG.getNode(
2532       ISD::SELECT, dl, ExpVT, NGtMaxExp, SelectN_Big,
2533       DAG.getNode(ISD::SELECT, dl, ExpVT, NLtMinExp, SelectN_Small, N));
2534 
2535   SDValue BiasedN = DAG.getNode(ISD::ADD, dl, ExpVT, NewN, MaxExp, NSW);
2536 
2537   SDValue ExponentShiftAmt =
2538       DAG.getShiftAmountConstant(Precision - 1, ExpVT, dl);
2539   SDValue CastExpToValTy = DAG.getZExtOrTrunc(BiasedN, dl, AsIntVT);
2540 
2541   SDValue AsInt = DAG.getNode(ISD::SHL, dl, AsIntVT, CastExpToValTy,
2542                               ExponentShiftAmt, NUW_NSW);
2543   SDValue AsFP = DAG.getNode(ISD::BITCAST, dl, VT, AsInt);
2544   return DAG.getNode(ISD::FMUL, dl, VT, NewX, AsFP);
2545 }
2546 
expandFrexp(SDNode * Node) const2547 SDValue SelectionDAGLegalize::expandFrexp(SDNode *Node) const {
2548   SDLoc dl(Node);
2549   SDValue Val = Node->getOperand(0);
2550   EVT VT = Val.getValueType();
2551   EVT ExpVT = Node->getValueType(1);
2552   EVT AsIntVT = VT.changeTypeToInteger();
2553   if (AsIntVT == EVT()) // TODO: How to handle f80?
2554     return SDValue();
2555 
2556   const fltSemantics &FltSem = VT.getFltSemantics();
2557   const APFloat::ExponentType MinExpVal = APFloat::semanticsMinExponent(FltSem);
2558   const unsigned Precision = APFloat::semanticsPrecision(FltSem);
2559   const unsigned BitSize = VT.getScalarSizeInBits();
2560 
2561   // TODO: Could introduce control flow and skip over the denormal handling.
2562 
2563   // scale_up = fmul value, scalbn(1.0, precision + 1)
2564   // extracted_exp = (bitcast value to uint) >> precision - 1
2565   // biased_exp = extracted_exp + min_exp
2566   // extracted_fract = (bitcast value to uint) & (fract_mask | sign_mask)
2567   //
2568   // is_denormal = val < smallest_normalized
2569   // computed_fract = is_denormal ? scale_up : extracted_fract
2570   // computed_exp = is_denormal ? biased_exp + (-precision - 1) : biased_exp
2571   //
2572   // result_0 =  (!isfinite(val) || iszero(val)) ? val : computed_fract
2573   // result_1 =  (!isfinite(val) || iszero(val)) ? 0 : computed_exp
2574 
2575   SDValue NegSmallestNormalizedInt = DAG.getConstant(
2576       APFloat::getSmallestNormalized(FltSem, true).bitcastToAPInt(), dl,
2577       AsIntVT);
2578 
2579   SDValue SmallestNormalizedInt = DAG.getConstant(
2580       APFloat::getSmallestNormalized(FltSem, false).bitcastToAPInt(), dl,
2581       AsIntVT);
2582 
2583   // Masks out the exponent bits.
2584   SDValue ExpMask =
2585       DAG.getConstant(APFloat::getInf(FltSem).bitcastToAPInt(), dl, AsIntVT);
2586 
2587   // Mask out the exponent part of the value.
2588   //
2589   // e.g, for f32 FractSignMaskVal = 0x807fffff
2590   APInt FractSignMaskVal = APInt::getBitsSet(BitSize, 0, Precision - 1);
2591   FractSignMaskVal.setBit(BitSize - 1); // Set the sign bit
2592 
2593   APInt SignMaskVal = APInt::getSignedMaxValue(BitSize);
2594   SDValue SignMask = DAG.getConstant(SignMaskVal, dl, AsIntVT);
2595 
2596   SDValue FractSignMask = DAG.getConstant(FractSignMaskVal, dl, AsIntVT);
2597 
2598   const APFloat One(FltSem, "1.0");
2599   // Scale a possible denormal input.
2600   // e.g., for f64, 0x1p+54
2601   APFloat ScaleUpKVal =
2602       scalbn(One, Precision + 1, APFloat::rmNearestTiesToEven);
2603 
2604   SDValue ScaleUpK = DAG.getConstantFP(ScaleUpKVal, dl, VT);
2605   SDValue ScaleUp = DAG.getNode(ISD::FMUL, dl, VT, Val, ScaleUpK);
2606 
2607   EVT SetCCVT =
2608       TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
2609 
2610   SDValue AsInt = DAG.getNode(ISD::BITCAST, dl, AsIntVT, Val);
2611 
2612   SDValue Abs = DAG.getNode(ISD::AND, dl, AsIntVT, AsInt, SignMask);
2613 
2614   SDValue AddNegSmallestNormal =
2615       DAG.getNode(ISD::ADD, dl, AsIntVT, Abs, NegSmallestNormalizedInt);
2616   SDValue DenormOrZero = DAG.getSetCC(dl, SetCCVT, AddNegSmallestNormal,
2617                                       NegSmallestNormalizedInt, ISD::SETULE);
2618 
2619   SDValue IsDenormal =
2620       DAG.getSetCC(dl, SetCCVT, Abs, SmallestNormalizedInt, ISD::SETULT);
2621 
2622   SDValue MinExp = DAG.getSignedConstant(MinExpVal, dl, ExpVT);
2623   SDValue Zero = DAG.getConstant(0, dl, ExpVT);
2624 
2625   SDValue ScaledAsInt = DAG.getNode(ISD::BITCAST, dl, AsIntVT, ScaleUp);
2626   SDValue ScaledSelect =
2627       DAG.getNode(ISD::SELECT, dl, AsIntVT, IsDenormal, ScaledAsInt, AsInt);
2628 
2629   SDValue ExpMaskScaled =
2630       DAG.getNode(ISD::AND, dl, AsIntVT, ScaledAsInt, ExpMask);
2631 
2632   SDValue ScaledValue =
2633       DAG.getNode(ISD::SELECT, dl, AsIntVT, IsDenormal, ExpMaskScaled, Abs);
2634 
2635   // Extract the exponent bits.
2636   SDValue ExponentShiftAmt =
2637       DAG.getShiftAmountConstant(Precision - 1, AsIntVT, dl);
2638   SDValue ShiftedExp =
2639       DAG.getNode(ISD::SRL, dl, AsIntVT, ScaledValue, ExponentShiftAmt);
2640   SDValue Exp = DAG.getSExtOrTrunc(ShiftedExp, dl, ExpVT);
2641 
2642   SDValue NormalBiasedExp = DAG.getNode(ISD::ADD, dl, ExpVT, Exp, MinExp);
2643   SDValue DenormalOffset = DAG.getConstant(-Precision - 1, dl, ExpVT);
2644   SDValue DenormalExpBias =
2645       DAG.getNode(ISD::SELECT, dl, ExpVT, IsDenormal, DenormalOffset, Zero);
2646 
2647   SDValue MaskedFractAsInt =
2648       DAG.getNode(ISD::AND, dl, AsIntVT, ScaledSelect, FractSignMask);
2649   const APFloat Half(FltSem, "0.5");
2650   SDValue FPHalf = DAG.getConstant(Half.bitcastToAPInt(), dl, AsIntVT);
2651   SDValue Or = DAG.getNode(ISD::OR, dl, AsIntVT, MaskedFractAsInt, FPHalf);
2652   SDValue MaskedFract = DAG.getNode(ISD::BITCAST, dl, VT, Or);
2653 
2654   SDValue ComputedExp =
2655       DAG.getNode(ISD::ADD, dl, ExpVT, NormalBiasedExp, DenormalExpBias);
2656 
2657   SDValue Result0 =
2658       DAG.getNode(ISD::SELECT, dl, VT, DenormOrZero, Val, MaskedFract);
2659 
2660   SDValue Result1 =
2661       DAG.getNode(ISD::SELECT, dl, ExpVT, DenormOrZero, Zero, ComputedExp);
2662 
2663   return DAG.getMergeValues({Result0, Result1}, dl);
2664 }
2665 
2666 /// This function is responsible for legalizing a
2667 /// INT_TO_FP operation of the specified operand when the target requests that
2668 /// we expand it.  At this point, we know that the result and operand types are
2669 /// legal for the target.
ExpandLegalINT_TO_FP(SDNode * Node,SDValue & Chain)2670 SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(SDNode *Node,
2671                                                    SDValue &Chain) {
2672   bool isSigned = (Node->getOpcode() == ISD::STRICT_SINT_TO_FP ||
2673                    Node->getOpcode() == ISD::SINT_TO_FP);
2674   EVT DestVT = Node->getValueType(0);
2675   SDLoc dl(Node);
2676   unsigned OpNo = Node->isStrictFPOpcode() ? 1 : 0;
2677   SDValue Op0 = Node->getOperand(OpNo);
2678   EVT SrcVT = Op0.getValueType();
2679 
2680   // TODO: Should any fast-math-flags be set for the created nodes?
2681   LLVM_DEBUG(dbgs() << "Legalizing INT_TO_FP\n");
2682   if (SrcVT == MVT::i32 && TLI.isTypeLegal(MVT::f64) &&
2683       (DestVT.bitsLE(MVT::f64) ||
2684        TLI.isOperationLegal(Node->isStrictFPOpcode() ? ISD::STRICT_FP_EXTEND
2685                                                      : ISD::FP_EXTEND,
2686                             DestVT))) {
2687     LLVM_DEBUG(dbgs() << "32-bit [signed|unsigned] integer to float/double "
2688                          "expansion\n");
2689 
2690     // Get the stack frame index of a 8 byte buffer.
2691     SDValue StackSlot = DAG.CreateStackTemporary(MVT::f64);
2692 
2693     SDValue Lo = Op0;
2694     // if signed map to unsigned space
2695     if (isSigned) {
2696       // Invert sign bit (signed to unsigned mapping).
2697       Lo = DAG.getNode(ISD::XOR, dl, MVT::i32, Lo,
2698                        DAG.getConstant(0x80000000u, dl, MVT::i32));
2699     }
2700     // Initial hi portion of constructed double.
2701     SDValue Hi = DAG.getConstant(0x43300000u, dl, MVT::i32);
2702 
2703     // If this a big endian target, swap the lo and high data.
2704     if (DAG.getDataLayout().isBigEndian())
2705       std::swap(Lo, Hi);
2706 
2707     SDValue MemChain = DAG.getEntryNode();
2708 
2709     // Store the lo of the constructed double.
2710     SDValue Store1 = DAG.getStore(MemChain, dl, Lo, StackSlot,
2711                                   MachinePointerInfo());
2712     // Store the hi of the constructed double.
2713     SDValue HiPtr =
2714         DAG.getMemBasePlusOffset(StackSlot, TypeSize::getFixed(4), dl);
2715     SDValue Store2 =
2716         DAG.getStore(MemChain, dl, Hi, HiPtr, MachinePointerInfo());
2717     MemChain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Store1, Store2);
2718 
2719     // load the constructed double
2720     SDValue Load =
2721         DAG.getLoad(MVT::f64, dl, MemChain, StackSlot, MachinePointerInfo());
2722     // FP constant to bias correct the final result
2723     SDValue Bias = DAG.getConstantFP(
2724         isSigned ? llvm::bit_cast<double>(0x4330000080000000ULL)
2725                  : llvm::bit_cast<double>(0x4330000000000000ULL),
2726         dl, MVT::f64);
2727     // Subtract the bias and get the final result.
2728     SDValue Sub;
2729     SDValue Result;
2730     if (Node->isStrictFPOpcode()) {
2731       Sub = DAG.getNode(ISD::STRICT_FSUB, dl, {MVT::f64, MVT::Other},
2732                         {Node->getOperand(0), Load, Bias});
2733       Chain = Sub.getValue(1);
2734       if (DestVT != Sub.getValueType()) {
2735         std::pair<SDValue, SDValue> ResultPair;
2736         ResultPair =
2737             DAG.getStrictFPExtendOrRound(Sub, Chain, dl, DestVT);
2738         Result = ResultPair.first;
2739         Chain = ResultPair.second;
2740       }
2741       else
2742         Result = Sub;
2743     } else {
2744       Sub = DAG.getNode(ISD::FSUB, dl, MVT::f64, Load, Bias);
2745       Result = DAG.getFPExtendOrRound(Sub, dl, DestVT);
2746     }
2747     return Result;
2748   }
2749 
2750   if (isSigned)
2751     return SDValue();
2752 
2753   // TODO: Generalize this for use with other types.
2754   if (((SrcVT == MVT::i32 || SrcVT == MVT::i64) && DestVT == MVT::f32) ||
2755       (SrcVT == MVT::i64 && DestVT == MVT::f64)) {
2756     LLVM_DEBUG(dbgs() << "Converting unsigned i32/i64 to f32/f64\n");
2757     // For unsigned conversions, convert them to signed conversions using the
2758     // algorithm from the x86_64 __floatundisf in compiler_rt. That method
2759     // should be valid for i32->f32 as well.
2760 
2761     // More generally this transform should be valid if there are 3 more bits
2762     // in the integer type than the significand. Rounding uses the first bit
2763     // after the width of the significand and the OR of all bits after that. So
2764     // we need to be able to OR the shifted out bit into one of the bits that
2765     // participate in the OR.
2766 
2767     // TODO: This really should be implemented using a branch rather than a
2768     // select.  We happen to get lucky and machinesink does the right
2769     // thing most of the time.  This would be a good candidate for a
2770     // pseudo-op, or, even better, for whole-function isel.
2771     EVT SetCCVT = getSetCCResultType(SrcVT);
2772 
2773     SDValue SignBitTest = DAG.getSetCC(
2774         dl, SetCCVT, Op0, DAG.getConstant(0, dl, SrcVT), ISD::SETLT);
2775 
2776     EVT ShiftVT = TLI.getShiftAmountTy(SrcVT, DAG.getDataLayout());
2777     SDValue ShiftConst = DAG.getConstant(1, dl, ShiftVT);
2778     SDValue Shr = DAG.getNode(ISD::SRL, dl, SrcVT, Op0, ShiftConst);
2779     SDValue AndConst = DAG.getConstant(1, dl, SrcVT);
2780     SDValue And = DAG.getNode(ISD::AND, dl, SrcVT, Op0, AndConst);
2781     SDValue Or = DAG.getNode(ISD::OR, dl, SrcVT, And, Shr);
2782 
2783     SDValue Slow, Fast;
2784     if (Node->isStrictFPOpcode()) {
2785       // In strict mode, we must avoid spurious exceptions, and therefore
2786       // must make sure to only emit a single STRICT_SINT_TO_FP.
2787       SDValue InCvt = DAG.getSelect(dl, SrcVT, SignBitTest, Or, Op0);
2788       Fast = DAG.getNode(ISD::STRICT_SINT_TO_FP, dl, { DestVT, MVT::Other },
2789                          { Node->getOperand(0), InCvt });
2790       Slow = DAG.getNode(ISD::STRICT_FADD, dl, { DestVT, MVT::Other },
2791                          { Fast.getValue(1), Fast, Fast });
2792       Chain = Slow.getValue(1);
2793       // The STRICT_SINT_TO_FP inherits the exception mode from the
2794       // incoming STRICT_UINT_TO_FP node; the STRICT_FADD node can
2795       // never raise any exception.
2796       SDNodeFlags Flags;
2797       Flags.setNoFPExcept(Node->getFlags().hasNoFPExcept());
2798       Fast->setFlags(Flags);
2799       Flags.setNoFPExcept(true);
2800       Slow->setFlags(Flags);
2801     } else {
2802       SDValue SignCvt = DAG.getNode(ISD::SINT_TO_FP, dl, DestVT, Or);
2803       Slow = DAG.getNode(ISD::FADD, dl, DestVT, SignCvt, SignCvt);
2804       Fast = DAG.getNode(ISD::SINT_TO_FP, dl, DestVT, Op0);
2805     }
2806 
2807     return DAG.getSelect(dl, DestVT, SignBitTest, Slow, Fast);
2808   }
2809 
2810   // Don't expand it if there isn't cheap fadd.
2811   if (!TLI.isOperationLegalOrCustom(
2812           Node->isStrictFPOpcode() ? ISD::STRICT_FADD : ISD::FADD, DestVT))
2813     return SDValue();
2814 
2815   // The following optimization is valid only if every value in SrcVT (when
2816   // treated as signed) is representable in DestVT.  Check that the mantissa
2817   // size of DestVT is >= than the number of bits in SrcVT -1.
2818   assert(APFloat::semanticsPrecision(DestVT.getFltSemantics()) >=
2819              SrcVT.getSizeInBits() - 1 &&
2820          "Cannot perform lossless SINT_TO_FP!");
2821 
2822   SDValue Tmp1;
2823   if (Node->isStrictFPOpcode()) {
2824     Tmp1 = DAG.getNode(ISD::STRICT_SINT_TO_FP, dl, { DestVT, MVT::Other },
2825                        { Node->getOperand(0), Op0 });
2826   } else
2827     Tmp1 = DAG.getNode(ISD::SINT_TO_FP, dl, DestVT, Op0);
2828 
2829   SDValue SignSet = DAG.getSetCC(dl, getSetCCResultType(SrcVT), Op0,
2830                                  DAG.getConstant(0, dl, SrcVT), ISD::SETLT);
2831   SDValue Zero = DAG.getIntPtrConstant(0, dl),
2832           Four = DAG.getIntPtrConstant(4, dl);
2833   SDValue CstOffset = DAG.getSelect(dl, Zero.getValueType(),
2834                                     SignSet, Four, Zero);
2835 
2836   // If the sign bit of the integer is set, the large number will be treated
2837   // as a negative number.  To counteract this, the dynamic code adds an
2838   // offset depending on the data type.
2839   uint64_t FF;
2840   switch (SrcVT.getSimpleVT().SimpleTy) {
2841   default:
2842     return SDValue();
2843   case MVT::i8 : FF = 0x43800000ULL; break;  // 2^8  (as a float)
2844   case MVT::i16: FF = 0x47800000ULL; break;  // 2^16 (as a float)
2845   case MVT::i32: FF = 0x4F800000ULL; break;  // 2^32 (as a float)
2846   case MVT::i64: FF = 0x5F800000ULL; break;  // 2^64 (as a float)
2847   }
2848   if (DAG.getDataLayout().isLittleEndian())
2849     FF <<= 32;
2850   Constant *FudgeFactor = ConstantInt::get(
2851                                        Type::getInt64Ty(*DAG.getContext()), FF);
2852 
2853   SDValue CPIdx =
2854       DAG.getConstantPool(FudgeFactor, TLI.getPointerTy(DAG.getDataLayout()));
2855   Align Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlign();
2856   CPIdx = DAG.getNode(ISD::ADD, dl, CPIdx.getValueType(), CPIdx, CstOffset);
2857   Alignment = commonAlignment(Alignment, 4);
2858   SDValue FudgeInReg;
2859   if (DestVT == MVT::f32)
2860     FudgeInReg = DAG.getLoad(
2861         MVT::f32, dl, DAG.getEntryNode(), CPIdx,
2862         MachinePointerInfo::getConstantPool(DAG.getMachineFunction()),
2863         Alignment);
2864   else {
2865     SDValue Load = DAG.getExtLoad(
2866         ISD::EXTLOAD, dl, DestVT, DAG.getEntryNode(), CPIdx,
2867         MachinePointerInfo::getConstantPool(DAG.getMachineFunction()), MVT::f32,
2868         Alignment);
2869     HandleSDNode Handle(Load);
2870     LegalizeOp(Load.getNode());
2871     FudgeInReg = Handle.getValue();
2872   }
2873 
2874   if (Node->isStrictFPOpcode()) {
2875     SDValue Result = DAG.getNode(ISD::STRICT_FADD, dl, { DestVT, MVT::Other },
2876                                  { Tmp1.getValue(1), Tmp1, FudgeInReg });
2877     Chain = Result.getValue(1);
2878     return Result;
2879   }
2880 
2881   return DAG.getNode(ISD::FADD, dl, DestVT, Tmp1, FudgeInReg);
2882 }
2883 
2884 /// This function is responsible for legalizing a
2885 /// *INT_TO_FP operation of the specified operand when the target requests that
2886 /// we promote it.  At this point, we know that the result and operand types are
2887 /// legal for the target, and that there is a legal UINT_TO_FP or SINT_TO_FP
2888 /// operation that takes a larger input.
PromoteLegalINT_TO_FP(SDNode * N,const SDLoc & dl,SmallVectorImpl<SDValue> & Results)2889 void SelectionDAGLegalize::PromoteLegalINT_TO_FP(
2890     SDNode *N, const SDLoc &dl, SmallVectorImpl<SDValue> &Results) {
2891   bool IsStrict = N->isStrictFPOpcode();
2892   bool IsSigned = N->getOpcode() == ISD::SINT_TO_FP ||
2893                   N->getOpcode() == ISD::STRICT_SINT_TO_FP;
2894   EVT DestVT = N->getValueType(0);
2895   SDValue LegalOp = N->getOperand(IsStrict ? 1 : 0);
2896   unsigned UIntOp = IsStrict ? ISD::STRICT_UINT_TO_FP : ISD::UINT_TO_FP;
2897   unsigned SIntOp = IsStrict ? ISD::STRICT_SINT_TO_FP : ISD::SINT_TO_FP;
2898 
2899   // First step, figure out the appropriate *INT_TO_FP operation to use.
2900   EVT NewInTy = LegalOp.getValueType();
2901 
2902   unsigned OpToUse = 0;
2903 
2904   // Scan for the appropriate larger type to use.
2905   while (true) {
2906     NewInTy = (MVT::SimpleValueType)(NewInTy.getSimpleVT().SimpleTy+1);
2907     assert(NewInTy.isInteger() && "Ran out of possibilities!");
2908 
2909     // If the target supports SINT_TO_FP of this type, use it.
2910     if (TLI.isOperationLegalOrCustom(SIntOp, NewInTy)) {
2911       OpToUse = SIntOp;
2912       break;
2913     }
2914     if (IsSigned)
2915       continue;
2916 
2917     // If the target supports UINT_TO_FP of this type, use it.
2918     if (TLI.isOperationLegalOrCustom(UIntOp, NewInTy)) {
2919       OpToUse = UIntOp;
2920       break;
2921     }
2922 
2923     // Otherwise, try a larger type.
2924   }
2925 
2926   // Okay, we found the operation and type to use.  Zero extend our input to the
2927   // desired type then run the operation on it.
2928   if (IsStrict) {
2929     SDValue Res =
2930         DAG.getNode(OpToUse, dl, {DestVT, MVT::Other},
2931                     {N->getOperand(0),
2932                      DAG.getNode(IsSigned ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND,
2933                                  dl, NewInTy, LegalOp)});
2934     Results.push_back(Res);
2935     Results.push_back(Res.getValue(1));
2936     return;
2937   }
2938 
2939   Results.push_back(
2940       DAG.getNode(OpToUse, dl, DestVT,
2941                   DAG.getNode(IsSigned ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND,
2942                               dl, NewInTy, LegalOp)));
2943 }
2944 
2945 /// This function is responsible for legalizing a
2946 /// FP_TO_*INT operation of the specified operand when the target requests that
2947 /// we promote it.  At this point, we know that the result and operand types are
2948 /// legal for the target, and that there is a legal FP_TO_UINT or FP_TO_SINT
2949 /// operation that returns a larger result.
PromoteLegalFP_TO_INT(SDNode * N,const SDLoc & dl,SmallVectorImpl<SDValue> & Results)2950 void SelectionDAGLegalize::PromoteLegalFP_TO_INT(SDNode *N, const SDLoc &dl,
2951                                                  SmallVectorImpl<SDValue> &Results) {
2952   bool IsStrict = N->isStrictFPOpcode();
2953   bool IsSigned = N->getOpcode() == ISD::FP_TO_SINT ||
2954                   N->getOpcode() == ISD::STRICT_FP_TO_SINT;
2955   EVT DestVT = N->getValueType(0);
2956   SDValue LegalOp = N->getOperand(IsStrict ? 1 : 0);
2957   // First step, figure out the appropriate FP_TO*INT operation to use.
2958   EVT NewOutTy = DestVT;
2959 
2960   unsigned OpToUse = 0;
2961 
2962   // Scan for the appropriate larger type to use.
2963   while (true) {
2964     NewOutTy = (MVT::SimpleValueType)(NewOutTy.getSimpleVT().SimpleTy+1);
2965     assert(NewOutTy.isInteger() && "Ran out of possibilities!");
2966 
2967     // A larger signed type can hold all unsigned values of the requested type,
2968     // so using FP_TO_SINT is valid
2969     OpToUse = IsStrict ? ISD::STRICT_FP_TO_SINT : ISD::FP_TO_SINT;
2970     if (TLI.isOperationLegalOrCustom(OpToUse, NewOutTy))
2971       break;
2972 
2973     // However, if the value may be < 0.0, we *must* use some FP_TO_SINT.
2974     OpToUse = IsStrict ? ISD::STRICT_FP_TO_UINT : ISD::FP_TO_UINT;
2975     if (!IsSigned && TLI.isOperationLegalOrCustom(OpToUse, NewOutTy))
2976       break;
2977 
2978     // Otherwise, try a larger type.
2979   }
2980 
2981   // Okay, we found the operation and type to use.
2982   SDValue Operation;
2983   if (IsStrict) {
2984     SDVTList VTs = DAG.getVTList(NewOutTy, MVT::Other);
2985     Operation = DAG.getNode(OpToUse, dl, VTs, N->getOperand(0), LegalOp);
2986   } else
2987     Operation = DAG.getNode(OpToUse, dl, NewOutTy, LegalOp);
2988 
2989   // Truncate the result of the extended FP_TO_*INT operation to the desired
2990   // size.
2991   SDValue Trunc = DAG.getNode(ISD::TRUNCATE, dl, DestVT, Operation);
2992   Results.push_back(Trunc);
2993   if (IsStrict)
2994     Results.push_back(Operation.getValue(1));
2995 }
2996 
2997 /// Promote FP_TO_*INT_SAT operation to a larger result type. At this point
2998 /// the result and operand types are legal and there must be a legal
2999 /// FP_TO_*INT_SAT operation for a larger result type.
PromoteLegalFP_TO_INT_SAT(SDNode * Node,const SDLoc & dl)3000 SDValue SelectionDAGLegalize::PromoteLegalFP_TO_INT_SAT(SDNode *Node,
3001                                                         const SDLoc &dl) {
3002   unsigned Opcode = Node->getOpcode();
3003 
3004   // Scan for the appropriate larger type to use.
3005   EVT NewOutTy = Node->getValueType(0);
3006   while (true) {
3007     NewOutTy = (MVT::SimpleValueType)(NewOutTy.getSimpleVT().SimpleTy + 1);
3008     assert(NewOutTy.isInteger() && "Ran out of possibilities!");
3009 
3010     if (TLI.isOperationLegalOrCustom(Opcode, NewOutTy))
3011       break;
3012   }
3013 
3014   // Saturation width is determined by second operand, so we don't have to
3015   // perform any fixup and can directly truncate the result.
3016   SDValue Result = DAG.getNode(Opcode, dl, NewOutTy, Node->getOperand(0),
3017                                Node->getOperand(1));
3018   return DAG.getNode(ISD::TRUNCATE, dl, Node->getValueType(0), Result);
3019 }
3020 
3021 /// Open code the operations for PARITY of the specified operation.
ExpandPARITY(SDValue Op,const SDLoc & dl)3022 SDValue SelectionDAGLegalize::ExpandPARITY(SDValue Op, const SDLoc &dl) {
3023   EVT VT = Op.getValueType();
3024   EVT ShVT = TLI.getShiftAmountTy(VT, DAG.getDataLayout());
3025   unsigned Sz = VT.getScalarSizeInBits();
3026 
3027   // If CTPOP is legal, use it. Otherwise use shifts and xor.
3028   SDValue Result;
3029   if (TLI.isOperationLegalOrPromote(ISD::CTPOP, VT)) {
3030     Result = DAG.getNode(ISD::CTPOP, dl, VT, Op);
3031   } else {
3032     Result = Op;
3033     for (unsigned i = Log2_32_Ceil(Sz); i != 0;) {
3034       SDValue Shift = DAG.getNode(ISD::SRL, dl, VT, Result,
3035                                   DAG.getConstant(1ULL << (--i), dl, ShVT));
3036       Result = DAG.getNode(ISD::XOR, dl, VT, Result, Shift);
3037     }
3038   }
3039 
3040   return DAG.getNode(ISD::AND, dl, VT, Result, DAG.getConstant(1, dl, VT));
3041 }
3042 
PromoteReduction(SDNode * Node)3043 SDValue SelectionDAGLegalize::PromoteReduction(SDNode *Node) {
3044   bool IsVPOpcode = ISD::isVPOpcode(Node->getOpcode());
3045   MVT VecVT = IsVPOpcode ? Node->getOperand(1).getSimpleValueType()
3046                          : Node->getOperand(0).getSimpleValueType();
3047   MVT NewVecVT = TLI.getTypeToPromoteTo(Node->getOpcode(), VecVT);
3048   MVT ScalarVT = Node->getSimpleValueType(0);
3049   MVT NewScalarVT = NewVecVT.getVectorElementType();
3050 
3051   SDLoc DL(Node);
3052   SmallVector<SDValue, 4> Operands(Node->getNumOperands());
3053 
3054   // FIXME: Support integer.
3055   assert(Node->getOperand(0).getValueType().isFloatingPoint() &&
3056          "Only FP promotion is supported");
3057 
3058   for (unsigned j = 0; j != Node->getNumOperands(); ++j)
3059     if (Node->getOperand(j).getValueType().isVector() &&
3060         !(IsVPOpcode &&
3061           ISD::getVPMaskIdx(Node->getOpcode()) == j)) { // Skip mask operand.
3062       // promote the vector operand.
3063       // FIXME: Support integer.
3064       assert(Node->getOperand(j).getValueType().isFloatingPoint() &&
3065              "Only FP promotion is supported");
3066       Operands[j] =
3067           DAG.getNode(ISD::FP_EXTEND, DL, NewVecVT, Node->getOperand(j));
3068     } else if (Node->getOperand(j).getValueType().isFloatingPoint()) {
3069       // promote the initial value.
3070       Operands[j] =
3071           DAG.getNode(ISD::FP_EXTEND, DL, NewScalarVT, Node->getOperand(j));
3072     } else {
3073       Operands[j] = Node->getOperand(j); // Skip VL operand.
3074     }
3075 
3076   SDValue Res = DAG.getNode(Node->getOpcode(), DL, NewScalarVT, Operands,
3077                             Node->getFlags());
3078 
3079   assert(ScalarVT.isFloatingPoint() && "Only FP promotion is supported");
3080   return DAG.getNode(ISD::FP_ROUND, DL, ScalarVT, Res,
3081                      DAG.getIntPtrConstant(0, DL, /*isTarget=*/true));
3082 }
3083 
ExpandNode(SDNode * Node)3084 bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
3085   LLVM_DEBUG(dbgs() << "Trying to expand node\n");
3086   SmallVector<SDValue, 8> Results;
3087   SDLoc dl(Node);
3088   SDValue Tmp1, Tmp2, Tmp3, Tmp4;
3089   bool NeedInvert;
3090   switch (Node->getOpcode()) {
3091   case ISD::ABS:
3092     if ((Tmp1 = TLI.expandABS(Node, DAG)))
3093       Results.push_back(Tmp1);
3094     break;
3095   case ISD::ABDS:
3096   case ISD::ABDU:
3097     if ((Tmp1 = TLI.expandABD(Node, DAG)))
3098       Results.push_back(Tmp1);
3099     break;
3100   case ISD::AVGCEILS:
3101   case ISD::AVGCEILU:
3102   case ISD::AVGFLOORS:
3103   case ISD::AVGFLOORU:
3104     if ((Tmp1 = TLI.expandAVG(Node, DAG)))
3105       Results.push_back(Tmp1);
3106     break;
3107   case ISD::CTPOP:
3108     if ((Tmp1 = TLI.expandCTPOP(Node, DAG)))
3109       Results.push_back(Tmp1);
3110     break;
3111   case ISD::CTLZ:
3112   case ISD::CTLZ_ZERO_UNDEF:
3113     if ((Tmp1 = TLI.expandCTLZ(Node, DAG)))
3114       Results.push_back(Tmp1);
3115     break;
3116   case ISD::CTTZ:
3117   case ISD::CTTZ_ZERO_UNDEF:
3118     if ((Tmp1 = TLI.expandCTTZ(Node, DAG)))
3119       Results.push_back(Tmp1);
3120     break;
3121   case ISD::BITREVERSE:
3122     if ((Tmp1 = TLI.expandBITREVERSE(Node, DAG)))
3123       Results.push_back(Tmp1);
3124     break;
3125   case ISD::BSWAP:
3126     if ((Tmp1 = TLI.expandBSWAP(Node, DAG)))
3127       Results.push_back(Tmp1);
3128     break;
3129   case ISD::PARITY:
3130     Results.push_back(ExpandPARITY(Node->getOperand(0), dl));
3131     break;
3132   case ISD::FRAMEADDR:
3133   case ISD::RETURNADDR:
3134   case ISD::FRAME_TO_ARGS_OFFSET:
3135     Results.push_back(DAG.getConstant(0, dl, Node->getValueType(0)));
3136     break;
3137   case ISD::EH_DWARF_CFA: {
3138     SDValue CfaArg = DAG.getSExtOrTrunc(Node->getOperand(0), dl,
3139                                         TLI.getPointerTy(DAG.getDataLayout()));
3140     SDValue Offset = DAG.getNode(ISD::ADD, dl,
3141                                  CfaArg.getValueType(),
3142                                  DAG.getNode(ISD::FRAME_TO_ARGS_OFFSET, dl,
3143                                              CfaArg.getValueType()),
3144                                  CfaArg);
3145     SDValue FA = DAG.getNode(
3146         ISD::FRAMEADDR, dl, TLI.getPointerTy(DAG.getDataLayout()),
3147         DAG.getConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout())));
3148     Results.push_back(DAG.getNode(ISD::ADD, dl, FA.getValueType(),
3149                                   FA, Offset));
3150     break;
3151   }
3152   case ISD::GET_ROUNDING:
3153     Results.push_back(DAG.getConstant(1, dl, Node->getValueType(0)));
3154     Results.push_back(Node->getOperand(0));
3155     break;
3156   case ISD::EH_RETURN:
3157   case ISD::EH_LABEL:
3158   case ISD::PREFETCH:
3159   case ISD::VAEND:
3160   case ISD::EH_SJLJ_LONGJMP:
3161     // If the target didn't expand these, there's nothing to do, so just
3162     // preserve the chain and be done.
3163     Results.push_back(Node->getOperand(0));
3164     break;
3165   case ISD::READCYCLECOUNTER:
3166   case ISD::READSTEADYCOUNTER:
3167     // If the target didn't expand this, just return 'zero' and preserve the
3168     // chain.
3169     Results.append(Node->getNumValues() - 1,
3170                    DAG.getConstant(0, dl, Node->getValueType(0)));
3171     Results.push_back(Node->getOperand(0));
3172     break;
3173   case ISD::EH_SJLJ_SETJMP:
3174     // If the target didn't expand this, just return 'zero' and preserve the
3175     // chain.
3176     Results.push_back(DAG.getConstant(0, dl, MVT::i32));
3177     Results.push_back(Node->getOperand(0));
3178     break;
3179   case ISD::ATOMIC_LOAD: {
3180     // There is no libcall for atomic load; fake it with ATOMIC_CMP_SWAP.
3181     SDValue Zero = DAG.getConstant(0, dl, Node->getValueType(0));
3182     SDVTList VTs = DAG.getVTList(Node->getValueType(0), MVT::Other);
3183     SDValue Swap = DAG.getAtomicCmpSwap(
3184         ISD::ATOMIC_CMP_SWAP, dl, cast<AtomicSDNode>(Node)->getMemoryVT(), VTs,
3185         Node->getOperand(0), Node->getOperand(1), Zero, Zero,
3186         cast<AtomicSDNode>(Node)->getMemOperand());
3187     Results.push_back(Swap.getValue(0));
3188     Results.push_back(Swap.getValue(1));
3189     break;
3190   }
3191   case ISD::ATOMIC_STORE: {
3192     // There is no libcall for atomic store; fake it with ATOMIC_SWAP.
3193     SDValue Swap = DAG.getAtomic(
3194         ISD::ATOMIC_SWAP, dl, cast<AtomicSDNode>(Node)->getMemoryVT(),
3195         Node->getOperand(0), Node->getOperand(2), Node->getOperand(1),
3196         cast<AtomicSDNode>(Node)->getMemOperand());
3197     Results.push_back(Swap.getValue(1));
3198     break;
3199   }
3200   case ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS: {
3201     // Expanding an ATOMIC_CMP_SWAP_WITH_SUCCESS produces an ATOMIC_CMP_SWAP and
3202     // splits out the success value as a comparison. Expanding the resulting
3203     // ATOMIC_CMP_SWAP will produce a libcall.
3204     SDVTList VTs = DAG.getVTList(Node->getValueType(0), MVT::Other);
3205     SDValue Res = DAG.getAtomicCmpSwap(
3206         ISD::ATOMIC_CMP_SWAP, dl, cast<AtomicSDNode>(Node)->getMemoryVT(), VTs,
3207         Node->getOperand(0), Node->getOperand(1), Node->getOperand(2),
3208         Node->getOperand(3), cast<MemSDNode>(Node)->getMemOperand());
3209 
3210     SDValue ExtRes = Res;
3211     SDValue LHS = Res;
3212     SDValue RHS = Node->getOperand(1);
3213 
3214     EVT AtomicType = cast<AtomicSDNode>(Node)->getMemoryVT();
3215     EVT OuterType = Node->getValueType(0);
3216     switch (TLI.getExtendForAtomicOps()) {
3217     case ISD::SIGN_EXTEND:
3218       LHS = DAG.getNode(ISD::AssertSext, dl, OuterType, Res,
3219                         DAG.getValueType(AtomicType));
3220       RHS = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, OuterType,
3221                         Node->getOperand(2), DAG.getValueType(AtomicType));
3222       ExtRes = LHS;
3223       break;
3224     case ISD::ZERO_EXTEND:
3225       LHS = DAG.getNode(ISD::AssertZext, dl, OuterType, Res,
3226                         DAG.getValueType(AtomicType));
3227       RHS = DAG.getZeroExtendInReg(Node->getOperand(2), dl, AtomicType);
3228       ExtRes = LHS;
3229       break;
3230     case ISD::ANY_EXTEND:
3231       LHS = DAG.getZeroExtendInReg(Res, dl, AtomicType);
3232       RHS = DAG.getZeroExtendInReg(Node->getOperand(2), dl, AtomicType);
3233       break;
3234     default:
3235       llvm_unreachable("Invalid atomic op extension");
3236     }
3237 
3238     SDValue Success =
3239         DAG.getSetCC(dl, Node->getValueType(1), LHS, RHS, ISD::SETEQ);
3240 
3241     Results.push_back(ExtRes.getValue(0));
3242     Results.push_back(Success);
3243     Results.push_back(Res.getValue(1));
3244     break;
3245   }
3246   case ISD::ATOMIC_LOAD_SUB: {
3247     SDLoc DL(Node);
3248     EVT VT = Node->getValueType(0);
3249     SDValue RHS = Node->getOperand(2);
3250     AtomicSDNode *AN = cast<AtomicSDNode>(Node);
3251     if (RHS->getOpcode() == ISD::SIGN_EXTEND_INREG &&
3252         cast<VTSDNode>(RHS->getOperand(1))->getVT() == AN->getMemoryVT())
3253       RHS = RHS->getOperand(0);
3254     SDValue NewRHS =
3255         DAG.getNode(ISD::SUB, DL, VT, DAG.getConstant(0, DL, VT), RHS);
3256     SDValue Res = DAG.getAtomic(ISD::ATOMIC_LOAD_ADD, DL, AN->getMemoryVT(),
3257                                 Node->getOperand(0), Node->getOperand(1),
3258                                 NewRHS, AN->getMemOperand());
3259     Results.push_back(Res);
3260     Results.push_back(Res.getValue(1));
3261     break;
3262   }
3263   case ISD::DYNAMIC_STACKALLOC:
3264     ExpandDYNAMIC_STACKALLOC(Node, Results);
3265     break;
3266   case ISD::MERGE_VALUES:
3267     for (unsigned i = 0; i < Node->getNumValues(); i++)
3268       Results.push_back(Node->getOperand(i));
3269     break;
3270   case ISD::POISON:
3271   case ISD::UNDEF: {
3272     EVT VT = Node->getValueType(0);
3273     if (VT.isInteger())
3274       Results.push_back(DAG.getConstant(0, dl, VT));
3275     else {
3276       assert(VT.isFloatingPoint() && "Unknown value type!");
3277       Results.push_back(DAG.getConstantFP(0, dl, VT));
3278     }
3279     break;
3280   }
3281   case ISD::STRICT_FP_ROUND:
3282     // When strict mode is enforced we can't do expansion because it
3283     // does not honor the "strict" properties. Only libcall is allowed.
3284     if (TLI.isStrictFPEnabled())
3285       break;
3286     // We might as well mutate to FP_ROUND when FP_ROUND operation is legal
3287     // since this operation is more efficient than stack operation.
3288     if (TLI.getStrictFPOperationAction(Node->getOpcode(),
3289                                        Node->getValueType(0))
3290         == TargetLowering::Legal)
3291       break;
3292     // We fall back to use stack operation when the FP_ROUND operation
3293     // isn't available.
3294     if ((Tmp1 = EmitStackConvert(Node->getOperand(1), Node->getValueType(0),
3295                                  Node->getValueType(0), dl,
3296                                  Node->getOperand(0)))) {
3297       ReplaceNode(Node, Tmp1.getNode());
3298       LLVM_DEBUG(dbgs() << "Successfully expanded STRICT_FP_ROUND node\n");
3299       return true;
3300     }
3301     break;
3302   case ISD::FP_ROUND: {
3303     if ((Tmp1 = TLI.expandFP_ROUND(Node, DAG))) {
3304       Results.push_back(Tmp1);
3305       break;
3306     }
3307 
3308     [[fallthrough]];
3309   }
3310   case ISD::BITCAST:
3311     if ((Tmp1 = EmitStackConvert(Node->getOperand(0), Node->getValueType(0),
3312                                  Node->getValueType(0), dl)))
3313       Results.push_back(Tmp1);
3314     break;
3315   case ISD::STRICT_FP_EXTEND:
3316     // When strict mode is enforced we can't do expansion because it
3317     // does not honor the "strict" properties. Only libcall is allowed.
3318     if (TLI.isStrictFPEnabled())
3319       break;
3320     // We might as well mutate to FP_EXTEND when FP_EXTEND operation is legal
3321     // since this operation is more efficient than stack operation.
3322     if (TLI.getStrictFPOperationAction(Node->getOpcode(),
3323                                        Node->getValueType(0))
3324         == TargetLowering::Legal)
3325       break;
3326     // We fall back to use stack operation when the FP_EXTEND operation
3327     // isn't available.
3328     if ((Tmp1 = EmitStackConvert(
3329              Node->getOperand(1), Node->getOperand(1).getValueType(),
3330              Node->getValueType(0), dl, Node->getOperand(0)))) {
3331       ReplaceNode(Node, Tmp1.getNode());
3332       LLVM_DEBUG(dbgs() << "Successfully expanded STRICT_FP_EXTEND node\n");
3333       return true;
3334     }
3335     break;
3336   case ISD::FP_EXTEND: {
3337     SDValue Op = Node->getOperand(0);
3338     EVT SrcVT = Op.getValueType();
3339     EVT DstVT = Node->getValueType(0);
3340     if (SrcVT.getScalarType() == MVT::bf16) {
3341       Results.push_back(DAG.getNode(ISD::BF16_TO_FP, SDLoc(Node), DstVT, Op));
3342       break;
3343     }
3344 
3345     if ((Tmp1 = EmitStackConvert(Op, SrcVT, DstVT, dl)))
3346       Results.push_back(Tmp1);
3347     break;
3348   }
3349   case ISD::BF16_TO_FP: {
3350     // Always expand bf16 to f32 casts, they lower to ext + shift.
3351     //
3352     // Note that the operand of this code can be bf16 or an integer type in case
3353     // bf16 is not supported on the target and was softened.
3354     SDValue Op = Node->getOperand(0);
3355     if (Op.getValueType() == MVT::bf16) {
3356       Op = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i32,
3357                        DAG.getNode(ISD::BITCAST, dl, MVT::i16, Op));
3358     } else {
3359       Op = DAG.getAnyExtOrTrunc(Op, dl, MVT::i32);
3360     }
3361     Op = DAG.getNode(
3362         ISD::SHL, dl, MVT::i32, Op,
3363         DAG.getConstant(16, dl,
3364                         TLI.getShiftAmountTy(MVT::i32, DAG.getDataLayout())));
3365     Op = DAG.getNode(ISD::BITCAST, dl, MVT::f32, Op);
3366     // Add fp_extend in case the output is bigger than f32.
3367     if (Node->getValueType(0) != MVT::f32)
3368       Op = DAG.getNode(ISD::FP_EXTEND, dl, Node->getValueType(0), Op);
3369     Results.push_back(Op);
3370     break;
3371   }
3372   case ISD::FP_TO_BF16: {
3373     SDValue Op = Node->getOperand(0);
3374     if (Op.getValueType() != MVT::f32)
3375       Op = DAG.getNode(ISD::FP_ROUND, dl, MVT::f32, Op,
3376                        DAG.getIntPtrConstant(0, dl, /*isTarget=*/true));
3377     // Certain SNaNs will turn into infinities if we do a simple shift right.
3378     if (!DAG.isKnownNeverSNaN(Op)) {
3379       Op = DAG.getNode(ISD::FCANONICALIZE, dl, MVT::f32, Op, Node->getFlags());
3380     }
3381     Op = DAG.getNode(
3382         ISD::SRL, dl, MVT::i32, DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op),
3383         DAG.getConstant(16, dl,
3384                         TLI.getShiftAmountTy(MVT::i32, DAG.getDataLayout())));
3385     // The result of this node can be bf16 or an integer type in case bf16 is
3386     // not supported on the target and was softened to i16 for storage.
3387     if (Node->getValueType(0) == MVT::bf16) {
3388       Op = DAG.getNode(ISD::BITCAST, dl, MVT::bf16,
3389                        DAG.getNode(ISD::TRUNCATE, dl, MVT::i16, Op));
3390     } else {
3391       Op = DAG.getAnyExtOrTrunc(Op, dl, Node->getValueType(0));
3392     }
3393     Results.push_back(Op);
3394     break;
3395   }
3396   case ISD::FCANONICALIZE: {
3397     // This implements llvm.canonicalize.f* by multiplication with 1.0, as
3398     // suggested in
3399     // https://llvm.org/docs/LangRef.html#llvm-canonicalize-intrinsic.
3400     // It uses strict_fp operations even outside a strict_fp context in order
3401     // to guarantee that the canonicalization is not optimized away by later
3402     // passes. The result chain introduced by that is intentionally ignored
3403     // since no ordering requirement is intended here.
3404 
3405     // Create strict multiplication by 1.0.
3406     SDValue Operand = Node->getOperand(0);
3407     EVT VT = Operand.getValueType();
3408     SDValue One = DAG.getConstantFP(1.0, dl, VT);
3409     SDValue Chain = DAG.getEntryNode();
3410     SDValue Mul = DAG.getNode(ISD::STRICT_FMUL, dl, {VT, MVT::Other},
3411                               {Chain, Operand, One});
3412 
3413     // Propagate existing flags on canonicalize, and additionally set
3414     // NoFPExcept.
3415     SDNodeFlags CanonicalizeFlags = Node->getFlags();
3416     CanonicalizeFlags.setNoFPExcept(true);
3417     Mul->setFlags(CanonicalizeFlags);
3418 
3419     Results.push_back(Mul);
3420     break;
3421   }
3422   case ISD::SIGN_EXTEND_INREG: {
3423     EVT ExtraVT = cast<VTSDNode>(Node->getOperand(1))->getVT();
3424     EVT VT = Node->getValueType(0);
3425 
3426     // An in-register sign-extend of a boolean is a negation:
3427     // 'true' (1) sign-extended is -1.
3428     // 'false' (0) sign-extended is 0.
3429     // However, we must mask the high bits of the source operand because the
3430     // SIGN_EXTEND_INREG does not guarantee that the high bits are already zero.
3431 
3432     // TODO: Do this for vectors too?
3433     if (ExtraVT.isScalarInteger() && ExtraVT.getSizeInBits() == 1) {
3434       SDValue One = DAG.getConstant(1, dl, VT);
3435       SDValue And = DAG.getNode(ISD::AND, dl, VT, Node->getOperand(0), One);
3436       SDValue Zero = DAG.getConstant(0, dl, VT);
3437       SDValue Neg = DAG.getNode(ISD::SUB, dl, VT, Zero, And);
3438       Results.push_back(Neg);
3439       break;
3440     }
3441 
3442     // NOTE: we could fall back on load/store here too for targets without
3443     // SRA.  However, it is doubtful that any exist.
3444     EVT ShiftAmountTy = TLI.getShiftAmountTy(VT, DAG.getDataLayout());
3445     unsigned BitsDiff = VT.getScalarSizeInBits() -
3446                         ExtraVT.getScalarSizeInBits();
3447     SDValue ShiftCst = DAG.getConstant(BitsDiff, dl, ShiftAmountTy);
3448     Tmp1 = DAG.getNode(ISD::SHL, dl, Node->getValueType(0),
3449                        Node->getOperand(0), ShiftCst);
3450     Tmp1 = DAG.getNode(ISD::SRA, dl, Node->getValueType(0), Tmp1, ShiftCst);
3451     Results.push_back(Tmp1);
3452     break;
3453   }
3454   case ISD::UINT_TO_FP:
3455   case ISD::STRICT_UINT_TO_FP:
3456     if (TLI.expandUINT_TO_FP(Node, Tmp1, Tmp2, DAG)) {
3457       Results.push_back(Tmp1);
3458       if (Node->isStrictFPOpcode())
3459         Results.push_back(Tmp2);
3460       break;
3461     }
3462     [[fallthrough]];
3463   case ISD::SINT_TO_FP:
3464   case ISD::STRICT_SINT_TO_FP:
3465     if ((Tmp1 = ExpandLegalINT_TO_FP(Node, Tmp2))) {
3466       Results.push_back(Tmp1);
3467       if (Node->isStrictFPOpcode())
3468         Results.push_back(Tmp2);
3469     }
3470     break;
3471   case ISD::FP_TO_SINT:
3472     if (TLI.expandFP_TO_SINT(Node, Tmp1, DAG))
3473       Results.push_back(Tmp1);
3474     break;
3475   case ISD::STRICT_FP_TO_SINT:
3476     if (TLI.expandFP_TO_SINT(Node, Tmp1, DAG)) {
3477       ReplaceNode(Node, Tmp1.getNode());
3478       LLVM_DEBUG(dbgs() << "Successfully expanded STRICT_FP_TO_SINT node\n");
3479       return true;
3480     }
3481     break;
3482   case ISD::FP_TO_UINT:
3483     if (TLI.expandFP_TO_UINT(Node, Tmp1, Tmp2, DAG))
3484       Results.push_back(Tmp1);
3485     break;
3486   case ISD::STRICT_FP_TO_UINT:
3487     if (TLI.expandFP_TO_UINT(Node, Tmp1, Tmp2, DAG)) {
3488       // Relink the chain.
3489       DAG.ReplaceAllUsesOfValueWith(SDValue(Node,1), Tmp2);
3490       // Replace the new UINT result.
3491       ReplaceNodeWithValue(SDValue(Node, 0), Tmp1);
3492       LLVM_DEBUG(dbgs() << "Successfully expanded STRICT_FP_TO_UINT node\n");
3493       return true;
3494     }
3495     break;
3496   case ISD::FP_TO_SINT_SAT:
3497   case ISD::FP_TO_UINT_SAT:
3498     Results.push_back(TLI.expandFP_TO_INT_SAT(Node, DAG));
3499     break;
3500   case ISD::LROUND:
3501   case ISD::LLROUND: {
3502     SDValue Arg = Node->getOperand(0);
3503     EVT ArgVT = Arg.getValueType();
3504     EVT ResVT = Node->getValueType(0);
3505     SDLoc dl(Node);
3506     SDValue RoundNode = DAG.getNode(ISD::FROUND, dl, ArgVT, Arg);
3507     Results.push_back(DAG.getNode(ISD::FP_TO_SINT, dl, ResVT, RoundNode));
3508     break;
3509   }
3510   case ISD::VAARG:
3511     Results.push_back(DAG.expandVAArg(Node));
3512     Results.push_back(Results[0].getValue(1));
3513     break;
3514   case ISD::VACOPY:
3515     Results.push_back(DAG.expandVACopy(Node));
3516     break;
3517   case ISD::EXTRACT_VECTOR_ELT:
3518     if (Node->getOperand(0).getValueType().getVectorElementCount().isScalar())
3519       // This must be an access of the only element.  Return it.
3520       Tmp1 = DAG.getNode(ISD::BITCAST, dl, Node->getValueType(0),
3521                          Node->getOperand(0));
3522     else
3523       Tmp1 = ExpandExtractFromVectorThroughStack(SDValue(Node, 0));
3524     Results.push_back(Tmp1);
3525     break;
3526   case ISD::EXTRACT_SUBVECTOR:
3527     Results.push_back(ExpandExtractFromVectorThroughStack(SDValue(Node, 0)));
3528     break;
3529   case ISD::INSERT_SUBVECTOR:
3530     Results.push_back(ExpandInsertToVectorThroughStack(SDValue(Node, 0)));
3531     break;
3532   case ISD::CONCAT_VECTORS:
3533     if (EVT VectorValueType = Node->getOperand(0).getValueType();
3534         VectorValueType.isScalableVector() ||
3535         TLI.isOperationExpand(ISD::EXTRACT_VECTOR_ELT, VectorValueType))
3536       Results.push_back(ExpandVectorBuildThroughStack(Node));
3537     else
3538       Results.push_back(ExpandConcatVectors(Node));
3539     break;
3540   case ISD::SCALAR_TO_VECTOR:
3541     Results.push_back(ExpandSCALAR_TO_VECTOR(Node));
3542     break;
3543   case ISD::INSERT_VECTOR_ELT:
3544     Results.push_back(ExpandINSERT_VECTOR_ELT(SDValue(Node, 0)));
3545     break;
3546   case ISD::VECTOR_SHUFFLE: {
3547     SmallVector<int, 32> NewMask;
3548     ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(Node)->getMask();
3549 
3550     EVT VT = Node->getValueType(0);
3551     EVT EltVT = VT.getVectorElementType();
3552     SDValue Op0 = Node->getOperand(0);
3553     SDValue Op1 = Node->getOperand(1);
3554     if (!TLI.isTypeLegal(EltVT)) {
3555       EVT NewEltVT = TLI.getTypeToTransformTo(*DAG.getContext(), EltVT);
3556 
3557       // BUILD_VECTOR operands are allowed to be wider than the element type.
3558       // But if NewEltVT is smaller that EltVT the BUILD_VECTOR does not accept
3559       // it.
3560       if (NewEltVT.bitsLT(EltVT)) {
3561         // Convert shuffle node.
3562         // If original node was v4i64 and the new EltVT is i32,
3563         // cast operands to v8i32 and re-build the mask.
3564 
3565         // Calculate new VT, the size of the new VT should be equal to original.
3566         EVT NewVT =
3567             EVT::getVectorVT(*DAG.getContext(), NewEltVT,
3568                              VT.getSizeInBits() / NewEltVT.getSizeInBits());
3569         assert(NewVT.bitsEq(VT));
3570 
3571         // cast operands to new VT
3572         Op0 = DAG.getNode(ISD::BITCAST, dl, NewVT, Op0);
3573         Op1 = DAG.getNode(ISD::BITCAST, dl, NewVT, Op1);
3574 
3575         // Convert the shuffle mask
3576         unsigned int factor =
3577                          NewVT.getVectorNumElements()/VT.getVectorNumElements();
3578 
3579         // EltVT gets smaller
3580         assert(factor > 0);
3581 
3582         for (unsigned i = 0; i < VT.getVectorNumElements(); ++i) {
3583           if (Mask[i] < 0) {
3584             for (unsigned fi = 0; fi < factor; ++fi)
3585               NewMask.push_back(Mask[i]);
3586           }
3587           else {
3588             for (unsigned fi = 0; fi < factor; ++fi)
3589               NewMask.push_back(Mask[i]*factor+fi);
3590           }
3591         }
3592         Mask = NewMask;
3593         VT = NewVT;
3594       }
3595       EltVT = NewEltVT;
3596     }
3597     unsigned NumElems = VT.getVectorNumElements();
3598     SmallVector<SDValue, 16> Ops;
3599     for (unsigned i = 0; i != NumElems; ++i) {
3600       if (Mask[i] < 0) {
3601         Ops.push_back(DAG.getUNDEF(EltVT));
3602         continue;
3603       }
3604       unsigned Idx = Mask[i];
3605       if (Idx < NumElems)
3606         Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, Op0,
3607                                   DAG.getVectorIdxConstant(Idx, dl)));
3608       else
3609         Ops.push_back(
3610             DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, Op1,
3611                         DAG.getVectorIdxConstant(Idx - NumElems, dl)));
3612     }
3613 
3614     Tmp1 = DAG.getBuildVector(VT, dl, Ops);
3615     // We may have changed the BUILD_VECTOR type. Cast it back to the Node type.
3616     Tmp1 = DAG.getNode(ISD::BITCAST, dl, Node->getValueType(0), Tmp1);
3617     Results.push_back(Tmp1);
3618     break;
3619   }
3620   case ISD::VECTOR_SPLICE: {
3621     Results.push_back(TLI.expandVectorSplice(Node, DAG));
3622     break;
3623   }
3624   case ISD::VECTOR_DEINTERLEAVE: {
3625     unsigned Factor = Node->getNumOperands();
3626     if (Factor <= 2 || !isPowerOf2_32(Factor))
3627       break;
3628     SmallVector<SDValue, 8> Ops(Node->ops());
3629     EVT VecVT = Node->getValueType(0);
3630     SmallVector<EVT> HalfVTs(Factor / 2, VecVT);
3631     // Deinterleave at Factor/2 so each result contains two factors interleaved:
3632     // a0b0 c0d0 a1b1 c1d1 -> [a0c0 b0d0] [a1c1 b1d1]
3633     SDValue L = DAG.getNode(ISD::VECTOR_DEINTERLEAVE, dl, HalfVTs,
3634                             ArrayRef(Ops).take_front(Factor / 2));
3635     SDValue R = DAG.getNode(ISD::VECTOR_DEINTERLEAVE, dl, HalfVTs,
3636                             ArrayRef(Ops).take_back(Factor / 2));
3637     Results.resize(Factor);
3638     // Deinterleave the 2 factors out:
3639     // [a0c0 a1c1] [b0d0 b1d1] -> a0a1 b0b1 c0c1 d0d1
3640     for (unsigned I = 0; I < Factor / 2; I++) {
3641       SDValue Deinterleave =
3642           DAG.getNode(ISD::VECTOR_DEINTERLEAVE, dl, {VecVT, VecVT},
3643                       {L.getValue(I), R.getValue(I)});
3644       Results[I] = Deinterleave.getValue(0);
3645       Results[I + Factor / 2] = Deinterleave.getValue(1);
3646     }
3647     break;
3648   }
3649   case ISD::VECTOR_INTERLEAVE: {
3650     unsigned Factor = Node->getNumOperands();
3651     if (Factor <= 2 || !isPowerOf2_32(Factor))
3652       break;
3653     EVT VecVT = Node->getValueType(0);
3654     SmallVector<EVT> HalfVTs(Factor / 2, VecVT);
3655     SmallVector<SDValue, 8> LOps, ROps;
3656     // Interleave so we have 2 factors per result:
3657     // a0a1 b0b1 c0c1 d0d1 -> [a0c0 b0d0] [a1c1 b1d1]
3658     for (unsigned I = 0; I < Factor / 2; I++) {
3659       SDValue Interleave =
3660           DAG.getNode(ISD::VECTOR_INTERLEAVE, dl, {VecVT, VecVT},
3661                       {Node->getOperand(I), Node->getOperand(I + Factor / 2)});
3662       LOps.push_back(Interleave.getValue(0));
3663       ROps.push_back(Interleave.getValue(1));
3664     }
3665     // Interleave at Factor/2:
3666     // [a0c0 b0d0] [a1c1 b1d1] -> a0b0 c0d0 a1b1 c1d1
3667     SDValue L = DAG.getNode(ISD::VECTOR_INTERLEAVE, dl, HalfVTs, LOps);
3668     SDValue R = DAG.getNode(ISD::VECTOR_INTERLEAVE, dl, HalfVTs, ROps);
3669     for (unsigned I = 0; I < Factor / 2; I++)
3670       Results.push_back(L.getValue(I));
3671     for (unsigned I = 0; I < Factor / 2; I++)
3672       Results.push_back(R.getValue(I));
3673     break;
3674   }
3675   case ISD::EXTRACT_ELEMENT: {
3676     EVT OpTy = Node->getOperand(0).getValueType();
3677     if (Node->getConstantOperandVal(1)) {
3678       // 1 -> Hi
3679       Tmp1 = DAG.getNode(ISD::SRL, dl, OpTy, Node->getOperand(0),
3680                          DAG.getConstant(OpTy.getSizeInBits() / 2, dl,
3681                                          TLI.getShiftAmountTy(
3682                                              Node->getOperand(0).getValueType(),
3683                                              DAG.getDataLayout())));
3684       Tmp1 = DAG.getNode(ISD::TRUNCATE, dl, Node->getValueType(0), Tmp1);
3685     } else {
3686       // 0 -> Lo
3687       Tmp1 = DAG.getNode(ISD::TRUNCATE, dl, Node->getValueType(0),
3688                          Node->getOperand(0));
3689     }
3690     Results.push_back(Tmp1);
3691     break;
3692   }
3693   case ISD::STACKSAVE:
3694     // Expand to CopyFromReg if the target set
3695     // StackPointerRegisterToSaveRestore.
3696     if (Register SP = TLI.getStackPointerRegisterToSaveRestore()) {
3697       Results.push_back(DAG.getCopyFromReg(Node->getOperand(0), dl, SP,
3698                                            Node->getValueType(0)));
3699       Results.push_back(Results[0].getValue(1));
3700     } else {
3701       Results.push_back(DAG.getUNDEF(Node->getValueType(0)));
3702       Results.push_back(Node->getOperand(0));
3703     }
3704     break;
3705   case ISD::STACKRESTORE:
3706     // Expand to CopyToReg if the target set
3707     // StackPointerRegisterToSaveRestore.
3708     if (Register SP = TLI.getStackPointerRegisterToSaveRestore()) {
3709       Results.push_back(DAG.getCopyToReg(Node->getOperand(0), dl, SP,
3710                                          Node->getOperand(1)));
3711     } else {
3712       Results.push_back(Node->getOperand(0));
3713     }
3714     break;
3715   case ISD::GET_DYNAMIC_AREA_OFFSET:
3716     Results.push_back(DAG.getConstant(0, dl, Node->getValueType(0)));
3717     Results.push_back(Results[0].getValue(0));
3718     break;
3719   case ISD::FCOPYSIGN:
3720     Results.push_back(ExpandFCOPYSIGN(Node));
3721     break;
3722   case ISD::FNEG:
3723     Results.push_back(ExpandFNEG(Node));
3724     break;
3725   case ISD::FABS:
3726     Results.push_back(ExpandFABS(Node));
3727     break;
3728   case ISD::IS_FPCLASS: {
3729     auto Test = static_cast<FPClassTest>(Node->getConstantOperandVal(1));
3730     if (SDValue Expanded =
3731             TLI.expandIS_FPCLASS(Node->getValueType(0), Node->getOperand(0),
3732                                  Test, Node->getFlags(), SDLoc(Node), DAG))
3733       Results.push_back(Expanded);
3734     break;
3735   }
3736   case ISD::SMIN:
3737   case ISD::SMAX:
3738   case ISD::UMIN:
3739   case ISD::UMAX: {
3740     // Expand Y = MAX(A, B) -> Y = (A > B) ? A : B
3741     ISD::CondCode Pred;
3742     switch (Node->getOpcode()) {
3743     default: llvm_unreachable("How did we get here?");
3744     case ISD::SMAX: Pred = ISD::SETGT; break;
3745     case ISD::SMIN: Pred = ISD::SETLT; break;
3746     case ISD::UMAX: Pred = ISD::SETUGT; break;
3747     case ISD::UMIN: Pred = ISD::SETULT; break;
3748     }
3749     Tmp1 = Node->getOperand(0);
3750     Tmp2 = Node->getOperand(1);
3751     Tmp1 = DAG.getSelectCC(dl, Tmp1, Tmp2, Tmp1, Tmp2, Pred);
3752     Results.push_back(Tmp1);
3753     break;
3754   }
3755   case ISD::FMINNUM:
3756   case ISD::FMAXNUM: {
3757     if (SDValue Expanded = TLI.expandFMINNUM_FMAXNUM(Node, DAG))
3758       Results.push_back(Expanded);
3759     break;
3760   }
3761   case ISD::FMINIMUM:
3762   case ISD::FMAXIMUM: {
3763     if (SDValue Expanded = TLI.expandFMINIMUM_FMAXIMUM(Node, DAG))
3764       Results.push_back(Expanded);
3765     break;
3766   }
3767   case ISD::FMINIMUMNUM:
3768   case ISD::FMAXIMUMNUM: {
3769     Results.push_back(TLI.expandFMINIMUMNUM_FMAXIMUMNUM(Node, DAG));
3770     break;
3771   }
3772   case ISD::FSIN:
3773   case ISD::FCOS: {
3774     EVT VT = Node->getValueType(0);
3775     // Turn fsin / fcos into ISD::FSINCOS node if there are a pair of fsin /
3776     // fcos which share the same operand and both are used.
3777     if ((TLI.isOperationLegalOrCustom(ISD::FSINCOS, VT) ||
3778          isSinCosLibcallAvailable(Node, TLI))
3779         && useSinCos(Node)) {
3780       SDVTList VTs = DAG.getVTList(VT, VT);
3781       Tmp1 = DAG.getNode(ISD::FSINCOS, dl, VTs, Node->getOperand(0));
3782       if (Node->getOpcode() == ISD::FCOS)
3783         Tmp1 = Tmp1.getValue(1);
3784       Results.push_back(Tmp1);
3785     }
3786     break;
3787   }
3788   case ISD::FLDEXP:
3789   case ISD::STRICT_FLDEXP: {
3790     EVT VT = Node->getValueType(0);
3791     RTLIB::Libcall LC = RTLIB::getLDEXP(VT);
3792     // Use the LibCall instead, it is very likely faster
3793     // FIXME: Use separate LibCall action.
3794     if (TLI.getLibcallName(LC))
3795       break;
3796 
3797     if (SDValue Expanded = expandLdexp(Node)) {
3798       Results.push_back(Expanded);
3799       if (Node->getOpcode() == ISD::STRICT_FLDEXP)
3800         Results.push_back(Expanded.getValue(1));
3801     }
3802 
3803     break;
3804   }
3805   case ISD::FFREXP: {
3806     RTLIB::Libcall LC = RTLIB::getFREXP(Node->getValueType(0));
3807     // Use the LibCall instead, it is very likely faster
3808     // FIXME: Use separate LibCall action.
3809     if (TLI.getLibcallName(LC))
3810       break;
3811 
3812     if (SDValue Expanded = expandFrexp(Node)) {
3813       Results.push_back(Expanded);
3814       Results.push_back(Expanded.getValue(1));
3815     }
3816     break;
3817   }
3818   case ISD::FSINCOS: {
3819     if (isSinCosLibcallAvailable(Node, TLI))
3820       break;
3821     EVT VT = Node->getValueType(0);
3822     SDValue Op = Node->getOperand(0);
3823     SDNodeFlags Flags = Node->getFlags();
3824     Tmp1 = DAG.getNode(ISD::FSIN, dl, VT, Op, Flags);
3825     Tmp2 = DAG.getNode(ISD::FCOS, dl, VT, Op, Flags);
3826     Results.append({Tmp1, Tmp2});
3827     break;
3828   }
3829   case ISD::FMAD:
3830     llvm_unreachable("Illegal fmad should never be formed");
3831 
3832   case ISD::FP16_TO_FP:
3833     if (Node->getValueType(0) != MVT::f32) {
3834       // We can extend to types bigger than f32 in two steps without changing
3835       // the result. Since "f16 -> f32" is much more commonly available, give
3836       // CodeGen the option of emitting that before resorting to a libcall.
3837       SDValue Res =
3838           DAG.getNode(ISD::FP16_TO_FP, dl, MVT::f32, Node->getOperand(0));
3839       Results.push_back(
3840           DAG.getNode(ISD::FP_EXTEND, dl, Node->getValueType(0), Res));
3841     }
3842     break;
3843   case ISD::STRICT_BF16_TO_FP:
3844   case ISD::STRICT_FP16_TO_FP:
3845     if (Node->getValueType(0) != MVT::f32) {
3846       // We can extend to types bigger than f32 in two steps without changing
3847       // the result. Since "f16 -> f32" is much more commonly available, give
3848       // CodeGen the option of emitting that before resorting to a libcall.
3849       SDValue Res = DAG.getNode(Node->getOpcode(), dl, {MVT::f32, MVT::Other},
3850                                 {Node->getOperand(0), Node->getOperand(1)});
3851       Res = DAG.getNode(ISD::STRICT_FP_EXTEND, dl,
3852                         {Node->getValueType(0), MVT::Other},
3853                         {Res.getValue(1), Res});
3854       Results.push_back(Res);
3855       Results.push_back(Res.getValue(1));
3856     }
3857     break;
3858   case ISD::FP_TO_FP16:
3859     LLVM_DEBUG(dbgs() << "Legalizing FP_TO_FP16\n");
3860     if (!TLI.useSoftFloat() && TM.Options.UnsafeFPMath) {
3861       SDValue Op = Node->getOperand(0);
3862       MVT SVT = Op.getSimpleValueType();
3863       if ((SVT == MVT::f64 || SVT == MVT::f80) &&
3864           TLI.isOperationLegalOrCustom(ISD::FP_TO_FP16, MVT::f32)) {
3865         // Under fastmath, we can expand this node into a fround followed by
3866         // a float-half conversion.
3867         SDValue FloatVal =
3868             DAG.getNode(ISD::FP_ROUND, dl, MVT::f32, Op,
3869                         DAG.getIntPtrConstant(0, dl, /*isTarget=*/true));
3870         Results.push_back(
3871             DAG.getNode(ISD::FP_TO_FP16, dl, Node->getValueType(0), FloatVal));
3872       }
3873     }
3874     break;
3875   case ISD::ConstantFP: {
3876     ConstantFPSDNode *CFP = cast<ConstantFPSDNode>(Node);
3877     // Check to see if this FP immediate is already legal.
3878     // If this is a legal constant, turn it into a TargetConstantFP node.
3879     if (!TLI.isFPImmLegal(CFP->getValueAPF(), Node->getValueType(0),
3880                           DAG.shouldOptForSize()))
3881       Results.push_back(ExpandConstantFP(CFP, true));
3882     break;
3883   }
3884   case ISD::Constant: {
3885     ConstantSDNode *CP = cast<ConstantSDNode>(Node);
3886     Results.push_back(ExpandConstant(CP));
3887     break;
3888   }
3889   case ISD::FSUB: {
3890     EVT VT = Node->getValueType(0);
3891     if (TLI.isOperationLegalOrCustom(ISD::FADD, VT) &&
3892         TLI.isOperationLegalOrCustom(ISD::FNEG, VT)) {
3893       const SDNodeFlags Flags = Node->getFlags();
3894       Tmp1 = DAG.getNode(ISD::FNEG, dl, VT, Node->getOperand(1));
3895       Tmp1 = DAG.getNode(ISD::FADD, dl, VT, Node->getOperand(0), Tmp1, Flags);
3896       Results.push_back(Tmp1);
3897     }
3898     break;
3899   }
3900   case ISD::SUB: {
3901     EVT VT = Node->getValueType(0);
3902     assert(TLI.isOperationLegalOrCustom(ISD::ADD, VT) &&
3903            TLI.isOperationLegalOrCustom(ISD::XOR, VT) &&
3904            "Don't know how to expand this subtraction!");
3905     Tmp1 = DAG.getNOT(dl, Node->getOperand(1), VT);
3906     Tmp1 = DAG.getNode(ISD::ADD, dl, VT, Tmp1, DAG.getConstant(1, dl, VT));
3907     Results.push_back(DAG.getNode(ISD::ADD, dl, VT, Node->getOperand(0), Tmp1));
3908     break;
3909   }
3910   case ISD::UREM:
3911   case ISD::SREM:
3912     if (TLI.expandREM(Node, Tmp1, DAG))
3913       Results.push_back(Tmp1);
3914     break;
3915   case ISD::UDIV:
3916   case ISD::SDIV: {
3917     bool isSigned = Node->getOpcode() == ISD::SDIV;
3918     unsigned DivRemOpc = isSigned ? ISD::SDIVREM : ISD::UDIVREM;
3919     EVT VT = Node->getValueType(0);
3920     if (TLI.isOperationLegalOrCustom(DivRemOpc, VT)) {
3921       SDVTList VTs = DAG.getVTList(VT, VT);
3922       Tmp1 = DAG.getNode(DivRemOpc, dl, VTs, Node->getOperand(0),
3923                          Node->getOperand(1));
3924       Results.push_back(Tmp1);
3925     }
3926     break;
3927   }
3928   case ISD::MULHU:
3929   case ISD::MULHS: {
3930     unsigned ExpandOpcode =
3931         Node->getOpcode() == ISD::MULHU ? ISD::UMUL_LOHI : ISD::SMUL_LOHI;
3932     EVT VT = Node->getValueType(0);
3933     SDVTList VTs = DAG.getVTList(VT, VT);
3934 
3935     Tmp1 = DAG.getNode(ExpandOpcode, dl, VTs, Node->getOperand(0),
3936                        Node->getOperand(1));
3937     Results.push_back(Tmp1.getValue(1));
3938     break;
3939   }
3940   case ISD::UMUL_LOHI:
3941   case ISD::SMUL_LOHI: {
3942     SDValue LHS = Node->getOperand(0);
3943     SDValue RHS = Node->getOperand(1);
3944     MVT VT = LHS.getSimpleValueType();
3945     unsigned MULHOpcode =
3946         Node->getOpcode() == ISD::UMUL_LOHI ? ISD::MULHU : ISD::MULHS;
3947 
3948     if (TLI.isOperationLegalOrCustom(MULHOpcode, VT)) {
3949       Results.push_back(DAG.getNode(ISD::MUL, dl, VT, LHS, RHS));
3950       Results.push_back(DAG.getNode(MULHOpcode, dl, VT, LHS, RHS));
3951       break;
3952     }
3953 
3954     SmallVector<SDValue, 4> Halves;
3955     EVT HalfType = EVT(VT).getHalfSizedIntegerVT(*DAG.getContext());
3956     assert(TLI.isTypeLegal(HalfType));
3957     if (TLI.expandMUL_LOHI(Node->getOpcode(), VT, dl, LHS, RHS, Halves,
3958                            HalfType, DAG,
3959                            TargetLowering::MulExpansionKind::Always)) {
3960       for (unsigned i = 0; i < 2; ++i) {
3961         SDValue Lo = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Halves[2 * i]);
3962         SDValue Hi = DAG.getNode(ISD::ANY_EXTEND, dl, VT, Halves[2 * i + 1]);
3963         SDValue Shift = DAG.getConstant(
3964             HalfType.getScalarSizeInBits(), dl,
3965             TLI.getShiftAmountTy(HalfType, DAG.getDataLayout()));
3966         Hi = DAG.getNode(ISD::SHL, dl, VT, Hi, Shift);
3967         Results.push_back(DAG.getNode(ISD::OR, dl, VT, Lo, Hi));
3968       }
3969       break;
3970     }
3971     break;
3972   }
3973   case ISD::MUL: {
3974     EVT VT = Node->getValueType(0);
3975     SDVTList VTs = DAG.getVTList(VT, VT);
3976     // See if multiply or divide can be lowered using two-result operations.
3977     // We just need the low half of the multiply; try both the signed
3978     // and unsigned forms. If the target supports both SMUL_LOHI and
3979     // UMUL_LOHI, form a preference by checking which forms of plain
3980     // MULH it supports.
3981     bool HasSMUL_LOHI = TLI.isOperationLegalOrCustom(ISD::SMUL_LOHI, VT);
3982     bool HasUMUL_LOHI = TLI.isOperationLegalOrCustom(ISD::UMUL_LOHI, VT);
3983     bool HasMULHS = TLI.isOperationLegalOrCustom(ISD::MULHS, VT);
3984     bool HasMULHU = TLI.isOperationLegalOrCustom(ISD::MULHU, VT);
3985     unsigned OpToUse = 0;
3986     if (HasSMUL_LOHI && !HasMULHS) {
3987       OpToUse = ISD::SMUL_LOHI;
3988     } else if (HasUMUL_LOHI && !HasMULHU) {
3989       OpToUse = ISD::UMUL_LOHI;
3990     } else if (HasSMUL_LOHI) {
3991       OpToUse = ISD::SMUL_LOHI;
3992     } else if (HasUMUL_LOHI) {
3993       OpToUse = ISD::UMUL_LOHI;
3994     }
3995     if (OpToUse) {
3996       Results.push_back(DAG.getNode(OpToUse, dl, VTs, Node->getOperand(0),
3997                                     Node->getOperand(1)));
3998       break;
3999     }
4000 
4001     SDValue Lo, Hi;
4002     EVT HalfType = VT.getHalfSizedIntegerVT(*DAG.getContext());
4003     if (TLI.isOperationLegalOrCustom(ISD::ZERO_EXTEND, VT) &&
4004         TLI.isOperationLegalOrCustom(ISD::ANY_EXTEND, VT) &&
4005         TLI.isOperationLegalOrCustom(ISD::SHL, VT) &&
4006         TLI.isOperationLegalOrCustom(ISD::OR, VT) &&
4007         TLI.expandMUL(Node, Lo, Hi, HalfType, DAG,
4008                       TargetLowering::MulExpansionKind::OnlyLegalOrCustom)) {
4009       Lo = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Lo);
4010       Hi = DAG.getNode(ISD::ANY_EXTEND, dl, VT, Hi);
4011       SDValue Shift =
4012           DAG.getConstant(HalfType.getSizeInBits(), dl,
4013                           TLI.getShiftAmountTy(HalfType, DAG.getDataLayout()));
4014       Hi = DAG.getNode(ISD::SHL, dl, VT, Hi, Shift);
4015       Results.push_back(DAG.getNode(ISD::OR, dl, VT, Lo, Hi));
4016     }
4017     break;
4018   }
4019   case ISD::FSHL:
4020   case ISD::FSHR:
4021     if (SDValue Expanded = TLI.expandFunnelShift(Node, DAG))
4022       Results.push_back(Expanded);
4023     break;
4024   case ISD::ROTL:
4025   case ISD::ROTR:
4026     if (SDValue Expanded = TLI.expandROT(Node, true /*AllowVectorOps*/, DAG))
4027       Results.push_back(Expanded);
4028     break;
4029   case ISD::SADDSAT:
4030   case ISD::UADDSAT:
4031   case ISD::SSUBSAT:
4032   case ISD::USUBSAT:
4033     Results.push_back(TLI.expandAddSubSat(Node, DAG));
4034     break;
4035   case ISD::SCMP:
4036   case ISD::UCMP:
4037     Results.push_back(TLI.expandCMP(Node, DAG));
4038     break;
4039   case ISD::SSHLSAT:
4040   case ISD::USHLSAT:
4041     Results.push_back(TLI.expandShlSat(Node, DAG));
4042     break;
4043   case ISD::SMULFIX:
4044   case ISD::SMULFIXSAT:
4045   case ISD::UMULFIX:
4046   case ISD::UMULFIXSAT:
4047     Results.push_back(TLI.expandFixedPointMul(Node, DAG));
4048     break;
4049   case ISD::SDIVFIX:
4050   case ISD::SDIVFIXSAT:
4051   case ISD::UDIVFIX:
4052   case ISD::UDIVFIXSAT:
4053     if (SDValue V = TLI.expandFixedPointDiv(Node->getOpcode(), SDLoc(Node),
4054                                             Node->getOperand(0),
4055                                             Node->getOperand(1),
4056                                             Node->getConstantOperandVal(2),
4057                                             DAG)) {
4058       Results.push_back(V);
4059       break;
4060     }
4061     // FIXME: We might want to retry here with a wider type if we fail, if that
4062     // type is legal.
4063     // FIXME: Technically, so long as we only have sdivfixes where BW+Scale is
4064     // <= 128 (which is the case for all of the default Embedded-C types),
4065     // we will only get here with types and scales that we could always expand
4066     // if we were allowed to generate libcalls to division functions of illegal
4067     // type. But we cannot do that.
4068     llvm_unreachable("Cannot expand DIVFIX!");
4069   case ISD::UADDO_CARRY:
4070   case ISD::USUBO_CARRY: {
4071     SDValue LHS = Node->getOperand(0);
4072     SDValue RHS = Node->getOperand(1);
4073     SDValue Carry = Node->getOperand(2);
4074 
4075     bool IsAdd = Node->getOpcode() == ISD::UADDO_CARRY;
4076 
4077     // Initial add of the 2 operands.
4078     unsigned Op = IsAdd ? ISD::ADD : ISD::SUB;
4079     EVT VT = LHS.getValueType();
4080     SDValue Sum = DAG.getNode(Op, dl, VT, LHS, RHS);
4081 
4082     // Initial check for overflow.
4083     EVT CarryType = Node->getValueType(1);
4084     EVT SetCCType = getSetCCResultType(Node->getValueType(0));
4085     ISD::CondCode CC = IsAdd ? ISD::SETULT : ISD::SETUGT;
4086     SDValue Overflow = DAG.getSetCC(dl, SetCCType, Sum, LHS, CC);
4087 
4088     // Add of the sum and the carry.
4089     SDValue One = DAG.getConstant(1, dl, VT);
4090     SDValue CarryExt =
4091         DAG.getNode(ISD::AND, dl, VT, DAG.getZExtOrTrunc(Carry, dl, VT), One);
4092     SDValue Sum2 = DAG.getNode(Op, dl, VT, Sum, CarryExt);
4093 
4094     // Second check for overflow. If we are adding, we can only overflow if the
4095     // initial sum is all 1s ang the carry is set, resulting in a new sum of 0.
4096     // If we are subtracting, we can only overflow if the initial sum is 0 and
4097     // the carry is set, resulting in a new sum of all 1s.
4098     SDValue Zero = DAG.getConstant(0, dl, VT);
4099     SDValue Overflow2 =
4100         IsAdd ? DAG.getSetCC(dl, SetCCType, Sum2, Zero, ISD::SETEQ)
4101               : DAG.getSetCC(dl, SetCCType, Sum, Zero, ISD::SETEQ);
4102     Overflow2 = DAG.getNode(ISD::AND, dl, SetCCType, Overflow2,
4103                             DAG.getZExtOrTrunc(Carry, dl, SetCCType));
4104 
4105     SDValue ResultCarry =
4106         DAG.getNode(ISD::OR, dl, SetCCType, Overflow, Overflow2);
4107 
4108     Results.push_back(Sum2);
4109     Results.push_back(DAG.getBoolExtOrTrunc(ResultCarry, dl, CarryType, VT));
4110     break;
4111   }
4112   case ISD::SADDO:
4113   case ISD::SSUBO: {
4114     SDValue Result, Overflow;
4115     TLI.expandSADDSUBO(Node, Result, Overflow, DAG);
4116     Results.push_back(Result);
4117     Results.push_back(Overflow);
4118     break;
4119   }
4120   case ISD::UADDO:
4121   case ISD::USUBO: {
4122     SDValue Result, Overflow;
4123     TLI.expandUADDSUBO(Node, Result, Overflow, DAG);
4124     Results.push_back(Result);
4125     Results.push_back(Overflow);
4126     break;
4127   }
4128   case ISD::UMULO:
4129   case ISD::SMULO: {
4130     SDValue Result, Overflow;
4131     if (TLI.expandMULO(Node, Result, Overflow, DAG)) {
4132       Results.push_back(Result);
4133       Results.push_back(Overflow);
4134     }
4135     break;
4136   }
4137   case ISD::BUILD_PAIR: {
4138     EVT PairTy = Node->getValueType(0);
4139     Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, PairTy, Node->getOperand(0));
4140     Tmp2 = DAG.getNode(ISD::ANY_EXTEND, dl, PairTy, Node->getOperand(1));
4141     Tmp2 = DAG.getNode(
4142         ISD::SHL, dl, PairTy, Tmp2,
4143         DAG.getConstant(PairTy.getSizeInBits() / 2, dl,
4144                         TLI.getShiftAmountTy(PairTy, DAG.getDataLayout())));
4145     Results.push_back(DAG.getNode(ISD::OR, dl, PairTy, Tmp1, Tmp2));
4146     break;
4147   }
4148   case ISD::SELECT:
4149     Tmp1 = Node->getOperand(0);
4150     Tmp2 = Node->getOperand(1);
4151     Tmp3 = Node->getOperand(2);
4152     if (Tmp1.getOpcode() == ISD::SETCC) {
4153       Tmp1 = DAG.getSelectCC(dl, Tmp1.getOperand(0), Tmp1.getOperand(1),
4154                              Tmp2, Tmp3,
4155                              cast<CondCodeSDNode>(Tmp1.getOperand(2))->get());
4156     } else {
4157       Tmp1 = DAG.getSelectCC(dl, Tmp1,
4158                              DAG.getConstant(0, dl, Tmp1.getValueType()),
4159                              Tmp2, Tmp3, ISD::SETNE);
4160     }
4161     Tmp1->setFlags(Node->getFlags());
4162     Results.push_back(Tmp1);
4163     break;
4164   case ISD::BR_JT: {
4165     SDValue Chain = Node->getOperand(0);
4166     SDValue Table = Node->getOperand(1);
4167     SDValue Index = Node->getOperand(2);
4168     int JTI = cast<JumpTableSDNode>(Table.getNode())->getIndex();
4169 
4170     const DataLayout &TD = DAG.getDataLayout();
4171     EVT PTy = TLI.getPointerTy(TD);
4172 
4173     unsigned EntrySize =
4174       DAG.getMachineFunction().getJumpTableInfo()->getEntrySize(TD);
4175 
4176     // For power-of-two jumptable entry sizes convert multiplication to a shift.
4177     // This transformation needs to be done here since otherwise the MIPS
4178     // backend will end up emitting a three instruction multiply sequence
4179     // instead of a single shift and MSP430 will call a runtime function.
4180     if (llvm::isPowerOf2_32(EntrySize))
4181       Index = DAG.getNode(
4182           ISD::SHL, dl, Index.getValueType(), Index,
4183           DAG.getConstant(llvm::Log2_32(EntrySize), dl, Index.getValueType()));
4184     else
4185       Index = DAG.getNode(ISD::MUL, dl, Index.getValueType(), Index,
4186                           DAG.getConstant(EntrySize, dl, Index.getValueType()));
4187     SDValue Addr = DAG.getMemBasePlusOffset(Table, Index, dl);
4188 
4189     EVT MemVT = EVT::getIntegerVT(*DAG.getContext(), EntrySize * 8);
4190     SDValue LD = DAG.getExtLoad(
4191         ISD::SEXTLOAD, dl, PTy, Chain, Addr,
4192         MachinePointerInfo::getJumpTable(DAG.getMachineFunction()), MemVT);
4193     Addr = LD;
4194     if (TLI.isJumpTableRelative()) {
4195       // For PIC, the sequence is:
4196       // BRIND(RelocBase + load(Jumptable + index))
4197       // RelocBase can be JumpTable, GOT or some sort of global base.
4198       Addr = DAG.getMemBasePlusOffset(TLI.getPICJumpTableRelocBase(Table, DAG),
4199                                       Addr, dl);
4200     }
4201 
4202     Tmp1 = TLI.expandIndirectJTBranch(dl, LD.getValue(1), Addr, JTI, DAG);
4203     Results.push_back(Tmp1);
4204     break;
4205   }
4206   case ISD::BRCOND:
4207     // Expand brcond's setcc into its constituent parts and create a BR_CC
4208     // Node.
4209     Tmp1 = Node->getOperand(0);
4210     Tmp2 = Node->getOperand(1);
4211     if (Tmp2.getOpcode() == ISD::SETCC &&
4212         TLI.isOperationLegalOrCustom(ISD::BR_CC,
4213                                      Tmp2.getOperand(0).getValueType())) {
4214       Tmp1 = DAG.getNode(ISD::BR_CC, dl, MVT::Other, Tmp1, Tmp2.getOperand(2),
4215                          Tmp2.getOperand(0), Tmp2.getOperand(1),
4216                          Node->getOperand(2));
4217     } else {
4218       // We test only the i1 bit.  Skip the AND if UNDEF or another AND.
4219       if (Tmp2.isUndef() ||
4220           (Tmp2.getOpcode() == ISD::AND && isOneConstant(Tmp2.getOperand(1))))
4221         Tmp3 = Tmp2;
4222       else
4223         Tmp3 = DAG.getNode(ISD::AND, dl, Tmp2.getValueType(), Tmp2,
4224                            DAG.getConstant(1, dl, Tmp2.getValueType()));
4225       Tmp1 = DAG.getNode(ISD::BR_CC, dl, MVT::Other, Tmp1,
4226                          DAG.getCondCode(ISD::SETNE), Tmp3,
4227                          DAG.getConstant(0, dl, Tmp3.getValueType()),
4228                          Node->getOperand(2));
4229     }
4230     Results.push_back(Tmp1);
4231     break;
4232   case ISD::SETCC:
4233   case ISD::VP_SETCC:
4234   case ISD::STRICT_FSETCC:
4235   case ISD::STRICT_FSETCCS: {
4236     bool IsVP = Node->getOpcode() == ISD::VP_SETCC;
4237     bool IsStrict = Node->getOpcode() == ISD::STRICT_FSETCC ||
4238                     Node->getOpcode() == ISD::STRICT_FSETCCS;
4239     bool IsSignaling = Node->getOpcode() == ISD::STRICT_FSETCCS;
4240     SDValue Chain = IsStrict ? Node->getOperand(0) : SDValue();
4241     unsigned Offset = IsStrict ? 1 : 0;
4242     Tmp1 = Node->getOperand(0 + Offset);
4243     Tmp2 = Node->getOperand(1 + Offset);
4244     Tmp3 = Node->getOperand(2 + Offset);
4245     SDValue Mask, EVL;
4246     if (IsVP) {
4247       Mask = Node->getOperand(3 + Offset);
4248       EVL = Node->getOperand(4 + Offset);
4249     }
4250     bool Legalized = TLI.LegalizeSetCCCondCode(
4251         DAG, Node->getValueType(0), Tmp1, Tmp2, Tmp3, Mask, EVL, NeedInvert, dl,
4252         Chain, IsSignaling);
4253 
4254     if (Legalized) {
4255       // If we expanded the SETCC by swapping LHS and RHS, or by inverting the
4256       // condition code, create a new SETCC node.
4257       if (Tmp3.getNode()) {
4258         if (IsStrict) {
4259           Tmp1 = DAG.getNode(Node->getOpcode(), dl, Node->getVTList(),
4260                              {Chain, Tmp1, Tmp2, Tmp3}, Node->getFlags());
4261           Chain = Tmp1.getValue(1);
4262         } else if (IsVP) {
4263           Tmp1 = DAG.getNode(Node->getOpcode(), dl, Node->getValueType(0),
4264                              {Tmp1, Tmp2, Tmp3, Mask, EVL}, Node->getFlags());
4265         } else {
4266           Tmp1 = DAG.getNode(Node->getOpcode(), dl, Node->getValueType(0), Tmp1,
4267                              Tmp2, Tmp3, Node->getFlags());
4268         }
4269       }
4270 
4271       // If we expanded the SETCC by inverting the condition code, then wrap
4272       // the existing SETCC in a NOT to restore the intended condition.
4273       if (NeedInvert) {
4274         if (!IsVP)
4275           Tmp1 = DAG.getLogicalNOT(dl, Tmp1, Tmp1->getValueType(0));
4276         else
4277           Tmp1 =
4278               DAG.getVPLogicalNOT(dl, Tmp1, Mask, EVL, Tmp1->getValueType(0));
4279       }
4280 
4281       Results.push_back(Tmp1);
4282       if (IsStrict)
4283         Results.push_back(Chain);
4284 
4285       break;
4286     }
4287 
4288     // FIXME: It seems Legalized is false iff CCCode is Legal. I don't
4289     // understand if this code is useful for strict nodes.
4290     assert(!IsStrict && "Don't know how to expand for strict nodes.");
4291 
4292     // Otherwise, SETCC for the given comparison type must be completely
4293     // illegal; expand it into a SELECT_CC.
4294     // FIXME: This drops the mask/evl for VP_SETCC.
4295     EVT VT = Node->getValueType(0);
4296     EVT Tmp1VT = Tmp1.getValueType();
4297     Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, VT, Tmp1, Tmp2,
4298                        DAG.getBoolConstant(true, dl, VT, Tmp1VT),
4299                        DAG.getBoolConstant(false, dl, VT, Tmp1VT), Tmp3);
4300     Tmp1->setFlags(Node->getFlags());
4301     Results.push_back(Tmp1);
4302     break;
4303   }
4304   case ISD::SELECT_CC: {
4305     // TODO: need to add STRICT_SELECT_CC and STRICT_SELECT_CCS
4306     Tmp1 = Node->getOperand(0);   // LHS
4307     Tmp2 = Node->getOperand(1);   // RHS
4308     Tmp3 = Node->getOperand(2);   // True
4309     Tmp4 = Node->getOperand(3);   // False
4310     EVT VT = Node->getValueType(0);
4311     SDValue Chain;
4312     SDValue CC = Node->getOperand(4);
4313     ISD::CondCode CCOp = cast<CondCodeSDNode>(CC)->get();
4314 
4315     if (TLI.isCondCodeLegalOrCustom(CCOp, Tmp1.getSimpleValueType())) {
4316       // If the condition code is legal, then we need to expand this
4317       // node using SETCC and SELECT.
4318       EVT CmpVT = Tmp1.getValueType();
4319       assert(!TLI.isOperationExpand(ISD::SELECT, VT) &&
4320              "Cannot expand ISD::SELECT_CC when ISD::SELECT also needs to be "
4321              "expanded.");
4322       EVT CCVT = getSetCCResultType(CmpVT);
4323       SDValue Cond = DAG.getNode(ISD::SETCC, dl, CCVT, Tmp1, Tmp2, CC, Node->getFlags());
4324       Results.push_back(
4325           DAG.getSelect(dl, VT, Cond, Tmp3, Tmp4, Node->getFlags()));
4326       break;
4327     }
4328 
4329     // SELECT_CC is legal, so the condition code must not be.
4330     bool Legalized = false;
4331     // Try to legalize by inverting the condition.  This is for targets that
4332     // might support an ordered version of a condition, but not the unordered
4333     // version (or vice versa).
4334     ISD::CondCode InvCC = ISD::getSetCCInverse(CCOp, Tmp1.getValueType());
4335     if (TLI.isCondCodeLegalOrCustom(InvCC, Tmp1.getSimpleValueType())) {
4336       // Use the new condition code and swap true and false
4337       Legalized = true;
4338       Tmp1 = DAG.getSelectCC(dl, Tmp1, Tmp2, Tmp4, Tmp3, InvCC);
4339       Tmp1->setFlags(Node->getFlags());
4340     } else {
4341       // If The inverse is not legal, then try to swap the arguments using
4342       // the inverse condition code.
4343       ISD::CondCode SwapInvCC = ISD::getSetCCSwappedOperands(InvCC);
4344       if (TLI.isCondCodeLegalOrCustom(SwapInvCC, Tmp1.getSimpleValueType())) {
4345         // The swapped inverse condition is legal, so swap true and false,
4346         // lhs and rhs.
4347         Legalized = true;
4348         Tmp1 = DAG.getSelectCC(dl, Tmp2, Tmp1, Tmp4, Tmp3, SwapInvCC);
4349         Tmp1->setFlags(Node->getFlags());
4350       }
4351     }
4352 
4353     if (!Legalized) {
4354       Legalized = TLI.LegalizeSetCCCondCode(
4355           DAG, getSetCCResultType(Tmp1.getValueType()), Tmp1, Tmp2, CC,
4356           /*Mask*/ SDValue(), /*EVL*/ SDValue(), NeedInvert, dl, Chain);
4357 
4358       assert(Legalized && "Can't legalize SELECT_CC with legal condition!");
4359 
4360       // If we expanded the SETCC by inverting the condition code, then swap
4361       // the True/False operands to match.
4362       if (NeedInvert)
4363         std::swap(Tmp3, Tmp4);
4364 
4365       // If we expanded the SETCC by swapping LHS and RHS, or by inverting the
4366       // condition code, create a new SELECT_CC node.
4367       if (CC.getNode()) {
4368         Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, Node->getValueType(0),
4369                            Tmp1, Tmp2, Tmp3, Tmp4, CC);
4370       } else {
4371         Tmp2 = DAG.getConstant(0, dl, Tmp1.getValueType());
4372         CC = DAG.getCondCode(ISD::SETNE);
4373         Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, Node->getValueType(0), Tmp1,
4374                            Tmp2, Tmp3, Tmp4, CC);
4375       }
4376       Tmp1->setFlags(Node->getFlags());
4377     }
4378     Results.push_back(Tmp1);
4379     break;
4380   }
4381   case ISD::BR_CC: {
4382     // TODO: need to add STRICT_BR_CC and STRICT_BR_CCS
4383     SDValue Chain;
4384     Tmp1 = Node->getOperand(0);              // Chain
4385     Tmp2 = Node->getOperand(2);              // LHS
4386     Tmp3 = Node->getOperand(3);              // RHS
4387     Tmp4 = Node->getOperand(1);              // CC
4388 
4389     bool Legalized = TLI.LegalizeSetCCCondCode(
4390         DAG, getSetCCResultType(Tmp2.getValueType()), Tmp2, Tmp3, Tmp4,
4391         /*Mask*/ SDValue(), /*EVL*/ SDValue(), NeedInvert, dl, Chain);
4392     (void)Legalized;
4393     assert(Legalized && "Can't legalize BR_CC with legal condition!");
4394 
4395     // If we expanded the SETCC by swapping LHS and RHS, create a new BR_CC
4396     // node.
4397     if (Tmp4.getNode()) {
4398       assert(!NeedInvert && "Don't know how to invert BR_CC!");
4399 
4400       Tmp1 = DAG.getNode(ISD::BR_CC, dl, Node->getValueType(0), Tmp1,
4401                          Tmp4, Tmp2, Tmp3, Node->getOperand(4));
4402     } else {
4403       Tmp3 = DAG.getConstant(0, dl, Tmp2.getValueType());
4404       Tmp4 = DAG.getCondCode(NeedInvert ? ISD::SETEQ : ISD::SETNE);
4405       Tmp1 = DAG.getNode(ISD::BR_CC, dl, Node->getValueType(0), Tmp1, Tmp4,
4406                          Tmp2, Tmp3, Node->getOperand(4));
4407     }
4408     Results.push_back(Tmp1);
4409     break;
4410   }
4411   case ISD::BUILD_VECTOR:
4412     Results.push_back(ExpandBUILD_VECTOR(Node));
4413     break;
4414   case ISD::SPLAT_VECTOR:
4415     Results.push_back(ExpandSPLAT_VECTOR(Node));
4416     break;
4417   case ISD::SRA:
4418   case ISD::SRL:
4419   case ISD::SHL: {
4420     // Scalarize vector SRA/SRL/SHL.
4421     EVT VT = Node->getValueType(0);
4422     assert(VT.isVector() && "Unable to legalize non-vector shift");
4423     assert(TLI.isTypeLegal(VT.getScalarType())&& "Element type must be legal");
4424     unsigned NumElem = VT.getVectorNumElements();
4425 
4426     SmallVector<SDValue, 8> Scalars;
4427     for (unsigned Idx = 0; Idx < NumElem; Idx++) {
4428       SDValue Ex =
4429           DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, VT.getScalarType(),
4430                       Node->getOperand(0), DAG.getVectorIdxConstant(Idx, dl));
4431       SDValue Sh =
4432           DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, VT.getScalarType(),
4433                       Node->getOperand(1), DAG.getVectorIdxConstant(Idx, dl));
4434       Scalars.push_back(DAG.getNode(Node->getOpcode(), dl,
4435                                     VT.getScalarType(), Ex, Sh));
4436     }
4437 
4438     SDValue Result = DAG.getBuildVector(Node->getValueType(0), dl, Scalars);
4439     Results.push_back(Result);
4440     break;
4441   }
4442   case ISD::VECREDUCE_FADD:
4443   case ISD::VECREDUCE_FMUL:
4444   case ISD::VECREDUCE_ADD:
4445   case ISD::VECREDUCE_MUL:
4446   case ISD::VECREDUCE_AND:
4447   case ISD::VECREDUCE_OR:
4448   case ISD::VECREDUCE_XOR:
4449   case ISD::VECREDUCE_SMAX:
4450   case ISD::VECREDUCE_SMIN:
4451   case ISD::VECREDUCE_UMAX:
4452   case ISD::VECREDUCE_UMIN:
4453   case ISD::VECREDUCE_FMAX:
4454   case ISD::VECREDUCE_FMIN:
4455   case ISD::VECREDUCE_FMAXIMUM:
4456   case ISD::VECREDUCE_FMINIMUM:
4457     Results.push_back(TLI.expandVecReduce(Node, DAG));
4458     break;
4459   case ISD::VP_CTTZ_ELTS:
4460   case ISD::VP_CTTZ_ELTS_ZERO_UNDEF:
4461     Results.push_back(TLI.expandVPCTTZElements(Node, DAG));
4462     break;
4463   case ISD::CLEAR_CACHE:
4464     // The default expansion of llvm.clear_cache is simply a no-op for those
4465     // targets where it is not needed.
4466     Results.push_back(Node->getOperand(0));
4467     break;
4468   case ISD::LRINT:
4469   case ISD::LLRINT: {
4470     SDValue Arg = Node->getOperand(0);
4471     EVT ArgVT = Arg.getValueType();
4472     EVT ResVT = Node->getValueType(0);
4473     SDLoc dl(Node);
4474     SDValue RoundNode = DAG.getNode(ISD::FRINT, dl, ArgVT, Arg);
4475     Results.push_back(DAG.getNode(ISD::FP_TO_SINT, dl, ResVT, RoundNode));
4476     break;
4477   }
4478   case ISD::ADDRSPACECAST:
4479     Results.push_back(DAG.UnrollVectorOp(Node));
4480     break;
4481   case ISD::GLOBAL_OFFSET_TABLE:
4482   case ISD::GlobalAddress:
4483   case ISD::GlobalTLSAddress:
4484   case ISD::ExternalSymbol:
4485   case ISD::ConstantPool:
4486   case ISD::JumpTable:
4487   case ISD::INTRINSIC_W_CHAIN:
4488   case ISD::INTRINSIC_WO_CHAIN:
4489   case ISD::INTRINSIC_VOID:
4490     // FIXME: Custom lowering for these operations shouldn't return null!
4491     // Return true so that we don't call ConvertNodeToLibcall which also won't
4492     // do anything.
4493     return true;
4494   }
4495 
4496   if (!TLI.isStrictFPEnabled() && Results.empty() && Node->isStrictFPOpcode()) {
4497     // FIXME: We were asked to expand a strict floating-point operation,
4498     // but there is currently no expansion implemented that would preserve
4499     // the "strict" properties.  For now, we just fall back to the non-strict
4500     // version if that is legal on the target.  The actual mutation of the
4501     // operation will happen in SelectionDAGISel::DoInstructionSelection.
4502     switch (Node->getOpcode()) {
4503     default:
4504       if (TLI.getStrictFPOperationAction(Node->getOpcode(),
4505                                          Node->getValueType(0))
4506           == TargetLowering::Legal)
4507         return true;
4508       break;
4509     case ISD::STRICT_FSUB: {
4510       if (TLI.getStrictFPOperationAction(
4511               ISD::STRICT_FSUB, Node->getValueType(0)) == TargetLowering::Legal)
4512         return true;
4513       if (TLI.getStrictFPOperationAction(
4514               ISD::STRICT_FADD, Node->getValueType(0)) != TargetLowering::Legal)
4515         break;
4516 
4517       EVT VT = Node->getValueType(0);
4518       const SDNodeFlags Flags = Node->getFlags();
4519       SDValue Neg = DAG.getNode(ISD::FNEG, dl, VT, Node->getOperand(2), Flags);
4520       SDValue Fadd = DAG.getNode(ISD::STRICT_FADD, dl, Node->getVTList(),
4521                                  {Node->getOperand(0), Node->getOperand(1), Neg},
4522                          Flags);
4523 
4524       Results.push_back(Fadd);
4525       Results.push_back(Fadd.getValue(1));
4526       break;
4527     }
4528     case ISD::STRICT_SINT_TO_FP:
4529     case ISD::STRICT_UINT_TO_FP:
4530     case ISD::STRICT_LRINT:
4531     case ISD::STRICT_LLRINT:
4532     case ISD::STRICT_LROUND:
4533     case ISD::STRICT_LLROUND:
4534       // These are registered by the operand type instead of the value
4535       // type. Reflect that here.
4536       if (TLI.getStrictFPOperationAction(Node->getOpcode(),
4537                                          Node->getOperand(1).getValueType())
4538           == TargetLowering::Legal)
4539         return true;
4540       break;
4541     }
4542   }
4543 
4544   // Replace the original node with the legalized result.
4545   if (Results.empty()) {
4546     LLVM_DEBUG(dbgs() << "Cannot expand node\n");
4547     return false;
4548   }
4549 
4550   LLVM_DEBUG(dbgs() << "Successfully expanded node\n");
4551   ReplaceNode(Node, Results.data());
4552   return true;
4553 }
4554 
4555 /// Return if we can use the FAST_* variant of a math libcall for the node.
4556 /// FIXME: This is just guessing, we probably should have unique specific sets
4557 /// flags required per libcall.
canUseFastMathLibcall(const SDNode * Node)4558 static bool canUseFastMathLibcall(const SDNode *Node) {
4559   // FIXME: Probably should define fast to respect nan/inf and only be
4560   // approximate functions.
4561 
4562   SDNodeFlags Flags = Node->getFlags();
4563   return Flags.hasApproximateFuncs() && Flags.hasNoNaNs() &&
4564          Flags.hasNoInfs() && Flags.hasNoSignedZeros();
4565 }
4566 
ConvertNodeToLibcall(SDNode * Node)4567 void SelectionDAGLegalize::ConvertNodeToLibcall(SDNode *Node) {
4568   LLVM_DEBUG(dbgs() << "Trying to convert node to libcall\n");
4569   SmallVector<SDValue, 8> Results;
4570   SDLoc dl(Node);
4571   TargetLowering::MakeLibCallOptions CallOptions;
4572   CallOptions.IsPostTypeLegalization = true;
4573   // FIXME: Check flags on the node to see if we can use a finite call.
4574   unsigned Opc = Node->getOpcode();
4575   switch (Opc) {
4576   case ISD::ATOMIC_FENCE: {
4577     // If the target didn't lower this, lower it to '__sync_synchronize()' call
4578     // FIXME: handle "fence singlethread" more efficiently.
4579     TargetLowering::ArgListTy Args;
4580 
4581     TargetLowering::CallLoweringInfo CLI(DAG);
4582     CLI.setDebugLoc(dl)
4583         .setChain(Node->getOperand(0))
4584         .setLibCallee(
4585             CallingConv::C, Type::getVoidTy(*DAG.getContext()),
4586             DAG.getExternalSymbol("__sync_synchronize",
4587                                   TLI.getPointerTy(DAG.getDataLayout())),
4588             std::move(Args));
4589 
4590     std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
4591 
4592     Results.push_back(CallResult.second);
4593     break;
4594   }
4595   // By default, atomic intrinsics are marked Legal and lowered. Targets
4596   // which don't support them directly, however, may want libcalls, in which
4597   // case they mark them Expand, and we get here.
4598   case ISD::ATOMIC_SWAP:
4599   case ISD::ATOMIC_LOAD_ADD:
4600   case ISD::ATOMIC_LOAD_SUB:
4601   case ISD::ATOMIC_LOAD_AND:
4602   case ISD::ATOMIC_LOAD_CLR:
4603   case ISD::ATOMIC_LOAD_OR:
4604   case ISD::ATOMIC_LOAD_XOR:
4605   case ISD::ATOMIC_LOAD_NAND:
4606   case ISD::ATOMIC_LOAD_MIN:
4607   case ISD::ATOMIC_LOAD_MAX:
4608   case ISD::ATOMIC_LOAD_UMIN:
4609   case ISD::ATOMIC_LOAD_UMAX:
4610   case ISD::ATOMIC_CMP_SWAP: {
4611     MVT VT = cast<AtomicSDNode>(Node)->getMemoryVT().getSimpleVT();
4612     AtomicOrdering Order = cast<AtomicSDNode>(Node)->getMergedOrdering();
4613     RTLIB::Libcall LC = RTLIB::getOUTLINE_ATOMIC(Opc, Order, VT);
4614     EVT RetVT = Node->getValueType(0);
4615     SmallVector<SDValue, 4> Ops;
4616     if (TLI.getLibcallName(LC)) {
4617       // If outline atomic available, prepare its arguments and expand.
4618       Ops.append(Node->op_begin() + 2, Node->op_end());
4619       Ops.push_back(Node->getOperand(1));
4620 
4621     } else {
4622       LC = RTLIB::getSYNC(Opc, VT);
4623       assert(LC != RTLIB::UNKNOWN_LIBCALL &&
4624              "Unexpected atomic op or value type!");
4625       // Arguments for expansion to sync libcall
4626       Ops.append(Node->op_begin() + 1, Node->op_end());
4627     }
4628     std::pair<SDValue, SDValue> Tmp = TLI.makeLibCall(DAG, LC, RetVT,
4629                                                       Ops, CallOptions,
4630                                                       SDLoc(Node),
4631                                                       Node->getOperand(0));
4632     Results.push_back(Tmp.first);
4633     Results.push_back(Tmp.second);
4634     break;
4635   }
4636   case ISD::TRAP: {
4637     // If this operation is not supported, lower it to 'abort()' call
4638     TargetLowering::ArgListTy Args;
4639     TargetLowering::CallLoweringInfo CLI(DAG);
4640     CLI.setDebugLoc(dl)
4641         .setChain(Node->getOperand(0))
4642         .setLibCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),
4643                       DAG.getExternalSymbol(
4644                           "abort", TLI.getPointerTy(DAG.getDataLayout())),
4645                       std::move(Args));
4646     std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
4647 
4648     Results.push_back(CallResult.second);
4649     break;
4650   }
4651   case ISD::CLEAR_CACHE: {
4652     SDValue InputChain = Node->getOperand(0);
4653     SDValue StartVal = Node->getOperand(1);
4654     SDValue EndVal = Node->getOperand(2);
4655     std::pair<SDValue, SDValue> Tmp = TLI.makeLibCall(
4656         DAG, RTLIB::CLEAR_CACHE, MVT::isVoid, {StartVal, EndVal}, CallOptions,
4657         SDLoc(Node), InputChain);
4658     Results.push_back(Tmp.second);
4659     break;
4660   }
4661   case ISD::FMINNUM:
4662   case ISD::STRICT_FMINNUM:
4663     ExpandFPLibCall(Node, RTLIB::FMIN_F32, RTLIB::FMIN_F64,
4664                     RTLIB::FMIN_F80, RTLIB::FMIN_F128,
4665                     RTLIB::FMIN_PPCF128, Results);
4666     break;
4667   // FIXME: We do not have libcalls for FMAXIMUM and FMINIMUM. So, we cannot use
4668   // libcall legalization for these nodes, but there is no default expasion for
4669   // these nodes either (see PR63267 for example).
4670   case ISD::FMAXNUM:
4671   case ISD::STRICT_FMAXNUM:
4672     ExpandFPLibCall(Node, RTLIB::FMAX_F32, RTLIB::FMAX_F64,
4673                     RTLIB::FMAX_F80, RTLIB::FMAX_F128,
4674                     RTLIB::FMAX_PPCF128, Results);
4675     break;
4676   case ISD::FMINIMUMNUM:
4677     ExpandFPLibCall(Node, RTLIB::FMINIMUM_NUM_F32, RTLIB::FMINIMUM_NUM_F64,
4678                     RTLIB::FMINIMUM_NUM_F80, RTLIB::FMINIMUM_NUM_F128,
4679                     RTLIB::FMINIMUM_NUM_PPCF128, Results);
4680     break;
4681   case ISD::FMAXIMUMNUM:
4682     ExpandFPLibCall(Node, RTLIB::FMAXIMUM_NUM_F32, RTLIB::FMAXIMUM_NUM_F64,
4683                     RTLIB::FMAXIMUM_NUM_F80, RTLIB::FMAXIMUM_NUM_F128,
4684                     RTLIB::FMAXIMUM_NUM_PPCF128, Results);
4685     break;
4686   case ISD::FSQRT:
4687   case ISD::STRICT_FSQRT: {
4688     // FIXME: Probably should define fast to respect nan/inf and only be
4689     // approximate functions.
4690     ExpandFastFPLibCall(Node, canUseFastMathLibcall(Node),
4691                         {RTLIB::FAST_SQRT_F32, RTLIB::SQRT_F32},
4692                         {RTLIB::FAST_SQRT_F64, RTLIB::SQRT_F64},
4693                         {RTLIB::FAST_SQRT_F80, RTLIB::SQRT_F80},
4694                         {RTLIB::FAST_SQRT_F128, RTLIB::SQRT_F128},
4695                         {RTLIB::FAST_SQRT_PPCF128, RTLIB::SQRT_PPCF128},
4696                         Results);
4697     break;
4698   }
4699   case ISD::FCBRT:
4700     ExpandFPLibCall(Node, RTLIB::CBRT_F32, RTLIB::CBRT_F64,
4701                     RTLIB::CBRT_F80, RTLIB::CBRT_F128,
4702                     RTLIB::CBRT_PPCF128, Results);
4703     break;
4704   case ISD::FSIN:
4705   case ISD::STRICT_FSIN:
4706     ExpandFPLibCall(Node, RTLIB::SIN_F32, RTLIB::SIN_F64,
4707                     RTLIB::SIN_F80, RTLIB::SIN_F128,
4708                     RTLIB::SIN_PPCF128, Results);
4709     break;
4710   case ISD::FCOS:
4711   case ISD::STRICT_FCOS:
4712     ExpandFPLibCall(Node, RTLIB::COS_F32, RTLIB::COS_F64,
4713                     RTLIB::COS_F80, RTLIB::COS_F128,
4714                     RTLIB::COS_PPCF128, Results);
4715     break;
4716   case ISD::FTAN:
4717   case ISD::STRICT_FTAN:
4718     ExpandFPLibCall(Node, RTLIB::TAN_F32, RTLIB::TAN_F64, RTLIB::TAN_F80,
4719                     RTLIB::TAN_F128, RTLIB::TAN_PPCF128, Results);
4720     break;
4721   case ISD::FASIN:
4722   case ISD::STRICT_FASIN:
4723     ExpandFPLibCall(Node, RTLIB::ASIN_F32, RTLIB::ASIN_F64, RTLIB::ASIN_F80,
4724                     RTLIB::ASIN_F128, RTLIB::ASIN_PPCF128, Results);
4725     break;
4726   case ISD::FACOS:
4727   case ISD::STRICT_FACOS:
4728     ExpandFPLibCall(Node, RTLIB::ACOS_F32, RTLIB::ACOS_F64, RTLIB::ACOS_F80,
4729                     RTLIB::ACOS_F128, RTLIB::ACOS_PPCF128, Results);
4730     break;
4731   case ISD::FATAN:
4732   case ISD::STRICT_FATAN:
4733     ExpandFPLibCall(Node, RTLIB::ATAN_F32, RTLIB::ATAN_F64, RTLIB::ATAN_F80,
4734                     RTLIB::ATAN_F128, RTLIB::ATAN_PPCF128, Results);
4735     break;
4736   case ISD::FATAN2:
4737   case ISD::STRICT_FATAN2:
4738     ExpandFPLibCall(Node, RTLIB::ATAN2_F32, RTLIB::ATAN2_F64, RTLIB::ATAN2_F80,
4739                     RTLIB::ATAN2_F128, RTLIB::ATAN2_PPCF128, Results);
4740     break;
4741   case ISD::FSINH:
4742   case ISD::STRICT_FSINH:
4743     ExpandFPLibCall(Node, RTLIB::SINH_F32, RTLIB::SINH_F64, RTLIB::SINH_F80,
4744                     RTLIB::SINH_F128, RTLIB::SINH_PPCF128, Results);
4745     break;
4746   case ISD::FCOSH:
4747   case ISD::STRICT_FCOSH:
4748     ExpandFPLibCall(Node, RTLIB::COSH_F32, RTLIB::COSH_F64, RTLIB::COSH_F80,
4749                     RTLIB::COSH_F128, RTLIB::COSH_PPCF128, Results);
4750     break;
4751   case ISD::FTANH:
4752   case ISD::STRICT_FTANH:
4753     ExpandFPLibCall(Node, RTLIB::TANH_F32, RTLIB::TANH_F64, RTLIB::TANH_F80,
4754                     RTLIB::TANH_F128, RTLIB::TANH_PPCF128, Results);
4755     break;
4756   case ISD::FSINCOS:
4757   case ISD::FSINCOSPI: {
4758     EVT VT = Node->getValueType(0);
4759     RTLIB::Libcall LC = Node->getOpcode() == ISD::FSINCOS
4760                             ? RTLIB::getSINCOS(VT)
4761                             : RTLIB::getSINCOSPI(VT);
4762     bool Expanded = DAG.expandMultipleResultFPLibCall(LC, Node, Results);
4763     if (!Expanded)
4764       llvm_unreachable("Expected scalar FSINCOS[PI] to expand to libcall!");
4765     break;
4766   }
4767   case ISD::FLOG:
4768   case ISD::STRICT_FLOG:
4769     ExpandFPLibCall(Node, RTLIB::LOG_F32, RTLIB::LOG_F64, RTLIB::LOG_F80,
4770                     RTLIB::LOG_F128, RTLIB::LOG_PPCF128, Results);
4771     break;
4772   case ISD::FLOG2:
4773   case ISD::STRICT_FLOG2:
4774     ExpandFPLibCall(Node, RTLIB::LOG2_F32, RTLIB::LOG2_F64, RTLIB::LOG2_F80,
4775                     RTLIB::LOG2_F128, RTLIB::LOG2_PPCF128, Results);
4776     break;
4777   case ISD::FLOG10:
4778   case ISD::STRICT_FLOG10:
4779     ExpandFPLibCall(Node, RTLIB::LOG10_F32, RTLIB::LOG10_F64, RTLIB::LOG10_F80,
4780                     RTLIB::LOG10_F128, RTLIB::LOG10_PPCF128, Results);
4781     break;
4782   case ISD::FEXP:
4783   case ISD::STRICT_FEXP:
4784     ExpandFPLibCall(Node, RTLIB::EXP_F32, RTLIB::EXP_F64, RTLIB::EXP_F80,
4785                     RTLIB::EXP_F128, RTLIB::EXP_PPCF128, Results);
4786     break;
4787   case ISD::FEXP2:
4788   case ISD::STRICT_FEXP2:
4789     ExpandFPLibCall(Node, RTLIB::EXP2_F32, RTLIB::EXP2_F64, RTLIB::EXP2_F80,
4790                     RTLIB::EXP2_F128, RTLIB::EXP2_PPCF128, Results);
4791     break;
4792   case ISD::FEXP10:
4793     ExpandFPLibCall(Node, RTLIB::EXP10_F32, RTLIB::EXP10_F64, RTLIB::EXP10_F80,
4794                     RTLIB::EXP10_F128, RTLIB::EXP10_PPCF128, Results);
4795     break;
4796   case ISD::FTRUNC:
4797   case ISD::STRICT_FTRUNC:
4798     ExpandFPLibCall(Node, RTLIB::TRUNC_F32, RTLIB::TRUNC_F64,
4799                     RTLIB::TRUNC_F80, RTLIB::TRUNC_F128,
4800                     RTLIB::TRUNC_PPCF128, Results);
4801     break;
4802   case ISD::FFLOOR:
4803   case ISD::STRICT_FFLOOR:
4804     ExpandFPLibCall(Node, RTLIB::FLOOR_F32, RTLIB::FLOOR_F64,
4805                     RTLIB::FLOOR_F80, RTLIB::FLOOR_F128,
4806                     RTLIB::FLOOR_PPCF128, Results);
4807     break;
4808   case ISD::FCEIL:
4809   case ISD::STRICT_FCEIL:
4810     ExpandFPLibCall(Node, RTLIB::CEIL_F32, RTLIB::CEIL_F64,
4811                     RTLIB::CEIL_F80, RTLIB::CEIL_F128,
4812                     RTLIB::CEIL_PPCF128, Results);
4813     break;
4814   case ISD::FRINT:
4815   case ISD::STRICT_FRINT:
4816     ExpandFPLibCall(Node, RTLIB::RINT_F32, RTLIB::RINT_F64,
4817                     RTLIB::RINT_F80, RTLIB::RINT_F128,
4818                     RTLIB::RINT_PPCF128, Results);
4819     break;
4820   case ISD::FNEARBYINT:
4821   case ISD::STRICT_FNEARBYINT:
4822     ExpandFPLibCall(Node, RTLIB::NEARBYINT_F32,
4823                     RTLIB::NEARBYINT_F64,
4824                     RTLIB::NEARBYINT_F80,
4825                     RTLIB::NEARBYINT_F128,
4826                     RTLIB::NEARBYINT_PPCF128, Results);
4827     break;
4828   case ISD::FROUND:
4829   case ISD::STRICT_FROUND:
4830     ExpandFPLibCall(Node, RTLIB::ROUND_F32,
4831                     RTLIB::ROUND_F64,
4832                     RTLIB::ROUND_F80,
4833                     RTLIB::ROUND_F128,
4834                     RTLIB::ROUND_PPCF128, Results);
4835     break;
4836   case ISD::FROUNDEVEN:
4837   case ISD::STRICT_FROUNDEVEN:
4838     ExpandFPLibCall(Node, RTLIB::ROUNDEVEN_F32,
4839                     RTLIB::ROUNDEVEN_F64,
4840                     RTLIB::ROUNDEVEN_F80,
4841                     RTLIB::ROUNDEVEN_F128,
4842                     RTLIB::ROUNDEVEN_PPCF128, Results);
4843     break;
4844   case ISD::FLDEXP:
4845   case ISD::STRICT_FLDEXP:
4846     ExpandFPLibCall(Node, RTLIB::LDEXP_F32, RTLIB::LDEXP_F64, RTLIB::LDEXP_F80,
4847                     RTLIB::LDEXP_F128, RTLIB::LDEXP_PPCF128, Results);
4848     break;
4849   case ISD::FMODF:
4850   case ISD::FFREXP: {
4851     EVT VT = Node->getValueType(0);
4852     RTLIB::Libcall LC = Node->getOpcode() == ISD::FMODF ? RTLIB::getMODF(VT)
4853                                                         : RTLIB::getFREXP(VT);
4854     bool Expanded = DAG.expandMultipleResultFPLibCall(LC, Node, Results,
4855                                                       /*CallRetResNo=*/0);
4856     if (!Expanded)
4857       llvm_unreachable("Expected scalar FFREXP/FMODF to expand to libcall!");
4858     break;
4859   }
4860   case ISD::FPOWI:
4861   case ISD::STRICT_FPOWI: {
4862     RTLIB::Libcall LC = RTLIB::getPOWI(Node->getSimpleValueType(0));
4863     assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected fpowi.");
4864     if (!TLI.getLibcallName(LC)) {
4865       // Some targets don't have a powi libcall; use pow instead.
4866       if (Node->isStrictFPOpcode()) {
4867         SDValue Exponent =
4868             DAG.getNode(ISD::STRICT_SINT_TO_FP, SDLoc(Node),
4869                         {Node->getValueType(0), Node->getValueType(1)},
4870                         {Node->getOperand(0), Node->getOperand(2)});
4871         SDValue FPOW =
4872             DAG.getNode(ISD::STRICT_FPOW, SDLoc(Node),
4873                         {Node->getValueType(0), Node->getValueType(1)},
4874                         {Exponent.getValue(1), Node->getOperand(1), Exponent});
4875         Results.push_back(FPOW);
4876         Results.push_back(FPOW.getValue(1));
4877       } else {
4878         SDValue Exponent =
4879             DAG.getNode(ISD::SINT_TO_FP, SDLoc(Node), Node->getValueType(0),
4880                         Node->getOperand(1));
4881         Results.push_back(DAG.getNode(ISD::FPOW, SDLoc(Node),
4882                                       Node->getValueType(0),
4883                                       Node->getOperand(0), Exponent));
4884       }
4885       break;
4886     }
4887     unsigned Offset = Node->isStrictFPOpcode() ? 1 : 0;
4888     bool ExponentHasSizeOfInt =
4889         DAG.getLibInfo().getIntSize() ==
4890         Node->getOperand(1 + Offset).getValueType().getSizeInBits();
4891     if (!ExponentHasSizeOfInt) {
4892       // If the exponent does not match with sizeof(int) a libcall to
4893       // RTLIB::POWI would use the wrong type for the argument.
4894       DAG.getContext()->emitError("POWI exponent does not match sizeof(int)");
4895       Results.push_back(DAG.getUNDEF(Node->getValueType(0)));
4896       break;
4897     }
4898     ExpandFPLibCall(Node, LC, Results);
4899     break;
4900   }
4901   case ISD::FPOW:
4902   case ISD::STRICT_FPOW:
4903     ExpandFPLibCall(Node, RTLIB::POW_F32, RTLIB::POW_F64, RTLIB::POW_F80,
4904                     RTLIB::POW_F128, RTLIB::POW_PPCF128, Results);
4905     break;
4906   case ISD::LROUND:
4907   case ISD::STRICT_LROUND:
4908     ExpandArgFPLibCall(Node, RTLIB::LROUND_F32,
4909                        RTLIB::LROUND_F64, RTLIB::LROUND_F80,
4910                        RTLIB::LROUND_F128,
4911                        RTLIB::LROUND_PPCF128, Results);
4912     break;
4913   case ISD::LLROUND:
4914   case ISD::STRICT_LLROUND:
4915     ExpandArgFPLibCall(Node, RTLIB::LLROUND_F32,
4916                        RTLIB::LLROUND_F64, RTLIB::LLROUND_F80,
4917                        RTLIB::LLROUND_F128,
4918                        RTLIB::LLROUND_PPCF128, Results);
4919     break;
4920   case ISD::LRINT:
4921   case ISD::STRICT_LRINT:
4922     ExpandArgFPLibCall(Node, RTLIB::LRINT_F32,
4923                        RTLIB::LRINT_F64, RTLIB::LRINT_F80,
4924                        RTLIB::LRINT_F128,
4925                        RTLIB::LRINT_PPCF128, Results);
4926     break;
4927   case ISD::LLRINT:
4928   case ISD::STRICT_LLRINT:
4929     ExpandArgFPLibCall(Node, RTLIB::LLRINT_F32,
4930                        RTLIB::LLRINT_F64, RTLIB::LLRINT_F80,
4931                        RTLIB::LLRINT_F128,
4932                        RTLIB::LLRINT_PPCF128, Results);
4933     break;
4934   case ISD::FDIV:
4935   case ISD::STRICT_FDIV: {
4936     ExpandFastFPLibCall(Node, canUseFastMathLibcall(Node),
4937                         {RTLIB::FAST_DIV_F32, RTLIB::DIV_F32},
4938                         {RTLIB::FAST_DIV_F64, RTLIB::DIV_F64},
4939                         {RTLIB::FAST_DIV_F80, RTLIB::DIV_F80},
4940                         {RTLIB::FAST_DIV_F128, RTLIB::DIV_F128},
4941                         {RTLIB::FAST_DIV_PPCF128, RTLIB::DIV_PPCF128}, Results);
4942     break;
4943   }
4944   case ISD::FREM:
4945   case ISD::STRICT_FREM:
4946     ExpandFPLibCall(Node, RTLIB::REM_F32, RTLIB::REM_F64,
4947                     RTLIB::REM_F80, RTLIB::REM_F128,
4948                     RTLIB::REM_PPCF128, Results);
4949     break;
4950   case ISD::FMA:
4951   case ISD::STRICT_FMA:
4952     ExpandFPLibCall(Node, RTLIB::FMA_F32, RTLIB::FMA_F64,
4953                     RTLIB::FMA_F80, RTLIB::FMA_F128,
4954                     RTLIB::FMA_PPCF128, Results);
4955     break;
4956   case ISD::FADD:
4957   case ISD::STRICT_FADD: {
4958     ExpandFastFPLibCall(Node, canUseFastMathLibcall(Node),
4959                         {RTLIB::FAST_ADD_F32, RTLIB::ADD_F32},
4960                         {RTLIB::FAST_ADD_F64, RTLIB::ADD_F64},
4961                         {RTLIB::FAST_ADD_F80, RTLIB::ADD_F80},
4962                         {RTLIB::FAST_ADD_F128, RTLIB::ADD_F128},
4963                         {RTLIB::FAST_ADD_PPCF128, RTLIB::ADD_PPCF128}, Results);
4964     break;
4965   }
4966   case ISD::FMUL:
4967   case ISD::STRICT_FMUL: {
4968     ExpandFastFPLibCall(Node, canUseFastMathLibcall(Node),
4969                         {RTLIB::FAST_MUL_F32, RTLIB::MUL_F32},
4970                         {RTLIB::FAST_MUL_F64, RTLIB::MUL_F64},
4971                         {RTLIB::FAST_MUL_F80, RTLIB::MUL_F80},
4972                         {RTLIB::FAST_MUL_F128, RTLIB::MUL_F128},
4973                         {RTLIB::FAST_MUL_PPCF128, RTLIB::MUL_PPCF128}, Results);
4974     break;
4975   }
4976   case ISD::FP16_TO_FP:
4977     if (Node->getValueType(0) == MVT::f32) {
4978       Results.push_back(ExpandLibCall(RTLIB::FPEXT_F16_F32, Node, false).first);
4979     }
4980     break;
4981   case ISD::STRICT_BF16_TO_FP:
4982     if (Node->getValueType(0) == MVT::f32) {
4983       std::pair<SDValue, SDValue> Tmp = TLI.makeLibCall(
4984           DAG, RTLIB::FPEXT_BF16_F32, MVT::f32, Node->getOperand(1),
4985           CallOptions, SDLoc(Node), Node->getOperand(0));
4986       Results.push_back(Tmp.first);
4987       Results.push_back(Tmp.second);
4988     }
4989     break;
4990   case ISD::STRICT_FP16_TO_FP: {
4991     if (Node->getValueType(0) == MVT::f32) {
4992       std::pair<SDValue, SDValue> Tmp = TLI.makeLibCall(
4993           DAG, RTLIB::FPEXT_F16_F32, MVT::f32, Node->getOperand(1), CallOptions,
4994           SDLoc(Node), Node->getOperand(0));
4995       Results.push_back(Tmp.first);
4996       Results.push_back(Tmp.second);
4997     }
4998     break;
4999   }
5000   case ISD::FP_TO_FP16: {
5001     RTLIB::Libcall LC =
5002         RTLIB::getFPROUND(Node->getOperand(0).getValueType(), MVT::f16);
5003     assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unable to expand fp_to_fp16");
5004     Results.push_back(ExpandLibCall(LC, Node, false).first);
5005     break;
5006   }
5007   case ISD::FP_TO_BF16: {
5008     RTLIB::Libcall LC =
5009         RTLIB::getFPROUND(Node->getOperand(0).getValueType(), MVT::bf16);
5010     assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unable to expand fp_to_bf16");
5011     Results.push_back(ExpandLibCall(LC, Node, false).first);
5012     break;
5013   }
5014   case ISD::STRICT_SINT_TO_FP:
5015   case ISD::STRICT_UINT_TO_FP:
5016   case ISD::SINT_TO_FP:
5017   case ISD::UINT_TO_FP: {
5018     // TODO - Common the code with DAGTypeLegalizer::SoftenFloatRes_XINT_TO_FP
5019     bool IsStrict = Node->isStrictFPOpcode();
5020     bool Signed = Node->getOpcode() == ISD::SINT_TO_FP ||
5021                   Node->getOpcode() == ISD::STRICT_SINT_TO_FP;
5022     EVT SVT = Node->getOperand(IsStrict ? 1 : 0).getValueType();
5023     EVT RVT = Node->getValueType(0);
5024     EVT NVT = EVT();
5025     SDLoc dl(Node);
5026 
5027     // Even if the input is legal, no libcall may exactly match, eg. we don't
5028     // have i1 -> fp conversions. So, it needs to be promoted to a larger type,
5029     // eg: i13 -> fp. Then, look for an appropriate libcall.
5030     RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
5031     for (unsigned t = MVT::FIRST_INTEGER_VALUETYPE;
5032          t <= MVT::LAST_INTEGER_VALUETYPE && LC == RTLIB::UNKNOWN_LIBCALL;
5033          ++t) {
5034       NVT = (MVT::SimpleValueType)t;
5035       // The source needs to big enough to hold the operand.
5036       if (NVT.bitsGE(SVT))
5037         LC = Signed ? RTLIB::getSINTTOFP(NVT, RVT)
5038                     : RTLIB::getUINTTOFP(NVT, RVT);
5039     }
5040     assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unable to legalize as libcall");
5041 
5042     SDValue Chain = IsStrict ? Node->getOperand(0) : SDValue();
5043     // Sign/zero extend the argument if the libcall takes a larger type.
5044     SDValue Op = DAG.getNode(Signed ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND, dl,
5045                              NVT, Node->getOperand(IsStrict ? 1 : 0));
5046     CallOptions.setIsSigned(Signed);
5047     std::pair<SDValue, SDValue> Tmp =
5048         TLI.makeLibCall(DAG, LC, RVT, Op, CallOptions, dl, Chain);
5049     Results.push_back(Tmp.first);
5050     if (IsStrict)
5051       Results.push_back(Tmp.second);
5052     break;
5053   }
5054   case ISD::FP_TO_SINT:
5055   case ISD::FP_TO_UINT:
5056   case ISD::STRICT_FP_TO_SINT:
5057   case ISD::STRICT_FP_TO_UINT: {
5058     // TODO - Common the code with DAGTypeLegalizer::SoftenFloatOp_FP_TO_XINT.
5059     bool IsStrict = Node->isStrictFPOpcode();
5060     bool Signed = Node->getOpcode() == ISD::FP_TO_SINT ||
5061                   Node->getOpcode() == ISD::STRICT_FP_TO_SINT;
5062 
5063     SDValue Op = Node->getOperand(IsStrict ? 1 : 0);
5064     EVT SVT = Op.getValueType();
5065     EVT RVT = Node->getValueType(0);
5066     EVT NVT = EVT();
5067     SDLoc dl(Node);
5068 
5069     // Even if the result is legal, no libcall may exactly match, eg. we don't
5070     // have fp -> i1 conversions. So, it needs to be promoted to a larger type,
5071     // eg: fp -> i32. Then, look for an appropriate libcall.
5072     RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
5073     for (unsigned IntVT = MVT::FIRST_INTEGER_VALUETYPE;
5074          IntVT <= MVT::LAST_INTEGER_VALUETYPE && LC == RTLIB::UNKNOWN_LIBCALL;
5075          ++IntVT) {
5076       NVT = (MVT::SimpleValueType)IntVT;
5077       // The type needs to big enough to hold the result.
5078       if (NVT.bitsGE(RVT))
5079         LC = Signed ? RTLIB::getFPTOSINT(SVT, NVT)
5080                     : RTLIB::getFPTOUINT(SVT, NVT);
5081     }
5082     assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unable to legalize as libcall");
5083 
5084     SDValue Chain = IsStrict ? Node->getOperand(0) : SDValue();
5085     std::pair<SDValue, SDValue> Tmp =
5086         TLI.makeLibCall(DAG, LC, NVT, Op, CallOptions, dl, Chain);
5087 
5088     // Truncate the result if the libcall returns a larger type.
5089     Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, RVT, Tmp.first));
5090     if (IsStrict)
5091       Results.push_back(Tmp.second);
5092     break;
5093   }
5094 
5095   case ISD::FP_ROUND:
5096   case ISD::STRICT_FP_ROUND: {
5097     // X = FP_ROUND(Y, TRUNC)
5098     // TRUNC is a flag, which is always an integer that is zero or one.
5099     // If TRUNC is 0, this is a normal rounding, if it is 1, this FP_ROUND
5100     // is known to not change the value of Y.
5101     // We can only expand it into libcall if the TRUNC is 0.
5102     bool IsStrict = Node->isStrictFPOpcode();
5103     SDValue Op = Node->getOperand(IsStrict ? 1 : 0);
5104     SDValue Chain = IsStrict ? Node->getOperand(0) : SDValue();
5105     EVT VT = Node->getValueType(0);
5106     assert(cast<ConstantSDNode>(Node->getOperand(IsStrict ? 2 : 1))->isZero() &&
5107            "Unable to expand as libcall if it is not normal rounding");
5108 
5109     RTLIB::Libcall LC = RTLIB::getFPROUND(Op.getValueType(), VT);
5110     assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unable to legalize as libcall");
5111 
5112     std::pair<SDValue, SDValue> Tmp =
5113         TLI.makeLibCall(DAG, LC, VT, Op, CallOptions, SDLoc(Node), Chain);
5114     Results.push_back(Tmp.first);
5115     if (IsStrict)
5116       Results.push_back(Tmp.second);
5117     break;
5118   }
5119   case ISD::FP_EXTEND: {
5120     Results.push_back(
5121         ExpandLibCall(RTLIB::getFPEXT(Node->getOperand(0).getValueType(),
5122                                       Node->getValueType(0)),
5123                       Node, false).first);
5124     break;
5125   }
5126   case ISD::STRICT_FP_EXTEND:
5127   case ISD::STRICT_FP_TO_FP16:
5128   case ISD::STRICT_FP_TO_BF16: {
5129     RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
5130     if (Node->getOpcode() == ISD::STRICT_FP_TO_FP16)
5131       LC = RTLIB::getFPROUND(Node->getOperand(1).getValueType(), MVT::f16);
5132     else if (Node->getOpcode() == ISD::STRICT_FP_TO_BF16)
5133       LC = RTLIB::getFPROUND(Node->getOperand(1).getValueType(), MVT::bf16);
5134     else
5135       LC = RTLIB::getFPEXT(Node->getOperand(1).getValueType(),
5136                            Node->getValueType(0));
5137 
5138     assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unable to legalize as libcall");
5139 
5140     std::pair<SDValue, SDValue> Tmp =
5141         TLI.makeLibCall(DAG, LC, Node->getValueType(0), Node->getOperand(1),
5142                         CallOptions, SDLoc(Node), Node->getOperand(0));
5143     Results.push_back(Tmp.first);
5144     Results.push_back(Tmp.second);
5145     break;
5146   }
5147   case ISD::FSUB:
5148   case ISD::STRICT_FSUB: {
5149     ExpandFastFPLibCall(Node, canUseFastMathLibcall(Node),
5150                         {RTLIB::FAST_SUB_F32, RTLIB::SUB_F32},
5151                         {RTLIB::FAST_SUB_F64, RTLIB::SUB_F64},
5152                         {RTLIB::FAST_SUB_F80, RTLIB::SUB_F80},
5153                         {RTLIB::FAST_SUB_F128, RTLIB::SUB_F128},
5154                         {RTLIB::FAST_SUB_PPCF128, RTLIB::SUB_PPCF128}, Results);
5155     break;
5156   }
5157   case ISD::SREM:
5158     Results.push_back(ExpandIntLibCall(Node, true,
5159                                        RTLIB::SREM_I8,
5160                                        RTLIB::SREM_I16, RTLIB::SREM_I32,
5161                                        RTLIB::SREM_I64, RTLIB::SREM_I128));
5162     break;
5163   case ISD::UREM:
5164     Results.push_back(ExpandIntLibCall(Node, false,
5165                                        RTLIB::UREM_I8,
5166                                        RTLIB::UREM_I16, RTLIB::UREM_I32,
5167                                        RTLIB::UREM_I64, RTLIB::UREM_I128));
5168     break;
5169   case ISD::SDIV:
5170     Results.push_back(ExpandIntLibCall(Node, true,
5171                                        RTLIB::SDIV_I8,
5172                                        RTLIB::SDIV_I16, RTLIB::SDIV_I32,
5173                                        RTLIB::SDIV_I64, RTLIB::SDIV_I128));
5174     break;
5175   case ISD::UDIV:
5176     Results.push_back(ExpandIntLibCall(Node, false,
5177                                        RTLIB::UDIV_I8,
5178                                        RTLIB::UDIV_I16, RTLIB::UDIV_I32,
5179                                        RTLIB::UDIV_I64, RTLIB::UDIV_I128));
5180     break;
5181   case ISD::SDIVREM:
5182   case ISD::UDIVREM:
5183     // Expand into divrem libcall
5184     ExpandDivRemLibCall(Node, Results);
5185     break;
5186   case ISD::MUL:
5187     Results.push_back(ExpandIntLibCall(Node, false,
5188                                        RTLIB::MUL_I8,
5189                                        RTLIB::MUL_I16, RTLIB::MUL_I32,
5190                                        RTLIB::MUL_I64, RTLIB::MUL_I128));
5191     break;
5192   case ISD::CTLZ_ZERO_UNDEF:
5193     Results.push_back(ExpandBitCountingLibCall(
5194         Node, RTLIB::CTLZ_I32, RTLIB::CTLZ_I64, RTLIB::CTLZ_I128));
5195     break;
5196   case ISD::CTPOP:
5197     Results.push_back(ExpandBitCountingLibCall(
5198         Node, RTLIB::CTPOP_I32, RTLIB::CTPOP_I64, RTLIB::CTPOP_I128));
5199     break;
5200   case ISD::RESET_FPENV: {
5201     // It is legalized to call 'fesetenv(FE_DFL_ENV)'. On most targets
5202     // FE_DFL_ENV is defined as '((const fenv_t *) -1)' in glibc.
5203     EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout());
5204     SDValue Ptr = DAG.getAllOnesConstant(dl, PtrTy);
5205     SDValue Chain = Node->getOperand(0);
5206     Results.push_back(
5207         DAG.makeStateFunctionCall(RTLIB::FESETENV, Ptr, Chain, dl));
5208     break;
5209   }
5210   case ISD::GET_FPENV_MEM: {
5211     SDValue Chain = Node->getOperand(0);
5212     SDValue EnvPtr = Node->getOperand(1);
5213     Results.push_back(
5214         DAG.makeStateFunctionCall(RTLIB::FEGETENV, EnvPtr, Chain, dl));
5215     break;
5216   }
5217   case ISD::SET_FPENV_MEM: {
5218     SDValue Chain = Node->getOperand(0);
5219     SDValue EnvPtr = Node->getOperand(1);
5220     Results.push_back(
5221         DAG.makeStateFunctionCall(RTLIB::FESETENV, EnvPtr, Chain, dl));
5222     break;
5223   }
5224   case ISD::GET_FPMODE: {
5225     // Call fegetmode, which saves control modes into a stack slot. Then load
5226     // the value to return from the stack.
5227     EVT ModeVT = Node->getValueType(0);
5228     SDValue StackPtr = DAG.CreateStackTemporary(ModeVT);
5229     int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
5230     SDValue Chain = DAG.makeStateFunctionCall(RTLIB::FEGETMODE, StackPtr,
5231                                               Node->getOperand(0), dl);
5232     SDValue LdInst = DAG.getLoad(
5233         ModeVT, dl, Chain, StackPtr,
5234         MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI));
5235     Results.push_back(LdInst);
5236     Results.push_back(LdInst.getValue(1));
5237     break;
5238   }
5239   case ISD::SET_FPMODE: {
5240     // Move control modes to stack slot and then call fesetmode with the pointer
5241     // to the slot as argument.
5242     SDValue Mode = Node->getOperand(1);
5243     EVT ModeVT = Mode.getValueType();
5244     SDValue StackPtr = DAG.CreateStackTemporary(ModeVT);
5245     int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
5246     SDValue StInst = DAG.getStore(
5247         Node->getOperand(0), dl, Mode, StackPtr,
5248         MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI));
5249     Results.push_back(
5250         DAG.makeStateFunctionCall(RTLIB::FESETMODE, StackPtr, StInst, dl));
5251     break;
5252   }
5253   case ISD::RESET_FPMODE: {
5254     // It is legalized to a call 'fesetmode(FE_DFL_MODE)'. On most targets
5255     // FE_DFL_MODE is defined as '((const femode_t *) -1)' in glibc. If not, the
5256     // target must provide custom lowering.
5257     const DataLayout &DL = DAG.getDataLayout();
5258     EVT PtrTy = TLI.getPointerTy(DL);
5259     SDValue Mode = DAG.getAllOnesConstant(dl, PtrTy);
5260     Results.push_back(DAG.makeStateFunctionCall(RTLIB::FESETMODE, Mode,
5261                                                 Node->getOperand(0), dl));
5262     break;
5263   }
5264   }
5265 
5266   // Replace the original node with the legalized result.
5267   if (!Results.empty()) {
5268     LLVM_DEBUG(dbgs() << "Successfully converted node to libcall\n");
5269     ReplaceNode(Node, Results.data());
5270   } else
5271     LLVM_DEBUG(dbgs() << "Could not convert node to libcall\n");
5272 }
5273 
5274 // Determine the vector type to use in place of an original scalar element when
5275 // promoting equally sized vectors.
getPromotedVectorElementType(const TargetLowering & TLI,MVT EltVT,MVT NewEltVT)5276 static MVT getPromotedVectorElementType(const TargetLowering &TLI,
5277                                         MVT EltVT, MVT NewEltVT) {
5278   unsigned OldEltsPerNewElt = EltVT.getSizeInBits() / NewEltVT.getSizeInBits();
5279   MVT MidVT = OldEltsPerNewElt == 1
5280                   ? NewEltVT
5281                   : MVT::getVectorVT(NewEltVT, OldEltsPerNewElt);
5282   assert(TLI.isTypeLegal(MidVT) && "unexpected");
5283   return MidVT;
5284 }
5285 
PromoteNode(SDNode * Node)5286 void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
5287   LLVM_DEBUG(dbgs() << "Trying to promote node\n");
5288   SmallVector<SDValue, 8> Results;
5289   MVT OVT = Node->getSimpleValueType(0);
5290   if (Node->getOpcode() == ISD::UINT_TO_FP ||
5291       Node->getOpcode() == ISD::SINT_TO_FP ||
5292       Node->getOpcode() == ISD::SETCC ||
5293       Node->getOpcode() == ISD::EXTRACT_VECTOR_ELT ||
5294       Node->getOpcode() == ISD::INSERT_VECTOR_ELT ||
5295       Node->getOpcode() == ISD::VECREDUCE_FMAX ||
5296       Node->getOpcode() == ISD::VECREDUCE_FMIN ||
5297       Node->getOpcode() == ISD::VECREDUCE_FMAXIMUM ||
5298       Node->getOpcode() == ISD::VECREDUCE_FMINIMUM) {
5299     OVT = Node->getOperand(0).getSimpleValueType();
5300   }
5301   if (Node->getOpcode() == ISD::ATOMIC_STORE ||
5302       Node->getOpcode() == ISD::STRICT_UINT_TO_FP ||
5303       Node->getOpcode() == ISD::STRICT_SINT_TO_FP ||
5304       Node->getOpcode() == ISD::STRICT_FSETCC ||
5305       Node->getOpcode() == ISD::STRICT_FSETCCS ||
5306       Node->getOpcode() == ISD::VP_REDUCE_FADD ||
5307       Node->getOpcode() == ISD::VP_REDUCE_FMUL ||
5308       Node->getOpcode() == ISD::VP_REDUCE_FMAX ||
5309       Node->getOpcode() == ISD::VP_REDUCE_FMIN ||
5310       Node->getOpcode() == ISD::VP_REDUCE_FMAXIMUM ||
5311       Node->getOpcode() == ISD::VP_REDUCE_FMINIMUM ||
5312       Node->getOpcode() == ISD::VP_REDUCE_SEQ_FADD)
5313     OVT = Node->getOperand(1).getSimpleValueType();
5314   if (Node->getOpcode() == ISD::BR_CC ||
5315       Node->getOpcode() == ISD::SELECT_CC)
5316     OVT = Node->getOperand(2).getSimpleValueType();
5317   // Preserve fast math flags
5318   SDNodeFlags FastMathFlags = Node->getFlags() & SDNodeFlags::FastMathFlags;
5319   SelectionDAG::FlagInserter FlagsInserter(DAG, FastMathFlags);
5320   MVT NVT = TLI.getTypeToPromoteTo(Node->getOpcode(), OVT);
5321   SDLoc dl(Node);
5322   SDValue Tmp1, Tmp2, Tmp3, Tmp4;
5323   switch (Node->getOpcode()) {
5324   case ISD::CTTZ:
5325   case ISD::CTTZ_ZERO_UNDEF:
5326   case ISD::CTLZ:
5327   case ISD::CTPOP: {
5328     // Zero extend the argument unless its cttz, then use any_extend.
5329     if (Node->getOpcode() == ISD::CTTZ ||
5330         Node->getOpcode() == ISD::CTTZ_ZERO_UNDEF)
5331       Tmp1 = DAG.getNode(ISD::ANY_EXTEND, dl, NVT, Node->getOperand(0));
5332     else
5333       Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Node->getOperand(0));
5334 
5335     unsigned NewOpc = Node->getOpcode();
5336     if (NewOpc == ISD::CTTZ) {
5337       // The count is the same in the promoted type except if the original
5338       // value was zero.  This can be handled by setting the bit just off
5339       // the top of the original type.
5340       auto TopBit = APInt::getOneBitSet(NVT.getSizeInBits(),
5341                                         OVT.getSizeInBits());
5342       Tmp1 = DAG.getNode(ISD::OR, dl, NVT, Tmp1,
5343                          DAG.getConstant(TopBit, dl, NVT));
5344       NewOpc = ISD::CTTZ_ZERO_UNDEF;
5345     }
5346     // Perform the larger operation. For CTPOP and CTTZ_ZERO_UNDEF, this is
5347     // already the correct result.
5348     Tmp1 = DAG.getNode(NewOpc, dl, NVT, Tmp1);
5349     if (NewOpc == ISD::CTLZ) {
5350       // Tmp1 = Tmp1 - (sizeinbits(NVT) - sizeinbits(Old VT))
5351       Tmp1 = DAG.getNode(ISD::SUB, dl, NVT, Tmp1,
5352                           DAG.getConstant(NVT.getSizeInBits() -
5353                                           OVT.getSizeInBits(), dl, NVT));
5354     }
5355     Results.push_back(
5356         DAG.getNode(ISD::TRUNCATE, dl, OVT, Tmp1, SDNodeFlags::NoWrap));
5357     break;
5358   }
5359   case ISD::CTLZ_ZERO_UNDEF: {
5360     // We know that the argument is unlikely to be zero, hence we can take a
5361     // different approach as compared to ISD::CTLZ
5362 
5363     // Any Extend the argument
5364     auto AnyExtendedNode =
5365         DAG.getNode(ISD::ANY_EXTEND, dl, NVT, Node->getOperand(0));
5366 
5367     // Tmp1 = Tmp1 << (sizeinbits(NVT) - sizeinbits(Old VT))
5368     auto ShiftConstant = DAG.getShiftAmountConstant(
5369         NVT.getSizeInBits() - OVT.getSizeInBits(), NVT, dl);
5370     auto LeftShiftResult =
5371         DAG.getNode(ISD::SHL, dl, NVT, AnyExtendedNode, ShiftConstant);
5372 
5373     // Perform the larger operation
5374     auto CTLZResult = DAG.getNode(Node->getOpcode(), dl, NVT, LeftShiftResult);
5375     Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, OVT, CTLZResult));
5376     break;
5377   }
5378   case ISD::BITREVERSE:
5379   case ISD::BSWAP: {
5380     unsigned DiffBits = NVT.getSizeInBits() - OVT.getSizeInBits();
5381     Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Node->getOperand(0));
5382     Tmp1 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1);
5383     Tmp1 = DAG.getNode(
5384         ISD::SRL, dl, NVT, Tmp1,
5385         DAG.getConstant(DiffBits, dl,
5386                         TLI.getShiftAmountTy(NVT, DAG.getDataLayout())));
5387 
5388     Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, OVT, Tmp1));
5389     break;
5390   }
5391   case ISD::FP_TO_UINT:
5392   case ISD::STRICT_FP_TO_UINT:
5393   case ISD::FP_TO_SINT:
5394   case ISD::STRICT_FP_TO_SINT:
5395     PromoteLegalFP_TO_INT(Node, dl, Results);
5396     break;
5397   case ISD::FP_TO_UINT_SAT:
5398   case ISD::FP_TO_SINT_SAT:
5399     Results.push_back(PromoteLegalFP_TO_INT_SAT(Node, dl));
5400     break;
5401   case ISD::UINT_TO_FP:
5402   case ISD::STRICT_UINT_TO_FP:
5403   case ISD::SINT_TO_FP:
5404   case ISD::STRICT_SINT_TO_FP:
5405     PromoteLegalINT_TO_FP(Node, dl, Results);
5406     break;
5407   case ISD::VAARG: {
5408     SDValue Chain = Node->getOperand(0); // Get the chain.
5409     SDValue Ptr = Node->getOperand(1); // Get the pointer.
5410 
5411     unsigned TruncOp;
5412     if (OVT.isVector()) {
5413       TruncOp = ISD::BITCAST;
5414     } else {
5415       assert(OVT.isInteger()
5416         && "VAARG promotion is supported only for vectors or integer types");
5417       TruncOp = ISD::TRUNCATE;
5418     }
5419 
5420     // Perform the larger operation, then convert back
5421     Tmp1 = DAG.getVAArg(NVT, dl, Chain, Ptr, Node->getOperand(2),
5422              Node->getConstantOperandVal(3));
5423     Chain = Tmp1.getValue(1);
5424 
5425     Tmp2 = DAG.getNode(TruncOp, dl, OVT, Tmp1);
5426 
5427     // Modified the chain result - switch anything that used the old chain to
5428     // use the new one.
5429     DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 0), Tmp2);
5430     DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 1), Chain);
5431     if (UpdatedNodes) {
5432       UpdatedNodes->insert(Tmp2.getNode());
5433       UpdatedNodes->insert(Chain.getNode());
5434     }
5435     ReplacedNode(Node);
5436     break;
5437   }
5438   case ISD::MUL:
5439   case ISD::SDIV:
5440   case ISD::SREM:
5441   case ISD::UDIV:
5442   case ISD::UREM:
5443   case ISD::SMIN:
5444   case ISD::SMAX:
5445   case ISD::UMIN:
5446   case ISD::UMAX:
5447   case ISD::AND:
5448   case ISD::OR:
5449   case ISD::XOR: {
5450     unsigned ExtOp, TruncOp;
5451     if (OVT.isVector()) {
5452       ExtOp   = ISD::BITCAST;
5453       TruncOp = ISD::BITCAST;
5454     } else {
5455       assert(OVT.isInteger() && "Cannot promote logic operation");
5456 
5457       switch (Node->getOpcode()) {
5458       default:
5459         ExtOp = ISD::ANY_EXTEND;
5460         break;
5461       case ISD::SDIV:
5462       case ISD::SREM:
5463       case ISD::SMIN:
5464       case ISD::SMAX:
5465         ExtOp = ISD::SIGN_EXTEND;
5466         break;
5467       case ISD::UDIV:
5468       case ISD::UREM:
5469         ExtOp = ISD::ZERO_EXTEND;
5470         break;
5471       case ISD::UMIN:
5472       case ISD::UMAX:
5473         if (TLI.isSExtCheaperThanZExt(OVT, NVT))
5474           ExtOp = ISD::SIGN_EXTEND;
5475         else
5476           ExtOp = ISD::ZERO_EXTEND;
5477         break;
5478       }
5479       TruncOp = ISD::TRUNCATE;
5480     }
5481     // Promote each of the values to the new type.
5482     Tmp1 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(0));
5483     Tmp2 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(1));
5484     // Perform the larger operation, then convert back
5485     Tmp1 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2);
5486     Results.push_back(DAG.getNode(TruncOp, dl, OVT, Tmp1));
5487     break;
5488   }
5489   case ISD::UMUL_LOHI:
5490   case ISD::SMUL_LOHI: {
5491     // Promote to a multiply in a wider integer type.
5492     unsigned ExtOp = Node->getOpcode() == ISD::UMUL_LOHI ? ISD::ZERO_EXTEND
5493                                                          : ISD::SIGN_EXTEND;
5494     Tmp1 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(0));
5495     Tmp2 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(1));
5496     Tmp1 = DAG.getNode(ISD::MUL, dl, NVT, Tmp1, Tmp2);
5497 
5498     auto &DL = DAG.getDataLayout();
5499     unsigned OriginalSize = OVT.getScalarSizeInBits();
5500     Tmp2 = DAG.getNode(
5501         ISD::SRL, dl, NVT, Tmp1,
5502         DAG.getConstant(OriginalSize, dl, TLI.getScalarShiftAmountTy(DL, NVT)));
5503     Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, OVT, Tmp1));
5504     Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, OVT, Tmp2));
5505     break;
5506   }
5507   case ISD::SELECT: {
5508     unsigned ExtOp, TruncOp;
5509     if (Node->getValueType(0).isVector() ||
5510         Node->getValueType(0).getSizeInBits() == NVT.getSizeInBits()) {
5511       ExtOp   = ISD::BITCAST;
5512       TruncOp = ISD::BITCAST;
5513     } else if (Node->getValueType(0).isInteger()) {
5514       ExtOp   = ISD::ANY_EXTEND;
5515       TruncOp = ISD::TRUNCATE;
5516     } else {
5517       ExtOp   = ISD::FP_EXTEND;
5518       TruncOp = ISD::FP_ROUND;
5519     }
5520     Tmp1 = Node->getOperand(0);
5521     // Promote each of the values to the new type.
5522     Tmp2 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(1));
5523     Tmp3 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(2));
5524     // Perform the larger operation, then round down.
5525     Tmp1 = DAG.getSelect(dl, NVT, Tmp1, Tmp2, Tmp3);
5526     if (TruncOp != ISD::FP_ROUND)
5527       Tmp1 = DAG.getNode(TruncOp, dl, Node->getValueType(0), Tmp1);
5528     else
5529       Tmp1 = DAG.getNode(TruncOp, dl, Node->getValueType(0), Tmp1,
5530                          DAG.getIntPtrConstant(0, dl, /*isTarget=*/true));
5531     Results.push_back(Tmp1);
5532     break;
5533   }
5534   case ISD::VECTOR_SHUFFLE: {
5535     ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(Node)->getMask();
5536 
5537     // Cast the two input vectors.
5538     Tmp1 = DAG.getNode(ISD::BITCAST, dl, NVT, Node->getOperand(0));
5539     Tmp2 = DAG.getNode(ISD::BITCAST, dl, NVT, Node->getOperand(1));
5540 
5541     // Convert the shuffle mask to the right # elements.
5542     Tmp1 = ShuffleWithNarrowerEltType(NVT, OVT, dl, Tmp1, Tmp2, Mask);
5543     Tmp1 = DAG.getNode(ISD::BITCAST, dl, OVT, Tmp1);
5544     Results.push_back(Tmp1);
5545     break;
5546   }
5547   case ISD::VECTOR_SPLICE: {
5548     Tmp1 = DAG.getNode(ISD::ANY_EXTEND, dl, NVT, Node->getOperand(0));
5549     Tmp2 = DAG.getNode(ISD::ANY_EXTEND, dl, NVT, Node->getOperand(1));
5550     Tmp3 = DAG.getNode(ISD::VECTOR_SPLICE, dl, NVT, Tmp1, Tmp2,
5551                        Node->getOperand(2));
5552     Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, OVT, Tmp3));
5553     break;
5554   }
5555   case ISD::SELECT_CC: {
5556     SDValue Cond = Node->getOperand(4);
5557     ISD::CondCode CCCode = cast<CondCodeSDNode>(Cond)->get();
5558     // Type of the comparison operands.
5559     MVT CVT = Node->getSimpleValueType(0);
5560     assert(CVT == OVT && "not handled");
5561 
5562     unsigned ExtOp = ISD::FP_EXTEND;
5563     if (NVT.isInteger()) {
5564       ExtOp = isSignedIntSetCC(CCCode) ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
5565     }
5566 
5567     // Promote the comparison operands, if needed.
5568     if (TLI.isCondCodeLegal(CCCode, CVT)) {
5569       Tmp1 = Node->getOperand(0);
5570       Tmp2 = Node->getOperand(1);
5571     } else {
5572       Tmp1 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(0));
5573       Tmp2 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(1));
5574     }
5575     // Cast the true/false operands.
5576     Tmp3 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(2));
5577     Tmp4 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(3));
5578 
5579     Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, NVT, {Tmp1, Tmp2, Tmp3, Tmp4, Cond},
5580                        Node->getFlags());
5581 
5582     // Cast the result back to the original type.
5583     if (ExtOp != ISD::FP_EXTEND)
5584       Tmp1 = DAG.getNode(ISD::TRUNCATE, dl, OVT, Tmp1);
5585     else
5586       Tmp1 = DAG.getNode(ISD::FP_ROUND, dl, OVT, Tmp1,
5587                          DAG.getIntPtrConstant(0, dl, /*isTarget=*/true));
5588 
5589     Results.push_back(Tmp1);
5590     break;
5591   }
5592   case ISD::SETCC:
5593   case ISD::STRICT_FSETCC:
5594   case ISD::STRICT_FSETCCS: {
5595     unsigned ExtOp = ISD::FP_EXTEND;
5596     if (NVT.isInteger()) {
5597       ISD::CondCode CCCode = cast<CondCodeSDNode>(Node->getOperand(2))->get();
5598       if (isSignedIntSetCC(CCCode) ||
5599           TLI.isSExtCheaperThanZExt(Node->getOperand(0).getValueType(), NVT))
5600         ExtOp = ISD::SIGN_EXTEND;
5601       else
5602         ExtOp = ISD::ZERO_EXTEND;
5603     }
5604     if (Node->isStrictFPOpcode()) {
5605       SDValue InChain = Node->getOperand(0);
5606       std::tie(Tmp1, std::ignore) =
5607           DAG.getStrictFPExtendOrRound(Node->getOperand(1), InChain, dl, NVT);
5608       std::tie(Tmp2, std::ignore) =
5609           DAG.getStrictFPExtendOrRound(Node->getOperand(2), InChain, dl, NVT);
5610       SmallVector<SDValue, 2> TmpChains = {Tmp1.getValue(1), Tmp2.getValue(1)};
5611       SDValue OutChain = DAG.getTokenFactor(dl, TmpChains);
5612       SDVTList VTs = DAG.getVTList(Node->getValueType(0), MVT::Other);
5613       Results.push_back(DAG.getNode(Node->getOpcode(), dl, VTs,
5614                                     {OutChain, Tmp1, Tmp2, Node->getOperand(3)},
5615                                     Node->getFlags()));
5616       Results.push_back(Results.back().getValue(1));
5617       break;
5618     }
5619     Tmp1 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(0));
5620     Tmp2 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(1));
5621     Results.push_back(DAG.getNode(ISD::SETCC, dl, Node->getValueType(0), Tmp1,
5622                                   Tmp2, Node->getOperand(2), Node->getFlags()));
5623     break;
5624   }
5625   case ISD::BR_CC: {
5626     unsigned ExtOp = ISD::FP_EXTEND;
5627     if (NVT.isInteger()) {
5628       ISD::CondCode CCCode =
5629         cast<CondCodeSDNode>(Node->getOperand(1))->get();
5630       ExtOp = isSignedIntSetCC(CCCode) ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
5631     }
5632     Tmp1 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(2));
5633     Tmp2 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(3));
5634     Results.push_back(DAG.getNode(ISD::BR_CC, dl, Node->getValueType(0),
5635                                   Node->getOperand(0), Node->getOperand(1),
5636                                   Tmp1, Tmp2, Node->getOperand(4)));
5637     break;
5638   }
5639   case ISD::FADD:
5640   case ISD::FSUB:
5641   case ISD::FMUL:
5642   case ISD::FDIV:
5643   case ISD::FREM:
5644   case ISD::FMINNUM:
5645   case ISD::FMAXNUM:
5646   case ISD::FMINIMUM:
5647   case ISD::FMAXIMUM:
5648   case ISD::FMINIMUMNUM:
5649   case ISD::FMAXIMUMNUM:
5650   case ISD::FPOW:
5651   case ISD::FATAN2:
5652     Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0));
5653     Tmp2 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(1));
5654     Tmp3 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2);
5655     Results.push_back(
5656         DAG.getNode(ISD::FP_ROUND, dl, OVT, Tmp3,
5657                     DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)));
5658     break;
5659 
5660   case ISD::STRICT_FMINIMUM:
5661   case ISD::STRICT_FMAXIMUM: {
5662     SDValue InChain = Node->getOperand(0);
5663     SDVTList VTs = DAG.getVTList(NVT, MVT::Other);
5664     Tmp1 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, VTs, InChain,
5665                        Node->getOperand(1));
5666     Tmp2 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, VTs, InChain,
5667                        Node->getOperand(2));
5668     SmallVector<SDValue, 4> Ops = {InChain, Tmp1, Tmp2};
5669     Tmp3 = DAG.getNode(Node->getOpcode(), dl, VTs, Ops, Node->getFlags());
5670     Tmp4 = DAG.getNode(ISD::STRICT_FP_ROUND, dl, DAG.getVTList(OVT, MVT::Other),
5671                        InChain, Tmp3,
5672                        DAG.getIntPtrConstant(0, dl, /*isTarget=*/true));
5673     Results.push_back(Tmp4);
5674     Results.push_back(Tmp4.getValue(1));
5675     break;
5676   }
5677 
5678   case ISD::STRICT_FADD:
5679   case ISD::STRICT_FSUB:
5680   case ISD::STRICT_FMUL:
5681   case ISD::STRICT_FDIV:
5682   case ISD::STRICT_FMINNUM:
5683   case ISD::STRICT_FMAXNUM:
5684   case ISD::STRICT_FREM:
5685   case ISD::STRICT_FPOW:
5686   case ISD::STRICT_FATAN2:
5687     Tmp1 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other},
5688                        {Node->getOperand(0), Node->getOperand(1)});
5689     Tmp2 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other},
5690                        {Node->getOperand(0), Node->getOperand(2)});
5691     Tmp3 = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Tmp1.getValue(1),
5692                        Tmp2.getValue(1));
5693     Tmp1 = DAG.getNode(Node->getOpcode(), dl, {NVT, MVT::Other},
5694                        {Tmp3, Tmp1, Tmp2});
5695     Tmp1 = DAG.getNode(ISD::STRICT_FP_ROUND, dl, {OVT, MVT::Other},
5696                        {Tmp1.getValue(1), Tmp1,
5697                         DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)});
5698     Results.push_back(Tmp1);
5699     Results.push_back(Tmp1.getValue(1));
5700     break;
5701   case ISD::FMA:
5702     Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0));
5703     Tmp2 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(1));
5704     Tmp3 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(2));
5705     Results.push_back(
5706         DAG.getNode(ISD::FP_ROUND, dl, OVT,
5707                     DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2, Tmp3),
5708                     DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)));
5709     break;
5710   case ISD::STRICT_FMA:
5711     Tmp1 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other},
5712                        {Node->getOperand(0), Node->getOperand(1)});
5713     Tmp2 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other},
5714                        {Node->getOperand(0), Node->getOperand(2)});
5715     Tmp3 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other},
5716                        {Node->getOperand(0), Node->getOperand(3)});
5717     Tmp4 = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Tmp1.getValue(1),
5718                        Tmp2.getValue(1), Tmp3.getValue(1));
5719     Tmp4 = DAG.getNode(Node->getOpcode(), dl, {NVT, MVT::Other},
5720                        {Tmp4, Tmp1, Tmp2, Tmp3});
5721     Tmp4 = DAG.getNode(ISD::STRICT_FP_ROUND, dl, {OVT, MVT::Other},
5722                        {Tmp4.getValue(1), Tmp4,
5723                         DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)});
5724     Results.push_back(Tmp4);
5725     Results.push_back(Tmp4.getValue(1));
5726     break;
5727   case ISD::FCOPYSIGN:
5728   case ISD::FLDEXP:
5729   case ISD::FPOWI: {
5730     Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0));
5731     Tmp2 = Node->getOperand(1);
5732     Tmp3 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2);
5733 
5734     // fcopysign doesn't change anything but the sign bit, so
5735     //   (fp_round (fcopysign (fpext a), b))
5736     // is as precise as
5737     //   (fp_round (fpext a))
5738     // which is a no-op. Mark it as a TRUNCating FP_ROUND.
5739     const bool isTrunc = (Node->getOpcode() == ISD::FCOPYSIGN);
5740     Results.push_back(
5741         DAG.getNode(ISD::FP_ROUND, dl, OVT, Tmp3,
5742                     DAG.getIntPtrConstant(isTrunc, dl, /*isTarget=*/true)));
5743     break;
5744   }
5745   case ISD::STRICT_FLDEXP: {
5746     Tmp1 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other},
5747                        {Node->getOperand(0), Node->getOperand(1)});
5748     Tmp2 = Node->getOperand(2);
5749     Tmp3 = DAG.getNode(ISD::STRICT_FLDEXP, dl, {NVT, MVT::Other},
5750                        {Tmp1.getValue(1), Tmp1, Tmp2});
5751     Tmp4 = DAG.getNode(ISD::STRICT_FP_ROUND, dl, {OVT, MVT::Other},
5752                        {Tmp3.getValue(1), Tmp3,
5753                         DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)});
5754     Results.push_back(Tmp4);
5755     Results.push_back(Tmp4.getValue(1));
5756     break;
5757   }
5758   case ISD::STRICT_FPOWI:
5759     Tmp1 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other},
5760                        {Node->getOperand(0), Node->getOperand(1)});
5761     Tmp2 = DAG.getNode(Node->getOpcode(), dl, {NVT, MVT::Other},
5762                        {Tmp1.getValue(1), Tmp1, Node->getOperand(2)});
5763     Tmp3 = DAG.getNode(ISD::STRICT_FP_ROUND, dl, {OVT, MVT::Other},
5764                        {Tmp2.getValue(1), Tmp2,
5765                         DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)});
5766     Results.push_back(Tmp3);
5767     Results.push_back(Tmp3.getValue(1));
5768     break;
5769   case ISD::FFREXP: {
5770     Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0));
5771     Tmp2 = DAG.getNode(ISD::FFREXP, dl, {NVT, Node->getValueType(1)}, Tmp1);
5772 
5773     Results.push_back(
5774         DAG.getNode(ISD::FP_ROUND, dl, OVT, Tmp2,
5775                     DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)));
5776 
5777     Results.push_back(Tmp2.getValue(1));
5778     break;
5779   }
5780   case ISD::FMODF:
5781   case ISD::FSINCOS:
5782   case ISD::FSINCOSPI: {
5783     Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0));
5784     Tmp2 = DAG.getNode(Node->getOpcode(), dl, DAG.getVTList(NVT, NVT), Tmp1);
5785     Tmp3 = DAG.getIntPtrConstant(0, dl, /*isTarget=*/true);
5786     for (unsigned ResNum = 0; ResNum < Node->getNumValues(); ResNum++)
5787       Results.push_back(
5788           DAG.getNode(ISD::FP_ROUND, dl, OVT, Tmp2.getValue(ResNum), Tmp3));
5789     break;
5790   }
5791   case ISD::FFLOOR:
5792   case ISD::FCEIL:
5793   case ISD::FRINT:
5794   case ISD::FNEARBYINT:
5795   case ISD::FROUND:
5796   case ISD::FROUNDEVEN:
5797   case ISD::FTRUNC:
5798   case ISD::FNEG:
5799   case ISD::FSQRT:
5800   case ISD::FSIN:
5801   case ISD::FCOS:
5802   case ISD::FTAN:
5803   case ISD::FASIN:
5804   case ISD::FACOS:
5805   case ISD::FATAN:
5806   case ISD::FSINH:
5807   case ISD::FCOSH:
5808   case ISD::FTANH:
5809   case ISD::FLOG:
5810   case ISD::FLOG2:
5811   case ISD::FLOG10:
5812   case ISD::FABS:
5813   case ISD::FEXP:
5814   case ISD::FEXP2:
5815   case ISD::FEXP10:
5816   case ISD::FCANONICALIZE:
5817     Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0));
5818     Tmp2 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1);
5819     Results.push_back(
5820         DAG.getNode(ISD::FP_ROUND, dl, OVT, Tmp2,
5821                     DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)));
5822     break;
5823   case ISD::STRICT_FFLOOR:
5824   case ISD::STRICT_FCEIL:
5825   case ISD::STRICT_FRINT:
5826   case ISD::STRICT_FNEARBYINT:
5827   case ISD::STRICT_FROUND:
5828   case ISD::STRICT_FROUNDEVEN:
5829   case ISD::STRICT_FTRUNC:
5830   case ISD::STRICT_FSQRT:
5831   case ISD::STRICT_FSIN:
5832   case ISD::STRICT_FCOS:
5833   case ISD::STRICT_FTAN:
5834   case ISD::STRICT_FASIN:
5835   case ISD::STRICT_FACOS:
5836   case ISD::STRICT_FATAN:
5837   case ISD::STRICT_FSINH:
5838   case ISD::STRICT_FCOSH:
5839   case ISD::STRICT_FTANH:
5840   case ISD::STRICT_FLOG:
5841   case ISD::STRICT_FLOG2:
5842   case ISD::STRICT_FLOG10:
5843   case ISD::STRICT_FEXP:
5844   case ISD::STRICT_FEXP2:
5845     Tmp1 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other},
5846                        {Node->getOperand(0), Node->getOperand(1)});
5847     Tmp2 = DAG.getNode(Node->getOpcode(), dl, {NVT, MVT::Other},
5848                        {Tmp1.getValue(1), Tmp1});
5849     Tmp3 = DAG.getNode(ISD::STRICT_FP_ROUND, dl, {OVT, MVT::Other},
5850                        {Tmp2.getValue(1), Tmp2,
5851                         DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)});
5852     Results.push_back(Tmp3);
5853     Results.push_back(Tmp3.getValue(1));
5854     break;
5855   case ISD::BUILD_VECTOR: {
5856     MVT EltVT = OVT.getVectorElementType();
5857     MVT NewEltVT = NVT.getVectorElementType();
5858 
5859     // Handle bitcasts to a different vector type with the same total bit size
5860     //
5861     // e.g. v2i64 = build_vector i64:x, i64:y => v4i32
5862     //  =>
5863     //  v4i32 = concat_vectors (v2i32 (bitcast i64:x)), (v2i32 (bitcast i64:y))
5864 
5865     assert(NVT.isVector() && OVT.getSizeInBits() == NVT.getSizeInBits() &&
5866            "Invalid promote type for build_vector");
5867     assert(NewEltVT.bitsLE(EltVT) && "not handled");
5868 
5869     MVT MidVT = getPromotedVectorElementType(TLI, EltVT, NewEltVT);
5870 
5871     SmallVector<SDValue, 8> NewOps;
5872     for (const SDValue &Op : Node->op_values())
5873       NewOps.push_back(DAG.getNode(ISD::BITCAST, SDLoc(Op), MidVT, Op));
5874 
5875     SDLoc SL(Node);
5876     SDValue Concat =
5877         DAG.getNode(MidVT == NewEltVT ? ISD::BUILD_VECTOR : ISD::CONCAT_VECTORS,
5878                     SL, NVT, NewOps);
5879     SDValue CvtVec = DAG.getNode(ISD::BITCAST, SL, OVT, Concat);
5880     Results.push_back(CvtVec);
5881     break;
5882   }
5883   case ISD::EXTRACT_VECTOR_ELT: {
5884     MVT EltVT = OVT.getVectorElementType();
5885     MVT NewEltVT = NVT.getVectorElementType();
5886 
5887     // Handle bitcasts to a different vector type with the same total bit size.
5888     //
5889     // e.g. v2i64 = extract_vector_elt x:v2i64, y:i32
5890     //  =>
5891     //  v4i32:castx = bitcast x:v2i64
5892     //
5893     // i64 = bitcast
5894     //   (v2i32 build_vector (i32 (extract_vector_elt castx, (2 * y))),
5895     //                       (i32 (extract_vector_elt castx, (2 * y + 1)))
5896     //
5897 
5898     assert(NVT.isVector() && OVT.getSizeInBits() == NVT.getSizeInBits() &&
5899            "Invalid promote type for extract_vector_elt");
5900     assert(NewEltVT.bitsLT(EltVT) && "not handled");
5901 
5902     MVT MidVT = getPromotedVectorElementType(TLI, EltVT, NewEltVT);
5903     unsigned NewEltsPerOldElt = MidVT.getVectorNumElements();
5904 
5905     SDValue Idx = Node->getOperand(1);
5906     EVT IdxVT = Idx.getValueType();
5907     SDLoc SL(Node);
5908     SDValue Factor = DAG.getConstant(NewEltsPerOldElt, SL, IdxVT);
5909     SDValue NewBaseIdx = DAG.getNode(ISD::MUL, SL, IdxVT, Idx, Factor);
5910 
5911     SDValue CastVec = DAG.getNode(ISD::BITCAST, SL, NVT, Node->getOperand(0));
5912 
5913     SmallVector<SDValue, 8> NewOps;
5914     for (unsigned I = 0; I < NewEltsPerOldElt; ++I) {
5915       SDValue IdxOffset = DAG.getConstant(I, SL, IdxVT);
5916       SDValue TmpIdx = DAG.getNode(ISD::ADD, SL, IdxVT, NewBaseIdx, IdxOffset);
5917 
5918       SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, NewEltVT,
5919                                 CastVec, TmpIdx);
5920       NewOps.push_back(Elt);
5921     }
5922 
5923     SDValue NewVec = DAG.getBuildVector(MidVT, SL, NewOps);
5924     Results.push_back(DAG.getNode(ISD::BITCAST, SL, EltVT, NewVec));
5925     break;
5926   }
5927   case ISD::INSERT_VECTOR_ELT: {
5928     MVT EltVT = OVT.getVectorElementType();
5929     MVT NewEltVT = NVT.getVectorElementType();
5930 
5931     // Handle bitcasts to a different vector type with the same total bit size
5932     //
5933     // e.g. v2i64 = insert_vector_elt x:v2i64, y:i64, z:i32
5934     //  =>
5935     //  v4i32:castx = bitcast x:v2i64
5936     //  v2i32:casty = bitcast y:i64
5937     //
5938     // v2i64 = bitcast
5939     //   (v4i32 insert_vector_elt
5940     //       (v4i32 insert_vector_elt v4i32:castx,
5941     //                                (extract_vector_elt casty, 0), 2 * z),
5942     //        (extract_vector_elt casty, 1), (2 * z + 1))
5943 
5944     assert(NVT.isVector() && OVT.getSizeInBits() == NVT.getSizeInBits() &&
5945            "Invalid promote type for insert_vector_elt");
5946     assert(NewEltVT.bitsLT(EltVT) && "not handled");
5947 
5948     MVT MidVT = getPromotedVectorElementType(TLI, EltVT, NewEltVT);
5949     unsigned NewEltsPerOldElt = MidVT.getVectorNumElements();
5950 
5951     SDValue Val = Node->getOperand(1);
5952     SDValue Idx = Node->getOperand(2);
5953     EVT IdxVT = Idx.getValueType();
5954     SDLoc SL(Node);
5955 
5956     SDValue Factor = DAG.getConstant(NewEltsPerOldElt, SDLoc(), IdxVT);
5957     SDValue NewBaseIdx = DAG.getNode(ISD::MUL, SL, IdxVT, Idx, Factor);
5958 
5959     SDValue CastVec = DAG.getNode(ISD::BITCAST, SL, NVT, Node->getOperand(0));
5960     SDValue CastVal = DAG.getNode(ISD::BITCAST, SL, MidVT, Val);
5961 
5962     SDValue NewVec = CastVec;
5963     for (unsigned I = 0; I < NewEltsPerOldElt; ++I) {
5964       SDValue IdxOffset = DAG.getConstant(I, SL, IdxVT);
5965       SDValue InEltIdx = DAG.getNode(ISD::ADD, SL, IdxVT, NewBaseIdx, IdxOffset);
5966 
5967       SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, NewEltVT,
5968                                 CastVal, IdxOffset);
5969 
5970       NewVec = DAG.getNode(ISD::INSERT_VECTOR_ELT, SL, NVT,
5971                            NewVec, Elt, InEltIdx);
5972     }
5973 
5974     Results.push_back(DAG.getNode(ISD::BITCAST, SL, OVT, NewVec));
5975     break;
5976   }
5977   case ISD::SCALAR_TO_VECTOR: {
5978     MVT EltVT = OVT.getVectorElementType();
5979     MVT NewEltVT = NVT.getVectorElementType();
5980 
5981     // Handle bitcasts to different vector type with the same total bit size.
5982     //
5983     // e.g. v2i64 = scalar_to_vector x:i64
5984     //   =>
5985     //  concat_vectors (v2i32 bitcast x:i64), (v2i32 undef)
5986     //
5987 
5988     MVT MidVT = getPromotedVectorElementType(TLI, EltVT, NewEltVT);
5989     SDValue Val = Node->getOperand(0);
5990     SDLoc SL(Node);
5991 
5992     SDValue CastVal = DAG.getNode(ISD::BITCAST, SL, MidVT, Val);
5993     SDValue Undef = DAG.getUNDEF(MidVT);
5994 
5995     SmallVector<SDValue, 8> NewElts;
5996     NewElts.push_back(CastVal);
5997     for (unsigned I = 1, NElts = OVT.getVectorNumElements(); I != NElts; ++I)
5998       NewElts.push_back(Undef);
5999 
6000     SDValue Concat = DAG.getNode(ISD::CONCAT_VECTORS, SL, NVT, NewElts);
6001     SDValue CvtVec = DAG.getNode(ISD::BITCAST, SL, OVT, Concat);
6002     Results.push_back(CvtVec);
6003     break;
6004   }
6005   case ISD::ATOMIC_SWAP:
6006   case ISD::ATOMIC_STORE: {
6007     AtomicSDNode *AM = cast<AtomicSDNode>(Node);
6008     SDLoc SL(Node);
6009     SDValue CastVal = DAG.getNode(ISD::BITCAST, SL, NVT, AM->getVal());
6010     assert(NVT.getSizeInBits() == OVT.getSizeInBits() &&
6011            "unexpected promotion type");
6012     assert(AM->getMemoryVT().getSizeInBits() == NVT.getSizeInBits() &&
6013            "unexpected atomic_swap with illegal type");
6014 
6015     SDValue Op0 = AM->getBasePtr();
6016     SDValue Op1 = CastVal;
6017 
6018     // ATOMIC_STORE uses a swapped operand order from every other AtomicSDNode,
6019     // but really it should merge with ISD::STORE.
6020     if (AM->getOpcode() == ISD::ATOMIC_STORE)
6021       std::swap(Op0, Op1);
6022 
6023     SDValue NewAtomic = DAG.getAtomic(AM->getOpcode(), SL, NVT, AM->getChain(),
6024                                       Op0, Op1, AM->getMemOperand());
6025 
6026     if (AM->getOpcode() != ISD::ATOMIC_STORE) {
6027       Results.push_back(DAG.getNode(ISD::BITCAST, SL, OVT, NewAtomic));
6028       Results.push_back(NewAtomic.getValue(1));
6029     } else
6030       Results.push_back(NewAtomic);
6031     break;
6032   }
6033   case ISD::ATOMIC_LOAD: {
6034     AtomicSDNode *AM = cast<AtomicSDNode>(Node);
6035     SDLoc SL(Node);
6036     assert(NVT.getSizeInBits() == OVT.getSizeInBits() &&
6037            "unexpected promotion type");
6038     assert(AM->getMemoryVT().getSizeInBits() == NVT.getSizeInBits() &&
6039            "unexpected atomic_load with illegal type");
6040 
6041     SDValue NewAtomic =
6042         DAG.getAtomic(ISD::ATOMIC_LOAD, SL, NVT, DAG.getVTList(NVT, MVT::Other),
6043                       {AM->getChain(), AM->getBasePtr()}, AM->getMemOperand());
6044     Results.push_back(DAG.getNode(ISD::BITCAST, SL, OVT, NewAtomic));
6045     Results.push_back(NewAtomic.getValue(1));
6046     break;
6047   }
6048   case ISD::SPLAT_VECTOR: {
6049     SDValue Scalar = Node->getOperand(0);
6050     MVT ScalarType = Scalar.getSimpleValueType();
6051     MVT NewScalarType = NVT.getVectorElementType();
6052     if (ScalarType.isInteger()) {
6053       Tmp1 = DAG.getNode(ISD::ANY_EXTEND, dl, NewScalarType, Scalar);
6054       Tmp2 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1);
6055       Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, OVT, Tmp2));
6056       break;
6057     }
6058     Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NewScalarType, Scalar);
6059     Tmp2 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1);
6060     Results.push_back(
6061         DAG.getNode(ISD::FP_ROUND, dl, OVT, Tmp2,
6062                     DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)));
6063     break;
6064   }
6065   case ISD::VECREDUCE_FMAX:
6066   case ISD::VECREDUCE_FMIN:
6067   case ISD::VECREDUCE_FMAXIMUM:
6068   case ISD::VECREDUCE_FMINIMUM:
6069   case ISD::VP_REDUCE_FMAX:
6070   case ISD::VP_REDUCE_FMIN:
6071   case ISD::VP_REDUCE_FMAXIMUM:
6072   case ISD::VP_REDUCE_FMINIMUM:
6073     Results.push_back(PromoteReduction(Node));
6074     break;
6075   }
6076 
6077   // Replace the original node with the legalized result.
6078   if (!Results.empty()) {
6079     LLVM_DEBUG(dbgs() << "Successfully promoted node\n");
6080     ReplaceNode(Node, Results.data());
6081   } else
6082     LLVM_DEBUG(dbgs() << "Could not promote node\n");
6083 }
6084 
6085 /// This is the entry point for the file.
Legalize()6086 void SelectionDAG::Legalize() {
6087   AssignTopologicalOrder();
6088 
6089   SmallPtrSet<SDNode *, 16> LegalizedNodes;
6090   // Use a delete listener to remove nodes which were deleted during
6091   // legalization from LegalizeNodes. This is needed to handle the situation
6092   // where a new node is allocated by the object pool to the same address of a
6093   // previously deleted node.
6094   DAGNodeDeletedListener DeleteListener(
6095       *this,
6096       [&LegalizedNodes](SDNode *N, SDNode *E) { LegalizedNodes.erase(N); });
6097 
6098   SelectionDAGLegalize Legalizer(*this, LegalizedNodes);
6099 
6100   // Visit all the nodes. We start in topological order, so that we see
6101   // nodes with their original operands intact. Legalization can produce
6102   // new nodes which may themselves need to be legalized. Iterate until all
6103   // nodes have been legalized.
6104   while (true) {
6105     bool AnyLegalized = false;
6106     for (auto NI = allnodes_end(); NI != allnodes_begin();) {
6107       --NI;
6108 
6109       SDNode *N = &*NI;
6110       if (N->use_empty() && N != getRoot().getNode()) {
6111         ++NI;
6112         DeleteNode(N);
6113         continue;
6114       }
6115 
6116       if (LegalizedNodes.insert(N).second) {
6117         AnyLegalized = true;
6118         Legalizer.LegalizeOp(N);
6119 
6120         if (N->use_empty() && N != getRoot().getNode()) {
6121           ++NI;
6122           DeleteNode(N);
6123         }
6124       }
6125     }
6126     if (!AnyLegalized)
6127       break;
6128 
6129   }
6130 
6131   // Remove dead nodes now.
6132   RemoveDeadNodes();
6133 }
6134 
LegalizeOp(SDNode * N,SmallSetVector<SDNode *,16> & UpdatedNodes)6135 bool SelectionDAG::LegalizeOp(SDNode *N,
6136                               SmallSetVector<SDNode *, 16> &UpdatedNodes) {
6137   SmallPtrSet<SDNode *, 16> LegalizedNodes;
6138   SelectionDAGLegalize Legalizer(*this, LegalizedNodes, &UpdatedNodes);
6139 
6140   // Directly insert the node in question, and legalize it. This will recurse
6141   // as needed through operands.
6142   LegalizedNodes.insert(N);
6143   Legalizer.LegalizeOp(N);
6144 
6145   return LegalizedNodes.count(N);
6146 }
6147