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