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