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