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