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