LLVM 21.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.getMemBasePlusOffset(Table, Index, dl);
3974
3975 EVT MemVT = EVT::getIntegerVT(*DAG.getContext(), EntrySize * 8);
3976 SDValue LD = DAG.getExtLoad(
3977 ISD::SEXTLOAD, dl, PTy, Chain, Addr,
3978 MachinePointerInfo::getJumpTable(DAG.getMachineFunction()), MemVT);
3979 Addr = LD;
3980 if (TLI.isJumpTableRelative()) {
3981 // For PIC, the sequence is:
3982 // BRIND(RelocBase + load(Jumptable + index))
3983 // RelocBase can be JumpTable, GOT or some sort of global base.
3984 Addr = DAG.getMemBasePlusOffset(TLI.getPICJumpTableRelocBase(Table, DAG),
3985 Addr, dl);
3986 }
3987
3988 Tmp1 = TLI.expandIndirectJTBranch(dl, LD.getValue(1), Addr, JTI, DAG);
3989 Results.push_back(Tmp1);
3990 break;
3991 }
3992 case ISD::BRCOND:
3993 // Expand brcond's setcc into its constituent parts and create a BR_CC
3994 // Node.
3995 Tmp1 = Node->getOperand(0);
3996 Tmp2 = Node->getOperand(1);
3997 if (Tmp2.getOpcode() == ISD::SETCC &&
3998 TLI.isOperationLegalOrCustom(ISD::BR_CC,
3999 Tmp2.getOperand(0).getValueType())) {
4000 Tmp1 = DAG.getNode(ISD::BR_CC, dl, MVT::Other, Tmp1, Tmp2.getOperand(2),
4001 Tmp2.getOperand(0), Tmp2.getOperand(1),
4002 Node->getOperand(2));
4003 } else {
4004 // We test only the i1 bit. Skip the AND if UNDEF or another AND.
4005 if (Tmp2.isUndef() ||
4006 (Tmp2.getOpcode() == ISD::AND && isOneConstant(Tmp2.getOperand(1))))
4007 Tmp3 = Tmp2;
4008 else
4009 Tmp3 = DAG.getNode(ISD::AND, dl, Tmp2.getValueType(), Tmp2,
4010 DAG.getConstant(1, dl, Tmp2.getValueType()));
4011 Tmp1 = DAG.getNode(ISD::BR_CC, dl, MVT::Other, Tmp1,
4012 DAG.getCondCode(ISD::SETNE), Tmp3,
4013 DAG.getConstant(0, dl, Tmp3.getValueType()),
4014 Node->getOperand(2));
4015 }
4016 Results.push_back(Tmp1);
4017 break;
4018 case ISD::SETCC:
4019 case ISD::VP_SETCC:
4020 case ISD::STRICT_FSETCC:
4021 case ISD::STRICT_FSETCCS: {
4022 bool IsVP = Node->getOpcode() == ISD::VP_SETCC;
4023 bool IsStrict = Node->getOpcode() == ISD::STRICT_FSETCC ||
4024 Node->getOpcode() == ISD::STRICT_FSETCCS;
4025 bool IsSignaling = Node->getOpcode() == ISD::STRICT_FSETCCS;
4026 SDValue Chain = IsStrict ? Node->getOperand(0) : SDValue();
4027 unsigned Offset = IsStrict ? 1 : 0;
4028 Tmp1 = Node->getOperand(0 + Offset);
4029 Tmp2 = Node->getOperand(1 + Offset);
4030 Tmp3 = Node->getOperand(2 + Offset);
4031 SDValue Mask, EVL;
4032 if (IsVP) {
4033 Mask = Node->getOperand(3 + Offset);
4034 EVL = Node->getOperand(4 + Offset);
4035 }
4036 bool Legalized = TLI.LegalizeSetCCCondCode(
4037 DAG, Node->getValueType(0), Tmp1, Tmp2, Tmp3, Mask, EVL, NeedInvert, dl,
4038 Chain, IsSignaling);
4039
4040 if (Legalized) {
4041 // If we expanded the SETCC by swapping LHS and RHS, or by inverting the
4042 // condition code, create a new SETCC node.
4043 if (Tmp3.getNode()) {
4044 if (IsStrict) {
4045 Tmp1 = DAG.getNode(Node->getOpcode(), dl, Node->getVTList(),
4046 {Chain, Tmp1, Tmp2, Tmp3}, Node->getFlags());
4047 Chain = Tmp1.getValue(1);
4048 } else if (IsVP) {
4049 Tmp1 = DAG.getNode(Node->getOpcode(), dl, Node->getValueType(0),
4050 {Tmp1, Tmp2, Tmp3, Mask, EVL}, Node->getFlags());
4051 } else {
4052 Tmp1 = DAG.getNode(Node->getOpcode(), dl, Node->getValueType(0), Tmp1,
4053 Tmp2, Tmp3, Node->getFlags());
4054 }
4055 }
4056
4057 // If we expanded the SETCC by inverting the condition code, then wrap
4058 // the existing SETCC in a NOT to restore the intended condition.
4059 if (NeedInvert) {
4060 if (!IsVP)
4061 Tmp1 = DAG.getLogicalNOT(dl, Tmp1, Tmp1->getValueType(0));
4062 else
4063 Tmp1 =
4064 DAG.getVPLogicalNOT(dl, Tmp1, Mask, EVL, Tmp1->getValueType(0));
4065 }
4066
4067 Results.push_back(Tmp1);
4068 if (IsStrict)
4069 Results.push_back(Chain);
4070
4071 break;
4072 }
4073
4074 // FIXME: It seems Legalized is false iff CCCode is Legal. I don't
4075 // understand if this code is useful for strict nodes.
4076 assert(!IsStrict && "Don't know how to expand for strict nodes.");
4077
4078 // Otherwise, SETCC for the given comparison type must be completely
4079 // illegal; expand it into a SELECT_CC.
4080 // FIXME: This drops the mask/evl for VP_SETCC.
4081 EVT VT = Node->getValueType(0);
4082 EVT Tmp1VT = Tmp1.getValueType();
4083 Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, VT, Tmp1, Tmp2,
4084 DAG.getBoolConstant(true, dl, VT, Tmp1VT),
4085 DAG.getBoolConstant(false, dl, VT, Tmp1VT), Tmp3);
4086 Tmp1->setFlags(Node->getFlags());
4087 Results.push_back(Tmp1);
4088 break;
4089 }
4090 case ISD::SELECT_CC: {
4091 // TODO: need to add STRICT_SELECT_CC and STRICT_SELECT_CCS
4092 Tmp1 = Node->getOperand(0); // LHS
4093 Tmp2 = Node->getOperand(1); // RHS
4094 Tmp3 = Node->getOperand(2); // True
4095 Tmp4 = Node->getOperand(3); // False
4096 EVT VT = Node->getValueType(0);
4097 SDValue Chain;
4098 SDValue CC = Node->getOperand(4);
4099 ISD::CondCode CCOp = cast<CondCodeSDNode>(CC)->get();
4100
4101 if (TLI.isCondCodeLegalOrCustom(CCOp, Tmp1.getSimpleValueType())) {
4102 // If the condition code is legal, then we need to expand this
4103 // node using SETCC and SELECT.
4104 EVT CmpVT = Tmp1.getValueType();
4105 assert(!TLI.isOperationExpand(ISD::SELECT, VT) &&
4106 "Cannot expand ISD::SELECT_CC when ISD::SELECT also needs to be "
4107 "expanded.");
4108 EVT CCVT = getSetCCResultType(CmpVT);
4109 SDValue Cond = DAG.getNode(ISD::SETCC, dl, CCVT, Tmp1, Tmp2, CC, Node->getFlags());
4110 Results.push_back(
4111 DAG.getSelect(dl, VT, Cond, Tmp3, Tmp4, Node->getFlags()));
4112 break;
4113 }
4114
4115 // SELECT_CC is legal, so the condition code must not be.
4116 bool Legalized = false;
4117 // Try to legalize by inverting the condition. This is for targets that
4118 // might support an ordered version of a condition, but not the unordered
4119 // version (or vice versa).
4120 ISD::CondCode InvCC = ISD::getSetCCInverse(CCOp, Tmp1.getValueType());
4121 if (TLI.isCondCodeLegalOrCustom(InvCC, Tmp1.getSimpleValueType())) {
4122 // Use the new condition code and swap true and false
4123 Legalized = true;
4124 Tmp1 = DAG.getSelectCC(dl, Tmp1, Tmp2, Tmp4, Tmp3, InvCC);
4125 Tmp1->setFlags(Node->getFlags());
4126 } else {
4127 // If The inverse is not legal, then try to swap the arguments using
4128 // the inverse condition code.
4130 if (TLI.isCondCodeLegalOrCustom(SwapInvCC, Tmp1.getSimpleValueType())) {
4131 // The swapped inverse condition is legal, so swap true and false,
4132 // lhs and rhs.
4133 Legalized = true;
4134 Tmp1 = DAG.getSelectCC(dl, Tmp2, Tmp1, Tmp4, Tmp3, SwapInvCC);
4135 Tmp1->setFlags(Node->getFlags());
4136 }
4137 }
4138
4139 if (!Legalized) {
4140 Legalized = TLI.LegalizeSetCCCondCode(
4141 DAG, getSetCCResultType(Tmp1.getValueType()), Tmp1, Tmp2, CC,
4142 /*Mask*/ SDValue(), /*EVL*/ SDValue(), NeedInvert, dl, Chain);
4143
4144 assert(Legalized && "Can't legalize SELECT_CC with legal condition!");
4145
4146 // If we expanded the SETCC by inverting the condition code, then swap
4147 // the True/False operands to match.
4148 if (NeedInvert)
4149 std::swap(Tmp3, Tmp4);
4150
4151 // If we expanded the SETCC by swapping LHS and RHS, or by inverting the
4152 // condition code, create a new SELECT_CC node.
4153 if (CC.getNode()) {
4154 Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, Node->getValueType(0),
4155 Tmp1, Tmp2, Tmp3, Tmp4, CC);
4156 } else {
4157 Tmp2 = DAG.getConstant(0, dl, Tmp1.getValueType());
4158 CC = DAG.getCondCode(ISD::SETNE);
4159 Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, Node->getValueType(0), Tmp1,
4160 Tmp2, Tmp3, Tmp4, CC);
4161 }
4162 Tmp1->setFlags(Node->getFlags());
4163 }
4164 Results.push_back(Tmp1);
4165 break;
4166 }
4167 case ISD::BR_CC: {
4168 // TODO: need to add STRICT_BR_CC and STRICT_BR_CCS
4169 SDValue Chain;
4170 Tmp1 = Node->getOperand(0); // Chain
4171 Tmp2 = Node->getOperand(2); // LHS
4172 Tmp3 = Node->getOperand(3); // RHS
4173 Tmp4 = Node->getOperand(1); // CC
4174
4175 bool Legalized = TLI.LegalizeSetCCCondCode(
4176 DAG, getSetCCResultType(Tmp2.getValueType()), Tmp2, Tmp3, Tmp4,
4177 /*Mask*/ SDValue(), /*EVL*/ SDValue(), NeedInvert, dl, Chain);
4178 (void)Legalized;
4179 assert(Legalized && "Can't legalize BR_CC with legal condition!");
4180
4181 // If we expanded the SETCC by swapping LHS and RHS, create a new BR_CC
4182 // node.
4183 if (Tmp4.getNode()) {
4184 assert(!NeedInvert && "Don't know how to invert BR_CC!");
4185
4186 Tmp1 = DAG.getNode(ISD::BR_CC, dl, Node->getValueType(0), Tmp1,
4187 Tmp4, Tmp2, Tmp3, Node->getOperand(4));
4188 } else {
4189 Tmp3 = DAG.getConstant(0, dl, Tmp2.getValueType());
4190 Tmp4 = DAG.getCondCode(NeedInvert ? ISD::SETEQ : ISD::SETNE);
4191 Tmp1 = DAG.getNode(ISD::BR_CC, dl, Node->getValueType(0), Tmp1, Tmp4,
4192 Tmp2, Tmp3, Node->getOperand(4));
4193 }
4194 Results.push_back(Tmp1);
4195 break;
4196 }
4197 case ISD::BUILD_VECTOR:
4198 Results.push_back(ExpandBUILD_VECTOR(Node));
4199 break;
4200 case ISD::SPLAT_VECTOR:
4201 Results.push_back(ExpandSPLAT_VECTOR(Node));
4202 break;
4203 case ISD::SRA:
4204 case ISD::SRL:
4205 case ISD::SHL: {
4206 // Scalarize vector SRA/SRL/SHL.
4207 EVT VT = Node->getValueType(0);
4208 assert(VT.isVector() && "Unable to legalize non-vector shift");
4209 assert(TLI.isTypeLegal(VT.getScalarType())&& "Element type must be legal");
4210 unsigned NumElem = VT.getVectorNumElements();
4211
4213 for (unsigned Idx = 0; Idx < NumElem; Idx++) {
4214 SDValue Ex =
4216 Node->getOperand(0), DAG.getVectorIdxConstant(Idx, dl));
4217 SDValue Sh =
4219 Node->getOperand(1), DAG.getVectorIdxConstant(Idx, dl));
4220 Scalars.push_back(DAG.getNode(Node->getOpcode(), dl,
4221 VT.getScalarType(), Ex, Sh));
4222 }
4223
4224 SDValue Result = DAG.getBuildVector(Node->getValueType(0), dl, Scalars);
4225 Results.push_back(Result);
4226 break;
4227 }
4230 case ISD::VECREDUCE_ADD:
4231 case ISD::VECREDUCE_MUL:
4232 case ISD::VECREDUCE_AND:
4233 case ISD::VECREDUCE_OR:
4234 case ISD::VECREDUCE_XOR:
4243 Results.push_back(TLI.expandVecReduce(Node, DAG));
4244 break;
4245 case ISD::VP_CTTZ_ELTS:
4246 case ISD::VP_CTTZ_ELTS_ZERO_UNDEF:
4247 Results.push_back(TLI.expandVPCTTZElements(Node, DAG));
4248 break;
4249 case ISD::CLEAR_CACHE:
4250 // The default expansion of llvm.clear_cache is simply a no-op for those
4251 // targets where it is not needed.
4252 Results.push_back(Node->getOperand(0));
4253 break;
4254 case ISD::LRINT:
4255 case ISD::LLRINT: {
4256 SDValue Arg = Node->getOperand(0);
4257 EVT ArgVT = Arg.getValueType();
4258 EVT ResVT = Node->getValueType(0);
4259 SDLoc dl(Node);
4260 SDValue RoundNode = DAG.getNode(ISD::FRINT, dl, ArgVT, Arg);
4261 Results.push_back(DAG.getNode(ISD::FP_TO_SINT, dl, ResVT, RoundNode));
4262 break;
4263 }
4264 case ISD::ADDRSPACECAST:
4265 Results.push_back(DAG.UnrollVectorOp(Node));
4266 break;
4268 case ISD::GlobalAddress:
4271 case ISD::ConstantPool:
4272 case ISD::JumpTable:
4276 // FIXME: Custom lowering for these operations shouldn't return null!
4277 // Return true so that we don't call ConvertNodeToLibcall which also won't
4278 // do anything.
4279 return true;
4280 }
4281
4282 if (!TLI.isStrictFPEnabled() && Results.empty() && Node->isStrictFPOpcode()) {
4283 // FIXME: We were asked to expand a strict floating-point operation,
4284 // but there is currently no expansion implemented that would preserve
4285 // the "strict" properties. For now, we just fall back to the non-strict
4286 // version if that is legal on the target. The actual mutation of the
4287 // operation will happen in SelectionDAGISel::DoInstructionSelection.
4288 switch (Node->getOpcode()) {
4289 default:
4290 if (TLI.getStrictFPOperationAction(Node->getOpcode(),
4291 Node->getValueType(0))
4292 == TargetLowering::Legal)
4293 return true;
4294 break;
4295 case ISD::STRICT_FSUB: {
4296 if (TLI.getStrictFPOperationAction(
4297 ISD::STRICT_FSUB, Node->getValueType(0)) == TargetLowering::Legal)
4298 return true;
4299 if (TLI.getStrictFPOperationAction(
4300 ISD::STRICT_FADD, Node->getValueType(0)) != TargetLowering::Legal)
4301 break;
4302
4303 EVT VT = Node->getValueType(0);
4304 const SDNodeFlags Flags = Node->getFlags();
4305 SDValue Neg = DAG.getNode(ISD::FNEG, dl, VT, Node->getOperand(2), Flags);
4306 SDValue Fadd = DAG.getNode(ISD::STRICT_FADD, dl, Node->getVTList(),
4307 {Node->getOperand(0), Node->getOperand(1), Neg},
4308 Flags);
4309
4310 Results.push_back(Fadd);
4311 Results.push_back(Fadd.getValue(1));
4312 break;
4313 }
4316 case ISD::STRICT_LRINT:
4317 case ISD::STRICT_LLRINT:
4318 case ISD::STRICT_LROUND:
4320 // These are registered by the operand type instead of the value
4321 // type. Reflect that here.
4322 if (TLI.getStrictFPOperationAction(Node->getOpcode(),
4323 Node->getOperand(1).getValueType())
4324 == TargetLowering::Legal)
4325 return true;
4326 break;
4327 }
4328 }
4329
4330 // Replace the original node with the legalized result.
4331 if (Results.empty()) {
4332 LLVM_DEBUG(dbgs() << "Cannot expand node\n");
4333 return false;
4334 }
4335
4336 LLVM_DEBUG(dbgs() << "Successfully expanded node\n");
4337 ReplaceNode(Node, Results.data());
4338 return true;
4339}
4340
4341void SelectionDAGLegalize::ConvertNodeToLibcall(SDNode *Node) {
4342 LLVM_DEBUG(dbgs() << "Trying to convert node to libcall\n");
4344 SDLoc dl(Node);
4346 CallOptions.IsPostTypeLegalization = true;
4347 // FIXME: Check flags on the node to see if we can use a finite call.
4348 unsigned Opc = Node->getOpcode();
4349 switch (Opc) {
4350 case ISD::ATOMIC_FENCE: {
4351 // If the target didn't lower this, lower it to '__sync_synchronize()' call
4352 // FIXME: handle "fence singlethread" more efficiently.
4354
4356 CLI.setDebugLoc(dl)
4357 .setChain(Node->getOperand(0))
4358 .setLibCallee(
4359 CallingConv::C, Type::getVoidTy(*DAG.getContext()),
4360 DAG.getExternalSymbol("__sync_synchronize",
4361 TLI.getPointerTy(DAG.getDataLayout())),
4362 std::move(Args));
4363
4364 std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
4365
4366 Results.push_back(CallResult.second);
4367 break;
4368 }
4369 // By default, atomic intrinsics are marked Legal and lowered. Targets
4370 // which don't support them directly, however, may want libcalls, in which
4371 // case they mark them Expand, and we get here.
4372 case ISD::ATOMIC_SWAP:
4384 case ISD::ATOMIC_CMP_SWAP: {
4385 MVT VT = cast<AtomicSDNode>(Node)->getMemoryVT().getSimpleVT();
4386 AtomicOrdering Order = cast<AtomicSDNode>(Node)->getMergedOrdering();
4387 RTLIB::Libcall LC = RTLIB::getOUTLINE_ATOMIC(Opc, Order, VT);
4388 EVT RetVT = Node->getValueType(0);
4390 if (TLI.getLibcallName(LC)) {
4391 // If outline atomic available, prepare its arguments and expand.
4392 Ops.append(Node->op_begin() + 2, Node->op_end());
4393 Ops.push_back(Node->getOperand(1));
4394
4395 } else {
4396 LC = RTLIB::getSYNC(Opc, VT);
4397 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
4398 "Unexpected atomic op or value type!");
4399 // Arguments for expansion to sync libcall
4400 Ops.append(Node->op_begin() + 1, Node->op_end());
4401 }
4402 std::pair<SDValue, SDValue> Tmp = TLI.makeLibCall(DAG, LC, RetVT,
4403 Ops, CallOptions,
4404 SDLoc(Node),
4405 Node->getOperand(0));
4406 Results.push_back(Tmp.first);
4407 Results.push_back(Tmp.second);
4408 break;
4409 }
4410 case ISD::TRAP: {
4411 // If this operation is not supported, lower it to 'abort()' call
4414 CLI.setDebugLoc(dl)
4415 .setChain(Node->getOperand(0))
4416 .setLibCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),
4417 DAG.getExternalSymbol(
4418 "abort", TLI.getPointerTy(DAG.getDataLayout())),
4419 std::move(Args));
4420 std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
4421
4422 Results.push_back(CallResult.second);
4423 break;
4424 }
4425 case ISD::CLEAR_CACHE: {
4426 SDValue InputChain = Node->getOperand(0);
4427 SDValue StartVal = Node->getOperand(1);
4428 SDValue EndVal = Node->getOperand(2);
4429 std::pair<SDValue, SDValue> Tmp = TLI.makeLibCall(
4430 DAG, RTLIB::CLEAR_CACHE, MVT::isVoid, {StartVal, EndVal}, CallOptions,
4431 SDLoc(Node), InputChain);
4432 Results.push_back(Tmp.second);
4433 break;
4434 }
4435 case ISD::FMINNUM:
4437 ExpandFPLibCall(Node, RTLIB::FMIN_F32, RTLIB::FMIN_F64,
4438 RTLIB::FMIN_F80, RTLIB::FMIN_F128,
4439 RTLIB::FMIN_PPCF128, Results);
4440 break;
4441 // FIXME: We do not have libcalls for FMAXIMUM and FMINIMUM. So, we cannot use
4442 // libcall legalization for these nodes, but there is no default expasion for
4443 // these nodes either (see PR63267 for example).
4444 case ISD::FMAXNUM:
4446 ExpandFPLibCall(Node, RTLIB::FMAX_F32, RTLIB::FMAX_F64,
4447 RTLIB::FMAX_F80, RTLIB::FMAX_F128,
4448 RTLIB::FMAX_PPCF128, Results);
4449 break;
4450 case ISD::FMINIMUMNUM:
4451 ExpandFPLibCall(Node, RTLIB::FMINIMUMNUM_F32, RTLIB::FMINIMUMNUM_F64,
4452 RTLIB::FMINIMUMNUM_F80, RTLIB::FMINIMUMNUM_F128,
4453 RTLIB::FMINIMUMNUM_PPCF128, Results);
4454 break;
4455 case ISD::FMAXIMUMNUM:
4456 ExpandFPLibCall(Node, RTLIB::FMAXIMUMNUM_F32, RTLIB::FMAXIMUMNUM_F64,
4457 RTLIB::FMAXIMUMNUM_F80, RTLIB::FMAXIMUMNUM_F128,
4458 RTLIB::FMAXIMUMNUM_PPCF128, Results);
4459 break;
4460 case ISD::FSQRT:
4461 case ISD::STRICT_FSQRT:
4462 ExpandFPLibCall(Node, RTLIB::SQRT_F32, RTLIB::SQRT_F64,
4463 RTLIB::SQRT_F80, RTLIB::SQRT_F128,
4464 RTLIB::SQRT_PPCF128, Results);
4465 break;
4466 case ISD::FCBRT:
4467 ExpandFPLibCall(Node, RTLIB::CBRT_F32, RTLIB::CBRT_F64,
4468 RTLIB::CBRT_F80, RTLIB::CBRT_F128,
4469 RTLIB::CBRT_PPCF128, Results);
4470 break;
4471 case ISD::FSIN:
4472 case ISD::STRICT_FSIN:
4473 ExpandFPLibCall(Node, RTLIB::SIN_F32, RTLIB::SIN_F64,
4474 RTLIB::SIN_F80, RTLIB::SIN_F128,
4475 RTLIB::SIN_PPCF128, Results);
4476 break;
4477 case ISD::FCOS:
4478 case ISD::STRICT_FCOS:
4479 ExpandFPLibCall(Node, RTLIB::COS_F32, RTLIB::COS_F64,
4480 RTLIB::COS_F80, RTLIB::COS_F128,
4481 RTLIB::COS_PPCF128, Results);
4482 break;
4483 case ISD::FTAN:
4484 case ISD::STRICT_FTAN:
4485 ExpandFPLibCall(Node, RTLIB::TAN_F32, RTLIB::TAN_F64, RTLIB::TAN_F80,
4486 RTLIB::TAN_F128, RTLIB::TAN_PPCF128, Results);
4487 break;
4488 case ISD::FASIN:
4489 case ISD::STRICT_FASIN:
4490 ExpandFPLibCall(Node, RTLIB::ASIN_F32, RTLIB::ASIN_F64, RTLIB::ASIN_F80,
4491 RTLIB::ASIN_F128, RTLIB::ASIN_PPCF128, Results);
4492 break;
4493 case ISD::FACOS:
4494 case ISD::STRICT_FACOS:
4495 ExpandFPLibCall(Node, RTLIB::ACOS_F32, RTLIB::ACOS_F64, RTLIB::ACOS_F80,
4496 RTLIB::ACOS_F128, RTLIB::ACOS_PPCF128, Results);
4497 break;
4498 case ISD::FATAN:
4499 case ISD::STRICT_FATAN:
4500 ExpandFPLibCall(Node, RTLIB::ATAN_F32, RTLIB::ATAN_F64, RTLIB::ATAN_F80,
4501 RTLIB::ATAN_F128, RTLIB::ATAN_PPCF128, Results);
4502 break;
4503 case ISD::FATAN2:
4504 case ISD::STRICT_FATAN2:
4505 ExpandFPLibCall(Node, RTLIB::ATAN2_F32, RTLIB::ATAN2_F64, RTLIB::ATAN2_F80,
4506 RTLIB::ATAN2_F128, RTLIB::ATAN2_PPCF128, Results);
4507 break;
4508 case ISD::FSINH:
4509 case ISD::STRICT_FSINH:
4510 ExpandFPLibCall(Node, RTLIB::SINH_F32, RTLIB::SINH_F64, RTLIB::SINH_F80,
4511 RTLIB::SINH_F128, RTLIB::SINH_PPCF128, Results);
4512 break;
4513 case ISD::FCOSH:
4514 case ISD::STRICT_FCOSH:
4515 ExpandFPLibCall(Node, RTLIB::COSH_F32, RTLIB::COSH_F64, RTLIB::COSH_F80,
4516 RTLIB::COSH_F128, RTLIB::COSH_PPCF128, Results);
4517 break;
4518 case ISD::FTANH:
4519 case ISD::STRICT_FTANH:
4520 ExpandFPLibCall(Node, RTLIB::TANH_F32, RTLIB::TANH_F64, RTLIB::TANH_F80,
4521 RTLIB::TANH_F128, RTLIB::TANH_PPCF128, Results);
4522 break;
4523 case ISD::FSINCOS: {
4524 RTLIB::Libcall LC = RTLIB::getFSINCOS(Node->getValueType(0));
4525 bool Expanded = DAG.expandMultipleResultFPLibCall(LC, Node, Results);
4526 if (!Expanded)
4527 llvm_unreachable("Expected scalar FSINCOS to expand to libcall!");
4528 break;
4529 }
4530 case ISD::FLOG:
4531 case ISD::STRICT_FLOG:
4532 ExpandFPLibCall(Node, RTLIB::LOG_F32, RTLIB::LOG_F64, RTLIB::LOG_F80,
4533 RTLIB::LOG_F128, RTLIB::LOG_PPCF128, Results);
4534 break;
4535 case ISD::FLOG2:
4536 case ISD::STRICT_FLOG2:
4537 ExpandFPLibCall(Node, RTLIB::LOG2_F32, RTLIB::LOG2_F64, RTLIB::LOG2_F80,
4538 RTLIB::LOG2_F128, RTLIB::LOG2_PPCF128, Results);
4539 break;
4540 case ISD::FLOG10:
4541 case ISD::STRICT_FLOG10:
4542 ExpandFPLibCall(Node, RTLIB::LOG10_F32, RTLIB::LOG10_F64, RTLIB::LOG10_F80,
4543 RTLIB::LOG10_F128, RTLIB::LOG10_PPCF128, Results);
4544 break;
4545 case ISD::FEXP:
4546 case ISD::STRICT_FEXP:
4547 ExpandFPLibCall(Node, RTLIB::EXP_F32, RTLIB::EXP_F64, RTLIB::EXP_F80,
4548 RTLIB::EXP_F128, RTLIB::EXP_PPCF128, Results);
4549 break;
4550 case ISD::FEXP2:
4551 case ISD::STRICT_FEXP2:
4552 ExpandFPLibCall(Node, RTLIB::EXP2_F32, RTLIB::EXP2_F64, RTLIB::EXP2_F80,
4553 RTLIB::EXP2_F128, RTLIB::EXP2_PPCF128, Results);
4554 break;
4555 case ISD::FEXP10:
4556 ExpandFPLibCall(Node, RTLIB::EXP10_F32, RTLIB::EXP10_F64, RTLIB::EXP10_F80,
4557 RTLIB::EXP10_F128, RTLIB::EXP10_PPCF128, Results);
4558 break;
4559 case ISD::FTRUNC:
4560 case ISD::STRICT_FTRUNC:
4561 ExpandFPLibCall(Node, RTLIB::TRUNC_F32, RTLIB::TRUNC_F64,
4562 RTLIB::TRUNC_F80, RTLIB::TRUNC_F128,
4563 RTLIB::TRUNC_PPCF128, Results);
4564 break;
4565 case ISD::FFLOOR:
4566 case ISD::STRICT_FFLOOR:
4567 ExpandFPLibCall(Node, RTLIB::FLOOR_F32, RTLIB::FLOOR_F64,
4568 RTLIB::FLOOR_F80, RTLIB::FLOOR_F128,
4569 RTLIB::FLOOR_PPCF128, Results);
4570 break;
4571 case ISD::FCEIL:
4572 case ISD::STRICT_FCEIL:
4573 ExpandFPLibCall(Node, RTLIB::CEIL_F32, RTLIB::CEIL_F64,
4574 RTLIB::CEIL_F80, RTLIB::CEIL_F128,
4575 RTLIB::CEIL_PPCF128, Results);
4576 break;
4577 case ISD::FRINT:
4578 case ISD::STRICT_FRINT:
4579 ExpandFPLibCall(Node, RTLIB::RINT_F32, RTLIB::RINT_F64,
4580 RTLIB::RINT_F80, RTLIB::RINT_F128,
4581 RTLIB::RINT_PPCF128, Results);
4582 break;
4583 case ISD::FNEARBYINT:
4585 ExpandFPLibCall(Node, RTLIB::NEARBYINT_F32,
4586 RTLIB::NEARBYINT_F64,
4587 RTLIB::NEARBYINT_F80,
4588 RTLIB::NEARBYINT_F128,
4589 RTLIB::NEARBYINT_PPCF128, Results);
4590 break;
4591 case ISD::FROUND:
4592 case ISD::STRICT_FROUND:
4593 ExpandFPLibCall(Node, RTLIB::ROUND_F32,
4594 RTLIB::ROUND_F64,
4595 RTLIB::ROUND_F80,
4596 RTLIB::ROUND_F128,
4597 RTLIB::ROUND_PPCF128, Results);
4598 break;
4599 case ISD::FROUNDEVEN:
4601 ExpandFPLibCall(Node, RTLIB::ROUNDEVEN_F32,
4602 RTLIB::ROUNDEVEN_F64,
4603 RTLIB::ROUNDEVEN_F80,
4604 RTLIB::ROUNDEVEN_F128,
4605 RTLIB::ROUNDEVEN_PPCF128, Results);
4606 break;
4607 case ISD::FLDEXP:
4608 case ISD::STRICT_FLDEXP:
4609 ExpandFPLibCall(Node, RTLIB::LDEXP_F32, RTLIB::LDEXP_F64, RTLIB::LDEXP_F80,
4610 RTLIB::LDEXP_F128, RTLIB::LDEXP_PPCF128, Results);
4611 break;
4612 case ISD::FFREXP: {
4613 RTLIB::Libcall LC = RTLIB::getFREXP(Node->getValueType(0));
4614 bool Expanded = DAG.expandMultipleResultFPLibCall(LC, Node, Results,
4615 /*CallRetResNo=*/0);
4616 if (!Expanded)
4617 llvm_unreachable("Expected scalar FFREXP to expand to libcall!");
4618 break;
4619 }
4620 case ISD::FPOWI:
4621 case ISD::STRICT_FPOWI: {
4622 RTLIB::Libcall LC = RTLIB::getPOWI(Node->getSimpleValueType(0));
4623 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected fpowi.");
4624 if (!TLI.getLibcallName(LC)) {
4625 // Some targets don't have a powi libcall; use pow instead.
4626 if (Node->isStrictFPOpcode()) {
4628 DAG.getNode(ISD::STRICT_SINT_TO_FP, SDLoc(Node),
4629 {Node->getValueType(0), Node->getValueType(1)},
4630 {Node->getOperand(0), Node->getOperand(2)});
4631 SDValue FPOW =
4632 DAG.getNode(ISD::STRICT_FPOW, SDLoc(Node),
4633 {Node->getValueType(0), Node->getValueType(1)},
4634 {Exponent.getValue(1), Node->getOperand(1), Exponent});
4635 Results.push_back(FPOW);
4636 Results.push_back(FPOW.getValue(1));
4637 } else {
4639 DAG.getNode(ISD::SINT_TO_FP, SDLoc(Node), Node->getValueType(0),
4640 Node->getOperand(1));
4641 Results.push_back(DAG.getNode(ISD::FPOW, SDLoc(Node),
4642 Node->getValueType(0),
4643 Node->getOperand(0), Exponent));
4644 }
4645 break;
4646 }
4647 unsigned Offset = Node->isStrictFPOpcode() ? 1 : 0;
4648 bool ExponentHasSizeOfInt =
4649 DAG.getLibInfo().getIntSize() ==
4650 Node->getOperand(1 + Offset).getValueType().getSizeInBits();
4651 if (!ExponentHasSizeOfInt) {
4652 // If the exponent does not match with sizeof(int) a libcall to
4653 // RTLIB::POWI would use the wrong type for the argument.
4654 DAG.getContext()->emitError("POWI exponent does not match sizeof(int)");
4655 Results.push_back(DAG.getUNDEF(Node->getValueType(0)));
4656 break;
4657 }
4658 ExpandFPLibCall(Node, LC, Results);
4659 break;
4660 }
4661 case ISD::FPOW:
4662 case ISD::STRICT_FPOW:
4663 ExpandFPLibCall(Node, RTLIB::POW_F32, RTLIB::POW_F64, RTLIB::POW_F80,
4664 RTLIB::POW_F128, RTLIB::POW_PPCF128, Results);
4665 break;
4666 case ISD::LROUND:
4667 case ISD::STRICT_LROUND:
4668 ExpandArgFPLibCall(Node, RTLIB::LROUND_F32,
4669 RTLIB::LROUND_F64, RTLIB::LROUND_F80,
4670 RTLIB::LROUND_F128,
4671 RTLIB::LROUND_PPCF128, Results);
4672 break;
4673 case ISD::LLROUND:
4675 ExpandArgFPLibCall(Node, RTLIB::LLROUND_F32,
4676 RTLIB::LLROUND_F64, RTLIB::LLROUND_F80,
4677 RTLIB::LLROUND_F128,
4678 RTLIB::LLROUND_PPCF128, Results);
4679 break;
4680 case ISD::LRINT:
4681 case ISD::STRICT_LRINT:
4682 ExpandArgFPLibCall(Node, RTLIB::LRINT_F32,
4683 RTLIB::LRINT_F64, RTLIB::LRINT_F80,
4684 RTLIB::LRINT_F128,
4685 RTLIB::LRINT_PPCF128, Results);
4686 break;
4687 case ISD::LLRINT:
4688 case ISD::STRICT_LLRINT:
4689 ExpandArgFPLibCall(Node, RTLIB::LLRINT_F32,
4690 RTLIB::LLRINT_F64, RTLIB::LLRINT_F80,
4691 RTLIB::LLRINT_F128,
4692 RTLIB::LLRINT_PPCF128, Results);
4693 break;
4694 case ISD::FDIV:
4695 case ISD::STRICT_FDIV:
4696 ExpandFPLibCall(Node, RTLIB::DIV_F32, RTLIB::DIV_F64,
4697 RTLIB::DIV_F80, RTLIB::DIV_F128,
4698 RTLIB::DIV_PPCF128, Results);
4699 break;
4700 case ISD::FREM:
4701 case ISD::STRICT_FREM:
4702 ExpandFPLibCall(Node, RTLIB::REM_F32, RTLIB::REM_F64,
4703 RTLIB::REM_F80, RTLIB::REM_F128,
4704 RTLIB::REM_PPCF128, Results);
4705 break;
4706 case ISD::FMA:
4707 case ISD::STRICT_FMA:
4708 ExpandFPLibCall(Node, RTLIB::FMA_F32, RTLIB::FMA_F64,
4709 RTLIB::FMA_F80, RTLIB::FMA_F128,
4710 RTLIB::FMA_PPCF128, Results);
4711 break;
4712 case ISD::FADD:
4713 case ISD::STRICT_FADD:
4714 ExpandFPLibCall(Node, RTLIB::ADD_F32, RTLIB::ADD_F64,
4715 RTLIB::ADD_F80, RTLIB::ADD_F128,
4716 RTLIB::ADD_PPCF128, Results);
4717 break;
4718 case ISD::FMUL:
4719 case ISD::STRICT_FMUL:
4720 ExpandFPLibCall(Node, RTLIB::MUL_F32, RTLIB::MUL_F64,
4721 RTLIB::MUL_F80, RTLIB::MUL_F128,
4722 RTLIB::MUL_PPCF128, Results);
4723 break;
4724 case ISD::FP16_TO_FP:
4725 if (Node->getValueType(0) == MVT::f32) {
4726 Results.push_back(ExpandLibCall(RTLIB::FPEXT_F16_F32, Node, false).first);
4727 }
4728 break;
4730 if (Node->getValueType(0) == MVT::f32) {
4731 std::pair<SDValue, SDValue> Tmp = TLI.makeLibCall(
4732 DAG, RTLIB::FPEXT_BF16_F32, MVT::f32, Node->getOperand(1),
4733 CallOptions, SDLoc(Node), Node->getOperand(0));
4734 Results.push_back(Tmp.first);
4735 Results.push_back(Tmp.second);
4736 }
4737 break;
4739 if (Node->getValueType(0) == MVT::f32) {
4740 std::pair<SDValue, SDValue> Tmp = TLI.makeLibCall(
4741 DAG, RTLIB::FPEXT_F16_F32, MVT::f32, Node->getOperand(1), CallOptions,
4742 SDLoc(Node), Node->getOperand(0));
4743 Results.push_back(Tmp.first);
4744 Results.push_back(Tmp.second);
4745 }
4746 break;
4747 }
4748 case ISD::FP_TO_FP16: {
4749 RTLIB::Libcall LC =
4750 RTLIB::getFPROUND(Node->getOperand(0).getValueType(), MVT::f16);
4751 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unable to expand fp_to_fp16");
4752 Results.push_back(ExpandLibCall(LC, Node, false).first);
4753 break;
4754 }
4755 case ISD::FP_TO_BF16: {
4756 RTLIB::Libcall LC =
4757 RTLIB::getFPROUND(Node->getOperand(0).getValueType(), MVT::bf16);
4758 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unable to expand fp_to_bf16");
4759 Results.push_back(ExpandLibCall(LC, Node, false).first);
4760 break;
4761 }
4764 case ISD::SINT_TO_FP:
4765 case ISD::UINT_TO_FP: {
4766 // TODO - Common the code with DAGTypeLegalizer::SoftenFloatRes_XINT_TO_FP
4767 bool IsStrict = Node->isStrictFPOpcode();
4768 bool Signed = Node->getOpcode() == ISD::SINT_TO_FP ||
4769 Node->getOpcode() == ISD::STRICT_SINT_TO_FP;
4770 EVT SVT = Node->getOperand(IsStrict ? 1 : 0).getValueType();
4771 EVT RVT = Node->getValueType(0);
4772 EVT NVT = EVT();
4773 SDLoc dl(Node);
4774
4775 // Even if the input is legal, no libcall may exactly match, eg. we don't
4776 // have i1 -> fp conversions. So, it needs to be promoted to a larger type,
4777 // eg: i13 -> fp. Then, look for an appropriate libcall.
4778 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
4779 for (unsigned t = MVT::FIRST_INTEGER_VALUETYPE;
4780 t <= MVT::LAST_INTEGER_VALUETYPE && LC == RTLIB::UNKNOWN_LIBCALL;
4781 ++t) {
4782 NVT = (MVT::SimpleValueType)t;
4783 // The source needs to big enough to hold the operand.
4784 if (NVT.bitsGE(SVT))
4785 LC = Signed ? RTLIB::getSINTTOFP(NVT, RVT)
4786 : RTLIB::getUINTTOFP(NVT, RVT);
4787 }
4788 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unable to legalize as libcall");
4789
4790 SDValue Chain = IsStrict ? Node->getOperand(0) : SDValue();
4791 // Sign/zero extend the argument if the libcall takes a larger type.
4792 SDValue Op = DAG.getNode(Signed ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND, dl,
4793 NVT, Node->getOperand(IsStrict ? 1 : 0));
4794 CallOptions.setIsSigned(Signed);
4795 std::pair<SDValue, SDValue> Tmp =
4796 TLI.makeLibCall(DAG, LC, RVT, Op, CallOptions, dl, Chain);
4797 Results.push_back(Tmp.first);
4798 if (IsStrict)
4799 Results.push_back(Tmp.second);
4800 break;
4801 }
4802 case ISD::FP_TO_SINT:
4803 case ISD::FP_TO_UINT:
4806 // TODO - Common the code with DAGTypeLegalizer::SoftenFloatOp_FP_TO_XINT.
4807 bool IsStrict = Node->isStrictFPOpcode();
4808 bool Signed = Node->getOpcode() == ISD::FP_TO_SINT ||
4809 Node->getOpcode() == ISD::STRICT_FP_TO_SINT;
4810
4811 SDValue Op = Node->getOperand(IsStrict ? 1 : 0);
4812 EVT SVT = Op.getValueType();
4813 EVT RVT = Node->getValueType(0);
4814 EVT NVT = EVT();
4815 SDLoc dl(Node);
4816
4817 // Even if the result is legal, no libcall may exactly match, eg. we don't
4818 // have fp -> i1 conversions. So, it needs to be promoted to a larger type,
4819 // eg: fp -> i32. Then, look for an appropriate libcall.
4820 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
4821 for (unsigned IntVT = MVT::FIRST_INTEGER_VALUETYPE;
4822 IntVT <= MVT::LAST_INTEGER_VALUETYPE && LC == RTLIB::UNKNOWN_LIBCALL;
4823 ++IntVT) {
4824 NVT = (MVT::SimpleValueType)IntVT;
4825 // The type needs to big enough to hold the result.
4826 if (NVT.bitsGE(RVT))
4827 LC = Signed ? RTLIB::getFPTOSINT(SVT, NVT)
4828 : RTLIB::getFPTOUINT(SVT, NVT);
4829 }
4830 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unable to legalize as libcall");
4831
4832 SDValue Chain = IsStrict ? Node->getOperand(0) : SDValue();
4833 std::pair<SDValue, SDValue> Tmp =
4834 TLI.makeLibCall(DAG, LC, NVT, Op, CallOptions, dl, Chain);
4835
4836 // Truncate the result if the libcall returns a larger type.
4837 Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, RVT, Tmp.first));
4838 if (IsStrict)
4839 Results.push_back(Tmp.second);
4840 break;
4841 }
4842
4843 case ISD::FP_ROUND:
4844 case ISD::STRICT_FP_ROUND: {
4845 // X = FP_ROUND(Y, TRUNC)
4846 // TRUNC is a flag, which is always an integer that is zero or one.
4847 // If TRUNC is 0, this is a normal rounding, if it is 1, this FP_ROUND
4848 // is known to not change the value of Y.
4849 // We can only expand it into libcall if the TRUNC is 0.
4850 bool IsStrict = Node->isStrictFPOpcode();
4851 SDValue Op = Node->getOperand(IsStrict ? 1 : 0);
4852 SDValue Chain = IsStrict ? Node->getOperand(0) : SDValue();
4853 EVT VT = Node->getValueType(0);
4854 assert(cast<ConstantSDNode>(Node->getOperand(IsStrict ? 2 : 1))->isZero() &&
4855 "Unable to expand as libcall if it is not normal rounding");
4856
4857 RTLIB::Libcall LC = RTLIB::getFPROUND(Op.getValueType(), VT);
4858 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unable to legalize as libcall");
4859
4860 std::pair<SDValue, SDValue> Tmp =
4861 TLI.makeLibCall(DAG, LC, VT, Op, CallOptions, SDLoc(Node), Chain);
4862 Results.push_back(Tmp.first);
4863 if (IsStrict)
4864 Results.push_back(Tmp.second);
4865 break;
4866 }
4867 case ISD::FP_EXTEND: {
4868 Results.push_back(
4869 ExpandLibCall(RTLIB::getFPEXT(Node->getOperand(0).getValueType(),
4870 Node->getValueType(0)),
4871 Node, false).first);
4872 break;
4873 }
4877 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
4878 if (Node->getOpcode() == ISD::STRICT_FP_TO_FP16)
4879 LC = RTLIB::getFPROUND(Node->getOperand(1).getValueType(), MVT::f16);
4880 else if (Node->getOpcode() == ISD::STRICT_FP_TO_BF16)
4881 LC = RTLIB::getFPROUND(Node->getOperand(1).getValueType(), MVT::bf16);
4882 else
4883 LC = RTLIB::getFPEXT(Node->getOperand(1).getValueType(),
4884 Node->getValueType(0));
4885
4886 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unable to legalize as libcall");
4887
4888 std::pair<SDValue, SDValue> Tmp =
4889 TLI.makeLibCall(DAG, LC, Node->getValueType(0), Node->getOperand(1),
4890 CallOptions, SDLoc(Node), Node->getOperand(0));
4891 Results.push_back(Tmp.first);
4892 Results.push_back(Tmp.second);
4893 break;
4894 }
4895 case ISD::FSUB:
4896 case ISD::STRICT_FSUB:
4897 ExpandFPLibCall(Node, RTLIB::SUB_F32, RTLIB::SUB_F64,
4898 RTLIB::SUB_F80, RTLIB::SUB_F128,
4899 RTLIB::SUB_PPCF128, Results);
4900 break;
4901 case ISD::SREM:
4902 Results.push_back(ExpandIntLibCall(Node, true,
4903 RTLIB::SREM_I8,
4904 RTLIB::SREM_I16, RTLIB::SREM_I32,
4905 RTLIB::SREM_I64, RTLIB::SREM_I128));
4906 break;
4907 case ISD::UREM:
4908 Results.push_back(ExpandIntLibCall(Node, false,
4909 RTLIB::UREM_I8,
4910 RTLIB::UREM_I16, RTLIB::UREM_I32,
4911 RTLIB::UREM_I64, RTLIB::UREM_I128));
4912 break;
4913 case ISD::SDIV:
4914 Results.push_back(ExpandIntLibCall(Node, true,
4915 RTLIB::SDIV_I8,
4916 RTLIB::SDIV_I16, RTLIB::SDIV_I32,
4917 RTLIB::SDIV_I64, RTLIB::SDIV_I128));
4918 break;
4919 case ISD::UDIV:
4920 Results.push_back(ExpandIntLibCall(Node, false,
4921 RTLIB::UDIV_I8,
4922 RTLIB::UDIV_I16, RTLIB::UDIV_I32,
4923 RTLIB::UDIV_I64, RTLIB::UDIV_I128));
4924 break;
4925 case ISD::SDIVREM:
4926 case ISD::UDIVREM:
4927 // Expand into divrem libcall
4928 ExpandDivRemLibCall(Node, Results);
4929 break;
4930 case ISD::MUL:
4931 Results.push_back(ExpandIntLibCall(Node, false,
4932 RTLIB::MUL_I8,
4933 RTLIB::MUL_I16, RTLIB::MUL_I32,
4934 RTLIB::MUL_I64, RTLIB::MUL_I128));
4935 break;
4937 switch (Node->getSimpleValueType(0).SimpleTy) {
4938 default:
4939 llvm_unreachable("LibCall explicitly requested, but not available");
4940 case MVT::i32:
4941 Results.push_back(ExpandLibCall(RTLIB::CTLZ_I32, Node, false).first);
4942 break;
4943 case MVT::i64:
4944 Results.push_back(ExpandLibCall(RTLIB::CTLZ_I64, Node, false).first);
4945 break;
4946 case MVT::i128:
4947 Results.push_back(ExpandLibCall(RTLIB::CTLZ_I128, Node, false).first);
4948 break;
4949 }
4950 break;
4951 case ISD::RESET_FPENV: {
4952 // It is legalized to call 'fesetenv(FE_DFL_ENV)'. On most targets
4953 // FE_DFL_ENV is defined as '((const fenv_t *) -1)' in glibc.
4954 EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout());
4955 SDValue Ptr = DAG.getAllOnesConstant(dl, PtrTy);
4956 SDValue Chain = Node->getOperand(0);
4957 Results.push_back(
4958 DAG.makeStateFunctionCall(RTLIB::FESETENV, Ptr, Chain, dl));
4959 break;
4960 }
4961 case ISD::GET_FPENV_MEM: {
4962 SDValue Chain = Node->getOperand(0);
4963 SDValue EnvPtr = Node->getOperand(1);
4964 Results.push_back(
4965 DAG.makeStateFunctionCall(RTLIB::FEGETENV, EnvPtr, Chain, dl));
4966 break;
4967 }
4968 case ISD::SET_FPENV_MEM: {
4969 SDValue Chain = Node->getOperand(0);
4970 SDValue EnvPtr = Node->getOperand(1);
4971 Results.push_back(
4972 DAG.makeStateFunctionCall(RTLIB::FESETENV, EnvPtr, Chain, dl));
4973 break;
4974 }
4975 case ISD::GET_FPMODE: {
4976 // Call fegetmode, which saves control modes into a stack slot. Then load
4977 // the value to return from the stack.
4978 EVT ModeVT = Node->getValueType(0);
4979 SDValue StackPtr = DAG.CreateStackTemporary(ModeVT);
4980 int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
4981 SDValue Chain = DAG.makeStateFunctionCall(RTLIB::FEGETMODE, StackPtr,
4982 Node->getOperand(0), dl);
4983 SDValue LdInst = DAG.getLoad(
4984 ModeVT, dl, Chain, StackPtr,
4985 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI));
4986 Results.push_back(LdInst);
4987 Results.push_back(LdInst.getValue(1));
4988 break;
4989 }
4990 case ISD::SET_FPMODE: {
4991 // Move control modes to stack slot and then call fesetmode with the pointer
4992 // to the slot as argument.
4993 SDValue Mode = Node->getOperand(1);
4994 EVT ModeVT = Mode.getValueType();
4995 SDValue StackPtr = DAG.CreateStackTemporary(ModeVT);
4996 int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
4997 SDValue StInst = DAG.getStore(
4998 Node->getOperand(0), dl, Mode, StackPtr,
4999 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI));
5000 Results.push_back(
5001 DAG.makeStateFunctionCall(RTLIB::FESETMODE, StackPtr, StInst, dl));
5002 break;
5003 }
5004 case ISD::RESET_FPMODE: {
5005 // It is legalized to a call 'fesetmode(FE_DFL_MODE)'. On most targets
5006 // FE_DFL_MODE is defined as '((const femode_t *) -1)' in glibc. If not, the
5007 // target must provide custom lowering.
5008 const DataLayout &DL = DAG.getDataLayout();
5009 EVT PtrTy = TLI.getPointerTy(DL);
5010 SDValue Mode = DAG.getAllOnesConstant(dl, PtrTy);
5011 Results.push_back(DAG.makeStateFunctionCall(RTLIB::FESETMODE, Mode,
5012 Node->getOperand(0), dl));
5013 break;
5014 }
5015 }
5016
5017 // Replace the original node with the legalized result.
5018 if (!Results.empty()) {
5019 LLVM_DEBUG(dbgs() << "Successfully converted node to libcall\n");
5020 ReplaceNode(Node, Results.data());
5021 } else
5022 LLVM_DEBUG(dbgs() << "Could not convert node to libcall\n");
5023}
5024
5025// Determine the vector type to use in place of an original scalar element when
5026// promoting equally sized vectors.
5028 MVT EltVT, MVT NewEltVT) {
5029 unsigned OldEltsPerNewElt = EltVT.getSizeInBits() / NewEltVT.getSizeInBits();
5030 MVT MidVT = OldEltsPerNewElt == 1
5031 ? NewEltVT
5032 : MVT::getVectorVT(NewEltVT, OldEltsPerNewElt);
5033 assert(TLI.isTypeLegal(MidVT) && "unexpected");
5034 return MidVT;
5035}
5036
5037void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
5038 LLVM_DEBUG(dbgs() << "Trying to promote node\n");
5040 MVT OVT = Node->getSimpleValueType(0);
5041 if (Node->getOpcode() == ISD::UINT_TO_FP ||
5042 Node->getOpcode() == ISD::SINT_TO_FP ||
5043 Node->getOpcode() == ISD::SETCC ||
5044 Node->getOpcode() == ISD::EXTRACT_VECTOR_ELT ||
5045 Node->getOpcode() == ISD::INSERT_VECTOR_ELT) {
5046 OVT = Node->getOperand(0).getSimpleValueType();
5047 }
5048 if (Node->getOpcode() == ISD::ATOMIC_STORE ||
5049 Node->getOpcode() == ISD::STRICT_UINT_TO_FP ||
5050 Node->getOpcode() == ISD::STRICT_SINT_TO_FP ||
5051 Node->getOpcode() == ISD::STRICT_FSETCC ||
5052 Node->getOpcode() == ISD::STRICT_FSETCCS ||
5053 Node->getOpcode() == ISD::VP_REDUCE_FADD ||
5054 Node->getOpcode() == ISD::VP_REDUCE_FMUL ||
5055 Node->getOpcode() == ISD::VP_REDUCE_FMAX ||
5056 Node->getOpcode() == ISD::VP_REDUCE_FMIN ||
5057 Node->getOpcode() == ISD::VP_REDUCE_FMAXIMUM ||
5058 Node->getOpcode() == ISD::VP_REDUCE_FMINIMUM ||
5059 Node->getOpcode() == ISD::VP_REDUCE_SEQ_FADD)
5060 OVT = Node->getOperand(1).getSimpleValueType();
5061 if (Node->getOpcode() == ISD::BR_CC ||
5062 Node->getOpcode() == ISD::SELECT_CC)
5063 OVT = Node->getOperand(2).getSimpleValueType();
5064 MVT NVT = TLI.getTypeToPromoteTo(Node->getOpcode(), OVT);
5065 SDLoc dl(Node);
5066 SDValue Tmp1, Tmp2, Tmp3, Tmp4;
5067 switch (Node->getOpcode()) {
5068 case ISD::CTTZ:
5070 case ISD::CTLZ:
5071 case ISD::CTPOP: {
5072 // Zero extend the argument unless its cttz, then use any_extend.
5073 if (Node->getOpcode() == ISD::CTTZ ||
5074 Node->getOpcode() == ISD::CTTZ_ZERO_UNDEF)
5075 Tmp1 = DAG.getNode(ISD::ANY_EXTEND, dl, NVT, Node->getOperand(0));
5076 else
5077 Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Node->getOperand(0));
5078
5079 unsigned NewOpc = Node->getOpcode();
5080 if (NewOpc == ISD::CTTZ) {
5081 // The count is the same in the promoted type except if the original
5082 // value was zero. This can be handled by setting the bit just off
5083 // the top of the original type.
5084 auto TopBit = APInt::getOneBitSet(NVT.getSizeInBits(),
5085 OVT.getSizeInBits());
5086 Tmp1 = DAG.getNode(ISD::OR, dl, NVT, Tmp1,
5087 DAG.getConstant(TopBit, dl, NVT));
5088 NewOpc = ISD::CTTZ_ZERO_UNDEF;
5089 }
5090 // Perform the larger operation. For CTPOP and CTTZ_ZERO_UNDEF, this is
5091 // already the correct result.
5092 Tmp1 = DAG.getNode(NewOpc, dl, NVT, Tmp1);
5093 if (NewOpc == ISD::CTLZ) {
5094 // Tmp1 = Tmp1 - (sizeinbits(NVT) - sizeinbits(Old VT))
5095 Tmp1 = DAG.getNode(ISD::SUB, dl, NVT, Tmp1,
5096 DAG.getConstant(NVT.getSizeInBits() -
5097 OVT.getSizeInBits(), dl, NVT));
5098 }
5099 Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, OVT, Tmp1));
5100 break;
5101 }
5102 case ISD::CTLZ_ZERO_UNDEF: {
5103 // We know that the argument is unlikely to be zero, hence we can take a
5104 // different approach as compared to ISD::CTLZ
5105
5106 // Any Extend the argument
5107 auto AnyExtendedNode =
5108 DAG.getNode(ISD::ANY_EXTEND, dl, NVT, Node->getOperand(0));
5109
5110 // Tmp1 = Tmp1 << (sizeinbits(NVT) - sizeinbits(Old VT))
5111 auto ShiftConstant = DAG.getShiftAmountConstant(
5112 NVT.getSizeInBits() - OVT.getSizeInBits(), NVT, dl);
5113 auto LeftShiftResult =
5114 DAG.getNode(ISD::SHL, dl, NVT, AnyExtendedNode, ShiftConstant);
5115
5116 // Perform the larger operation
5117 auto CTLZResult = DAG.getNode(Node->getOpcode(), dl, NVT, LeftShiftResult);
5118 Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, OVT, CTLZResult));
5119 break;
5120 }
5121 case ISD::BITREVERSE:
5122 case ISD::BSWAP: {
5123 unsigned DiffBits = NVT.getSizeInBits() - OVT.getSizeInBits();
5124 Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Node->getOperand(0));
5125 Tmp1 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1);
5126 Tmp1 = DAG.getNode(
5127 ISD::SRL, dl, NVT, Tmp1,
5128 DAG.getConstant(DiffBits, dl,
5129 TLI.getShiftAmountTy(NVT, DAG.getDataLayout())));
5130
5131 Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, OVT, Tmp1));
5132 break;
5133 }
5134 case ISD::FP_TO_UINT:
5136 case ISD::FP_TO_SINT:
5138 PromoteLegalFP_TO_INT(Node, dl, Results);
5139 break;
5142 Results.push_back(PromoteLegalFP_TO_INT_SAT(Node, dl));
5143 break;
5144 case ISD::UINT_TO_FP:
5146 case ISD::SINT_TO_FP:
5148 PromoteLegalINT_TO_FP(Node, dl, Results);
5149 break;
5150 case ISD::VAARG: {
5151 SDValue Chain = Node->getOperand(0); // Get the chain.
5152 SDValue Ptr = Node->getOperand(1); // Get the pointer.
5153
5154 unsigned TruncOp;
5155 if (OVT.isVector()) {
5156 TruncOp = ISD::BITCAST;
5157 } else {
5158 assert(OVT.isInteger()
5159 && "VAARG promotion is supported only for vectors or integer types");
5160 TruncOp = ISD::TRUNCATE;
5161 }
5162
5163 // Perform the larger operation, then convert back
5164 Tmp1 = DAG.getVAArg(NVT, dl, Chain, Ptr, Node->getOperand(2),
5165 Node->getConstantOperandVal(3));
5166 Chain = Tmp1.getValue(1);
5167
5168 Tmp2 = DAG.getNode(TruncOp, dl, OVT, Tmp1);
5169
5170 // Modified the chain result - switch anything that used the old chain to
5171 // use the new one.
5172 DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 0), Tmp2);
5173 DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 1), Chain);
5174 if (UpdatedNodes) {
5175 UpdatedNodes->insert(Tmp2.getNode());
5176 UpdatedNodes->insert(Chain.getNode());
5177 }
5178 ReplacedNode(Node);
5179 break;
5180 }
5181 case ISD::MUL:
5182 case ISD::SDIV:
5183 case ISD::SREM:
5184 case ISD::UDIV:
5185 case ISD::UREM:
5186 case ISD::SMIN:
5187 case ISD::SMAX:
5188 case ISD::UMIN:
5189 case ISD::UMAX:
5190 case ISD::AND:
5191 case ISD::OR:
5192 case ISD::XOR: {
5193 unsigned ExtOp, TruncOp;
5194 if (OVT.isVector()) {
5195 ExtOp = ISD::BITCAST;
5196 TruncOp = ISD::BITCAST;
5197 } else {
5198 assert(OVT.isInteger() && "Cannot promote logic operation");
5199
5200 switch (Node->getOpcode()) {
5201 default:
5202 ExtOp = ISD::ANY_EXTEND;
5203 break;
5204 case ISD::SDIV:
5205 case ISD::SREM:
5206 case ISD::SMIN:
5207 case ISD::SMAX:
5208 ExtOp = ISD::SIGN_EXTEND;
5209 break;
5210 case ISD::UDIV:
5211 case ISD::UREM:
5212 ExtOp = ISD::ZERO_EXTEND;
5213 break;
5214 case ISD::UMIN:
5215 case ISD::UMAX:
5216 if (TLI.isSExtCheaperThanZExt(OVT, NVT))
5217 ExtOp = ISD::SIGN_EXTEND;
5218 else
5219 ExtOp = ISD::ZERO_EXTEND;
5220 break;
5221 }
5222 TruncOp = ISD::TRUNCATE;
5223 }
5224 // Promote each of the values to the new type.
5225 Tmp1 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(0));
5226 Tmp2 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(1));
5227 // Perform the larger operation, then convert back
5228 Tmp1 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2);
5229 Results.push_back(DAG.getNode(TruncOp, dl, OVT, Tmp1));
5230 break;
5231 }
5232 case ISD::UMUL_LOHI:
5233 case ISD::SMUL_LOHI: {
5234 // Promote to a multiply in a wider integer type.
5235 unsigned ExtOp = Node->getOpcode() == ISD::UMUL_LOHI ? ISD::ZERO_EXTEND
5237 Tmp1 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(0));
5238 Tmp2 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(1));
5239 Tmp1 = DAG.getNode(ISD::MUL, dl, NVT, Tmp1, Tmp2);
5240
5241 auto &DL = DAG.getDataLayout();
5242 unsigned OriginalSize = OVT.getScalarSizeInBits();
5243 Tmp2 = DAG.getNode(
5244 ISD::SRL, dl, NVT, Tmp1,
5245 DAG.getConstant(OriginalSize, dl, TLI.getScalarShiftAmountTy(DL, NVT)));
5246 Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, OVT, Tmp1));
5247 Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, OVT, Tmp2));
5248 break;
5249 }
5250 case ISD::SELECT: {
5251 unsigned ExtOp, TruncOp;
5252 if (Node->getValueType(0).isVector() ||
5253 Node->getValueType(0).getSizeInBits() == NVT.getSizeInBits()) {
5254 ExtOp = ISD::BITCAST;
5255 TruncOp = ISD::BITCAST;
5256 } else if (Node->getValueType(0).isInteger()) {
5257 ExtOp = ISD::ANY_EXTEND;
5258 TruncOp = ISD::TRUNCATE;
5259 } else {
5260 ExtOp = ISD::FP_EXTEND;
5261 TruncOp = ISD::FP_ROUND;
5262 }
5263 Tmp1 = Node->getOperand(0);
5264 // Promote each of the values to the new type.
5265 Tmp2 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(1));
5266 Tmp3 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(2));
5267 // Perform the larger operation, then round down.
5268 Tmp1 = DAG.getSelect(dl, NVT, Tmp1, Tmp2, Tmp3);
5269 Tmp1->setFlags(Node->getFlags());
5270 if (TruncOp != ISD::FP_ROUND)
5271 Tmp1 = DAG.getNode(TruncOp, dl, Node->getValueType(0), Tmp1);
5272 else
5273 Tmp1 = DAG.getNode(TruncOp, dl, Node->getValueType(0), Tmp1,
5274 DAG.getIntPtrConstant(0, dl, /*isTarget=*/true));
5275 Results.push_back(Tmp1);
5276 break;
5277 }
5278 case ISD::VECTOR_SHUFFLE: {
5279 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(Node)->getMask();
5280
5281 // Cast the two input vectors.
5282 Tmp1 = DAG.getNode(ISD::BITCAST, dl, NVT, Node->getOperand(0));
5283 Tmp2 = DAG.getNode(ISD::BITCAST, dl, NVT, Node->getOperand(1));
5284
5285 // Convert the shuffle mask to the right # elements.
5286 Tmp1 = ShuffleWithNarrowerEltType(NVT, OVT, dl, Tmp1, Tmp2, Mask);
5287 Tmp1 = DAG.getNode(ISD::BITCAST, dl, OVT, Tmp1);
5288 Results.push_back(Tmp1);
5289 break;
5290 }
5291 case ISD::VECTOR_SPLICE: {
5292 Tmp1 = DAG.getNode(ISD::ANY_EXTEND, dl, NVT, Node->getOperand(0));
5293 Tmp2 = DAG.getNode(ISD::ANY_EXTEND, dl, NVT, Node->getOperand(1));
5294 Tmp3 = DAG.getNode(ISD::VECTOR_SPLICE, dl, NVT, Tmp1, Tmp2,
5295 Node->getOperand(2));
5296 Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, OVT, Tmp3));
5297 break;
5298 }
5299 case ISD::SELECT_CC: {
5300 SDValue Cond = Node->getOperand(4);
5301 ISD::CondCode CCCode = cast<CondCodeSDNode>(Cond)->get();
5302 // Type of the comparison operands.
5303 MVT CVT = Node->getSimpleValueType(0);
5304 assert(CVT == OVT && "not handled");
5305
5306 unsigned ExtOp = ISD::FP_EXTEND;
5307 if (NVT.isInteger()) {
5309 }
5310
5311 // Promote the comparison operands, if needed.
5312 if (TLI.isCondCodeLegal(CCCode, CVT)) {
5313 Tmp1 = Node->getOperand(0);
5314 Tmp2 = Node->getOperand(1);
5315 } else {
5316 Tmp1 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(0));
5317 Tmp2 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(1));
5318 }
5319 // Cast the true/false operands.
5320 Tmp3 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(2));
5321 Tmp4 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(3));
5322
5323 Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, NVT, {Tmp1, Tmp2, Tmp3, Tmp4, Cond},
5324 Node->getFlags());
5325
5326 // Cast the result back to the original type.
5327 if (ExtOp != ISD::FP_EXTEND)
5328 Tmp1 = DAG.getNode(ISD::TRUNCATE, dl, OVT, Tmp1);
5329 else
5330 Tmp1 = DAG.getNode(ISD::FP_ROUND, dl, OVT, Tmp1,
5331 DAG.getIntPtrConstant(0, dl, /*isTarget=*/true));
5332
5333 Results.push_back(Tmp1);
5334 break;
5335 }
5336 case ISD::SETCC:
5337 case ISD::STRICT_FSETCC:
5338 case ISD::STRICT_FSETCCS: {
5339 unsigned ExtOp = ISD::FP_EXTEND;
5340 if (NVT.isInteger()) {
5341 ISD::CondCode CCCode = cast<CondCodeSDNode>(Node->getOperand(2))->get();
5342 if (isSignedIntSetCC(CCCode) ||
5343 TLI.isSExtCheaperThanZExt(Node->getOperand(0).getValueType(), NVT))
5344 ExtOp = ISD::SIGN_EXTEND;
5345 else
5346 ExtOp = ISD::ZERO_EXTEND;
5347 }
5348 if (Node->isStrictFPOpcode()) {
5349 SDValue InChain = Node->getOperand(0);
5350 std::tie(Tmp1, std::ignore) =
5351 DAG.getStrictFPExtendOrRound(Node->getOperand(1), InChain, dl, NVT);
5352 std::tie(Tmp2, std::ignore) =
5353 DAG.getStrictFPExtendOrRound(Node->getOperand(2), InChain, dl, NVT);
5354 SmallVector<SDValue, 2> TmpChains = {Tmp1.getValue(1), Tmp2.getValue(1)};
5355 SDValue OutChain = DAG.getTokenFactor(dl, TmpChains);
5356 SDVTList VTs = DAG.getVTList(Node->getValueType(0), MVT::Other);
5357 Results.push_back(DAG.getNode(Node->getOpcode(), dl, VTs,
5358 {OutChain, Tmp1, Tmp2, Node->getOperand(3)},
5359 Node->getFlags()));
5360 Results.push_back(Results.back().getValue(1));
5361 break;
5362 }
5363 Tmp1 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(0));
5364 Tmp2 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(1));
5365 Results.push_back(DAG.getNode(ISD::SETCC, dl, Node->getValueType(0), Tmp1,
5366 Tmp2, Node->getOperand(2), Node->getFlags()));
5367 break;
5368 }
5369 case ISD::BR_CC: {
5370 unsigned ExtOp = ISD::FP_EXTEND;
5371 if (NVT.isInteger()) {
5372 ISD::CondCode CCCode =
5373 cast<CondCodeSDNode>(Node->getOperand(1))->get();
5375 }
5376 Tmp1 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(2));
5377 Tmp2 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(3));
5378 Results.push_back(DAG.getNode(ISD::BR_CC, dl, Node->getValueType(0),
5379 Node->getOperand(0), Node->getOperand(1),
5380 Tmp1, Tmp2, Node->getOperand(4)));
5381 break;
5382 }
5383 case ISD::FADD:
5384 case ISD::FSUB:
5385 case ISD::FMUL:
5386 case ISD::FDIV:
5387 case ISD::FREM:
5388 case ISD::FMINNUM:
5389 case ISD::FMAXNUM:
5390 case ISD::FMINIMUM:
5391 case ISD::FMAXIMUM:
5392 case ISD::FMINIMUMNUM:
5393 case ISD::FMAXIMUMNUM:
5394 case ISD::FPOW:
5395 case ISD::FATAN2:
5396 Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0));
5397 Tmp2 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(1));
5398 Tmp3 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2,
5399 Node->getFlags());
5400 Results.push_back(
5401 DAG.getNode(ISD::FP_ROUND, dl, OVT, Tmp3,
5402 DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)));
5403 break;
5404 case ISD::STRICT_FADD:
5405 case ISD::STRICT_FSUB:
5406 case ISD::STRICT_FMUL:
5407 case ISD::STRICT_FDIV:
5410 case ISD::STRICT_FREM:
5411 case ISD::STRICT_FPOW:
5412 case ISD::STRICT_FATAN2:
5413 Tmp1 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other},
5414 {Node->getOperand(0), Node->getOperand(1)});
5415 Tmp2 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other},
5416 {Node->getOperand(0), Node->getOperand(2)});
5417 Tmp3 = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Tmp1.getValue(1),
5418 Tmp2.getValue(1));
5419 Tmp1 = DAG.getNode(Node->getOpcode(), dl, {NVT, MVT::Other},
5420 {Tmp3, Tmp1, Tmp2});
5421 Tmp1 = DAG.getNode(ISD::STRICT_FP_ROUND, dl, {OVT, MVT::Other},
5422 {Tmp1.getValue(1), Tmp1,
5423 DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)});
5424 Results.push_back(Tmp1);
5425 Results.push_back(Tmp1.getValue(1));
5426 break;
5427 case ISD::FMA:
5428 Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0));
5429 Tmp2 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(1));
5430 Tmp3 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(2));
5431 Results.push_back(
5432 DAG.getNode(ISD::FP_ROUND, dl, OVT,
5433 DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2, Tmp3),
5434 DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)));
5435 break;
5436 case ISD::STRICT_FMA:
5437 Tmp1 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other},
5438 {Node->getOperand(0), Node->getOperand(1)});
5439 Tmp2 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other},
5440 {Node->getOperand(0), Node->getOperand(2)});
5441 Tmp3 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other},
5442 {Node->getOperand(0), Node->getOperand(3)});
5443 Tmp4 = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Tmp1.getValue(1),
5444 Tmp2.getValue(1), Tmp3.getValue(1));
5445 Tmp4 = DAG.getNode(Node->getOpcode(), dl, {NVT, MVT::Other},
5446 {Tmp4, Tmp1, Tmp2, Tmp3});
5447 Tmp4 = DAG.getNode(ISD::STRICT_FP_ROUND, dl, {OVT, MVT::Other},
5448 {Tmp4.getValue(1), Tmp4,
5449 DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)});
5450 Results.push_back(Tmp4);
5451 Results.push_back(Tmp4.getValue(1));
5452 break;
5453 case ISD::FCOPYSIGN:
5454 case ISD::FLDEXP:
5455 case ISD::FPOWI: {
5456 Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0));
5457 Tmp2 = Node->getOperand(1);
5458 Tmp3 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2);
5459
5460 // fcopysign doesn't change anything but the sign bit, so
5461 // (fp_round (fcopysign (fpext a), b))
5462 // is as precise as
5463 // (fp_round (fpext a))
5464 // which is a no-op. Mark it as a TRUNCating FP_ROUND.
5465 const bool isTrunc = (Node->getOpcode() == ISD::FCOPYSIGN);
5466 Results.push_back(
5467 DAG.getNode(ISD::FP_ROUND, dl, OVT, Tmp3,
5468 DAG.getIntPtrConstant(isTrunc, dl, /*isTarget=*/true)));
5469 break;
5470 }
5471 case ISD::STRICT_FLDEXP: {
5472 Tmp1 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other},
5473 {Node->getOperand(0), Node->getOperand(1)});
5474 Tmp2 = Node->getOperand(2);
5475 Tmp3 = DAG.getNode(ISD::STRICT_FLDEXP, dl, {NVT, MVT::Other},
5476 {Tmp1.getValue(1), Tmp1, Tmp2});
5477 Tmp4 = DAG.getNode(ISD::STRICT_FP_ROUND, dl, {OVT, MVT::Other},
5478 {Tmp3.getValue(1), Tmp3,
5479 DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)});
5480 Results.push_back(Tmp4);
5481 Results.push_back(Tmp4.getValue(1));
5482 break;
5483 }
5484 case ISD::STRICT_FPOWI:
5485 Tmp1 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other},
5486 {Node->getOperand(0), Node->getOperand(1)});
5487 Tmp2 = DAG.getNode(Node->getOpcode(), dl, {NVT, MVT::Other},
5488 {Tmp1.getValue(1), Tmp1, Node->getOperand(2)});
5489 Tmp3 = DAG.getNode(ISD::STRICT_FP_ROUND, dl, {OVT, MVT::Other},
5490 {Tmp2.getValue(1), Tmp2,
5491 DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)});
5492 Results.push_back(Tmp3);
5493 Results.push_back(Tmp3.getValue(1));
5494 break;
5495 case ISD::FFREXP: {
5496 Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0));
5497 Tmp2 = DAG.getNode(ISD::FFREXP, dl, {NVT, Node->getValueType(1)}, Tmp1);
5498
5499 Results.push_back(
5500 DAG.getNode(ISD::FP_ROUND, dl, OVT, Tmp2,
5501 DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)));
5502
5503 Results.push_back(Tmp2.getValue(1));
5504 break;
5505 }
5506 case ISD::FSINCOS: {
5507 Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0));
5508 Tmp2 = DAG.getNode(ISD::FSINCOS, dl, DAG.getVTList(NVT, NVT), Tmp1,
5509 Node->getFlags());
5510 Tmp3 = DAG.getIntPtrConstant(0, dl, /*isTarget=*/true);
5511 for (unsigned ResNum = 0; ResNum < Node->getNumValues(); ResNum++)
5512 Results.push_back(
5513 DAG.getNode(ISD::FP_ROUND, dl, OVT, Tmp2.getValue(ResNum), Tmp3));
5514 break;
5515 }
5516 case ISD::FFLOOR:
5517 case ISD::FCEIL:
5518 case ISD::FRINT:
5519 case ISD::FNEARBYINT:
5520 case ISD::FROUND:
5521 case ISD::FROUNDEVEN:
5522 case ISD::FTRUNC:
5523 case ISD::FNEG:
5524 case ISD::FSQRT:
5525 case ISD::FSIN:
5526 case ISD::FCOS:
5527 case ISD::FTAN:
5528 case ISD::FASIN:
5529 case ISD::FACOS:
5530 case ISD::FATAN:
5531 case ISD::FSINH:
5532 case ISD::FCOSH:
5533 case ISD::FTANH:
5534 case ISD::FLOG:
5535 case ISD::FLOG2:
5536 case ISD::FLOG10:
5537 case ISD::FABS:
5538 case ISD::FEXP:
5539 case ISD::FEXP2:
5540 case ISD::FEXP10:
5541 case ISD::FCANONICALIZE:
5542 Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0));
5543 Tmp2 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1);
5544 Results.push_back(
5545 DAG.getNode(ISD::FP_ROUND, dl, OVT, Tmp2,
5546 DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)));
5547 break;
5548 case ISD::STRICT_FFLOOR:
5549 case ISD::STRICT_FCEIL:
5550 case ISD::STRICT_FRINT:
5552 case ISD::STRICT_FROUND:
5554 case ISD::STRICT_FTRUNC:
5555 case ISD::STRICT_FSQRT:
5556 case ISD::STRICT_FSIN:
5557 case ISD::STRICT_FCOS:
5558 case ISD::STRICT_FTAN:
5559 case ISD::STRICT_FASIN:
5560 case ISD::STRICT_FACOS:
5561 case ISD::STRICT_FATAN:
5562 case ISD::STRICT_FSINH:
5563 case ISD::STRICT_FCOSH:
5564 case ISD::STRICT_FTANH:
5565 case ISD::STRICT_FLOG:
5566 case ISD::STRICT_FLOG2:
5567 case ISD::STRICT_FLOG10:
5568 case ISD::STRICT_FEXP:
5569 case ISD::STRICT_FEXP2:
5570 Tmp1 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other},
5571 {Node->getOperand(0), Node->getOperand(1)});
5572 Tmp2 = DAG.getNode(Node->getOpcode(), dl, {NVT, MVT::Other},
5573 {Tmp1.getValue(1), Tmp1});
5574 Tmp3 = DAG.getNode(ISD::STRICT_FP_ROUND, dl, {OVT, MVT::Other},
5575 {Tmp2.getValue(1), Tmp2,
5576 DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)});
5577 Results.push_back(Tmp3);
5578 Results.push_back(Tmp3.getValue(1));
5579 break;
5580 case ISD::BUILD_VECTOR: {
5581 MVT EltVT = OVT.getVectorElementType();
5582 MVT NewEltVT = NVT.getVectorElementType();
5583
5584 // Handle bitcasts to a different vector type with the same total bit size
5585 //
5586 // e.g. v2i64 = build_vector i64:x, i64:y => v4i32
5587 // =>
5588 // v4i32 = concat_vectors (v2i32 (bitcast i64:x)), (v2i32 (bitcast i64:y))
5589
5590 assert(NVT.isVector() && OVT.getSizeInBits() == NVT.getSizeInBits() &&
5591 "Invalid promote type for build_vector");
5592 assert(NewEltVT.bitsLE(EltVT) && "not handled");
5593
5594 MVT MidVT = getPromotedVectorElementType(TLI, EltVT, NewEltVT);
5595
5597 for (const SDValue &Op : Node->op_values())
5598 NewOps.push_back(DAG.getNode(ISD::BITCAST, SDLoc(Op), MidVT, Op));
5599
5600 SDLoc SL(Node);
5601 SDValue Concat =
5602 DAG.getNode(MidVT == NewEltVT ? ISD::BUILD_VECTOR : ISD::CONCAT_VECTORS,
5603 SL, NVT, NewOps);
5604 SDValue CvtVec = DAG.getNode(ISD::BITCAST, SL, OVT, Concat);
5605 Results.push_back(CvtVec);
5606 break;
5607 }
5609 MVT EltVT = OVT.getVectorElementType();
5610 MVT NewEltVT = NVT.getVectorElementType();
5611
5612 // Handle bitcasts to a different vector type with the same total bit size.
5613 //
5614 // e.g. v2i64 = extract_vector_elt x:v2i64, y:i32
5615 // =>
5616 // v4i32:castx = bitcast x:v2i64
5617 //
5618 // i64 = bitcast
5619 // (v2i32 build_vector (i32 (extract_vector_elt castx, (2 * y))),
5620 // (i32 (extract_vector_elt castx, (2 * y + 1)))
5621 //
5622
5623 assert(NVT.isVector() && OVT.getSizeInBits() == NVT.getSizeInBits() &&
5624 "Invalid promote type for extract_vector_elt");
5625 assert(NewEltVT.bitsLT(EltVT) && "not handled");
5626
5627 MVT MidVT = getPromotedVectorElementType(TLI, EltVT, NewEltVT);
5628 unsigned NewEltsPerOldElt = MidVT.getVectorNumElements();
5629
5630 SDValue Idx = Node->getOperand(1);
5631 EVT IdxVT = Idx.getValueType();
5632 SDLoc SL(Node);
5633 SDValue Factor = DAG.getConstant(NewEltsPerOldElt, SL, IdxVT);
5634 SDValue NewBaseIdx = DAG.getNode(ISD::MUL, SL, IdxVT, Idx, Factor);
5635
5636 SDValue CastVec = DAG.getNode(ISD::BITCAST, SL, NVT, Node->getOperand(0));
5637
5639 for (unsigned I = 0; I < NewEltsPerOldElt; ++I) {
5640 SDValue IdxOffset = DAG.getConstant(I, SL, IdxVT);
5641 SDValue TmpIdx = DAG.getNode(ISD::ADD, SL, IdxVT, NewBaseIdx, IdxOffset);
5642
5643 SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, NewEltVT,
5644 CastVec, TmpIdx);
5645 NewOps.push_back(Elt);
5646 }
5647
5648 SDValue NewVec = DAG.getBuildVector(MidVT, SL, NewOps);
5649 Results.push_back(DAG.getNode(ISD::BITCAST, SL, EltVT, NewVec));
5650 break;
5651 }
5653 MVT EltVT = OVT.getVectorElementType();
5654 MVT NewEltVT = NVT.getVectorElementType();
5655
5656 // Handle bitcasts to a different vector type with the same total bit size
5657 //
5658 // e.g. v2i64 = insert_vector_elt x:v2i64, y:i64, z:i32
5659 // =>
5660 // v4i32:castx = bitcast x:v2i64
5661 // v2i32:casty = bitcast y:i64
5662 //
5663 // v2i64 = bitcast
5664 // (v4i32 insert_vector_elt
5665 // (v4i32 insert_vector_elt v4i32:castx,
5666 // (extract_vector_elt casty, 0), 2 * z),
5667 // (extract_vector_elt casty, 1), (2 * z + 1))
5668
5669 assert(NVT.isVector() && OVT.getSizeInBits() == NVT.getSizeInBits() &&
5670 "Invalid promote type for insert_vector_elt");
5671 assert(NewEltVT.bitsLT(EltVT) && "not handled");
5672
5673 MVT MidVT = getPromotedVectorElementType(TLI, EltVT, NewEltVT);
5674 unsigned NewEltsPerOldElt = MidVT.getVectorNumElements();
5675
5676 SDValue Val = Node->getOperand(1);
5677 SDValue Idx = Node->getOperand(2);
5678 EVT IdxVT = Idx.getValueType();
5679 SDLoc SL(Node);
5680
5681 SDValue Factor = DAG.getConstant(NewEltsPerOldElt, SDLoc(), IdxVT);
5682 SDValue NewBaseIdx = DAG.getNode(ISD::MUL, SL, IdxVT, Idx, Factor);
5683
5684 SDValue CastVec = DAG.getNode(ISD::BITCAST, SL, NVT, Node->getOperand(0));
5685 SDValue CastVal = DAG.getNode(ISD::BITCAST, SL, MidVT, Val);
5686
5687 SDValue NewVec = CastVec;
5688 for (unsigned I = 0; I < NewEltsPerOldElt; ++I) {
5689 SDValue IdxOffset = DAG.getConstant(I, SL, IdxVT);
5690 SDValue InEltIdx = DAG.getNode(ISD::ADD, SL, IdxVT, NewBaseIdx, IdxOffset);
5691
5692 SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, NewEltVT,
5693 CastVal, IdxOffset);
5694
5695 NewVec = DAG.getNode(ISD::INSERT_VECTOR_ELT, SL, NVT,
5696 NewVec, Elt, InEltIdx);
5697 }
5698
5699 Results.push_back(DAG.getNode(ISD::BITCAST, SL, OVT, NewVec));
5700 break;
5701 }
5702 case ISD::SCALAR_TO_VECTOR: {
5703 MVT EltVT = OVT.getVectorElementType();
5704 MVT NewEltVT = NVT.getVectorElementType();
5705
5706 // Handle bitcasts to different vector type with the same total bit size.
5707 //
5708 // e.g. v2i64 = scalar_to_vector x:i64
5709 // =>
5710 // concat_vectors (v2i32 bitcast x:i64), (v2i32 undef)
5711 //
5712
5713 MVT MidVT = getPromotedVectorElementType(TLI, EltVT, NewEltVT);
5714 SDValue Val = Node->getOperand(0);
5715 SDLoc SL(Node);
5716
5717 SDValue CastVal = DAG.getNode(ISD::BITCAST, SL, MidVT, Val);
5718 SDValue Undef = DAG.getUNDEF(MidVT);
5719
5721 NewElts.push_back(CastVal);
5722 for (unsigned I = 1, NElts = OVT.getVectorNumElements(); I != NElts; ++I)
5723 NewElts.push_back(Undef);
5724
5725 SDValue Concat = DAG.getNode(ISD::CONCAT_VECTORS, SL, NVT, NewElts);
5726 SDValue CvtVec = DAG.getNode(ISD::BITCAST, SL, OVT, Concat);
5727 Results.push_back(CvtVec);
5728 break;
5729 }
5730 case ISD::ATOMIC_SWAP:
5731 case ISD::ATOMIC_STORE: {
5732 AtomicSDNode *AM = cast<AtomicSDNode>(Node);
5733 SDLoc SL(Node);
5734 SDValue CastVal = DAG.getNode(ISD::BITCAST, SL, NVT, AM->getVal());
5735 assert(NVT.getSizeInBits() == OVT.getSizeInBits() &&
5736 "unexpected promotion type");
5737 assert(AM->getMemoryVT().getSizeInBits() == NVT.getSizeInBits() &&
5738 "unexpected atomic_swap with illegal type");
5739
5740 SDValue Op0 = AM->getBasePtr();
5741 SDValue Op1 = CastVal;
5742
5743 // ATOMIC_STORE uses a swapped operand order from every other AtomicSDNode,
5744 // but really it should merge with ISD::STORE.
5745 if (AM->getOpcode() == ISD::ATOMIC_STORE)
5746 std::swap(Op0, Op1);
5747
5748 SDValue NewAtomic = DAG.getAtomic(AM->getOpcode(), SL, NVT, AM->getChain(),
5749 Op0, Op1, AM->getMemOperand());
5750
5751 if (AM->getOpcode() != ISD::ATOMIC_STORE) {
5752 Results.push_back(DAG.getNode(ISD::BITCAST, SL, OVT, NewAtomic));
5753 Results.push_back(NewAtomic.getValue(1));
5754 } else
5755 Results.push_back(NewAtomic);
5756 break;
5757 }
5758 case ISD::ATOMIC_LOAD: {
5759 AtomicSDNode *AM = cast<AtomicSDNode>(Node);
5760 SDLoc SL(Node);
5761 assert(NVT.getSizeInBits() == OVT.getSizeInBits() &&
5762 "unexpected promotion type");
5763 assert(AM->getMemoryVT().getSizeInBits() == NVT.getSizeInBits() &&
5764 "unexpected atomic_load with illegal type");
5765
5766 SDValue NewAtomic =
5767 DAG.getAtomic(ISD::ATOMIC_LOAD, SL, NVT, DAG.getVTList(NVT, MVT::Other),
5768 {AM->getChain(), AM->getBasePtr()}, AM->getMemOperand());
5769 Results.push_back(DAG.getNode(ISD::BITCAST, SL, OVT, NewAtomic));
5770 Results.push_back(NewAtomic.getValue(1));
5771 break;
5772 }
5773 case ISD::SPLAT_VECTOR: {
5774 SDValue Scalar = Node->getOperand(0);
5775 MVT ScalarType = Scalar.getSimpleValueType();
5776 MVT NewScalarType = NVT.getVectorElementType();
5777 if (ScalarType.isInteger()) {
5778 Tmp1 = DAG.getNode(ISD::ANY_EXTEND, dl, NewScalarType, Scalar);
5779 Tmp2 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1);
5780 Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, OVT, Tmp2));
5781 break;
5782 }
5783 Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NewScalarType, Scalar);
5784 Tmp2 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1);
5785 Results.push_back(
5786 DAG.getNode(ISD::FP_ROUND, dl, OVT, Tmp2,
5787 DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)));
5788 break;
5789 }
5790 case ISD::VP_REDUCE_FMAX:
5791 case ISD::VP_REDUCE_FMIN:
5792 case ISD::VP_REDUCE_FMAXIMUM:
5793 case ISD::VP_REDUCE_FMINIMUM:
5794 Results.push_back(PromoteReduction(Node));
5795 break;
5796 }
5797
5798 // Replace the original node with the legalized result.
5799 if (!Results.empty()) {
5800 LLVM_DEBUG(dbgs() << "Successfully promoted node\n");
5801 ReplaceNode(Node, Results.data());
5802 } else
5803 LLVM_DEBUG(dbgs() << "Could not promote node\n");
5804}
5805
5806/// This is the entry point for the file.
5809
5810 SmallPtrSet<SDNode *, 16> LegalizedNodes;
5811 // Use a delete listener to remove nodes which were deleted during
5812 // legalization from LegalizeNodes. This is needed to handle the situation
5813 // where a new node is allocated by the object pool to the same address of a
5814 // previously deleted node.
5815 DAGNodeDeletedListener DeleteListener(
5816 *this,
5817 [&LegalizedNodes](SDNode *N, SDNode *E) { LegalizedNodes.erase(N); });
5818
5819 SelectionDAGLegalize Legalizer(*this, LegalizedNodes);
5820
5821 // Visit all the nodes. We start in topological order, so that we see
5822 // nodes with their original operands intact. Legalization can produce
5823 // new nodes which may themselves need to be legalized. Iterate until all
5824 // nodes have been legalized.
5825 while (true) {
5826 bool AnyLegalized = false;
5827 for (auto NI = allnodes_end(); NI != allnodes_begin();) {
5828 --NI;
5829
5830 SDNode *N = &*NI;
5831 if (N->use_empty() && N != getRoot().getNode()) {
5832 ++NI;
5833 DeleteNode(N);
5834 continue;
5835 }
5836
5837 if (LegalizedNodes.insert(N).second) {
5838 AnyLegalized = true;
5839 Legalizer.LegalizeOp(N);
5840
5841 if (N->use_empty() && N != getRoot().getNode()) {
5842 ++NI;
5843 DeleteNode(N);
5844 }
5845 }
5846 }
5847 if (!AnyLegalized)
5848 break;
5849
5850 }
5851
5852 // Remove dead nodes now.
5854}
5855
5857 SmallSetVector<SDNode *, 16> &UpdatedNodes) {
5858 SmallPtrSet<SDNode *, 16> LegalizedNodes;
5859 SelectionDAGLegalize Legalizer(*this, LegalizedNodes, &UpdatedNodes);
5860
5861 // Directly insert the node in question, and legalize it. This will recurse
5862 // as needed through operands.
5863 LegalizedNodes.insert(N);
5864 Legalizer.LegalizeOp(N);
5865
5866 return LegalizedNodes.count(N);
5867}
#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:871
const BasicBlock & back() const
Definition: Function.h:874
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:80
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:1494
@ 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:1643
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
Definition: ISDOpcodes.h:1610
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
Definition: ISDOpcodes.h:1590
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:354
@ 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:297
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:341
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition: MathExtras.h:292
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:764
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)