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