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