LLVM 19.0.0git
SelectionDAG.cpp
Go to the documentation of this file.
1//===- SelectionDAG.cpp - Implement the SelectionDAG data structures ------===//
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 implements the SelectionDAG class.
10//
11//===----------------------------------------------------------------------===//
12
14#include "SDNodeDbgValue.h"
15#include "llvm/ADT/APFloat.h"
16#include "llvm/ADT/APInt.h"
17#include "llvm/ADT/APSInt.h"
18#include "llvm/ADT/ArrayRef.h"
19#include "llvm/ADT/BitVector.h"
20#include "llvm/ADT/DenseSet.h"
21#include "llvm/ADT/FoldingSet.h"
22#include "llvm/ADT/STLExtras.h"
25#include "llvm/ADT/Twine.h"
50#include "llvm/IR/Constant.h"
52#include "llvm/IR/Constants.h"
53#include "llvm/IR/DataLayout.h"
55#include "llvm/IR/DebugLoc.h"
57#include "llvm/IR/Function.h"
58#include "llvm/IR/GlobalValue.h"
59#include "llvm/IR/Metadata.h"
60#include "llvm/IR/Type.h"
64#include "llvm/Support/Debug.h"
68#include "llvm/Support/Mutex.h"
74#include <algorithm>
75#include <cassert>
76#include <cstdint>
77#include <cstdlib>
78#include <limits>
79#include <set>
80#include <string>
81#include <utility>
82#include <vector>
83
84using namespace llvm;
85using namespace llvm::SDPatternMatch;
86
87/// makeVTList - Return an instance of the SDVTList struct initialized with the
88/// specified members.
89static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs) {
90 SDVTList Res = {VTs, NumVTs};
91 return Res;
92}
93
94// Default null implementations of the callbacks.
98
99void SelectionDAG::DAGNodeDeletedListener::anchor() {}
100void SelectionDAG::DAGNodeInsertedListener::anchor() {}
101
102#define DEBUG_TYPE "selectiondag"
103
104static cl::opt<bool> EnableMemCpyDAGOpt("enable-memcpy-dag-opt",
105 cl::Hidden, cl::init(true),
106 cl::desc("Gang up loads and stores generated by inlining of memcpy"));
107
108static cl::opt<int> MaxLdStGlue("ldstmemcpy-glue-max",
109 cl::desc("Number limit for gluing ld/st of memcpy."),
110 cl::Hidden, cl::init(0));
111
113 LLVM_DEBUG(dbgs() << Msg; V.getNode()->dump(G););
114}
115
116//===----------------------------------------------------------------------===//
117// ConstantFPSDNode Class
118//===----------------------------------------------------------------------===//
119
120/// isExactlyValue - We don't rely on operator== working on double values, as
121/// it returns true for things that are clearly not equal, like -0.0 and 0.0.
122/// As such, this method can be used to do an exact bit-for-bit comparison of
123/// two floating point values.
125 return getValueAPF().bitwiseIsEqual(V);
126}
127
129 const APFloat& Val) {
130 assert(VT.isFloatingPoint() && "Can only convert between FP types");
131
132 // convert modifies in place, so make a copy.
133 APFloat Val2 = APFloat(Val);
134 bool losesInfo;
137 &losesInfo);
138 return !losesInfo;
139}
140
141//===----------------------------------------------------------------------===//
142// ISD Namespace
143//===----------------------------------------------------------------------===//
144
145bool ISD::isConstantSplatVector(const SDNode *N, APInt &SplatVal) {
146 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
147 unsigned EltSize =
148 N->getValueType(0).getVectorElementType().getSizeInBits();
149 if (auto *Op0 = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
150 SplatVal = Op0->getAPIntValue().trunc(EltSize);
151 return true;
152 }
153 if (auto *Op0 = dyn_cast<ConstantFPSDNode>(N->getOperand(0))) {
154 SplatVal = Op0->getValueAPF().bitcastToAPInt().trunc(EltSize);
155 return true;
156 }
157 }
158
159 auto *BV = dyn_cast<BuildVectorSDNode>(N);
160 if (!BV)
161 return false;
162
163 APInt SplatUndef;
164 unsigned SplatBitSize;
165 bool HasUndefs;
166 unsigned EltSize = N->getValueType(0).getVectorElementType().getSizeInBits();
167 // Endianness does not matter here. We are checking for a splat given the
168 // element size of the vector, and if we find such a splat for little endian
169 // layout, then that should be valid also for big endian (as the full vector
170 // size is known to be a multiple of the element size).
171 const bool IsBigEndian = false;
172 return BV->isConstantSplat(SplatVal, SplatUndef, SplatBitSize, HasUndefs,
173 EltSize, IsBigEndian) &&
174 EltSize == SplatBitSize;
175}
176
177// FIXME: AllOnes and AllZeros duplicate a lot of code. Could these be
178// specializations of the more general isConstantSplatVector()?
179
180bool ISD::isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly) {
181 // Look through a bit convert.
182 while (N->getOpcode() == ISD::BITCAST)
183 N = N->getOperand(0).getNode();
184
185 if (!BuildVectorOnly && N->getOpcode() == ISD::SPLAT_VECTOR) {
186 APInt SplatVal;
187 return isConstantSplatVector(N, SplatVal) && SplatVal.isAllOnes();
188 }
189
190 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
191
192 unsigned i = 0, e = N->getNumOperands();
193
194 // Skip over all of the undef values.
195 while (i != e && N->getOperand(i).isUndef())
196 ++i;
197
198 // Do not accept an all-undef vector.
199 if (i == e) return false;
200
201 // Do not accept build_vectors that aren't all constants or which have non-~0
202 // elements. We have to be a bit careful here, as the type of the constant
203 // may not be the same as the type of the vector elements due to type
204 // legalization (the elements are promoted to a legal type for the target and
205 // a vector of a type may be legal when the base element type is not).
206 // We only want to check enough bits to cover the vector elements, because
207 // we care if the resultant vector is all ones, not whether the individual
208 // constants are.
209 SDValue NotZero = N->getOperand(i);
210 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
211 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(NotZero)) {
212 if (CN->getAPIntValue().countr_one() < EltSize)
213 return false;
214 } else if (ConstantFPSDNode *CFPN = dyn_cast<ConstantFPSDNode>(NotZero)) {
215 if (CFPN->getValueAPF().bitcastToAPInt().countr_one() < EltSize)
216 return false;
217 } else
218 return false;
219
220 // Okay, we have at least one ~0 value, check to see if the rest match or are
221 // undefs. Even with the above element type twiddling, this should be OK, as
222 // the same type legalization should have applied to all the elements.
223 for (++i; i != e; ++i)
224 if (N->getOperand(i) != NotZero && !N->getOperand(i).isUndef())
225 return false;
226 return true;
227}
228
229bool ISD::isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly) {
230 // Look through a bit convert.
231 while (N->getOpcode() == ISD::BITCAST)
232 N = N->getOperand(0).getNode();
233
234 if (!BuildVectorOnly && N->getOpcode() == ISD::SPLAT_VECTOR) {
235 APInt SplatVal;
236 return isConstantSplatVector(N, SplatVal) && SplatVal.isZero();
237 }
238
239 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
240
241 bool IsAllUndef = true;
242 for (const SDValue &Op : N->op_values()) {
243 if (Op.isUndef())
244 continue;
245 IsAllUndef = false;
246 // Do not accept build_vectors that aren't all constants or which have non-0
247 // elements. We have to be a bit careful here, as the type of the constant
248 // may not be the same as the type of the vector elements due to type
249 // legalization (the elements are promoted to a legal type for the target
250 // and a vector of a type may be legal when the base element type is not).
251 // We only want to check enough bits to cover the vector elements, because
252 // we care if the resultant vector is all zeros, not whether the individual
253 // constants are.
254 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
255 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Op)) {
256 if (CN->getAPIntValue().countr_zero() < EltSize)
257 return false;
258 } else if (ConstantFPSDNode *CFPN = dyn_cast<ConstantFPSDNode>(Op)) {
259 if (CFPN->getValueAPF().bitcastToAPInt().countr_zero() < EltSize)
260 return false;
261 } else
262 return false;
263 }
264
265 // Do not accept an all-undef vector.
266 if (IsAllUndef)
267 return false;
268 return true;
269}
270
272 return isConstantSplatVectorAllOnes(N, /*BuildVectorOnly*/ true);
273}
274
276 return isConstantSplatVectorAllZeros(N, /*BuildVectorOnly*/ true);
277}
278
280 if (N->getOpcode() != ISD::BUILD_VECTOR)
281 return false;
282
283 for (const SDValue &Op : N->op_values()) {
284 if (Op.isUndef())
285 continue;
286 if (!isa<ConstantSDNode>(Op))
287 return false;
288 }
289 return true;
290}
291
293 if (N->getOpcode() != ISD::BUILD_VECTOR)
294 return false;
295
296 for (const SDValue &Op : N->op_values()) {
297 if (Op.isUndef())
298 continue;
299 if (!isa<ConstantFPSDNode>(Op))
300 return false;
301 }
302 return true;
303}
304
305bool ISD::isVectorShrinkable(const SDNode *N, unsigned NewEltSize,
306 bool Signed) {
307 assert(N->getValueType(0).isVector() && "Expected a vector!");
308
309 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
310 if (EltSize <= NewEltSize)
311 return false;
312
313 if (N->getOpcode() == ISD::ZERO_EXTEND) {
314 return (N->getOperand(0).getValueType().getScalarSizeInBits() <=
315 NewEltSize) &&
316 !Signed;
317 }
318 if (N->getOpcode() == ISD::SIGN_EXTEND) {
319 return (N->getOperand(0).getValueType().getScalarSizeInBits() <=
320 NewEltSize) &&
321 Signed;
322 }
323 if (N->getOpcode() != ISD::BUILD_VECTOR)
324 return false;
325
326 for (const SDValue &Op : N->op_values()) {
327 if (Op.isUndef())
328 continue;
329 if (!isa<ConstantSDNode>(Op))
330 return false;
331
332 APInt C = Op->getAsAPIntVal().trunc(EltSize);
333 if (Signed && C.trunc(NewEltSize).sext(EltSize) != C)
334 return false;
335 if (!Signed && C.trunc(NewEltSize).zext(EltSize) != C)
336 return false;
337 }
338
339 return true;
340}
341
343 // Return false if the node has no operands.
344 // This is "logically inconsistent" with the definition of "all" but
345 // is probably the desired behavior.
346 if (N->getNumOperands() == 0)
347 return false;
348 return all_of(N->op_values(), [](SDValue Op) { return Op.isUndef(); });
349}
350
352 return N->getOpcode() == ISD::FREEZE && N->getOperand(0).isUndef();
353}
354
355template <typename ConstNodeType>
357 std::function<bool(ConstNodeType *)> Match,
358 bool AllowUndefs) {
359 // FIXME: Add support for scalar UNDEF cases?
360 if (auto *C = dyn_cast<ConstNodeType>(Op))
361 return Match(C);
362
363 // FIXME: Add support for vector UNDEF cases?
364 if (ISD::BUILD_VECTOR != Op.getOpcode() &&
365 ISD::SPLAT_VECTOR != Op.getOpcode())
366 return false;
367
368 EVT SVT = Op.getValueType().getScalarType();
369 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
370 if (AllowUndefs && Op.getOperand(i).isUndef()) {
371 if (!Match(nullptr))
372 return false;
373 continue;
374 }
375
376 auto *Cst = dyn_cast<ConstNodeType>(Op.getOperand(i));
377 if (!Cst || Cst->getValueType(0) != SVT || !Match(Cst))
378 return false;
379 }
380 return true;
381}
382// Build used template types.
383template bool ISD::matchUnaryPredicateImpl<ConstantSDNode>(
384 SDValue, std::function<bool(ConstantSDNode *)>, bool);
385template bool ISD::matchUnaryPredicateImpl<ConstantFPSDNode>(
386 SDValue, std::function<bool(ConstantFPSDNode *)>, bool);
387
389 SDValue LHS, SDValue RHS,
390 std::function<bool(ConstantSDNode *, ConstantSDNode *)> Match,
391 bool AllowUndefs, bool AllowTypeMismatch) {
392 if (!AllowTypeMismatch && LHS.getValueType() != RHS.getValueType())
393 return false;
394
395 // TODO: Add support for scalar UNDEF cases?
396 if (auto *LHSCst = dyn_cast<ConstantSDNode>(LHS))
397 if (auto *RHSCst = dyn_cast<ConstantSDNode>(RHS))
398 return Match(LHSCst, RHSCst);
399
400 // TODO: Add support for vector UNDEF cases?
401 if (LHS.getOpcode() != RHS.getOpcode() ||
402 (LHS.getOpcode() != ISD::BUILD_VECTOR &&
403 LHS.getOpcode() != ISD::SPLAT_VECTOR))
404 return false;
405
406 EVT SVT = LHS.getValueType().getScalarType();
407 for (unsigned i = 0, e = LHS.getNumOperands(); i != e; ++i) {
408 SDValue LHSOp = LHS.getOperand(i);
409 SDValue RHSOp = RHS.getOperand(i);
410 bool LHSUndef = AllowUndefs && LHSOp.isUndef();
411 bool RHSUndef = AllowUndefs && RHSOp.isUndef();
412 auto *LHSCst = dyn_cast<ConstantSDNode>(LHSOp);
413 auto *RHSCst = dyn_cast<ConstantSDNode>(RHSOp);
414 if ((!LHSCst && !LHSUndef) || (!RHSCst && !RHSUndef))
415 return false;
416 if (!AllowTypeMismatch && (LHSOp.getValueType() != SVT ||
417 LHSOp.getValueType() != RHSOp.getValueType()))
418 return false;
419 if (!Match(LHSCst, RHSCst))
420 return false;
421 }
422 return true;
423}
424
426 switch (VecReduceOpcode) {
427 default:
428 llvm_unreachable("Expected VECREDUCE opcode");
431 case ISD::VP_REDUCE_FADD:
432 case ISD::VP_REDUCE_SEQ_FADD:
433 return ISD::FADD;
436 case ISD::VP_REDUCE_FMUL:
437 case ISD::VP_REDUCE_SEQ_FMUL:
438 return ISD::FMUL;
440 case ISD::VP_REDUCE_ADD:
441 return ISD::ADD;
443 case ISD::VP_REDUCE_MUL:
444 return ISD::MUL;
446 case ISD::VP_REDUCE_AND:
447 return ISD::AND;
449 case ISD::VP_REDUCE_OR:
450 return ISD::OR;
452 case ISD::VP_REDUCE_XOR:
453 return ISD::XOR;
455 case ISD::VP_REDUCE_SMAX:
456 return ISD::SMAX;
458 case ISD::VP_REDUCE_SMIN:
459 return ISD::SMIN;
461 case ISD::VP_REDUCE_UMAX:
462 return ISD::UMAX;
464 case ISD::VP_REDUCE_UMIN:
465 return ISD::UMIN;
467 case ISD::VP_REDUCE_FMAX:
468 return ISD::FMAXNUM;
470 case ISD::VP_REDUCE_FMIN:
471 return ISD::FMINNUM;
473 return ISD::FMAXIMUM;
475 return ISD::FMINIMUM;
476 }
477}
478
479bool ISD::isVPOpcode(unsigned Opcode) {
480 switch (Opcode) {
481 default:
482 return false;
483#define BEGIN_REGISTER_VP_SDNODE(VPSD, ...) \
484 case ISD::VPSD: \
485 return true;
486#include "llvm/IR/VPIntrinsics.def"
487 }
488}
489
490bool ISD::isVPBinaryOp(unsigned Opcode) {
491 switch (Opcode) {
492 default:
493 break;
494#define BEGIN_REGISTER_VP_SDNODE(VPSD, ...) case ISD::VPSD:
495#define VP_PROPERTY_BINARYOP return true;
496#define END_REGISTER_VP_SDNODE(VPSD) break;
497#include "llvm/IR/VPIntrinsics.def"
498 }
499 return false;
500}
501
502bool ISD::isVPReduction(unsigned Opcode) {
503 switch (Opcode) {
504 default:
505 break;
506#define BEGIN_REGISTER_VP_SDNODE(VPSD, ...) case ISD::VPSD:
507#define VP_PROPERTY_REDUCTION(STARTPOS, ...) return true;
508#define END_REGISTER_VP_SDNODE(VPSD) break;
509#include "llvm/IR/VPIntrinsics.def"
510 }
511 return false;
512}
513
514/// The operand position of the vector mask.
515std::optional<unsigned> ISD::getVPMaskIdx(unsigned Opcode) {
516 switch (Opcode) {
517 default:
518 return std::nullopt;
519#define BEGIN_REGISTER_VP_SDNODE(VPSD, LEGALPOS, TDNAME, MASKPOS, ...) \
520 case ISD::VPSD: \
521 return MASKPOS;
522#include "llvm/IR/VPIntrinsics.def"
523 }
524}
525
526/// The operand position of the explicit vector length parameter.
527std::optional<unsigned> ISD::getVPExplicitVectorLengthIdx(unsigned Opcode) {
528 switch (Opcode) {
529 default:
530 return std::nullopt;
531#define BEGIN_REGISTER_VP_SDNODE(VPSD, LEGALPOS, TDNAME, MASKPOS, EVLPOS) \
532 case ISD::VPSD: \
533 return EVLPOS;
534#include "llvm/IR/VPIntrinsics.def"
535 }
536}
537
538std::optional<unsigned> ISD::getBaseOpcodeForVP(unsigned VPOpcode,
539 bool hasFPExcept) {
540 // FIXME: Return strict opcodes in case of fp exceptions.
541 switch (VPOpcode) {
542 default:
543 return std::nullopt;
544#define BEGIN_REGISTER_VP_SDNODE(VPOPC, ...) case ISD::VPOPC:
545#define VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) return ISD::SDOPC;
546#define END_REGISTER_VP_SDNODE(VPOPC) break;
547#include "llvm/IR/VPIntrinsics.def"
548 }
549 return std::nullopt;
550}
551
552unsigned ISD::getVPForBaseOpcode(unsigned Opcode) {
553 switch (Opcode) {
554 default:
555 llvm_unreachable("can not translate this Opcode to VP.");
556#define BEGIN_REGISTER_VP_SDNODE(VPOPC, ...) break;
557#define VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) case ISD::SDOPC:
558#define END_REGISTER_VP_SDNODE(VPOPC) return ISD::VPOPC;
559#include "llvm/IR/VPIntrinsics.def"
560 }
561}
562
564 switch (ExtType) {
565 case ISD::EXTLOAD:
566 return IsFP ? ISD::FP_EXTEND : ISD::ANY_EXTEND;
567 case ISD::SEXTLOAD:
568 return ISD::SIGN_EXTEND;
569 case ISD::ZEXTLOAD:
570 return ISD::ZERO_EXTEND;
571 default:
572 break;
573 }
574
575 llvm_unreachable("Invalid LoadExtType");
576}
577
579 // To perform this operation, we just need to swap the L and G bits of the
580 // operation.
581 unsigned OldL = (Operation >> 2) & 1;
582 unsigned OldG = (Operation >> 1) & 1;
583 return ISD::CondCode((Operation & ~6) | // Keep the N, U, E bits
584 (OldL << 1) | // New G bit
585 (OldG << 2)); // New L bit.
586}
587
589 unsigned Operation = Op;
590 if (isIntegerLike)
591 Operation ^= 7; // Flip L, G, E bits, but not U.
592 else
593 Operation ^= 15; // Flip all of the condition bits.
594
596 Operation &= ~8; // Don't let N and U bits get set.
597
598 return ISD::CondCode(Operation);
599}
600
602 return getSetCCInverseImpl(Op, Type.isInteger());
603}
604
606 bool isIntegerLike) {
607 return getSetCCInverseImpl(Op, isIntegerLike);
608}
609
610/// For an integer comparison, return 1 if the comparison is a signed operation
611/// and 2 if the result is an unsigned comparison. Return zero if the operation
612/// does not depend on the sign of the input (setne and seteq).
613static int isSignedOp(ISD::CondCode Opcode) {
614 switch (Opcode) {
615 default: llvm_unreachable("Illegal integer setcc operation!");
616 case ISD::SETEQ:
617 case ISD::SETNE: return 0;
618 case ISD::SETLT:
619 case ISD::SETLE:
620 case ISD::SETGT:
621 case ISD::SETGE: return 1;
622 case ISD::SETULT:
623 case ISD::SETULE:
624 case ISD::SETUGT:
625 case ISD::SETUGE: return 2;
626 }
627}
628
630 EVT Type) {
631 bool IsInteger = Type.isInteger();
632 if (IsInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
633 // Cannot fold a signed integer setcc with an unsigned integer setcc.
634 return ISD::SETCC_INVALID;
635
636 unsigned Op = Op1 | Op2; // Combine all of the condition bits.
637
638 // If the N and U bits get set, then the resultant comparison DOES suddenly
639 // care about orderedness, and it is true when ordered.
640 if (Op > ISD::SETTRUE2)
641 Op &= ~16; // Clear the U bit if the N bit is set.
642
643 // Canonicalize illegal integer setcc's.
644 if (IsInteger && Op == ISD::SETUNE) // e.g. SETUGT | SETULT
645 Op = ISD::SETNE;
646
647 return ISD::CondCode(Op);
648}
649
651 EVT Type) {
652 bool IsInteger = Type.isInteger();
653 if (IsInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
654 // Cannot fold a signed setcc with an unsigned setcc.
655 return ISD::SETCC_INVALID;
656
657 // Combine all of the condition bits.
658 ISD::CondCode Result = ISD::CondCode(Op1 & Op2);
659
660 // Canonicalize illegal integer setcc's.
661 if (IsInteger) {
662 switch (Result) {
663 default: break;
664 case ISD::SETUO : Result = ISD::SETFALSE; break; // SETUGT & SETULT
665 case ISD::SETOEQ: // SETEQ & SETU[LG]E
666 case ISD::SETUEQ: Result = ISD::SETEQ ; break; // SETUGE & SETULE
667 case ISD::SETOLT: Result = ISD::SETULT ; break; // SETULT & SETNE
668 case ISD::SETOGT: Result = ISD::SETUGT ; break; // SETUGT & SETNE
669 }
670 }
671
672 return Result;
673}
674
675//===----------------------------------------------------------------------===//
676// SDNode Profile Support
677//===----------------------------------------------------------------------===//
678
679/// AddNodeIDOpcode - Add the node opcode to the NodeID data.
680static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC) {
681 ID.AddInteger(OpC);
682}
683
684/// AddNodeIDValueTypes - Value type lists are intern'd so we can represent them
685/// solely with their pointer.
687 ID.AddPointer(VTList.VTs);
688}
689
690/// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
692 ArrayRef<SDValue> Ops) {
693 for (const auto &Op : Ops) {
694 ID.AddPointer(Op.getNode());
695 ID.AddInteger(Op.getResNo());
696 }
697}
698
699/// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
701 ArrayRef<SDUse> Ops) {
702 for (const auto &Op : Ops) {
703 ID.AddPointer(Op.getNode());
704 ID.AddInteger(Op.getResNo());
705 }
706}
707
708static void AddNodeIDNode(FoldingSetNodeID &ID, unsigned OpC,
709 SDVTList VTList, ArrayRef<SDValue> OpList) {
710 AddNodeIDOpcode(ID, OpC);
711 AddNodeIDValueTypes(ID, VTList);
712 AddNodeIDOperands(ID, OpList);
713}
714
715/// If this is an SDNode with special info, add this info to the NodeID data.
717 switch (N->getOpcode()) {
720 case ISD::MCSymbol:
721 llvm_unreachable("Should only be used on nodes with operands");
722 default: break; // Normal nodes don't need extra info.
724 case ISD::Constant: {
725 const ConstantSDNode *C = cast<ConstantSDNode>(N);
726 ID.AddPointer(C->getConstantIntValue());
727 ID.AddBoolean(C->isOpaque());
728 break;
729 }
731 case ISD::ConstantFP:
732 ID.AddPointer(cast<ConstantFPSDNode>(N)->getConstantFPValue());
733 break;
738 const GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(N);
739 ID.AddPointer(GA->getGlobal());
740 ID.AddInteger(GA->getOffset());
741 ID.AddInteger(GA->getTargetFlags());
742 break;
743 }
744 case ISD::BasicBlock:
745 ID.AddPointer(cast<BasicBlockSDNode>(N)->getBasicBlock());
746 break;
747 case ISD::Register:
748 ID.AddInteger(cast<RegisterSDNode>(N)->getReg());
749 break;
751 ID.AddPointer(cast<RegisterMaskSDNode>(N)->getRegMask());
752 break;
753 case ISD::SRCVALUE:
754 ID.AddPointer(cast<SrcValueSDNode>(N)->getValue());
755 break;
756 case ISD::FrameIndex:
758 ID.AddInteger(cast<FrameIndexSDNode>(N)->getIndex());
759 break;
762 if (cast<LifetimeSDNode>(N)->hasOffset()) {
763 ID.AddInteger(cast<LifetimeSDNode>(N)->getSize());
764 ID.AddInteger(cast<LifetimeSDNode>(N)->getOffset());
765 }
766 break;
768 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getGuid());
769 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getIndex());
770 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getAttributes());
771 break;
772 case ISD::JumpTable:
774 ID.AddInteger(cast<JumpTableSDNode>(N)->getIndex());
775 ID.AddInteger(cast<JumpTableSDNode>(N)->getTargetFlags());
776 break;
779 const ConstantPoolSDNode *CP = cast<ConstantPoolSDNode>(N);
780 ID.AddInteger(CP->getAlign().value());
781 ID.AddInteger(CP->getOffset());
782 if (CP->isMachineConstantPoolEntry())
783 CP->getMachineCPVal()->addSelectionDAGCSEId(ID);
784 else
785 ID.AddPointer(CP->getConstVal());
786 ID.AddInteger(CP->getTargetFlags());
787 break;
788 }
789 case ISD::TargetIndex: {
790 const TargetIndexSDNode *TI = cast<TargetIndexSDNode>(N);
791 ID.AddInteger(TI->getIndex());
792 ID.AddInteger(TI->getOffset());
793 ID.AddInteger(TI->getTargetFlags());
794 break;
795 }
796 case ISD::LOAD: {
797 const LoadSDNode *LD = cast<LoadSDNode>(N);
798 ID.AddInteger(LD->getMemoryVT().getRawBits());
799 ID.AddInteger(LD->getRawSubclassData());
800 ID.AddInteger(LD->getPointerInfo().getAddrSpace());
801 ID.AddInteger(LD->getMemOperand()->getFlags());
802 break;
803 }
804 case ISD::STORE: {
805 const StoreSDNode *ST = cast<StoreSDNode>(N);
806 ID.AddInteger(ST->getMemoryVT().getRawBits());
807 ID.AddInteger(ST->getRawSubclassData());
808 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
809 ID.AddInteger(ST->getMemOperand()->getFlags());
810 break;
811 }
812 case ISD::VP_LOAD: {
813 const VPLoadSDNode *ELD = cast<VPLoadSDNode>(N);
814 ID.AddInteger(ELD->getMemoryVT().getRawBits());
815 ID.AddInteger(ELD->getRawSubclassData());
816 ID.AddInteger(ELD->getPointerInfo().getAddrSpace());
817 ID.AddInteger(ELD->getMemOperand()->getFlags());
818 break;
819 }
820 case ISD::VP_STORE: {
821 const VPStoreSDNode *EST = cast<VPStoreSDNode>(N);
822 ID.AddInteger(EST->getMemoryVT().getRawBits());
823 ID.AddInteger(EST->getRawSubclassData());
824 ID.AddInteger(EST->getPointerInfo().getAddrSpace());
825 ID.AddInteger(EST->getMemOperand()->getFlags());
826 break;
827 }
828 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD: {
829 const VPStridedLoadSDNode *SLD = cast<VPStridedLoadSDNode>(N);
830 ID.AddInteger(SLD->getMemoryVT().getRawBits());
831 ID.AddInteger(SLD->getRawSubclassData());
832 ID.AddInteger(SLD->getPointerInfo().getAddrSpace());
833 break;
834 }
835 case ISD::EXPERIMENTAL_VP_STRIDED_STORE: {
836 const VPStridedStoreSDNode *SST = cast<VPStridedStoreSDNode>(N);
837 ID.AddInteger(SST->getMemoryVT().getRawBits());
838 ID.AddInteger(SST->getRawSubclassData());
839 ID.AddInteger(SST->getPointerInfo().getAddrSpace());
840 break;
841 }
842 case ISD::VP_GATHER: {
843 const VPGatherSDNode *EG = cast<VPGatherSDNode>(N);
844 ID.AddInteger(EG->getMemoryVT().getRawBits());
845 ID.AddInteger(EG->getRawSubclassData());
846 ID.AddInteger(EG->getPointerInfo().getAddrSpace());
847 ID.AddInteger(EG->getMemOperand()->getFlags());
848 break;
849 }
850 case ISD::VP_SCATTER: {
851 const VPScatterSDNode *ES = cast<VPScatterSDNode>(N);
852 ID.AddInteger(ES->getMemoryVT().getRawBits());
853 ID.AddInteger(ES->getRawSubclassData());
854 ID.AddInteger(ES->getPointerInfo().getAddrSpace());
855 ID.AddInteger(ES->getMemOperand()->getFlags());
856 break;
857 }
858 case ISD::MLOAD: {
859 const MaskedLoadSDNode *MLD = cast<MaskedLoadSDNode>(N);
860 ID.AddInteger(MLD->getMemoryVT().getRawBits());
861 ID.AddInteger(MLD->getRawSubclassData());
862 ID.AddInteger(MLD->getPointerInfo().getAddrSpace());
863 ID.AddInteger(MLD->getMemOperand()->getFlags());
864 break;
865 }
866 case ISD::MSTORE: {
867 const MaskedStoreSDNode *MST = cast<MaskedStoreSDNode>(N);
868 ID.AddInteger(MST->getMemoryVT().getRawBits());
869 ID.AddInteger(MST->getRawSubclassData());
870 ID.AddInteger(MST->getPointerInfo().getAddrSpace());
871 ID.AddInteger(MST->getMemOperand()->getFlags());
872 break;
873 }
874 case ISD::MGATHER: {
875 const MaskedGatherSDNode *MG = cast<MaskedGatherSDNode>(N);
876 ID.AddInteger(MG->getMemoryVT().getRawBits());
877 ID.AddInteger(MG->getRawSubclassData());
878 ID.AddInteger(MG->getPointerInfo().getAddrSpace());
879 ID.AddInteger(MG->getMemOperand()->getFlags());
880 break;
881 }
882 case ISD::MSCATTER: {
883 const MaskedScatterSDNode *MS = cast<MaskedScatterSDNode>(N);
884 ID.AddInteger(MS->getMemoryVT().getRawBits());
885 ID.AddInteger(MS->getRawSubclassData());
886 ID.AddInteger(MS->getPointerInfo().getAddrSpace());
887 ID.AddInteger(MS->getMemOperand()->getFlags());
888 break;
889 }
892 case ISD::ATOMIC_SWAP:
904 case ISD::ATOMIC_LOAD:
905 case ISD::ATOMIC_STORE: {
906 const AtomicSDNode *AT = cast<AtomicSDNode>(N);
907 ID.AddInteger(AT->getMemoryVT().getRawBits());
908 ID.AddInteger(AT->getRawSubclassData());
909 ID.AddInteger(AT->getPointerInfo().getAddrSpace());
910 ID.AddInteger(AT->getMemOperand()->getFlags());
911 break;
912 }
913 case ISD::VECTOR_SHUFFLE: {
914 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(N)->getMask();
915 for (int M : Mask)
916 ID.AddInteger(M);
917 break;
918 }
920 case ISD::BlockAddress: {
921 const BlockAddressSDNode *BA = cast<BlockAddressSDNode>(N);
922 ID.AddPointer(BA->getBlockAddress());
923 ID.AddInteger(BA->getOffset());
924 ID.AddInteger(BA->getTargetFlags());
925 break;
926 }
927 case ISD::AssertAlign:
928 ID.AddInteger(cast<AssertAlignSDNode>(N)->getAlign().value());
929 break;
930 case ISD::PREFETCH:
933 // Handled by MemIntrinsicSDNode check after the switch.
934 break;
935 } // end switch (N->getOpcode())
936
937 // MemIntrinsic nodes could also have subclass data, address spaces, and flags
938 // to check.
939 if (auto *MN = dyn_cast<MemIntrinsicSDNode>(N)) {
940 ID.AddInteger(MN->getRawSubclassData());
941 ID.AddInteger(MN->getPointerInfo().getAddrSpace());
942 ID.AddInteger(MN->getMemOperand()->getFlags());
943 ID.AddInteger(MN->getMemoryVT().getRawBits());
944 }
945}
946
947/// AddNodeIDNode - Generic routine for adding a nodes info to the NodeID
948/// data.
949static void AddNodeIDNode(FoldingSetNodeID &ID, const SDNode *N) {
950 AddNodeIDOpcode(ID, N->getOpcode());
951 // Add the return value info.
952 AddNodeIDValueTypes(ID, N->getVTList());
953 // Add the operand info.
954 AddNodeIDOperands(ID, N->ops());
955
956 // Handle SDNode leafs with special info.
958}
959
960//===----------------------------------------------------------------------===//
961// SelectionDAG Class
962//===----------------------------------------------------------------------===//
963
964/// doNotCSE - Return true if CSE should not be performed for this node.
965static bool doNotCSE(SDNode *N) {
966 if (N->getValueType(0) == MVT::Glue)
967 return true; // Never CSE anything that produces a glue result.
968
969 switch (N->getOpcode()) {
970 default: break;
971 case ISD::HANDLENODE:
972 case ISD::EH_LABEL:
973 return true; // Never CSE these nodes.
974 }
975
976 // Check that remaining values produced are not flags.
977 for (unsigned i = 1, e = N->getNumValues(); i != e; ++i)
978 if (N->getValueType(i) == MVT::Glue)
979 return true; // Never CSE anything that produces a glue result.
980
981 return false;
982}
983
984/// RemoveDeadNodes - This method deletes all unreachable nodes in the
985/// SelectionDAG.
987 // Create a dummy node (which is not added to allnodes), that adds a reference
988 // to the root node, preventing it from being deleted.
989 HandleSDNode Dummy(getRoot());
990
992
993 // Add all obviously-dead nodes to the DeadNodes worklist.
994 for (SDNode &Node : allnodes())
995 if (Node.use_empty())
996 DeadNodes.push_back(&Node);
997
998 RemoveDeadNodes(DeadNodes);
999
1000 // If the root changed (e.g. it was a dead load, update the root).
1001 setRoot(Dummy.getValue());
1002}
1003
1004/// RemoveDeadNodes - This method deletes the unreachable nodes in the
1005/// given list, and any nodes that become unreachable as a result.
1007
1008 // Process the worklist, deleting the nodes and adding their uses to the
1009 // worklist.
1010 while (!DeadNodes.empty()) {
1011 SDNode *N = DeadNodes.pop_back_val();
1012 // Skip to next node if we've already managed to delete the node. This could
1013 // happen if replacing a node causes a node previously added to the node to
1014 // be deleted.
1015 if (N->getOpcode() == ISD::DELETED_NODE)
1016 continue;
1017
1018 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1019 DUL->NodeDeleted(N, nullptr);
1020
1021 // Take the node out of the appropriate CSE map.
1022 RemoveNodeFromCSEMaps(N);
1023
1024 // Next, brutally remove the operand list. This is safe to do, as there are
1025 // no cycles in the graph.
1026 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
1027 SDUse &Use = *I++;
1028 SDNode *Operand = Use.getNode();
1029 Use.set(SDValue());
1030
1031 // Now that we removed this operand, see if there are no uses of it left.
1032 if (Operand->use_empty())
1033 DeadNodes.push_back(Operand);
1034 }
1035
1036 DeallocateNode(N);
1037 }
1038}
1039
1041 SmallVector<SDNode*, 16> DeadNodes(1, N);
1042
1043 // Create a dummy node that adds a reference to the root node, preventing
1044 // it from being deleted. (This matters if the root is an operand of the
1045 // dead node.)
1046 HandleSDNode Dummy(getRoot());
1047
1048 RemoveDeadNodes(DeadNodes);
1049}
1050
1052 // First take this out of the appropriate CSE map.
1053 RemoveNodeFromCSEMaps(N);
1054
1055 // Finally, remove uses due to operands of this node, remove from the
1056 // AllNodes list, and delete the node.
1057 DeleteNodeNotInCSEMaps(N);
1058}
1059
1060void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *N) {
1061 assert(N->getIterator() != AllNodes.begin() &&
1062 "Cannot delete the entry node!");
1063 assert(N->use_empty() && "Cannot delete a node that is not dead!");
1064
1065 // Drop all of the operands and decrement used node's use counts.
1066 N->DropOperands();
1067
1068 DeallocateNode(N);
1069}
1070
1071void SDDbgInfo::add(SDDbgValue *V, bool isParameter) {
1072 assert(!(V->isVariadic() && isParameter));
1073 if (isParameter)
1074 ByvalParmDbgValues.push_back(V);
1075 else
1076 DbgValues.push_back(V);
1077 for (const SDNode *Node : V->getSDNodes())
1078 if (Node)
1079 DbgValMap[Node].push_back(V);
1080}
1081
1082void SDDbgInfo::erase(const SDNode *Node) {
1083 DbgValMapType::iterator I = DbgValMap.find(Node);
1084 if (I == DbgValMap.end())
1085 return;
1086 for (auto &Val: I->second)
1087 Val->setIsInvalidated();
1088 DbgValMap.erase(I);
1089}
1090
1091void SelectionDAG::DeallocateNode(SDNode *N) {
1092 // If we have operands, deallocate them.
1093 removeOperands(N);
1094
1095 NodeAllocator.Deallocate(AllNodes.remove(N));
1096
1097 // Set the opcode to DELETED_NODE to help catch bugs when node
1098 // memory is reallocated.
1099 // FIXME: There are places in SDag that have grown a dependency on the opcode
1100 // value in the released node.
1101 __asan_unpoison_memory_region(&N->NodeType, sizeof(N->NodeType));
1102 N->NodeType = ISD::DELETED_NODE;
1103
1104 // If any of the SDDbgValue nodes refer to this SDNode, invalidate
1105 // them and forget about that node.
1106 DbgInfo->erase(N);
1107
1108 // Invalidate extra info.
1109 SDEI.erase(N);
1110}
1111
1112#ifndef NDEBUG
1113/// VerifySDNode - Check the given SDNode. Aborts if it is invalid.
1114static void VerifySDNode(SDNode *N, const TargetLowering *TLI) {
1115 switch (N->getOpcode()) {
1116 default:
1117 if (N->getOpcode() > ISD::BUILTIN_OP_END)
1118 TLI->verifyTargetSDNode(N);
1119 break;
1120 case ISD::BUILD_PAIR: {
1121 EVT VT = N->getValueType(0);
1122 assert(N->getNumValues() == 1 && "Too many results!");
1123 assert(!VT.isVector() && (VT.isInteger() || VT.isFloatingPoint()) &&
1124 "Wrong return type!");
1125 assert(N->getNumOperands() == 2 && "Wrong number of operands!");
1126 assert(N->getOperand(0).getValueType() == N->getOperand(1).getValueType() &&
1127 "Mismatched operand types!");
1128 assert(N->getOperand(0).getValueType().isInteger() == VT.isInteger() &&
1129 "Wrong operand type!");
1130 assert(VT.getSizeInBits() == 2 * N->getOperand(0).getValueSizeInBits() &&
1131 "Wrong return type size");
1132 break;
1133 }
1134 case ISD::BUILD_VECTOR: {
1135 assert(N->getNumValues() == 1 && "Too many results!");
1136 assert(N->getValueType(0).isVector() && "Wrong return type!");
1137 assert(N->getNumOperands() == N->getValueType(0).getVectorNumElements() &&
1138 "Wrong number of operands!");
1139 EVT EltVT = N->getValueType(0).getVectorElementType();
1140 for (const SDUse &Op : N->ops()) {
1141 assert((Op.getValueType() == EltVT ||
1142 (EltVT.isInteger() && Op.getValueType().isInteger() &&
1143 EltVT.bitsLE(Op.getValueType()))) &&
1144 "Wrong operand type!");
1145 assert(Op.getValueType() == N->getOperand(0).getValueType() &&
1146 "Operands must all have the same type");
1147 }
1148 break;
1149 }
1150 }
1151}
1152#endif // NDEBUG
1153
1154/// Insert a newly allocated node into the DAG.
1155///
1156/// Handles insertion into the all nodes list and CSE map, as well as
1157/// verification and other common operations when a new node is allocated.
1158void SelectionDAG::InsertNode(SDNode *N) {
1159 AllNodes.push_back(N);
1160#ifndef NDEBUG
1161 N->PersistentId = NextPersistentId++;
1162 VerifySDNode(N, TLI);
1163#endif
1164 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1165 DUL->NodeInserted(N);
1166}
1167
1168/// RemoveNodeFromCSEMaps - Take the specified node out of the CSE map that
1169/// correspond to it. This is useful when we're about to delete or repurpose
1170/// the node. We don't want future request for structurally identical nodes
1171/// to return N anymore.
1172bool SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
1173 bool Erased = false;
1174 switch (N->getOpcode()) {
1175 case ISD::HANDLENODE: return false; // noop.
1176 case ISD::CONDCODE:
1177 assert(CondCodeNodes[cast<CondCodeSDNode>(N)->get()] &&
1178 "Cond code doesn't exist!");
1179 Erased = CondCodeNodes[cast<CondCodeSDNode>(N)->get()] != nullptr;
1180 CondCodeNodes[cast<CondCodeSDNode>(N)->get()] = nullptr;
1181 break;
1183 Erased = ExternalSymbols.erase(cast<ExternalSymbolSDNode>(N)->getSymbol());
1184 break;
1186 ExternalSymbolSDNode *ESN = cast<ExternalSymbolSDNode>(N);
1187 Erased = TargetExternalSymbols.erase(std::pair<std::string, unsigned>(
1188 ESN->getSymbol(), ESN->getTargetFlags()));
1189 break;
1190 }
1191 case ISD::MCSymbol: {
1192 auto *MCSN = cast<MCSymbolSDNode>(N);
1193 Erased = MCSymbols.erase(MCSN->getMCSymbol());
1194 break;
1195 }
1196 case ISD::VALUETYPE: {
1197 EVT VT = cast<VTSDNode>(N)->getVT();
1198 if (VT.isExtended()) {
1199 Erased = ExtendedValueTypeNodes.erase(VT);
1200 } else {
1201 Erased = ValueTypeNodes[VT.getSimpleVT().SimpleTy] != nullptr;
1202 ValueTypeNodes[VT.getSimpleVT().SimpleTy] = nullptr;
1203 }
1204 break;
1205 }
1206 default:
1207 // Remove it from the CSE Map.
1208 assert(N->getOpcode() != ISD::DELETED_NODE && "DELETED_NODE in CSEMap!");
1209 assert(N->getOpcode() != ISD::EntryToken && "EntryToken in CSEMap!");
1210 Erased = CSEMap.RemoveNode(N);
1211 break;
1212 }
1213#ifndef NDEBUG
1214 // Verify that the node was actually in one of the CSE maps, unless it has a
1215 // glue result (which cannot be CSE'd) or is one of the special cases that are
1216 // not subject to CSE.
1217 if (!Erased && N->getValueType(N->getNumValues()-1) != MVT::Glue &&
1218 !N->isMachineOpcode() && !doNotCSE(N)) {
1219 N->dump(this);
1220 dbgs() << "\n";
1221 llvm_unreachable("Node is not in map!");
1222 }
1223#endif
1224 return Erased;
1225}
1226
1227/// AddModifiedNodeToCSEMaps - The specified node has been removed from the CSE
1228/// maps and modified in place. Add it back to the CSE maps, unless an identical
1229/// node already exists, in which case transfer all its users to the existing
1230/// node. This transfer can potentially trigger recursive merging.
1231void
1232SelectionDAG::AddModifiedNodeToCSEMaps(SDNode *N) {
1233 // For node types that aren't CSE'd, just act as if no identical node
1234 // already exists.
1235 if (!doNotCSE(N)) {
1236 SDNode *Existing = CSEMap.GetOrInsertNode(N);
1237 if (Existing != N) {
1238 // If there was already an existing matching node, use ReplaceAllUsesWith
1239 // to replace the dead one with the existing one. This can cause
1240 // recursive merging of other unrelated nodes down the line.
1241 ReplaceAllUsesWith(N, Existing);
1242
1243 // N is now dead. Inform the listeners and delete it.
1244 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1245 DUL->NodeDeleted(N, Existing);
1246 DeleteNodeNotInCSEMaps(N);
1247 return;
1248 }
1249 }
1250
1251 // If the node doesn't already exist, we updated it. Inform listeners.
1252 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1253 DUL->NodeUpdated(N);
1254}
1255
1256/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1257/// were replaced with those specified. If this node is never memoized,
1258/// return null, otherwise return a pointer to the slot it would take. If a
1259/// node already exists with these operands, the slot will be non-null.
1260SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, SDValue Op,
1261 void *&InsertPos) {
1262 if (doNotCSE(N))
1263 return nullptr;
1264
1265 SDValue Ops[] = { Op };
1267 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1269 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1270 if (Node)
1271 Node->intersectFlagsWith(N->getFlags());
1272 return Node;
1273}
1274
1275/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1276/// were replaced with those specified. If this node is never memoized,
1277/// return null, otherwise return a pointer to the slot it would take. If a
1278/// node already exists with these operands, the slot will be non-null.
1279SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N,
1280 SDValue Op1, SDValue Op2,
1281 void *&InsertPos) {
1282 if (doNotCSE(N))
1283 return nullptr;
1284
1285 SDValue Ops[] = { Op1, Op2 };
1287 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1289 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1290 if (Node)
1291 Node->intersectFlagsWith(N->getFlags());
1292 return Node;
1293}
1294
1295/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1296/// were replaced with those specified. If this node is never memoized,
1297/// return null, otherwise return a pointer to the slot it would take. If a
1298/// node already exists with these operands, the slot will be non-null.
1299SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, ArrayRef<SDValue> Ops,
1300 void *&InsertPos) {
1301 if (doNotCSE(N))
1302 return nullptr;
1303
1305 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1307 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1308 if (Node)
1309 Node->intersectFlagsWith(N->getFlags());
1310 return Node;
1311}
1312
1314 Type *Ty = VT == MVT::iPTR ? PointerType::get(*getContext(), 0)
1315 : VT.getTypeForEVT(*getContext());
1316
1317 return getDataLayout().getABITypeAlign(Ty);
1318}
1319
1320// EntryNode could meaningfully have debug info if we can find it...
1322 : TM(tm), OptLevel(OL), EntryNode(ISD::EntryToken, 0, DebugLoc(),
1323 getVTList(MVT::Other, MVT::Glue)),
1324 Root(getEntryNode()) {
1325 InsertNode(&EntryNode);
1326 DbgInfo = new SDDbgInfo();
1327}
1328
1330 OptimizationRemarkEmitter &NewORE, Pass *PassPtr,
1331 const TargetLibraryInfo *LibraryInfo,
1332 UniformityInfo *NewUA, ProfileSummaryInfo *PSIin,
1333 BlockFrequencyInfo *BFIin,
1334 FunctionVarLocs const *VarLocs) {
1335 MF = &NewMF;
1336 SDAGISelPass = PassPtr;
1337 ORE = &NewORE;
1340 LibInfo = LibraryInfo;
1341 Context = &MF->getFunction().getContext();
1342 UA = NewUA;
1343 PSI = PSIin;
1344 BFI = BFIin;
1345 FnVarLocs = VarLocs;
1346}
1347
1349 assert(!UpdateListeners && "Dangling registered DAGUpdateListeners");
1350 allnodes_clear();
1351 OperandRecycler.clear(OperandAllocator);
1352 delete DbgInfo;
1353}
1354
1356 return MF->getFunction().hasOptSize() ||
1358}
1359
1360void SelectionDAG::allnodes_clear() {
1361 assert(&*AllNodes.begin() == &EntryNode);
1362 AllNodes.remove(AllNodes.begin());
1363 while (!AllNodes.empty())
1364 DeallocateNode(&AllNodes.front());
1365#ifndef NDEBUG
1366 NextPersistentId = 0;
1367#endif
1368}
1369
1370SDNode *SelectionDAG::FindNodeOrInsertPos(const FoldingSetNodeID &ID,
1371 void *&InsertPos) {
1372 SDNode *N = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
1373 if (N) {
1374 switch (N->getOpcode()) {
1375 default: break;
1376 case ISD::Constant:
1377 case ISD::ConstantFP:
1378 llvm_unreachable("Querying for Constant and ConstantFP nodes requires "
1379 "debug location. Use another overload.");
1380 }
1381 }
1382 return N;
1383}
1384
1385SDNode *SelectionDAG::FindNodeOrInsertPos(const FoldingSetNodeID &ID,
1386 const SDLoc &DL, void *&InsertPos) {
1387 SDNode *N = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
1388 if (N) {
1389 switch (N->getOpcode()) {
1390 case ISD::Constant:
1391 case ISD::ConstantFP:
1392 // Erase debug location from the node if the node is used at several
1393 // different places. Do not propagate one location to all uses as it
1394 // will cause a worse single stepping debugging experience.
1395 if (N->getDebugLoc() != DL.getDebugLoc())
1396 N->setDebugLoc(DebugLoc());
1397 break;
1398 default:
1399 // When the node's point of use is located earlier in the instruction
1400 // sequence than its prior point of use, update its debug info to the
1401 // earlier location.
1402 if (DL.getIROrder() && DL.getIROrder() < N->getIROrder())
1403 N->setDebugLoc(DL.getDebugLoc());
1404 break;
1405 }
1406 }
1407 return N;
1408}
1409
1411 allnodes_clear();
1412 OperandRecycler.clear(OperandAllocator);
1413 OperandAllocator.Reset();
1414 CSEMap.clear();
1415
1416 ExtendedValueTypeNodes.clear();
1417 ExternalSymbols.clear();
1418 TargetExternalSymbols.clear();
1419 MCSymbols.clear();
1420 SDEI.clear();
1421 std::fill(CondCodeNodes.begin(), CondCodeNodes.end(), nullptr);
1422 std::fill(ValueTypeNodes.begin(), ValueTypeNodes.end(), nullptr);
1423
1424 EntryNode.UseList = nullptr;
1425 InsertNode(&EntryNode);
1426 Root = getEntryNode();
1427 DbgInfo->clear();
1428}
1429
1431 return VT.bitsGT(Op.getValueType())
1432 ? getNode(ISD::FP_EXTEND, DL, VT, Op)
1433 : getNode(ISD::FP_ROUND, DL, VT, Op,
1434 getIntPtrConstant(0, DL, /*isTarget=*/true));
1435}
1436
1437std::pair<SDValue, SDValue>
1439 const SDLoc &DL, EVT VT) {
1440 assert(!VT.bitsEq(Op.getValueType()) &&
1441 "Strict no-op FP extend/round not allowed.");
1442 SDValue Res =
1443 VT.bitsGT(Op.getValueType())
1444 ? getNode(ISD::STRICT_FP_EXTEND, DL, {VT, MVT::Other}, {Chain, Op})
1445 : getNode(ISD::STRICT_FP_ROUND, DL, {VT, MVT::Other},
1446 {Chain, Op, getIntPtrConstant(0, DL)});
1447
1448 return std::pair<SDValue, SDValue>(Res, SDValue(Res.getNode(), 1));
1449}
1450
1452 return VT.bitsGT(Op.getValueType()) ?
1453 getNode(ISD::ANY_EXTEND, DL, VT, Op) :
1454 getNode(ISD::TRUNCATE, DL, VT, Op);
1455}
1456
1458 return VT.bitsGT(Op.getValueType()) ?
1459 getNode(ISD::SIGN_EXTEND, DL, VT, Op) :
1460 getNode(ISD::TRUNCATE, DL, VT, Op);
1461}
1462
1464 return VT.bitsGT(Op.getValueType()) ?
1465 getNode(ISD::ZERO_EXTEND, DL, VT, Op) :
1466 getNode(ISD::TRUNCATE, DL, VT, Op);
1467}
1468
1470 EVT VT) {
1471 assert(!VT.isVector());
1472 auto Type = Op.getValueType();
1473 SDValue DestOp;
1474 if (Type == VT)
1475 return Op;
1476 auto Size = Op.getValueSizeInBits();
1477 DestOp = getBitcast(MVT::getIntegerVT(Size), Op);
1478 if (DestOp.getValueType() == VT)
1479 return DestOp;
1480
1481 return getAnyExtOrTrunc(DestOp, DL, VT);
1482}
1483
1485 EVT VT) {
1486 assert(!VT.isVector());
1487 auto Type = Op.getValueType();
1488 SDValue DestOp;
1489 if (Type == VT)
1490 return Op;
1491 auto Size = Op.getValueSizeInBits();
1492 DestOp = getBitcast(MVT::getIntegerVT(Size), Op);
1493 if (DestOp.getValueType() == VT)
1494 return DestOp;
1495
1496 return getSExtOrTrunc(DestOp, DL, VT);
1497}
1498
1500 EVT VT) {
1501 assert(!VT.isVector());
1502 auto Type = Op.getValueType();
1503 SDValue DestOp;
1504 if (Type == VT)
1505 return Op;
1506 auto Size = Op.getValueSizeInBits();
1507 DestOp = getBitcast(MVT::getIntegerVT(Size), Op);
1508 if (DestOp.getValueType() == VT)
1509 return DestOp;
1510
1511 return getZExtOrTrunc(DestOp, DL, VT);
1512}
1513
1515 EVT OpVT) {
1516 if (VT.bitsLE(Op.getValueType()))
1517 return getNode(ISD::TRUNCATE, SL, VT, Op);
1518
1520 return getNode(TLI->getExtendForContent(BType), SL, VT, Op);
1521}
1522
1524 EVT OpVT = Op.getValueType();
1525 assert(VT.isInteger() && OpVT.isInteger() &&
1526 "Cannot getZeroExtendInReg FP types");
1527 assert(VT.isVector() == OpVT.isVector() &&
1528 "getZeroExtendInReg type should be vector iff the operand "
1529 "type is vector!");
1530 assert((!VT.isVector() ||
1532 "Vector element counts must match in getZeroExtendInReg");
1533 assert(VT.bitsLE(OpVT) && "Not extending!");
1534 if (OpVT == VT)
1535 return Op;
1537 VT.getScalarSizeInBits());
1538 return getNode(ISD::AND, DL, OpVT, Op, getConstant(Imm, DL, OpVT));
1539}
1540
1542 // Only unsigned pointer semantics are supported right now. In the future this
1543 // might delegate to TLI to check pointer signedness.
1544 return getZExtOrTrunc(Op, DL, VT);
1545}
1546
1548 // Only unsigned pointer semantics are supported right now. In the future this
1549 // might delegate to TLI to check pointer signedness.
1550 return getZeroExtendInReg(Op, DL, VT);
1551}
1552
1554 return getNode(ISD::SUB, DL, VT, getConstant(0, DL, VT), Val);
1555}
1556
1557/// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
1559 return getNode(ISD::XOR, DL, VT, Val, getAllOnesConstant(DL, VT));
1560}
1561
1563 SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
1564 return getNode(ISD::XOR, DL, VT, Val, TrueValue);
1565}
1566
1568 SDValue Mask, SDValue EVL, EVT VT) {
1569 SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
1570 return getNode(ISD::VP_XOR, DL, VT, Val, TrueValue, Mask, EVL);
1571}
1572
1574 SDValue Mask, SDValue EVL) {
1575 return getVPZExtOrTrunc(DL, VT, Op, Mask, EVL);
1576}
1577
1579 SDValue Mask, SDValue EVL) {
1580 if (VT.bitsGT(Op.getValueType()))
1581 return getNode(ISD::VP_ZERO_EXTEND, DL, VT, Op, Mask, EVL);
1582 if (VT.bitsLT(Op.getValueType()))
1583 return getNode(ISD::VP_TRUNCATE, DL, VT, Op, Mask, EVL);
1584 return Op;
1585}
1586
1588 EVT OpVT) {
1589 if (!V)
1590 return getConstant(0, DL, VT);
1591
1592 switch (TLI->getBooleanContents(OpVT)) {
1595 return getConstant(1, DL, VT);
1597 return getAllOnesConstant(DL, VT);
1598 }
1599 llvm_unreachable("Unexpected boolean content enum!");
1600}
1601
1603 bool isT, bool isO) {
1604 EVT EltVT = VT.getScalarType();
1605 assert((EltVT.getSizeInBits() >= 64 ||
1606 (uint64_t)((int64_t)Val >> EltVT.getSizeInBits()) + 1 < 2) &&
1607 "getConstant with a uint64_t value that doesn't fit in the type!");
1608 return getConstant(APInt(EltVT.getSizeInBits(), Val), DL, VT, isT, isO);
1609}
1610
1612 bool isT, bool isO) {
1613 return getConstant(*ConstantInt::get(*Context, Val), DL, VT, isT, isO);
1614}
1615
1617 EVT VT, bool isT, bool isO) {
1618 assert(VT.isInteger() && "Cannot create FP integer constant!");
1619
1620 EVT EltVT = VT.getScalarType();
1621 const ConstantInt *Elt = &Val;
1622
1623 // In some cases the vector type is legal but the element type is illegal and
1624 // needs to be promoted, for example v8i8 on ARM. In this case, promote the
1625 // inserted value (the type does not need to match the vector element type).
1626 // Any extra bits introduced will be truncated away.
1627 if (VT.isVector() && TLI->getTypeAction(*getContext(), EltVT) ==
1629 EltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1630 APInt NewVal;
1631 if (TLI->isSExtCheaperThanZExt(VT.getScalarType(), EltVT))
1632 NewVal = Elt->getValue().sextOrTrunc(EltVT.getSizeInBits());
1633 else
1634 NewVal = Elt->getValue().zextOrTrunc(EltVT.getSizeInBits());
1635 Elt = ConstantInt::get(*getContext(), NewVal);
1636 }
1637 // In other cases the element type is illegal and needs to be expanded, for
1638 // example v2i64 on MIPS32. In this case, find the nearest legal type, split
1639 // the value into n parts and use a vector type with n-times the elements.
1640 // Then bitcast to the type requested.
1641 // Legalizing constants too early makes the DAGCombiner's job harder so we
1642 // only legalize if the DAG tells us we must produce legal types.
1643 else if (NewNodesMustHaveLegalTypes && VT.isVector() &&
1644 TLI->getTypeAction(*getContext(), EltVT) ==
1646 const APInt &NewVal = Elt->getValue();
1647 EVT ViaEltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1648 unsigned ViaEltSizeInBits = ViaEltVT.getSizeInBits();
1649
1650 // For scalable vectors, try to use a SPLAT_VECTOR_PARTS node.
1651 if (VT.isScalableVector() ||
1653 assert(EltVT.getSizeInBits() % ViaEltSizeInBits == 0 &&
1654 "Can only handle an even split!");
1655 unsigned Parts = EltVT.getSizeInBits() / ViaEltSizeInBits;
1656
1657 SmallVector<SDValue, 2> ScalarParts;
1658 for (unsigned i = 0; i != Parts; ++i)
1659 ScalarParts.push_back(getConstant(
1660 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1661 ViaEltVT, isT, isO));
1662
1663 return getNode(ISD::SPLAT_VECTOR_PARTS, DL, VT, ScalarParts);
1664 }
1665
1666 unsigned ViaVecNumElts = VT.getSizeInBits() / ViaEltSizeInBits;
1667 EVT ViaVecVT = EVT::getVectorVT(*getContext(), ViaEltVT, ViaVecNumElts);
1668
1669 // Check the temporary vector is the correct size. If this fails then
1670 // getTypeToTransformTo() probably returned a type whose size (in bits)
1671 // isn't a power-of-2 factor of the requested type size.
1672 assert(ViaVecVT.getSizeInBits() == VT.getSizeInBits());
1673
1674 SmallVector<SDValue, 2> EltParts;
1675 for (unsigned i = 0; i < ViaVecNumElts / VT.getVectorNumElements(); ++i)
1676 EltParts.push_back(getConstant(
1677 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1678 ViaEltVT, isT, isO));
1679
1680 // EltParts is currently in little endian order. If we actually want
1681 // big-endian order then reverse it now.
1682 if (getDataLayout().isBigEndian())
1683 std::reverse(EltParts.begin(), EltParts.end());
1684
1685 // The elements must be reversed when the element order is different
1686 // to the endianness of the elements (because the BITCAST is itself a
1687 // vector shuffle in this situation). However, we do not need any code to
1688 // perform this reversal because getConstant() is producing a vector
1689 // splat.
1690 // This situation occurs in MIPS MSA.
1691
1693 for (unsigned i = 0, e = VT.getVectorNumElements(); i != e; ++i)
1694 llvm::append_range(Ops, EltParts);
1695
1696 SDValue V =
1697 getNode(ISD::BITCAST, DL, VT, getBuildVector(ViaVecVT, DL, Ops));
1698 return V;
1699 }
1700
1701 assert(Elt->getBitWidth() == EltVT.getSizeInBits() &&
1702 "APInt size does not match type size!");
1703 unsigned Opc = isT ? ISD::TargetConstant : ISD::Constant;
1705 AddNodeIDNode(ID, Opc, getVTList(EltVT), std::nullopt);
1706 ID.AddPointer(Elt);
1707 ID.AddBoolean(isO);
1708 void *IP = nullptr;
1709 SDNode *N = nullptr;
1710 if ((N = FindNodeOrInsertPos(ID, DL, IP)))
1711 if (!VT.isVector())
1712 return SDValue(N, 0);
1713
1714 if (!N) {
1715 N = newSDNode<ConstantSDNode>(isT, isO, Elt, EltVT);
1716 CSEMap.InsertNode(N, IP);
1717 InsertNode(N);
1718 NewSDValueDbgMsg(SDValue(N, 0), "Creating constant: ", this);
1719 }
1720
1721 SDValue Result(N, 0);
1722 if (VT.isVector())
1723 Result = getSplat(VT, DL, Result);
1724 return Result;
1725}
1726
1728 bool isTarget) {
1729 return getConstant(Val, DL, TLI->getPointerTy(getDataLayout()), isTarget);
1730}
1731
1733 const SDLoc &DL, bool LegalTypes) {
1734 assert(VT.isInteger() && "Shift amount is not an integer type!");
1735 EVT ShiftVT = TLI->getShiftAmountTy(VT, getDataLayout(), LegalTypes);
1736 return getConstant(Val, DL, ShiftVT);
1737}
1738
1740 const SDLoc &DL, bool LegalTypes) {
1741 assert(Val.ult(VT.getScalarSizeInBits()) && "Out of range shift");
1742 return getShiftAmountConstant(Val.getZExtValue(), VT, DL, LegalTypes);
1743}
1744
1746 bool isTarget) {
1747 return getConstant(Val, DL, TLI->getVectorIdxTy(getDataLayout()), isTarget);
1748}
1749
1751 bool isTarget) {
1752 return getConstantFP(*ConstantFP::get(*getContext(), V), DL, VT, isTarget);
1753}
1754
1756 EVT VT, bool isTarget) {
1757 assert(VT.isFloatingPoint() && "Cannot create integer FP constant!");
1758
1759 EVT EltVT = VT.getScalarType();
1760
1761 // Do the map lookup using the actual bit pattern for the floating point
1762 // value, so that we don't have problems with 0.0 comparing equal to -0.0, and
1763 // we don't have issues with SNANs.
1764 unsigned Opc = isTarget ? ISD::TargetConstantFP : ISD::ConstantFP;
1766 AddNodeIDNode(ID, Opc, getVTList(EltVT), std::nullopt);
1767 ID.AddPointer(&V);
1768 void *IP = nullptr;
1769 SDNode *N = nullptr;
1770 if ((N = FindNodeOrInsertPos(ID, DL, IP)))
1771 if (!VT.isVector())
1772 return SDValue(N, 0);
1773
1774 if (!N) {
1775 N = newSDNode<ConstantFPSDNode>(isTarget, &V, EltVT);
1776 CSEMap.InsertNode(N, IP);
1777 InsertNode(N);
1778 }
1779
1780 SDValue Result(N, 0);
1781 if (VT.isVector())
1782 Result = getSplat(VT, DL, Result);
1783 NewSDValueDbgMsg(Result, "Creating fp constant: ", this);
1784 return Result;
1785}
1786
1788 bool isTarget) {
1789 EVT EltVT = VT.getScalarType();
1790 if (EltVT == MVT::f32)
1791 return getConstantFP(APFloat((float)Val), DL, VT, isTarget);
1792 if (EltVT == MVT::f64)
1793 return getConstantFP(APFloat(Val), DL, VT, isTarget);
1794 if (EltVT == MVT::f80 || EltVT == MVT::f128 || EltVT == MVT::ppcf128 ||
1795 EltVT == MVT::f16 || EltVT == MVT::bf16) {
1796 bool Ignored;
1797 APFloat APF = APFloat(Val);
1799 &Ignored);
1800 return getConstantFP(APF, DL, VT, isTarget);
1801 }
1802 llvm_unreachable("Unsupported type in getConstantFP");
1803}
1804
1806 EVT VT, int64_t Offset, bool isTargetGA,
1807 unsigned TargetFlags) {
1808 assert((TargetFlags == 0 || isTargetGA) &&
1809 "Cannot set target flags on target-independent globals");
1810
1811 // Truncate (with sign-extension) the offset value to the pointer size.
1813 if (BitWidth < 64)
1815
1816 unsigned Opc;
1817 if (GV->isThreadLocal())
1819 else
1820 Opc = isTargetGA ? ISD::TargetGlobalAddress : ISD::GlobalAddress;
1821
1823 AddNodeIDNode(ID, Opc, getVTList(VT), std::nullopt);
1824 ID.AddPointer(GV);
1825 ID.AddInteger(Offset);
1826 ID.AddInteger(TargetFlags);
1827 void *IP = nullptr;
1828 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
1829 return SDValue(E, 0);
1830
1831 auto *N = newSDNode<GlobalAddressSDNode>(
1832 Opc, DL.getIROrder(), DL.getDebugLoc(), GV, VT, Offset, TargetFlags);
1833 CSEMap.InsertNode(N, IP);
1834 InsertNode(N);
1835 return SDValue(N, 0);
1836}
1837
1838SDValue SelectionDAG::getFrameIndex(int FI, EVT VT, bool isTarget) {
1839 unsigned Opc = isTarget ? ISD::TargetFrameIndex : ISD::FrameIndex;
1841 AddNodeIDNode(ID, Opc, getVTList(VT), std::nullopt);
1842 ID.AddInteger(FI);
1843 void *IP = nullptr;
1844 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
1845 return SDValue(E, 0);
1846
1847 auto *N = newSDNode<FrameIndexSDNode>(FI, VT, isTarget);
1848 CSEMap.InsertNode(N, IP);
1849 InsertNode(N);
1850 return SDValue(N, 0);
1851}
1852
1853SDValue SelectionDAG::getJumpTable(int JTI, EVT VT, bool isTarget,
1854 unsigned TargetFlags) {
1855 assert((TargetFlags == 0 || isTarget) &&
1856 "Cannot set target flags on target-independent jump tables");
1857 unsigned Opc = isTarget ? ISD::TargetJumpTable : ISD::JumpTable;
1859 AddNodeIDNode(ID, Opc, getVTList(VT), std::nullopt);
1860 ID.AddInteger(JTI);
1861 ID.AddInteger(TargetFlags);
1862 void *IP = nullptr;
1863 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
1864 return SDValue(E, 0);
1865
1866 auto *N = newSDNode<JumpTableSDNode>(JTI, VT, isTarget, TargetFlags);
1867 CSEMap.InsertNode(N, IP);
1868 InsertNode(N);
1869 return SDValue(N, 0);
1870}
1871
1873 const SDLoc &DL) {
1875 return getNode(ISD::JUMP_TABLE_DEBUG_INFO, DL, MVT::Glue, Chain,
1876 getTargetConstant(static_cast<uint64_t>(JTI), DL, PTy, true));
1877}
1878
1880 MaybeAlign Alignment, int Offset,
1881 bool isTarget, unsigned TargetFlags) {
1882 assert((TargetFlags == 0 || isTarget) &&
1883 "Cannot set target flags on target-independent globals");
1884 if (!Alignment)
1885 Alignment = shouldOptForSize()
1886 ? getDataLayout().getABITypeAlign(C->getType())
1887 : getDataLayout().getPrefTypeAlign(C->getType());
1888 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
1890 AddNodeIDNode(ID, Opc, getVTList(VT), std::nullopt);
1891 ID.AddInteger(Alignment->value());
1892 ID.AddInteger(Offset);
1893 ID.AddPointer(C);
1894 ID.AddInteger(TargetFlags);
1895 void *IP = nullptr;
1896 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
1897 return SDValue(E, 0);
1898
1899 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VT, Offset, *Alignment,
1900 TargetFlags);
1901 CSEMap.InsertNode(N, IP);
1902 InsertNode(N);
1903 SDValue V = SDValue(N, 0);
1904 NewSDValueDbgMsg(V, "Creating new constant pool: ", this);
1905 return V;
1906}
1907
1909 MaybeAlign Alignment, int Offset,
1910 bool isTarget, unsigned TargetFlags) {
1911 assert((TargetFlags == 0 || isTarget) &&
1912 "Cannot set target flags on target-independent globals");
1913 if (!Alignment)
1914 Alignment = getDataLayout().getPrefTypeAlign(C->getType());
1915 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
1917 AddNodeIDNode(ID, Opc, getVTList(VT), std::nullopt);
1918 ID.AddInteger(Alignment->value());
1919 ID.AddInteger(Offset);
1920 C->addSelectionDAGCSEId(ID);
1921 ID.AddInteger(TargetFlags);
1922 void *IP = nullptr;
1923 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
1924 return SDValue(E, 0);
1925
1926 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VT, Offset, *Alignment,
1927 TargetFlags);
1928 CSEMap.InsertNode(N, IP);
1929 InsertNode(N);
1930 return SDValue(N, 0);
1931}
1932
1935 AddNodeIDNode(ID, ISD::BasicBlock, getVTList(MVT::Other), std::nullopt);
1936 ID.AddPointer(MBB);
1937 void *IP = nullptr;
1938 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
1939 return SDValue(E, 0);
1940
1941 auto *N = newSDNode<BasicBlockSDNode>(MBB);
1942 CSEMap.InsertNode(N, IP);
1943 InsertNode(N);
1944 return SDValue(N, 0);
1945}
1946
1948 if (VT.isSimple() && (unsigned)VT.getSimpleVT().SimpleTy >=
1949 ValueTypeNodes.size())
1950 ValueTypeNodes.resize(VT.getSimpleVT().SimpleTy+1);
1951
1952 SDNode *&N = VT.isExtended() ?
1953 ExtendedValueTypeNodes[VT] : ValueTypeNodes[VT.getSimpleVT().SimpleTy];
1954
1955 if (N) return SDValue(N, 0);
1956 N = newSDNode<VTSDNode>(VT);
1957 InsertNode(N);
1958 return SDValue(N, 0);
1959}
1960
1962 SDNode *&N = ExternalSymbols[Sym];
1963 if (N) return SDValue(N, 0);
1964 N = newSDNode<ExternalSymbolSDNode>(false, Sym, 0, VT);
1965 InsertNode(N);
1966 return SDValue(N, 0);
1967}
1968
1970 SDNode *&N = MCSymbols[Sym];
1971 if (N)
1972 return SDValue(N, 0);
1973 N = newSDNode<MCSymbolSDNode>(Sym, VT);
1974 InsertNode(N);
1975 return SDValue(N, 0);
1976}
1977
1979 unsigned TargetFlags) {
1980 SDNode *&N =
1981 TargetExternalSymbols[std::pair<std::string, unsigned>(Sym, TargetFlags)];
1982 if (N) return SDValue(N, 0);
1983 N = newSDNode<ExternalSymbolSDNode>(true, Sym, TargetFlags, VT);
1984 InsertNode(N);
1985 return SDValue(N, 0);
1986}
1987
1989 if ((unsigned)Cond >= CondCodeNodes.size())
1990 CondCodeNodes.resize(Cond+1);
1991
1992 if (!CondCodeNodes[Cond]) {
1993 auto *N = newSDNode<CondCodeSDNode>(Cond);
1994 CondCodeNodes[Cond] = N;
1995 InsertNode(N);
1996 }
1997
1998 return SDValue(CondCodeNodes[Cond], 0);
1999}
2000
2002 bool ConstantFold) {
2003 assert(MulImm.getBitWidth() == VT.getSizeInBits() &&
2004 "APInt size does not match type size!");
2005
2006 if (MulImm == 0)
2007 return getConstant(0, DL, VT);
2008
2009 if (ConstantFold) {
2010 const MachineFunction &MF = getMachineFunction();
2011 const Function &F = MF.getFunction();
2012 ConstantRange CR = getVScaleRange(&F, 64);
2013 if (const APInt *C = CR.getSingleElement())
2014 return getConstant(MulImm * C->getZExtValue(), DL, VT);
2015 }
2016
2017 return getNode(ISD::VSCALE, DL, VT, getConstant(MulImm, DL, VT));
2018}
2019
2021 bool ConstantFold) {
2022 if (EC.isScalable())
2023 return getVScale(DL, VT,
2024 APInt(VT.getSizeInBits(), EC.getKnownMinValue()));
2025
2026 return getConstant(EC.getKnownMinValue(), DL, VT);
2027}
2028
2030 APInt One(ResVT.getScalarSizeInBits(), 1);
2031 return getStepVector(DL, ResVT, One);
2032}
2033
2035 const APInt &StepVal) {
2036 assert(ResVT.getScalarSizeInBits() == StepVal.getBitWidth());
2037 if (ResVT.isScalableVector())
2038 return getNode(
2039 ISD::STEP_VECTOR, DL, ResVT,
2040 getTargetConstant(StepVal, DL, ResVT.getVectorElementType()));
2041
2042 SmallVector<SDValue, 16> OpsStepConstants;
2043 for (uint64_t i = 0; i < ResVT.getVectorNumElements(); i++)
2044 OpsStepConstants.push_back(
2045 getConstant(StepVal * i, DL, ResVT.getVectorElementType()));
2046 return getBuildVector(ResVT, DL, OpsStepConstants);
2047}
2048
2049/// Swaps the values of N1 and N2. Swaps all indices in the shuffle mask M that
2050/// point at N1 to point at N2 and indices that point at N2 to point at N1.
2052 std::swap(N1, N2);
2054}
2055
2057 SDValue N2, ArrayRef<int> Mask) {
2058 assert(VT.getVectorNumElements() == Mask.size() &&
2059 "Must have the same number of vector elements as mask elements!");
2060 assert(VT == N1.getValueType() && VT == N2.getValueType() &&
2061 "Invalid VECTOR_SHUFFLE");
2062
2063 // Canonicalize shuffle undef, undef -> undef
2064 if (N1.isUndef() && N2.isUndef())
2065 return getUNDEF(VT);
2066
2067 // Validate that all indices in Mask are within the range of the elements
2068 // input to the shuffle.
2069 int NElts = Mask.size();
2070 assert(llvm::all_of(Mask,
2071 [&](int M) { return M < (NElts * 2) && M >= -1; }) &&
2072 "Index out of range");
2073
2074 // Copy the mask so we can do any needed cleanup.
2075 SmallVector<int, 8> MaskVec(Mask);
2076
2077 // Canonicalize shuffle v, v -> v, undef
2078 if (N1 == N2) {
2079 N2 = getUNDEF(VT);
2080 for (int i = 0; i != NElts; ++i)
2081 if (MaskVec[i] >= NElts) MaskVec[i] -= NElts;
2082 }
2083
2084 // Canonicalize shuffle undef, v -> v, undef. Commute the shuffle mask.
2085 if (N1.isUndef())
2086 commuteShuffle(N1, N2, MaskVec);
2087
2088 if (TLI->hasVectorBlend()) {
2089 // If shuffling a splat, try to blend the splat instead. We do this here so
2090 // that even when this arises during lowering we don't have to re-handle it.
2091 auto BlendSplat = [&](BuildVectorSDNode *BV, int Offset) {
2092 BitVector UndefElements;
2093 SDValue Splat = BV->getSplatValue(&UndefElements);
2094 if (!Splat)
2095 return;
2096
2097 for (int i = 0; i < NElts; ++i) {
2098 if (MaskVec[i] < Offset || MaskVec[i] >= (Offset + NElts))
2099 continue;
2100
2101 // If this input comes from undef, mark it as such.
2102 if (UndefElements[MaskVec[i] - Offset]) {
2103 MaskVec[i] = -1;
2104 continue;
2105 }
2106
2107 // If we can blend a non-undef lane, use that instead.
2108 if (!UndefElements[i])
2109 MaskVec[i] = i + Offset;
2110 }
2111 };
2112 if (auto *N1BV = dyn_cast<BuildVectorSDNode>(N1))
2113 BlendSplat(N1BV, 0);
2114 if (auto *N2BV = dyn_cast<BuildVectorSDNode>(N2))
2115 BlendSplat(N2BV, NElts);
2116 }
2117
2118 // Canonicalize all index into lhs, -> shuffle lhs, undef
2119 // Canonicalize all index into rhs, -> shuffle rhs, undef
2120 bool AllLHS = true, AllRHS = true;
2121 bool N2Undef = N2.isUndef();
2122 for (int i = 0; i != NElts; ++i) {
2123 if (MaskVec[i] >= NElts) {
2124 if (N2Undef)
2125 MaskVec[i] = -1;
2126 else
2127 AllLHS = false;
2128 } else if (MaskVec[i] >= 0) {
2129 AllRHS = false;
2130 }
2131 }
2132 if (AllLHS && AllRHS)
2133 return getUNDEF(VT);
2134 if (AllLHS && !N2Undef)
2135 N2 = getUNDEF(VT);
2136 if (AllRHS) {
2137 N1 = getUNDEF(VT);
2138 commuteShuffle(N1, N2, MaskVec);
2139 }
2140 // Reset our undef status after accounting for the mask.
2141 N2Undef = N2.isUndef();
2142 // Re-check whether both sides ended up undef.
2143 if (N1.isUndef() && N2Undef)
2144 return getUNDEF(VT);
2145
2146 // If Identity shuffle return that node.
2147 bool Identity = true, AllSame = true;
2148 for (int i = 0; i != NElts; ++i) {
2149 if (MaskVec[i] >= 0 && MaskVec[i] != i) Identity = false;
2150 if (MaskVec[i] != MaskVec[0]) AllSame = false;
2151 }
2152 if (Identity && NElts)
2153 return N1;
2154
2155 // Shuffling a constant splat doesn't change the result.
2156 if (N2Undef) {
2157 SDValue V = N1;
2158
2159 // Look through any bitcasts. We check that these don't change the number
2160 // (and size) of elements and just changes their types.
2161 while (V.getOpcode() == ISD::BITCAST)
2162 V = V->getOperand(0);
2163
2164 // A splat should always show up as a build vector node.
2165 if (auto *BV = dyn_cast<BuildVectorSDNode>(V)) {
2166 BitVector UndefElements;
2167 SDValue Splat = BV->getSplatValue(&UndefElements);
2168 // If this is a splat of an undef, shuffling it is also undef.
2169 if (Splat && Splat.isUndef())
2170 return getUNDEF(VT);
2171
2172 bool SameNumElts =
2173 V.getValueType().getVectorNumElements() == VT.getVectorNumElements();
2174
2175 // We only have a splat which can skip shuffles if there is a splatted
2176 // value and no undef lanes rearranged by the shuffle.
2177 if (Splat && UndefElements.none()) {
2178 // Splat of <x, x, ..., x>, return <x, x, ..., x>, provided that the
2179 // number of elements match or the value splatted is a zero constant.
2180 if (SameNumElts || isNullConstant(Splat))
2181 return N1;
2182 }
2183
2184 // If the shuffle itself creates a splat, build the vector directly.
2185 if (AllSame && SameNumElts) {
2186 EVT BuildVT = BV->getValueType(0);
2187 const SDValue &Splatted = BV->getOperand(MaskVec[0]);
2188 SDValue NewBV = getSplatBuildVector(BuildVT, dl, Splatted);
2189
2190 // We may have jumped through bitcasts, so the type of the
2191 // BUILD_VECTOR may not match the type of the shuffle.
2192 if (BuildVT != VT)
2193 NewBV = getNode(ISD::BITCAST, dl, VT, NewBV);
2194 return NewBV;
2195 }
2196 }
2197 }
2198
2200 SDValue Ops[2] = { N1, N2 };
2202 for (int i = 0; i != NElts; ++i)
2203 ID.AddInteger(MaskVec[i]);
2204
2205 void* IP = nullptr;
2206 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
2207 return SDValue(E, 0);
2208
2209 // Allocate the mask array for the node out of the BumpPtrAllocator, since
2210 // SDNode doesn't have access to it. This memory will be "leaked" when
2211 // the node is deallocated, but recovered when the NodeAllocator is released.
2212 int *MaskAlloc = OperandAllocator.Allocate<int>(NElts);
2213 llvm::copy(MaskVec, MaskAlloc);
2214
2215 auto *N = newSDNode<ShuffleVectorSDNode>(VT, dl.getIROrder(),
2216 dl.getDebugLoc(), MaskAlloc);
2217 createOperands(N, Ops);
2218
2219 CSEMap.InsertNode(N, IP);
2220 InsertNode(N);
2221 SDValue V = SDValue(N, 0);
2222 NewSDValueDbgMsg(V, "Creating new node: ", this);
2223 return V;
2224}
2225
2227 EVT VT = SV.getValueType(0);
2228 SmallVector<int, 8> MaskVec(SV.getMask());
2230
2231 SDValue Op0 = SV.getOperand(0);
2232 SDValue Op1 = SV.getOperand(1);
2233 return getVectorShuffle(VT, SDLoc(&SV), Op1, Op0, MaskVec);
2234}
2235
2238 AddNodeIDNode(ID, ISD::Register, getVTList(VT), std::nullopt);
2239 ID.AddInteger(RegNo);
2240 void *IP = nullptr;
2241 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2242 return SDValue(E, 0);
2243
2244 auto *N = newSDNode<RegisterSDNode>(RegNo, VT);
2245 N->SDNodeBits.IsDivergent = TLI->isSDNodeSourceOfDivergence(N, FLI, UA);
2246 CSEMap.InsertNode(N, IP);
2247 InsertNode(N);
2248 return SDValue(N, 0);
2249}
2250
2253 AddNodeIDNode(ID, ISD::RegisterMask, getVTList(MVT::Untyped), std::nullopt);
2254 ID.AddPointer(RegMask);
2255 void *IP = nullptr;
2256 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2257 return SDValue(E, 0);
2258
2259 auto *N = newSDNode<RegisterMaskSDNode>(RegMask);
2260 CSEMap.InsertNode(N, IP);
2261 InsertNode(N);
2262 return SDValue(N, 0);
2263}
2264
2266 MCSymbol *Label) {
2267 return getLabelNode(ISD::EH_LABEL, dl, Root, Label);
2268}
2269
2270SDValue SelectionDAG::getLabelNode(unsigned Opcode, const SDLoc &dl,
2271 SDValue Root, MCSymbol *Label) {
2273 SDValue Ops[] = { Root };
2274 AddNodeIDNode(ID, Opcode, getVTList(MVT::Other), Ops);
2275 ID.AddPointer(Label);
2276 void *IP = nullptr;
2277 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2278 return SDValue(E, 0);
2279
2280 auto *N =
2281 newSDNode<LabelSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), Label);
2282 createOperands(N, Ops);
2283
2284 CSEMap.InsertNode(N, IP);
2285 InsertNode(N);
2286 return SDValue(N, 0);
2287}
2288
2290 int64_t Offset, bool isTarget,
2291 unsigned TargetFlags) {
2292 unsigned Opc = isTarget ? ISD::TargetBlockAddress : ISD::BlockAddress;
2293
2295 AddNodeIDNode(ID, Opc, getVTList(VT), std::nullopt);
2296 ID.AddPointer(BA);
2297 ID.AddInteger(Offset);
2298 ID.AddInteger(TargetFlags);
2299 void *IP = nullptr;
2300 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2301 return SDValue(E, 0);
2302
2303 auto *N = newSDNode<BlockAddressSDNode>(Opc, VT, BA, Offset, TargetFlags);
2304 CSEMap.InsertNode(N, IP);
2305 InsertNode(N);
2306 return SDValue(N, 0);
2307}
2308
2311 AddNodeIDNode(ID, ISD::SRCVALUE, getVTList(MVT::Other), std::nullopt);
2312 ID.AddPointer(V);
2313
2314 void *IP = nullptr;
2315 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2316 return SDValue(E, 0);
2317
2318 auto *N = newSDNode<SrcValueSDNode>(V);
2319 CSEMap.InsertNode(N, IP);
2320 InsertNode(N);
2321 return SDValue(N, 0);
2322}
2323
2326 AddNodeIDNode(ID, ISD::MDNODE_SDNODE, getVTList(MVT::Other), std::nullopt);
2327 ID.AddPointer(MD);
2328
2329 void *IP = nullptr;
2330 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2331 return SDValue(E, 0);
2332
2333 auto *N = newSDNode<MDNodeSDNode>(MD);
2334 CSEMap.InsertNode(N, IP);
2335 InsertNode(N);
2336 return SDValue(N, 0);
2337}
2338
2340 if (VT == V.getValueType())
2341 return V;
2342
2343 return getNode(ISD::BITCAST, SDLoc(V), VT, V);
2344}
2345
2347 unsigned SrcAS, unsigned DestAS) {
2348 SDValue Ops[] = {Ptr};
2351 ID.AddInteger(SrcAS);
2352 ID.AddInteger(DestAS);
2353
2354 void *IP = nullptr;
2355 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
2356 return SDValue(E, 0);
2357
2358 auto *N = newSDNode<AddrSpaceCastSDNode>(dl.getIROrder(), dl.getDebugLoc(),
2359 VT, SrcAS, DestAS);
2360 createOperands(N, Ops);
2361
2362 CSEMap.InsertNode(N, IP);
2363 InsertNode(N);
2364 return SDValue(N, 0);
2365}
2366
2368 return getNode(ISD::FREEZE, SDLoc(V), V.getValueType(), V);
2369}
2370
2371/// getShiftAmountOperand - Return the specified value casted to
2372/// the target's desired shift amount type.
2374 EVT OpTy = Op.getValueType();
2375 EVT ShTy = TLI->getShiftAmountTy(LHSTy, getDataLayout());
2376 if (OpTy == ShTy || OpTy.isVector()) return Op;
2377
2378 return getZExtOrTrunc(Op, SDLoc(Op), ShTy);
2379}
2380
2382 SDLoc dl(Node);
2384 const Value *V = cast<SrcValueSDNode>(Node->getOperand(2))->getValue();
2385 EVT VT = Node->getValueType(0);
2386 SDValue Tmp1 = Node->getOperand(0);
2387 SDValue Tmp2 = Node->getOperand(1);
2388 const MaybeAlign MA(Node->getConstantOperandVal(3));
2389
2390 SDValue VAListLoad = getLoad(TLI.getPointerTy(getDataLayout()), dl, Tmp1,
2391 Tmp2, MachinePointerInfo(V));
2392 SDValue VAList = VAListLoad;
2393
2394 if (MA && *MA > TLI.getMinStackArgumentAlignment()) {
2395 VAList = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2396 getConstant(MA->value() - 1, dl, VAList.getValueType()));
2397
2398 VAList =
2399 getNode(ISD::AND, dl, VAList.getValueType(), VAList,
2400 getConstant(-(int64_t)MA->value(), dl, VAList.getValueType()));
2401 }
2402
2403 // Increment the pointer, VAList, to the next vaarg
2404 Tmp1 = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2405 getConstant(getDataLayout().getTypeAllocSize(
2406 VT.getTypeForEVT(*getContext())),
2407 dl, VAList.getValueType()));
2408 // Store the incremented VAList to the legalized pointer
2409 Tmp1 =
2410 getStore(VAListLoad.getValue(1), dl, Tmp1, Tmp2, MachinePointerInfo(V));
2411 // Load the actual argument out of the pointer VAList
2412 return getLoad(VT, dl, Tmp1, VAList, MachinePointerInfo());
2413}
2414
2416 SDLoc dl(Node);
2418 // This defaults to loading a pointer from the input and storing it to the
2419 // output, returning the chain.
2420 const Value *VD = cast<SrcValueSDNode>(Node->getOperand(3))->getValue();
2421 const Value *VS = cast<SrcValueSDNode>(Node->getOperand(4))->getValue();
2422 SDValue Tmp1 =
2423 getLoad(TLI.getPointerTy(getDataLayout()), dl, Node->getOperand(0),
2424 Node->getOperand(2), MachinePointerInfo(VS));
2425 return getStore(Tmp1.getValue(1), dl, Tmp1, Node->getOperand(1),
2426 MachinePointerInfo(VD));
2427}
2428
2430 const DataLayout &DL = getDataLayout();
2431 Type *Ty = VT.getTypeForEVT(*getContext());
2432 Align RedAlign = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2433
2434 if (TLI->isTypeLegal(VT) || !VT.isVector())
2435 return RedAlign;
2436
2438 const Align StackAlign = TFI->getStackAlign();
2439
2440 // See if we can choose a smaller ABI alignment in cases where it's an
2441 // illegal vector type that will get broken down.
2442 if (RedAlign > StackAlign) {
2443 EVT IntermediateVT;
2444 MVT RegisterVT;
2445 unsigned NumIntermediates;
2446 TLI->getVectorTypeBreakdown(*getContext(), VT, IntermediateVT,
2447 NumIntermediates, RegisterVT);
2448 Ty = IntermediateVT.getTypeForEVT(*getContext());
2449 Align RedAlign2 = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2450 if (RedAlign2 < RedAlign)
2451 RedAlign = RedAlign2;
2452 }
2453
2454 return RedAlign;
2455}
2456
2458 MachineFrameInfo &MFI = MF->getFrameInfo();
2460 int StackID = 0;
2461 if (Bytes.isScalable())
2462 StackID = TFI->getStackIDForScalableVectors();
2463 // The stack id gives an indication of whether the object is scalable or
2464 // not, so it's safe to pass in the minimum size here.
2465 int FrameIdx = MFI.CreateStackObject(Bytes.getKnownMinValue(), Alignment,
2466 false, nullptr, StackID);
2467 return getFrameIndex(FrameIdx, TLI->getFrameIndexTy(getDataLayout()));
2468}
2469
2471 Type *Ty = VT.getTypeForEVT(*getContext());
2472 Align StackAlign =
2473 std::max(getDataLayout().getPrefTypeAlign(Ty), Align(minAlign));
2474 return CreateStackTemporary(VT.getStoreSize(), StackAlign);
2475}
2476
2478 TypeSize VT1Size = VT1.getStoreSize();
2479 TypeSize VT2Size = VT2.getStoreSize();
2480 assert(VT1Size.isScalable() == VT2Size.isScalable() &&
2481 "Don't know how to choose the maximum size when creating a stack "
2482 "temporary");
2483 TypeSize Bytes = VT1Size.getKnownMinValue() > VT2Size.getKnownMinValue()
2484 ? VT1Size
2485 : VT2Size;
2486
2487 Type *Ty1 = VT1.getTypeForEVT(*getContext());
2488 Type *Ty2 = VT2.getTypeForEVT(*getContext());
2489 const DataLayout &DL = getDataLayout();
2490 Align Align = std::max(DL.getPrefTypeAlign(Ty1), DL.getPrefTypeAlign(Ty2));
2491 return CreateStackTemporary(Bytes, Align);
2492}
2493
2495 ISD::CondCode Cond, const SDLoc &dl) {
2496 EVT OpVT = N1.getValueType();
2497
2498 auto GetUndefBooleanConstant = [&]() {
2499 if (VT.getScalarType() == MVT::i1 ||
2500 TLI->getBooleanContents(OpVT) ==
2502 return getUNDEF(VT);
2503 // ZeroOrOne / ZeroOrNegative require specific values for the high bits,
2504 // so we cannot use getUNDEF(). Return zero instead.
2505 return getConstant(0, dl, VT);
2506 };
2507
2508 // These setcc operations always fold.
2509 switch (Cond) {
2510 default: break;
2511 case ISD::SETFALSE:
2512 case ISD::SETFALSE2: return getBoolConstant(false, dl, VT, OpVT);
2513 case ISD::SETTRUE:
2514 case ISD::SETTRUE2: return getBoolConstant(true, dl, VT, OpVT);
2515
2516 case ISD::SETOEQ:
2517 case ISD::SETOGT:
2518 case ISD::SETOGE:
2519 case ISD::SETOLT:
2520 case ISD::SETOLE:
2521 case ISD::SETONE:
2522 case ISD::SETO:
2523 case ISD::SETUO:
2524 case ISD::SETUEQ:
2525 case ISD::SETUNE:
2526 assert(!OpVT.isInteger() && "Illegal setcc for integer!");
2527 break;
2528 }
2529
2530 if (OpVT.isInteger()) {
2531 // For EQ and NE, we can always pick a value for the undef to make the
2532 // predicate pass or fail, so we can return undef.
2533 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2534 // icmp eq/ne X, undef -> undef.
2535 if ((N1.isUndef() || N2.isUndef()) &&
2536 (Cond == ISD::SETEQ || Cond == ISD::SETNE))
2537 return GetUndefBooleanConstant();
2538
2539 // If both operands are undef, we can return undef for int comparison.
2540 // icmp undef, undef -> undef.
2541 if (N1.isUndef() && N2.isUndef())
2542 return GetUndefBooleanConstant();
2543
2544 // icmp X, X -> true/false
2545 // icmp X, undef -> true/false because undef could be X.
2546 if (N1.isUndef() || N2.isUndef() || N1 == N2)
2547 return getBoolConstant(ISD::isTrueWhenEqual(Cond), dl, VT, OpVT);
2548 }
2549
2550 if (ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N2)) {
2551 const APInt &C2 = N2C->getAPIntValue();
2552 if (ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1)) {
2553 const APInt &C1 = N1C->getAPIntValue();
2554
2556 dl, VT, OpVT);
2557 }
2558 }
2559
2560 auto *N1CFP = dyn_cast<ConstantFPSDNode>(N1);
2561 auto *N2CFP = dyn_cast<ConstantFPSDNode>(N2);
2562
2563 if (N1CFP && N2CFP) {
2564 APFloat::cmpResult R = N1CFP->getValueAPF().compare(N2CFP->getValueAPF());
2565 switch (Cond) {
2566 default: break;
2567 case ISD::SETEQ: if (R==APFloat::cmpUnordered)
2568 return GetUndefBooleanConstant();
2569 [[fallthrough]];
2570 case ISD::SETOEQ: return getBoolConstant(R==APFloat::cmpEqual, dl, VT,
2571 OpVT);
2572 case ISD::SETNE: if (R==APFloat::cmpUnordered)
2573 return GetUndefBooleanConstant();
2574 [[fallthrough]];
2576 R==APFloat::cmpLessThan, dl, VT,
2577 OpVT);
2578 case ISD::SETLT: if (R==APFloat::cmpUnordered)
2579 return GetUndefBooleanConstant();
2580 [[fallthrough]];
2581 case ISD::SETOLT: return getBoolConstant(R==APFloat::cmpLessThan, dl, VT,
2582 OpVT);
2583 case ISD::SETGT: if (R==APFloat::cmpUnordered)
2584 return GetUndefBooleanConstant();
2585 [[fallthrough]];
2587 VT, OpVT);
2588 case ISD::SETLE: if (R==APFloat::cmpUnordered)
2589 return GetUndefBooleanConstant();
2590 [[fallthrough]];
2592 R==APFloat::cmpEqual, dl, VT,
2593 OpVT);
2594 case ISD::SETGE: if (R==APFloat::cmpUnordered)
2595 return GetUndefBooleanConstant();
2596 [[fallthrough]];
2598 R==APFloat::cmpEqual, dl, VT, OpVT);
2599 case ISD::SETO: return getBoolConstant(R!=APFloat::cmpUnordered, dl, VT,
2600 OpVT);
2601 case ISD::SETUO: return getBoolConstant(R==APFloat::cmpUnordered, dl, VT,
2602 OpVT);
2604 R==APFloat::cmpEqual, dl, VT,
2605 OpVT);
2606 case ISD::SETUNE: return getBoolConstant(R!=APFloat::cmpEqual, dl, VT,
2607 OpVT);
2609 R==APFloat::cmpLessThan, dl, VT,
2610 OpVT);
2612 R==APFloat::cmpUnordered, dl, VT,
2613 OpVT);
2615 VT, OpVT);
2616 case ISD::SETUGE: return getBoolConstant(R!=APFloat::cmpLessThan, dl, VT,
2617 OpVT);
2618 }
2619 } else if (N1CFP && OpVT.isSimple() && !N2.isUndef()) {
2620 // Ensure that the constant occurs on the RHS.
2622 if (!TLI->isCondCodeLegal(SwappedCond, OpVT.getSimpleVT()))
2623 return SDValue();
2624 return getSetCC(dl, VT, N2, N1, SwappedCond);
2625 } else if ((N2CFP && N2CFP->getValueAPF().isNaN()) ||
2626 (OpVT.isFloatingPoint() && (N1.isUndef() || N2.isUndef()))) {
2627 // If an operand is known to be a nan (or undef that could be a nan), we can
2628 // fold it.
2629 // Choosing NaN for the undef will always make unordered comparison succeed
2630 // and ordered comparison fails.
2631 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2632 switch (ISD::getUnorderedFlavor(Cond)) {
2633 default:
2634 llvm_unreachable("Unknown flavor!");
2635 case 0: // Known false.
2636 return getBoolConstant(false, dl, VT, OpVT);
2637 case 1: // Known true.
2638 return getBoolConstant(true, dl, VT, OpVT);
2639 case 2: // Undefined.
2640 return GetUndefBooleanConstant();
2641 }
2642 }
2643
2644 // Could not fold it.
2645 return SDValue();
2646}
2647
2648/// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We
2649/// use this predicate to simplify operations downstream.
2651 unsigned BitWidth = Op.getScalarValueSizeInBits();
2653}
2654
2655/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero. We use
2656/// this predicate to simplify operations downstream. Mask is known to be zero
2657/// for bits that V cannot have.
2659 unsigned Depth) const {
2660 return Mask.isSubsetOf(computeKnownBits(V, Depth).Zero);
2661}
2662
2663/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero in
2664/// DemandedElts. We use this predicate to simplify operations downstream.
2665/// Mask is known to be zero for bits that V cannot have.
2667 const APInt &DemandedElts,
2668 unsigned Depth) const {
2669 return Mask.isSubsetOf(computeKnownBits(V, DemandedElts, Depth).Zero);
2670}
2671
2672/// MaskedVectorIsZero - Return true if 'Op' is known to be zero in
2673/// DemandedElts. We use this predicate to simplify operations downstream.
2675 unsigned Depth /* = 0 */) const {
2676 return computeKnownBits(V, DemandedElts, Depth).isZero();
2677}
2678
2679/// MaskedValueIsAllOnes - Return true if '(Op & Mask) == Mask'.
2681 unsigned Depth) const {
2682 return Mask.isSubsetOf(computeKnownBits(V, Depth).One);
2683}
2684
2686 const APInt &DemandedElts,
2687 unsigned Depth) const {
2688 EVT VT = Op.getValueType();
2689 assert(VT.isVector() && !VT.isScalableVector() && "Only for fixed vectors!");
2690
2691 unsigned NumElts = VT.getVectorNumElements();
2692 assert(DemandedElts.getBitWidth() == NumElts && "Unexpected demanded mask.");
2693
2694 APInt KnownZeroElements = APInt::getZero(NumElts);
2695 for (unsigned EltIdx = 0; EltIdx != NumElts; ++EltIdx) {
2696 if (!DemandedElts[EltIdx])
2697 continue; // Don't query elements that are not demanded.
2698 APInt Mask = APInt::getOneBitSet(NumElts, EltIdx);
2699 if (MaskedVectorIsZero(Op, Mask, Depth))
2700 KnownZeroElements.setBit(EltIdx);
2701 }
2702 return KnownZeroElements;
2703}
2704
2705/// isSplatValue - Return true if the vector V has the same value
2706/// across all DemandedElts. For scalable vectors, we don't know the
2707/// number of lanes at compile time. Instead, we use a 1 bit APInt
2708/// to represent a conservative value for all lanes; that is, that
2709/// one bit value is implicitly splatted across all lanes.
2710bool SelectionDAG::isSplatValue(SDValue V, const APInt &DemandedElts,
2711 APInt &UndefElts, unsigned Depth) const {
2712 unsigned Opcode = V.getOpcode();
2713 EVT VT = V.getValueType();
2714 assert(VT.isVector() && "Vector type expected");
2715 assert((!VT.isScalableVector() || DemandedElts.getBitWidth() == 1) &&
2716 "scalable demanded bits are ignored");
2717
2718 if (!DemandedElts)
2719 return false; // No demanded elts, better to assume we don't know anything.
2720
2721 if (Depth >= MaxRecursionDepth)
2722 return false; // Limit search depth.
2723
2724 // Deal with some common cases here that work for both fixed and scalable
2725 // vector types.
2726 switch (Opcode) {
2727 case ISD::SPLAT_VECTOR:
2728 UndefElts = V.getOperand(0).isUndef()
2729 ? APInt::getAllOnes(DemandedElts.getBitWidth())
2730 : APInt(DemandedElts.getBitWidth(), 0);
2731 return true;
2732 case ISD::ADD:
2733 case ISD::SUB:
2734 case ISD::AND:
2735 case ISD::XOR:
2736 case ISD::OR: {
2737 APInt UndefLHS, UndefRHS;
2738 SDValue LHS = V.getOperand(0);
2739 SDValue RHS = V.getOperand(1);
2740 if (isSplatValue(LHS, DemandedElts, UndefLHS, Depth + 1) &&
2741 isSplatValue(RHS, DemandedElts, UndefRHS, Depth + 1)) {
2742 UndefElts = UndefLHS | UndefRHS;
2743 return true;
2744 }
2745 return false;
2746 }
2747 case ISD::ABS:
2748 case ISD::TRUNCATE:
2749 case ISD::SIGN_EXTEND:
2750 case ISD::ZERO_EXTEND:
2751 return isSplatValue(V.getOperand(0), DemandedElts, UndefElts, Depth + 1);
2752 default:
2753 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
2754 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
2755 return TLI->isSplatValueForTargetNode(V, DemandedElts, UndefElts, *this,
2756 Depth);
2757 break;
2758}
2759
2760 // We don't support other cases than those above for scalable vectors at
2761 // the moment.
2762 if (VT.isScalableVector())
2763 return false;
2764
2765 unsigned NumElts = VT.getVectorNumElements();
2766 assert(NumElts == DemandedElts.getBitWidth() && "Vector size mismatch");
2767 UndefElts = APInt::getZero(NumElts);
2768
2769 switch (Opcode) {
2770 case ISD::BUILD_VECTOR: {
2771 SDValue Scl;
2772 for (unsigned i = 0; i != NumElts; ++i) {
2773 SDValue Op = V.getOperand(i);
2774 if (Op.isUndef()) {
2775 UndefElts.setBit(i);
2776 continue;
2777 }
2778 if (!DemandedElts[i])
2779 continue;
2780 if (Scl && Scl != Op)
2781 return false;
2782 Scl = Op;
2783 }
2784 return true;
2785 }
2786 case ISD::VECTOR_SHUFFLE: {
2787 // Check if this is a shuffle node doing a splat or a shuffle of a splat.
2788 APInt DemandedLHS = APInt::getZero(NumElts);
2789 APInt DemandedRHS = APInt::getZero(NumElts);
2790 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(V)->getMask();
2791 for (int i = 0; i != (int)NumElts; ++i) {
2792 int M = Mask[i];
2793 if (M < 0) {
2794 UndefElts.setBit(i);
2795 continue;
2796 }
2797 if (!DemandedElts[i])
2798 continue;
2799 if (M < (int)NumElts)
2800 DemandedLHS.setBit(M);
2801 else
2802 DemandedRHS.setBit(M - NumElts);
2803 }
2804
2805 // If we aren't demanding either op, assume there's no splat.
2806 // If we are demanding both ops, assume there's no splat.
2807 if ((DemandedLHS.isZero() && DemandedRHS.isZero()) ||
2808 (!DemandedLHS.isZero() && !DemandedRHS.isZero()))
2809 return false;
2810
2811 // See if the demanded elts of the source op is a splat or we only demand
2812 // one element, which should always be a splat.
2813 // TODO: Handle source ops splats with undefs.
2814 auto CheckSplatSrc = [&](SDValue Src, const APInt &SrcElts) {
2815 APInt SrcUndefs;
2816 return (SrcElts.popcount() == 1) ||
2817 (isSplatValue(Src, SrcElts, SrcUndefs, Depth + 1) &&
2818 (SrcElts & SrcUndefs).isZero());
2819 };
2820 if (!DemandedLHS.isZero())
2821 return CheckSplatSrc(V.getOperand(0), DemandedLHS);
2822 return CheckSplatSrc(V.getOperand(1), DemandedRHS);
2823 }
2825 // Offset the demanded elts by the subvector index.
2826 SDValue Src = V.getOperand(0);
2827 // We don't support scalable vectors at the moment.
2828 if (Src.getValueType().isScalableVector())
2829 return false;
2830 uint64_t Idx = V.getConstantOperandVal(1);
2831 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
2832 APInt UndefSrcElts;
2833 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
2834 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
2835 UndefElts = UndefSrcElts.extractBits(NumElts, Idx);
2836 return true;
2837 }
2838 break;
2839 }
2843 // Widen the demanded elts by the src element count.
2844 SDValue Src = V.getOperand(0);
2845 // We don't support scalable vectors at the moment.
2846 if (Src.getValueType().isScalableVector())
2847 return false;
2848 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
2849 APInt UndefSrcElts;
2850 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts);
2851 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
2852 UndefElts = UndefSrcElts.trunc(NumElts);
2853 return true;
2854 }
2855 break;
2856 }
2857 case ISD::BITCAST: {
2858 SDValue Src = V.getOperand(0);
2859 EVT SrcVT = Src.getValueType();
2860 unsigned SrcBitWidth = SrcVT.getScalarSizeInBits();
2861 unsigned BitWidth = VT.getScalarSizeInBits();
2862
2863 // Ignore bitcasts from unsupported types.
2864 // TODO: Add fp support?
2865 if (!SrcVT.isVector() || !SrcVT.isInteger() || !VT.isInteger())
2866 break;
2867
2868 // Bitcast 'small element' vector to 'large element' vector.
2869 if ((BitWidth % SrcBitWidth) == 0) {
2870 // See if each sub element is a splat.
2871 unsigned Scale = BitWidth / SrcBitWidth;
2872 unsigned NumSrcElts = SrcVT.getVectorNumElements();
2873 APInt ScaledDemandedElts =
2874 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
2875 for (unsigned I = 0; I != Scale; ++I) {
2876 APInt SubUndefElts;
2877 APInt SubDemandedElt = APInt::getOneBitSet(Scale, I);
2878 APInt SubDemandedElts = APInt::getSplat(NumSrcElts, SubDemandedElt);
2879 SubDemandedElts &= ScaledDemandedElts;
2880 if (!isSplatValue(Src, SubDemandedElts, SubUndefElts, Depth + 1))
2881 return false;
2882 // TODO: Add support for merging sub undef elements.
2883 if (!SubUndefElts.isZero())
2884 return false;
2885 }
2886 return true;
2887 }
2888 break;
2889 }
2890 }
2891
2892 return false;
2893}
2894
2895/// Helper wrapper to main isSplatValue function.
2896bool SelectionDAG::isSplatValue(SDValue V, bool AllowUndefs) const {
2897 EVT VT = V.getValueType();
2898 assert(VT.isVector() && "Vector type expected");
2899
2900 APInt UndefElts;
2901 // Since the number of lanes in a scalable vector is unknown at compile time,
2902 // we track one bit which is implicitly broadcast to all lanes. This means
2903 // that all lanes in a scalable vector are considered demanded.
2904 APInt DemandedElts
2906 return isSplatValue(V, DemandedElts, UndefElts) &&
2907 (AllowUndefs || !UndefElts);
2908}
2909
2912
2913 EVT VT = V.getValueType();
2914 unsigned Opcode = V.getOpcode();
2915 switch (Opcode) {
2916 default: {
2917 APInt UndefElts;
2918 // Since the number of lanes in a scalable vector is unknown at compile time,
2919 // we track one bit which is implicitly broadcast to all lanes. This means
2920 // that all lanes in a scalable vector are considered demanded.
2921 APInt DemandedElts
2923
2924 if (isSplatValue(V, DemandedElts, UndefElts)) {
2925 if (VT.isScalableVector()) {
2926 // DemandedElts and UndefElts are ignored for scalable vectors, since
2927 // the only supported cases are SPLAT_VECTOR nodes.
2928 SplatIdx = 0;
2929 } else {
2930 // Handle case where all demanded elements are UNDEF.
2931 if (DemandedElts.isSubsetOf(UndefElts)) {
2932 SplatIdx = 0;
2933 return getUNDEF(VT);
2934 }
2935 SplatIdx = (UndefElts & DemandedElts).countr_one();
2936 }
2937 return V;
2938 }
2939 break;
2940 }
2941 case ISD::SPLAT_VECTOR:
2942 SplatIdx = 0;
2943 return V;
2944 case ISD::VECTOR_SHUFFLE: {
2945 assert(!VT.isScalableVector());
2946 // Check if this is a shuffle node doing a splat.
2947 // TODO - remove this and rely purely on SelectionDAG::isSplatValue,
2948 // getTargetVShiftNode currently struggles without the splat source.
2949 auto *SVN = cast<ShuffleVectorSDNode>(V);
2950 if (!SVN->isSplat())
2951 break;
2952 int Idx = SVN->getSplatIndex();
2953 int NumElts = V.getValueType().getVectorNumElements();
2954 SplatIdx = Idx % NumElts;
2955 return V.getOperand(Idx / NumElts);
2956 }
2957 }
2958
2959 return SDValue();
2960}
2961
2963 int SplatIdx;
2964 if (SDValue SrcVector = getSplatSourceVector(V, SplatIdx)) {
2965 EVT SVT = SrcVector.getValueType().getScalarType();
2966 EVT LegalSVT = SVT;
2967 if (LegalTypes && !TLI->isTypeLegal(SVT)) {
2968 if (!SVT.isInteger())
2969 return SDValue();
2970 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
2971 if (LegalSVT.bitsLT(SVT))
2972 return SDValue();
2973 }
2974 return getNode(ISD::EXTRACT_VECTOR_ELT, SDLoc(V), LegalSVT, SrcVector,
2975 getVectorIdxConstant(SplatIdx, SDLoc(V)));
2976 }
2977 return SDValue();
2978}
2979
2980const APInt *
2982 const APInt &DemandedElts) const {
2983 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
2984 V.getOpcode() == ISD::SRA) &&
2985 "Unknown shift node");
2986 unsigned BitWidth = V.getScalarValueSizeInBits();
2987 if (ConstantSDNode *SA = isConstOrConstSplat(V.getOperand(1), DemandedElts)) {
2988 // Shifting more than the bitwidth is not valid.
2989 const APInt &ShAmt = SA->getAPIntValue();
2990 if (ShAmt.ult(BitWidth))
2991 return &ShAmt;
2992 }
2993 return nullptr;
2994}
2995
2997 EVT VT = V.getValueType();
2998 APInt DemandedElts = VT.isFixedLengthVector()
3000 : APInt(1, 1);
3001 return getValidShiftAmountConstant(V, DemandedElts);
3002}
3003
3005 SDValue V, const APInt &DemandedElts) const {
3006 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3007 V.getOpcode() == ISD::SRA) &&
3008 "Unknown shift node");
3009 if (const APInt *ValidAmt = getValidShiftAmountConstant(V, DemandedElts))
3010 return ValidAmt;
3011 unsigned BitWidth = V.getScalarValueSizeInBits();
3012 auto *BV = dyn_cast<BuildVectorSDNode>(V.getOperand(1));
3013 if (!BV)
3014 return nullptr;
3015 const APInt *MinShAmt = nullptr;
3016 for (unsigned i = 0, e = BV->getNumOperands(); i != e; ++i) {
3017 if (!DemandedElts[i])
3018 continue;
3019 auto *SA = dyn_cast<ConstantSDNode>(BV->getOperand(i));
3020 if (!SA)
3021 return nullptr;
3022 // Shifting more than the bitwidth is not valid.
3023 const APInt &ShAmt = SA->getAPIntValue();
3024 if (ShAmt.uge(BitWidth))
3025 return nullptr;
3026 if (MinShAmt && MinShAmt->ule(ShAmt))
3027 continue;
3028 MinShAmt = &ShAmt;
3029 }
3030 return MinShAmt;
3031}
3032
3034 EVT VT = V.getValueType();
3035 APInt DemandedElts = VT.isFixedLengthVector()
3037 : APInt(1, 1);
3038 return getValidMinimumShiftAmountConstant(V, DemandedElts);
3039}
3040
3042 SDValue V, const APInt &DemandedElts) const {
3043 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3044 V.getOpcode() == ISD::SRA) &&
3045 "Unknown shift node");
3046 if (const APInt *ValidAmt = getValidShiftAmountConstant(V, DemandedElts))
3047 return ValidAmt;
3048 unsigned BitWidth = V.getScalarValueSizeInBits();
3049 auto *BV = dyn_cast<BuildVectorSDNode>(V.getOperand(1));
3050 if (!BV)
3051 return nullptr;
3052 const APInt *MaxShAmt = nullptr;
3053 for (unsigned i = 0, e = BV->getNumOperands(); i != e; ++i) {
3054 if (!DemandedElts[i])
3055 continue;
3056 auto *SA = dyn_cast<ConstantSDNode>(BV->getOperand(i));
3057 if (!SA)
3058 return nullptr;
3059 // Shifting more than the bitwidth is not valid.
3060 const APInt &ShAmt = SA->getAPIntValue();
3061 if (ShAmt.uge(BitWidth))
3062 return nullptr;
3063 if (MaxShAmt && MaxShAmt->uge(ShAmt))
3064 continue;
3065 MaxShAmt = &ShAmt;
3066 }
3067 return MaxShAmt;
3068}
3069
3071 EVT VT = V.getValueType();
3072 APInt DemandedElts = VT.isFixedLengthVector()
3074 : APInt(1, 1);
3075 return getValidMaximumShiftAmountConstant(V, DemandedElts);
3076}
3077
3078/// Determine which bits of Op are known to be either zero or one and return
3079/// them in Known. For vectors, the known bits are those that are shared by
3080/// every vector element.
3082 EVT VT = Op.getValueType();
3083
3084 // Since the number of lanes in a scalable vector is unknown at compile time,
3085 // we track one bit which is implicitly broadcast to all lanes. This means
3086 // that all lanes in a scalable vector are considered demanded.
3087 APInt DemandedElts = VT.isFixedLengthVector()
3089 : APInt(1, 1);
3090 return computeKnownBits(Op, DemandedElts, Depth);
3091}
3092
3093/// Determine which bits of Op are known to be either zero or one and return
3094/// them in Known. The DemandedElts argument allows us to only collect the known
3095/// bits that are shared by the requested vector elements.
3097 unsigned Depth) const {
3098 unsigned BitWidth = Op.getScalarValueSizeInBits();
3099
3100 KnownBits Known(BitWidth); // Don't know anything.
3101
3102 if (auto *C = dyn_cast<ConstantSDNode>(Op)) {
3103 // We know all of the bits for a constant!
3104 return KnownBits::makeConstant(C->getAPIntValue());
3105 }
3106 if (auto *C = dyn_cast<ConstantFPSDNode>(Op)) {
3107 // We know all of the bits for a constant fp!
3108 return KnownBits::makeConstant(C->getValueAPF().bitcastToAPInt());
3109 }
3110
3111 if (Depth >= MaxRecursionDepth)
3112 return Known; // Limit search depth.
3113
3114 KnownBits Known2;
3115 unsigned NumElts = DemandedElts.getBitWidth();
3116 assert((!Op.getValueType().isFixedLengthVector() ||
3117 NumElts == Op.getValueType().getVectorNumElements()) &&
3118 "Unexpected vector size");
3119
3120 if (!DemandedElts)
3121 return Known; // No demanded elts, better to assume we don't know anything.
3122
3123 unsigned Opcode = Op.getOpcode();
3124 switch (Opcode) {
3125 case ISD::MERGE_VALUES:
3126 return computeKnownBits(Op.getOperand(Op.getResNo()), DemandedElts,
3127 Depth + 1);
3128 case ISD::SPLAT_VECTOR: {
3129 SDValue SrcOp = Op.getOperand(0);
3130 assert(SrcOp.getValueSizeInBits() >= BitWidth &&
3131 "Expected SPLAT_VECTOR implicit truncation");
3132 // Implicitly truncate the bits to match the official semantics of
3133 // SPLAT_VECTOR.
3134 Known = computeKnownBits(SrcOp, Depth + 1).trunc(BitWidth);
3135 break;
3136 }
3138 unsigned ScalarSize = Op.getOperand(0).getScalarValueSizeInBits();
3139 assert(ScalarSize * Op.getNumOperands() == BitWidth &&
3140 "Expected SPLAT_VECTOR_PARTS scalars to cover element width");
3141 for (auto [I, SrcOp] : enumerate(Op->ops())) {
3142 Known.insertBits(computeKnownBits(SrcOp, Depth + 1), ScalarSize * I);
3143 }
3144 break;
3145 }
3146 case ISD::STEP_VECTOR: {
3147 const APInt &Step = Op.getConstantOperandAPInt(0);
3148
3149 if (Step.isPowerOf2())
3150 Known.Zero.setLowBits(Step.logBase2());
3151
3153
3154 if (!isUIntN(BitWidth, Op.getValueType().getVectorMinNumElements()))
3155 break;
3156 const APInt MinNumElts =
3157 APInt(BitWidth, Op.getValueType().getVectorMinNumElements());
3158
3159 bool Overflow;
3160 const APInt MaxNumElts = getVScaleRange(&F, BitWidth)
3162 .umul_ov(MinNumElts, Overflow);
3163 if (Overflow)
3164 break;
3165
3166 const APInt MaxValue = (MaxNumElts - 1).umul_ov(Step, Overflow);
3167 if (Overflow)
3168 break;
3169
3170 Known.Zero.setHighBits(MaxValue.countl_zero());
3171 break;
3172 }
3173 case ISD::BUILD_VECTOR:
3174 assert(!Op.getValueType().isScalableVector());
3175 // Collect the known bits that are shared by every demanded vector element.
3176 Known.Zero.setAllBits(); Known.One.setAllBits();
3177 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
3178 if (!DemandedElts[i])
3179 continue;
3180
3181 SDValue SrcOp = Op.getOperand(i);
3182 Known2 = computeKnownBits(SrcOp, Depth + 1);
3183
3184 // BUILD_VECTOR can implicitly truncate sources, we must handle this.
3185 if (SrcOp.getValueSizeInBits() != BitWidth) {
3186 assert(SrcOp.getValueSizeInBits() > BitWidth &&
3187 "Expected BUILD_VECTOR implicit truncation");
3188 Known2 = Known2.trunc(BitWidth);
3189 }
3190
3191 // Known bits are the values that are shared by every demanded element.
3192 Known = Known.intersectWith(Known2);
3193
3194 // If we don't know any bits, early out.
3195 if (Known.isUnknown())
3196 break;
3197 }
3198 break;
3199 case ISD::VECTOR_SHUFFLE: {
3200 assert(!Op.getValueType().isScalableVector());
3201 // Collect the known bits that are shared by every vector element referenced
3202 // by the shuffle.
3203 APInt DemandedLHS, DemandedRHS;
3204 const ShuffleVectorSDNode *SVN = cast<ShuffleVectorSDNode>(Op);
3205 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
3206 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
3207 DemandedLHS, DemandedRHS))
3208 break;
3209
3210 // Known bits are the values that are shared by every demanded element.
3211 Known.Zero.setAllBits(); Known.One.setAllBits();
3212 if (!!DemandedLHS) {
3213 SDValue LHS = Op.getOperand(0);
3214 Known2 = computeKnownBits(LHS, DemandedLHS, Depth + 1);
3215 Known = Known.intersectWith(Known2);
3216 }
3217 // If we don't know any bits, early out.
3218 if (Known.isUnknown())
3219 break;
3220 if (!!DemandedRHS) {
3221 SDValue RHS = Op.getOperand(1);
3222 Known2 = computeKnownBits(RHS, DemandedRHS, Depth + 1);
3223 Known = Known.intersectWith(Known2);
3224 }
3225 break;
3226 }
3227 case ISD::VSCALE: {
3229 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
3230 Known = getVScaleRange(&F, BitWidth).multiply(Multiplier).toKnownBits();
3231 break;
3232 }
3233 case ISD::CONCAT_VECTORS: {
3234 if (Op.getValueType().isScalableVector())
3235 break;
3236 // Split DemandedElts and test each of the demanded subvectors.
3237 Known.Zero.setAllBits(); Known.One.setAllBits();
3238 EVT SubVectorVT = Op.getOperand(0).getValueType();
3239 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
3240 unsigned NumSubVectors = Op.getNumOperands();
3241 for (unsigned i = 0; i != NumSubVectors; ++i) {
3242 APInt DemandedSub =
3243 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
3244 if (!!DemandedSub) {
3245 SDValue Sub = Op.getOperand(i);
3246 Known2 = computeKnownBits(Sub, DemandedSub, Depth + 1);
3247 Known = Known.intersectWith(Known2);
3248 }
3249 // If we don't know any bits, early out.
3250 if (Known.isUnknown())
3251 break;
3252 }
3253 break;
3254 }
3255 case ISD::INSERT_SUBVECTOR: {
3256 if (Op.getValueType().isScalableVector())
3257 break;
3258 // Demand any elements from the subvector and the remainder from the src its
3259 // inserted into.
3260 SDValue Src = Op.getOperand(0);
3261 SDValue Sub = Op.getOperand(1);
3262 uint64_t Idx = Op.getConstantOperandVal(2);
3263 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
3264 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
3265 APInt DemandedSrcElts = DemandedElts;
3266 DemandedSrcElts.insertBits(APInt::getZero(NumSubElts), Idx);
3267
3268 Known.One.setAllBits();
3269 Known.Zero.setAllBits();
3270 if (!!DemandedSubElts) {
3271 Known = computeKnownBits(Sub, DemandedSubElts, Depth + 1);
3272 if (Known.isUnknown())
3273 break; // early-out.
3274 }
3275 if (!!DemandedSrcElts) {
3276 Known2 = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3277 Known = Known.intersectWith(Known2);
3278 }
3279 break;
3280 }
3282 // Offset the demanded elts by the subvector index.
3283 SDValue Src = Op.getOperand(0);
3284 // Bail until we can represent demanded elements for scalable vectors.
3285 if (Op.getValueType().isScalableVector() || Src.getValueType().isScalableVector())
3286 break;
3287 uint64_t Idx = Op.getConstantOperandVal(1);
3288 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3289 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3290 Known = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3291 break;
3292 }
3293 case ISD::SCALAR_TO_VECTOR: {
3294 if (Op.getValueType().isScalableVector())
3295 break;
3296 // We know about scalar_to_vector as much as we know about it source,
3297 // which becomes the first element of otherwise unknown vector.
3298 if (DemandedElts != 1)
3299 break;
3300
3301 SDValue N0 = Op.getOperand(0);
3302 Known = computeKnownBits(N0, Depth + 1);
3303 if (N0.getValueSizeInBits() != BitWidth)
3304 Known = Known.trunc(BitWidth);
3305
3306 break;
3307 }
3308 case ISD::BITCAST: {
3309 if (Op.getValueType().isScalableVector())
3310 break;
3311
3312 SDValue N0 = Op.getOperand(0);
3313 EVT SubVT = N0.getValueType();
3314 unsigned SubBitWidth = SubVT.getScalarSizeInBits();
3315
3316 // Ignore bitcasts from unsupported types.
3317 if (!(SubVT.isInteger() || SubVT.isFloatingPoint()))
3318 break;
3319
3320 // Fast handling of 'identity' bitcasts.
3321 if (BitWidth == SubBitWidth) {
3322 Known = computeKnownBits(N0, DemandedElts, Depth + 1);
3323 break;
3324 }
3325
3326 bool IsLE = getDataLayout().isLittleEndian();
3327
3328 // Bitcast 'small element' vector to 'large element' scalar/vector.
3329 if ((BitWidth % SubBitWidth) == 0) {
3330 assert(N0.getValueType().isVector() && "Expected bitcast from vector");
3331
3332 // Collect known bits for the (larger) output by collecting the known
3333 // bits from each set of sub elements and shift these into place.
3334 // We need to separately call computeKnownBits for each set of
3335 // sub elements as the knownbits for each is likely to be different.
3336 unsigned SubScale = BitWidth / SubBitWidth;
3337 APInt SubDemandedElts(NumElts * SubScale, 0);
3338 for (unsigned i = 0; i != NumElts; ++i)
3339 if (DemandedElts[i])
3340 SubDemandedElts.setBit(i * SubScale);
3341
3342 for (unsigned i = 0; i != SubScale; ++i) {
3343 Known2 = computeKnownBits(N0, SubDemandedElts.shl(i),
3344 Depth + 1);
3345 unsigned Shifts = IsLE ? i : SubScale - 1 - i;
3346 Known.insertBits(Known2, SubBitWidth * Shifts);
3347 }
3348 }
3349
3350 // Bitcast 'large element' scalar/vector to 'small element' vector.
3351 if ((SubBitWidth % BitWidth) == 0) {
3352 assert(Op.getValueType().isVector() && "Expected bitcast to vector");
3353
3354 // Collect known bits for the (smaller) output by collecting the known
3355 // bits from the overlapping larger input elements and extracting the
3356 // sub sections we actually care about.
3357 unsigned SubScale = SubBitWidth / BitWidth;
3358 APInt SubDemandedElts =
3359 APIntOps::ScaleBitMask(DemandedElts, NumElts / SubScale);
3360 Known2 = computeKnownBits(N0, SubDemandedElts, Depth + 1);
3361
3362 Known.Zero.setAllBits(); Known.One.setAllBits();
3363 for (unsigned i = 0; i != NumElts; ++i)
3364 if (DemandedElts[i]) {
3365 unsigned Shifts = IsLE ? i : NumElts - 1 - i;
3366 unsigned Offset = (Shifts % SubScale) * BitWidth;
3367 Known = Known.intersectWith(Known2.extractBits(BitWidth, Offset));
3368 // If we don't know any bits, early out.
3369 if (Known.isUnknown())
3370 break;
3371 }
3372 }
3373 break;
3374 }
3375 case ISD::AND:
3376 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3377 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3378
3379 Known &= Known2;
3380 break;
3381 case ISD::OR:
3382 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3383 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3384
3385 Known |= Known2;
3386 break;
3387 case ISD::XOR:
3388 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3389 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3390
3391 Known ^= Known2;
3392 break;
3393 case ISD::MUL: {
3394 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3395 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3396 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3397 // TODO: SelfMultiply can be poison, but not undef.
3398 if (SelfMultiply)
3399 SelfMultiply &= isGuaranteedNotToBeUndefOrPoison(
3400 Op.getOperand(0), DemandedElts, false, Depth + 1);
3401 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3402
3403 // If the multiplication is known not to overflow, the product of a number
3404 // with itself is non-negative. Only do this if we didn't already computed
3405 // the opposite value for the sign bit.
3406 if (Op->getFlags().hasNoSignedWrap() &&
3407 Op.getOperand(0) == Op.getOperand(1) &&
3408 !Known.isNegative())
3409 Known.makeNonNegative();
3410 break;
3411 }
3412 case ISD::MULHU: {
3413 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3414 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3415 Known = KnownBits::mulhu(Known, Known2);
3416 break;
3417 }
3418 case ISD::MULHS: {
3419 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3420 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3421 Known = KnownBits::mulhs(Known, Known2);
3422 break;
3423 }
3424 case ISD::ABDU: {
3425 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3426 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3427 Known = KnownBits::abdu(Known, Known2);
3428 break;
3429 }
3430 case ISD::ABDS: {
3431 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3432 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3433 Known = KnownBits::abds(Known, Known2);
3434 break;
3435 }
3436 case ISD::UMUL_LOHI: {
3437 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3438 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3439 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3440 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3441 if (Op.getResNo() == 0)
3442 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3443 else
3444 Known = KnownBits::mulhu(Known, Known2);
3445 break;
3446 }
3447 case ISD::SMUL_LOHI: {
3448 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3449 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3450 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3451 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3452 if (Op.getResNo() == 0)
3453 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3454 else
3455 Known = KnownBits::mulhs(Known, Known2);
3456 break;
3457 }
3458 case ISD::AVGFLOORU:
3459 case ISD::AVGCEILU:
3460 case ISD::AVGFLOORS:
3461 case ISD::AVGCEILS: {
3462 bool IsCeil = Opcode == ISD::AVGCEILU || Opcode == ISD::AVGCEILS;
3463 bool IsSigned = Opcode == ISD::AVGFLOORS || Opcode == ISD::AVGCEILS;
3464 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3465 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3466 Known = IsSigned ? Known.sext(BitWidth + 1) : Known.zext(BitWidth + 1);
3467 Known2 = IsSigned ? Known2.sext(BitWidth + 1) : Known2.zext(BitWidth + 1);
3468 KnownBits Carry = KnownBits::makeConstant(APInt(1, IsCeil ? 1 : 0));
3469 Known = KnownBits::computeForAddCarry(Known, Known2, Carry);
3470 Known = Known.extractBits(BitWidth, 1);
3471 break;
3472 }
3473 case ISD::SELECT:
3474 case ISD::VSELECT:
3475 Known = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3476 // If we don't know any bits, early out.
3477 if (Known.isUnknown())
3478 break;
3479 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth+1);
3480
3481 // Only known if known in both the LHS and RHS.
3482 Known = Known.intersectWith(Known2);
3483 break;
3484 case ISD::SELECT_CC:
3485 Known = computeKnownBits(Op.getOperand(3), DemandedElts, Depth+1);
3486 // If we don't know any bits, early out.
3487 if (Known.isUnknown())
3488 break;
3489 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3490
3491 // Only known if known in both the LHS and RHS.
3492 Known = Known.intersectWith(Known2);
3493 break;
3494 case ISD::SMULO:
3495 case ISD::UMULO:
3496 if (Op.getResNo() != 1)
3497 break;
3498 // The boolean result conforms to getBooleanContents.
3499 // If we know the result of a setcc has the top bits zero, use this info.
3500 // We know that we have an integer-based boolean since these operations
3501 // are only available for integer.
3502 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
3504 BitWidth > 1)
3505 Known.Zero.setBitsFrom(1);
3506 break;
3507 case ISD::SETCC:
3508 case ISD::SETCCCARRY:
3509 case ISD::STRICT_FSETCC:
3510 case ISD::STRICT_FSETCCS: {
3511 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
3512 // If we know the result of a setcc has the top bits zero, use this info.
3513 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
3515 BitWidth > 1)
3516 Known.Zero.setBitsFrom(1);
3517 break;
3518 }
3519 case ISD::SHL:
3520 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3521 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3522 Known = KnownBits::shl(Known, Known2);
3523
3524 // Minimum shift low bits are known zero.
3525 if (const APInt *ShMinAmt =
3527 Known.Zero.setLowBits(ShMinAmt->getZExtValue());
3528 break;
3529 case ISD::SRL:
3530 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3531 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3532 Known = KnownBits::lshr(Known, Known2, /*ShAmtNonZero=*/false,
3533 Op->getFlags().hasExact());
3534
3535 // Minimum shift high bits are known zero.
3536 if (const APInt *ShMinAmt =
3538 Known.Zero.setHighBits(ShMinAmt->getZExtValue());
3539 break;
3540 case ISD::SRA:
3541 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3542 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3543 Known = KnownBits::ashr(Known, Known2, /*ShAmtNonZero=*/false,
3544 Op->getFlags().hasExact());
3545 break;
3546 case ISD::FSHL:
3547 case ISD::FSHR:
3548 if (ConstantSDNode *C = isConstOrConstSplat(Op.getOperand(2), DemandedElts)) {
3549 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3550
3551 // For fshl, 0-shift returns the 1st arg.
3552 // For fshr, 0-shift returns the 2nd arg.
3553 if (Amt == 0) {
3554 Known = computeKnownBits(Op.getOperand(Opcode == ISD::FSHL ? 0 : 1),
3555 DemandedElts, Depth + 1);
3556 break;
3557 }
3558
3559 // fshl: (X << (Z % BW)) | (Y >> (BW - (Z % BW)))
3560 // fshr: (X << (BW - (Z % BW))) | (Y >> (Z % BW))
3561 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3562 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3563 if (Opcode == ISD::FSHL) {
3564 Known.One <<= Amt;
3565 Known.Zero <<= Amt;
3566 Known2.One.lshrInPlace(BitWidth - Amt);
3567 Known2.Zero.lshrInPlace(BitWidth - Amt);
3568 } else {
3569 Known.One <<= BitWidth - Amt;
3570 Known.Zero <<= BitWidth - Amt;
3571 Known2.One.lshrInPlace(Amt);
3572 Known2.Zero.lshrInPlace(Amt);
3573 }
3574 Known = Known.unionWith(Known2);
3575 }
3576 break;
3577 case ISD::SHL_PARTS:
3578 case ISD::SRA_PARTS:
3579 case ISD::SRL_PARTS: {
3580 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3581
3582 // Collect lo/hi source values and concatenate.
3583 unsigned LoBits = Op.getOperand(0).getScalarValueSizeInBits();
3584 unsigned HiBits = Op.getOperand(1).getScalarValueSizeInBits();
3585 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3586 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3587 Known = Known2.concat(Known);
3588
3589 // Collect shift amount.
3590 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
3591
3592 if (Opcode == ISD::SHL_PARTS)
3593 Known = KnownBits::shl(Known, Known2);
3594 else if (Opcode == ISD::SRA_PARTS)
3595 Known = KnownBits::ashr(Known, Known2);
3596 else // if (Opcode == ISD::SRL_PARTS)
3597 Known = KnownBits::lshr(Known, Known2);
3598
3599 // TODO: Minimum shift low/high bits are known zero.
3600
3601 if (Op.getResNo() == 0)
3602 Known = Known.extractBits(LoBits, 0);
3603 else
3604 Known = Known.extractBits(HiBits, LoBits);
3605 break;
3606 }
3608 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3609 EVT EVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
3610 Known = Known.sextInReg(EVT.getScalarSizeInBits());
3611 break;
3612 }
3613 case ISD::CTTZ:
3614 case ISD::CTTZ_ZERO_UNDEF: {
3615 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3616 // If we have a known 1, its position is our upper bound.
3617 unsigned PossibleTZ = Known2.countMaxTrailingZeros();
3618 unsigned LowBits = llvm::bit_width(PossibleTZ);
3619 Known.Zero.setBitsFrom(LowBits);
3620 break;
3621 }
3622 case ISD::CTLZ:
3623 case ISD::CTLZ_ZERO_UNDEF: {
3624 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3625 // If we have a known 1, its position is our upper bound.
3626 unsigned PossibleLZ = Known2.countMaxLeadingZeros();
3627 unsigned LowBits = llvm::bit_width(PossibleLZ);
3628 Known.Zero.setBitsFrom(LowBits);
3629 break;
3630 }
3631 case ISD::CTPOP: {
3632 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3633 // If we know some of the bits are zero, they can't be one.
3634 unsigned PossibleOnes = Known2.countMaxPopulation();
3635 Known.Zero.setBitsFrom(llvm::bit_width(PossibleOnes));
3636 break;
3637 }
3638 case ISD::PARITY: {
3639 // Parity returns 0 everywhere but the LSB.
3640 Known.Zero.setBitsFrom(1);
3641 break;
3642 }
3643 case ISD::LOAD: {
3644 LoadSDNode *LD = cast<LoadSDNode>(Op);
3645 const Constant *Cst = TLI->getTargetConstantFromLoad(LD);
3646 if (ISD::isNON_EXTLoad(LD) && Cst) {
3647 // Determine any common known bits from the loaded constant pool value.
3648 Type *CstTy = Cst->getType();
3649 if ((NumElts * BitWidth) == CstTy->getPrimitiveSizeInBits() &&
3650 !Op.getValueType().isScalableVector()) {
3651 // If its a vector splat, then we can (quickly) reuse the scalar path.
3652 // NOTE: We assume all elements match and none are UNDEF.
3653 if (CstTy->isVectorTy()) {
3654 if (const Constant *Splat = Cst->getSplatValue()) {
3655 Cst = Splat;
3656 CstTy = Cst->getType();
3657 }
3658 }
3659 // TODO - do we need to handle different bitwidths?
3660 if (CstTy->isVectorTy() && BitWidth == CstTy->getScalarSizeInBits()) {
3661 // Iterate across all vector elements finding common known bits.
3662 Known.One.setAllBits();
3663 Known.Zero.setAllBits();
3664 for (unsigned i = 0; i != NumElts; ++i) {
3665 if (!DemandedElts[i])
3666 continue;
3667 if (Constant *Elt = Cst->getAggregateElement(i)) {
3668 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
3669 const APInt &Value = CInt->getValue();
3670 Known.One &= Value;
3671 Known.Zero &= ~Value;
3672 continue;
3673 }
3674 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
3675 APInt Value = CFP->getValueAPF().bitcastToAPInt();
3676 Known.One &= Value;
3677 Known.Zero &= ~Value;
3678 continue;
3679 }
3680 }
3681 Known.One.clearAllBits();
3682 Known.Zero.clearAllBits();
3683 break;
3684 }
3685 } else if (BitWidth == CstTy->getPrimitiveSizeInBits()) {
3686 if (auto *CInt = dyn_cast<ConstantInt>(Cst)) {
3687 Known = KnownBits::makeConstant(CInt->getValue());
3688 } else if (auto *CFP = dyn_cast<ConstantFP>(Cst)) {
3689 Known =
3690 KnownBits::makeConstant(CFP->getValueAPF().bitcastToAPInt());
3691 }
3692 }
3693 }
3694 } else if (Op.getResNo() == 0) {
3695 KnownBits Known0(!LD->getMemoryVT().isScalableVT()
3696 ? LD->getMemoryVT().getFixedSizeInBits()
3697 : BitWidth);
3698 EVT VT = Op.getValueType();
3699 // Fill in any known bits from range information. There are 3 types being
3700 // used. The results VT (same vector elt size as BitWidth), the loaded
3701 // MemoryVT (which may or may not be vector) and the range VTs original
3702 // type. The range matadata needs the full range (i.e
3703 // MemoryVT().getSizeInBits()), which is truncated to the correct elt size
3704 // if it is know. These are then extended to the original VT sizes below.
3705 if (const MDNode *MD = LD->getRanges()) {
3707 if (VT.isVector()) {
3708 // Handle truncation to the first demanded element.
3709 // TODO: Figure out which demanded elements are covered
3710 if (DemandedElts != 1 || !getDataLayout().isLittleEndian())
3711 break;
3712 Known0 = Known0.trunc(BitWidth);
3713 }
3714 }
3715
3716 if (LD->getMemoryVT().isVector())
3717 Known0 = Known0.trunc(LD->getMemoryVT().getScalarSizeInBits());
3718
3719 // Extend the Known bits from memory to the size of the result.
3720 if (ISD::isZEXTLoad(Op.getNode()))
3721 Known = Known0.zext(BitWidth);
3722 else if (ISD::isSEXTLoad(Op.getNode()))
3723 Known = Known0.sext(BitWidth);
3724 else if (ISD::isEXTLoad(Op.getNode()))
3725 Known = Known0.anyext(BitWidth);
3726 else
3727 Known = Known0;
3728 assert(Known.getBitWidth() == BitWidth);
3729 return Known;
3730 }
3731 break;
3732 }
3734 if (Op.getValueType().isScalableVector())
3735 break;
3736 EVT InVT = Op.getOperand(0).getValueType();
3737 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
3738 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
3739 Known = Known.zext(BitWidth);
3740 break;
3741 }
3742 case ISD::ZERO_EXTEND: {
3743 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3744 Known = Known.zext(BitWidth);
3745 break;
3746 }
3748 if (Op.getValueType().isScalableVector())
3749 break;
3750 EVT InVT = Op.getOperand(0).getValueType();
3751 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
3752 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
3753 // If the sign bit is known to be zero or one, then sext will extend
3754 // it to the top bits, else it will just zext.
3755 Known = Known.sext(BitWidth);
3756 break;
3757 }
3758 case ISD::SIGN_EXTEND: {
3759 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3760 // If the sign bit is known to be zero or one, then sext will extend
3761 // it to the top bits, else it will just zext.
3762 Known = Known.sext(BitWidth);
3763 break;
3764 }
3766 if (Op.getValueType().isScalableVector())
3767 break;
3768 EVT InVT = Op.getOperand(0).getValueType();
3769 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
3770 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
3771 Known = Known.anyext(BitWidth);
3772 break;
3773 }
3774 case ISD::ANY_EXTEND: {
3775 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3776 Known = Known.anyext(BitWidth);
3777 break;
3778 }
3779 case ISD::TRUNCATE: {
3780 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3781 Known = Known.trunc(BitWidth);
3782 break;
3783 }
3784 case ISD::AssertZext: {
3785 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
3787 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3788 Known.Zero |= (~InMask);
3789 Known.One &= (~Known.Zero);
3790 break;
3791 }
3792 case ISD::AssertAlign: {
3793 unsigned LogOfAlign = Log2(cast<AssertAlignSDNode>(Op)->getAlign());
3794 assert(LogOfAlign != 0);
3795
3796 // TODO: Should use maximum with source
3797 // If a node is guaranteed to be aligned, set low zero bits accordingly as
3798 // well as clearing one bits.
3799 Known.Zero.setLowBits(LogOfAlign);
3800 Known.One.clearLowBits(LogOfAlign);
3801 break;
3802 }
3803 case ISD::FGETSIGN:
3804 // All bits are zero except the low bit.
3805 Known.Zero.setBitsFrom(1);
3806 break;
3807 case ISD::ADD:
3808 case ISD::SUB: {
3809 SDNodeFlags Flags = Op.getNode()->getFlags();
3810 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3811 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3813 Op.getOpcode() == ISD::ADD, Flags.hasNoSignedWrap(),
3814 Flags.hasNoUnsignedWrap(), Known, Known2);
3815 break;
3816 }
3817 case ISD::USUBO:
3818 case ISD::SSUBO:
3819 case ISD::USUBO_CARRY:
3820 case ISD::SSUBO_CARRY:
3821 if (Op.getResNo() == 1) {
3822 // If we know the result of a setcc has the top bits zero, use this info.
3823 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
3825 BitWidth > 1)
3826 Known.Zero.setBitsFrom(1);
3827 break;
3828 }
3829 [[fallthrough]];
3830 case ISD::SUBC: {
3831 assert(Op.getResNo() == 0 &&
3832 "We only compute knownbits for the difference here.");
3833
3834 // With USUBO_CARRY and SSUBO_CARRY a borrow bit may be added in.
3835 KnownBits Borrow(1);
3836 if (Opcode == ISD::USUBO_CARRY || Opcode == ISD::SSUBO_CARRY) {
3837 Borrow = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
3838 // Borrow has bit width 1
3839 Borrow = Borrow.trunc(1);
3840 } else {
3841 Borrow.setAllZero();
3842 }
3843
3844 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3845 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3846 Known = KnownBits::computeForSubBorrow(Known, Known2, Borrow);
3847 break;
3848 }
3849 case ISD::UADDO:
3850 case ISD::SADDO:
3851 case ISD::UADDO_CARRY:
3852 case ISD::SADDO_CARRY:
3853 if (Op.getResNo() == 1) {
3854 // If we know the result of a setcc has the top bits zero, use this info.
3855 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
3857 BitWidth > 1)
3858 Known.Zero.setBitsFrom(1);
3859 break;
3860 }
3861 [[fallthrough]];
3862 case ISD::ADDC:
3863 case ISD::ADDE: {
3864 assert(Op.getResNo() == 0 && "We only compute knownbits for the sum here.");
3865
3866 // With ADDE and UADDO_CARRY, a carry bit may be added in.
3867 KnownBits Carry(1);
3868 if (Opcode == ISD::ADDE)
3869 // Can't track carry from glue, set carry to unknown.
3870 Carry.resetAll();
3871 else if (Opcode == ISD::UADDO_CARRY || Opcode == ISD::SADDO_CARRY) {
3872 Carry = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
3873 // Carry has bit width 1
3874 Carry = Carry.trunc(1);
3875 } else {
3876 Carry.setAllZero();
3877 }
3878
3879 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3880 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3881 Known = KnownBits::computeForAddCarry(Known, Known2, Carry);
3882 break;
3883 }
3884 case ISD::UDIV: {
3885 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3886 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3887 Known = KnownBits::udiv(Known, Known2, Op->getFlags().hasExact());
3888 break;
3889 }
3890 case ISD::SDIV: {
3891 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3892 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3893 Known = KnownBits::sdiv(Known, Known2, Op->getFlags().hasExact());
3894 break;
3895 }
3896 case ISD::SREM: {
3897 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3898 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3899 Known = KnownBits::srem(Known, Known2);
3900 break;
3901 }
3902 case ISD::UREM: {
3903 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3904 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3905 Known = KnownBits::urem(Known, Known2);
3906 break;
3907 }
3908 case ISD::EXTRACT_ELEMENT: {
3909 Known = computeKnownBits(Op.getOperand(0), Depth+1);
3910 const unsigned Index = Op.getConstantOperandVal(1);
3911 const unsigned EltBitWidth = Op.getValueSizeInBits();
3912
3913 // Remove low part of known bits mask
3914 Known.Zero = Known.Zero.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
3915 Known.One = Known.One.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
3916
3917 // Remove high part of known bit mask
3918 Known = Known.trunc(EltBitWidth);
3919 break;
3920 }
3922 SDValue InVec = Op.getOperand(0);
3923 SDValue EltNo = Op.getOperand(1);
3924 EVT VecVT = InVec.getValueType();
3925 // computeKnownBits not yet implemented for scalable vectors.
3926 if (VecVT.isScalableVector())
3927 break;
3928 const unsigned EltBitWidth = VecVT.getScalarSizeInBits();
3929 const unsigned NumSrcElts = VecVT.getVectorNumElements();
3930
3931 // If BitWidth > EltBitWidth the value is anyext:ed. So we do not know
3932 // anything about the extended bits.
3933 if (BitWidth > EltBitWidth)
3934 Known = Known.trunc(EltBitWidth);
3935
3936 // If we know the element index, just demand that vector element, else for
3937 // an unknown element index, ignore DemandedElts and demand them all.
3938 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
3939 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
3940 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
3941 DemandedSrcElts =
3942 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
3943
3944 Known = computeKnownBits(InVec, DemandedSrcElts, Depth + 1);
3945 if (BitWidth > EltBitWidth)
3946 Known = Known.anyext(BitWidth);
3947 break;
3948 }
3950 if (Op.getValueType().isScalableVector())
3951 break;
3952
3953 // If we know the element index, split the demand between the
3954 // source vector and the inserted element, otherwise assume we need
3955 // the original demanded vector elements and the value.
3956 SDValue InVec = Op.getOperand(0);
3957 SDValue InVal = Op.getOperand(1);
3958 SDValue EltNo = Op.getOperand(2);
3959 bool DemandedVal = true;
3960 APInt DemandedVecElts = DemandedElts;
3961 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
3962 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
3963 unsigned EltIdx = CEltNo->getZExtValue();
3964 DemandedVal = !!DemandedElts[EltIdx];
3965 DemandedVecElts.clearBit(EltIdx);
3966 }
3967 Known.One.setAllBits();
3968 Known.Zero.setAllBits();
3969 if (DemandedVal) {
3970 Known2 = computeKnownBits(InVal, Depth + 1);
3971 Known = Known.intersectWith(Known2.zextOrTrunc(BitWidth));
3972 }
3973 if (!!DemandedVecElts) {
3974 Known2 = computeKnownBits(InVec, DemandedVecElts, Depth + 1);
3975 Known = Known.intersectWith(Known2);
3976 }
3977 break;
3978 }
3979 case ISD::BITREVERSE: {
3980 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3981 Known = Known2.reverseBits();
3982 break;
3983 }
3984 case ISD::BSWAP: {
3985 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3986 Known = Known2.byteSwap();
3987 break;
3988 }
3989 case ISD::ABS: {
3990 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3991 Known = Known2.abs();
3992 break;
3993 }
3994 case ISD::USUBSAT: {
3995 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3996 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3997 Known = KnownBits::usub_sat(Known, Known2);
3998 break;
3999 }
4000 case ISD::UMIN: {
4001 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4002 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4003 Known = KnownBits::umin(Known, Known2);
4004 break;
4005 }
4006 case ISD::UMAX: {
4007 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4008 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4009 Known = KnownBits::umax(Known, Known2);
4010 break;
4011 }
4012 case ISD::SMIN:
4013 case ISD::SMAX: {
4014 // If we have a clamp pattern, we know that the number of sign bits will be
4015 // the minimum of the clamp min/max range.
4016 bool IsMax = (Opcode == ISD::SMAX);
4017 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
4018 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
4019 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
4020 CstHigh =
4021 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
4022 if (CstLow && CstHigh) {
4023 if (!IsMax)
4024 std::swap(CstLow, CstHigh);
4025
4026 const APInt &ValueLow = CstLow->getAPIntValue();
4027 const APInt &ValueHigh = CstHigh->getAPIntValue();
4028 if (ValueLow.sle(ValueHigh)) {
4029 unsigned LowSignBits = ValueLow.getNumSignBits();
4030 unsigned HighSignBits = ValueHigh.getNumSignBits();
4031 unsigned MinSignBits = std::min(LowSignBits, HighSignBits);
4032 if (ValueLow.isNegative() && ValueHigh.isNegative()) {
4033 Known.One.setHighBits(MinSignBits);
4034 break;
4035 }
4036 if (ValueLow.isNonNegative() && ValueHigh.isNonNegative()) {
4037 Known.Zero.setHighBits(MinSignBits);
4038 break;
4039 }
4040 }
4041 }
4042
4043 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4044 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4045 if (IsMax)
4046 Known = KnownBits::smax(Known, Known2);
4047 else
4048 Known = KnownBits::smin(Known, Known2);
4049
4050 // For SMAX, if CstLow is non-negative we know the result will be
4051 // non-negative and thus all sign bits are 0.
4052 // TODO: There's an equivalent of this for smin with negative constant for
4053 // known ones.
4054 if (IsMax && CstLow) {
4055 const APInt &ValueLow = CstLow->getAPIntValue();
4056 if (ValueLow.isNonNegative()) {
4057 unsigned SignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4058 Known.Zero.setHighBits(std::min(SignBits, ValueLow.getNumSignBits()));
4059 }
4060 }
4061
4062 break;
4063 }
4064 case ISD::UINT_TO_FP: {
4065 Known.makeNonNegative();
4066 break;
4067 }
4068 case ISD::SINT_TO_FP: {
4069 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4070 if (Known2.isNonNegative())
4071 Known.makeNonNegative();
4072 else if (Known2.isNegative())
4073 Known.makeNegative();
4074 break;
4075 }
4076 case ISD::FP_TO_UINT_SAT: {
4077 // FP_TO_UINT_SAT produces an unsigned value that fits in the saturating VT.
4078 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4080 break;
4081 }
4083 if (Op.getResNo() == 1) {
4084 // The boolean result conforms to getBooleanContents.
4085 // If we know the result of a setcc has the top bits zero, use this info.
4086 // We know that we have an integer-based boolean since these operations
4087 // are only available for integer.
4088 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
4090 BitWidth > 1)
4091 Known.Zero.setBitsFrom(1);
4092 break;
4093 }
4094 [[fallthrough]];
4096 case ISD::ATOMIC_SWAP:
4108 case ISD::ATOMIC_LOAD: {
4109 unsigned MemBits =
4110 cast<AtomicSDNode>(Op)->getMemoryVT().getScalarSizeInBits();
4111 // If we are looking at the loaded value.
4112 if (Op.getResNo() == 0) {
4114 Known.Zero.setBitsFrom(MemBits);
4115 else if (Op->getOpcode() == ISD::ATOMIC_LOAD &&
4116 cast<AtomicSDNode>(Op)->getExtensionType() == ISD::ZEXTLOAD)
4117 Known.Zero.setBitsFrom(MemBits);
4118 }
4119 break;
4120 }
4121 case ISD::FrameIndex:
4123 TLI->computeKnownBitsForFrameIndex(cast<FrameIndexSDNode>(Op)->getIndex(),
4124 Known, getMachineFunction());
4125 break;
4126
4127 default:
4128 if (Opcode < ISD::BUILTIN_OP_END)
4129 break;
4130 [[fallthrough]];
4134 // TODO: Probably okay to remove after audit; here to reduce change size
4135 // in initial enablement patch for scalable vectors
4136 if (Op.getValueType().isScalableVector())
4137 break;
4138
4139 // Allow the target to implement this method for its nodes.
4140 TLI->computeKnownBitsForTargetNode(Op, Known, DemandedElts, *this, Depth);
4141 break;
4142 }
4143
4144 assert(!Known.hasConflict() && "Bits known to be one AND zero?");
4145 return Known;
4146}
4147
4148/// Convert ConstantRange OverflowResult into SelectionDAG::OverflowKind.
4150 switch (OR) {
4158 }
4159 llvm_unreachable("Unknown OverflowResult");
4160}
4161
4164 // X + 0 never overflow
4165 if (isNullConstant(N1))
4166 return OFK_Never;
4167
4168 // If both operands each have at least two sign bits, the addition
4169 // cannot overflow.
4170 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4171 return OFK_Never;
4172
4173 // TODO: Add ConstantRange::signedAddMayOverflow handling.
4174 return OFK_Sometime;
4175}
4176
4179 // X + 0 never overflow
4180 if (isNullConstant(N1))
4181 return OFK_Never;
4182
4183 // mulhi + 1 never overflow
4184 KnownBits N1Known = computeKnownBits(N1);
4185 if (N0.getOpcode() == ISD::UMUL_LOHI && N0.getResNo() == 1 &&
4186 N1Known.getMaxValue().ult(2))
4187 return OFK_Never;
4188
4189 KnownBits N0Known = computeKnownBits(N0);
4190 if (N1.getOpcode() == ISD::UMUL_LOHI && N1.getResNo() == 1 &&
4191 N0Known.getMaxValue().ult(2))
4192 return OFK_Never;
4193
4194 // Fallback to ConstantRange::unsignedAddMayOverflow handling.
4195 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4196 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4197 return mapOverflowResult(N0Range.unsignedAddMayOverflow(N1Range));
4198}
4199
4202 // X - 0 never overflow
4203 if (isNullConstant(N1))
4204 return OFK_Never;
4205
4206 // If both operands each have at least two sign bits, the subtraction
4207 // cannot overflow.
4208 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4209 return OFK_Never;
4210
4211 KnownBits N0Known = computeKnownBits(N0);
4212 KnownBits N1Known = computeKnownBits(N1);
4213 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, true);
4214 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, true);
4215 return mapOverflowResult(N0Range.signedSubMayOverflow(N1Range));
4216}
4217
4220 // X - 0 never overflow
4221 if (isNullConstant(N1))
4222 return OFK_Never;
4223
4224 KnownBits N0Known = computeKnownBits(N0);
4225 KnownBits N1Known = computeKnownBits(N1);
4226 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4227 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4228 return mapOverflowResult(N0Range.unsignedSubMayOverflow(N1Range));
4229}
4230
4233 // X * 0 and X * 1 never overflow.
4234 if (isNullConstant(N1) || isOneConstant(N1))
4235 return OFK_Never;
4236
4237 KnownBits N0Known = computeKnownBits(N0);
4238 KnownBits N1Known = computeKnownBits(N1);
4239 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4240 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4241 return mapOverflowResult(N0Range.unsignedMulMayOverflow(N1Range));
4242}
4243
4246 // X * 0 and X * 1 never overflow.
4247 if (isNullConstant(N1) || isOneConstant(N1))
4248 return OFK_Never;
4249
4250 // Get the size of the result.
4251 unsigned BitWidth = N0.getScalarValueSizeInBits();
4252
4253 // Sum of the sign bits.
4254 unsigned SignBits = ComputeNumSignBits(N0) + ComputeNumSignBits(N1);
4255
4256 // If we have enough sign bits, then there's no overflow.
4257 if (SignBits > BitWidth + 1)
4258 return OFK_Never;
4259
4260 if (SignBits == BitWidth + 1) {
4261 // The overflow occurs when the true multiplication of the
4262 // the operands is the minimum negative number.
4263 KnownBits N0Known = computeKnownBits(N0);
4264 KnownBits N1Known = computeKnownBits(N1);
4265 // If one of the operands is non-negative, then there's no
4266 // overflow.
4267 if (N0Known.isNonNegative() || N1Known.isNonNegative())
4268 return OFK_Never;
4269 }
4270
4271 return OFK_Sometime;
4272}
4273
4275 if (Depth >= MaxRecursionDepth)
4276 return false; // Limit search depth.
4277
4278 EVT OpVT = Val.getValueType();
4279 unsigned BitWidth = OpVT.getScalarSizeInBits();
4280
4281 // Is the constant a known power of 2?
4283 return C->getAPIntValue().zextOrTrunc(BitWidth).isPowerOf2();
4284 }))
4285 return true;
4286
4287 // A left-shift of a constant one will have exactly one bit set because
4288 // shifting the bit off the end is undefined.
4289 if (Val.getOpcode() == ISD::SHL) {
4290 auto *C = isConstOrConstSplat(Val.getOperand(0));
4291 if (C && C->getAPIntValue() == 1)
4292 return true;
4293 return isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth + 1) &&
4294 isKnownNeverZero(Val, Depth);
4295 }
4296
4297 // Similarly, a logical right-shift of a constant sign-bit will have exactly
4298 // one bit set.
4299 if (Val.getOpcode() == ISD::SRL) {
4300 auto *C = isConstOrConstSplat(Val.getOperand(0));
4301 if (C && C->getAPIntValue().isSignMask())
4302 return true;
4303 return isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth + 1) &&
4304 isKnownNeverZero(Val, Depth);
4305 }
4306
4307 if (Val.getOpcode() == ISD::ROTL || Val.getOpcode() == ISD::ROTR)
4308 return isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth + 1);
4309
4310 // Are all operands of a build vector constant powers of two?
4311 if (Val.getOpcode() == ISD::BUILD_VECTOR)
4312 if (llvm::all_of(Val->ops(), [BitWidth](SDValue E) {
4313 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(E))
4314 return C->getAPIntValue().zextOrTrunc(BitWidth).isPowerOf2();
4315 return false;
4316 }))
4317 return true;
4318
4319 // Is the operand of a splat vector a constant power of two?
4320 if (Val.getOpcode() == ISD::SPLAT_VECTOR)
4321 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Val->getOperand(0)))
4322 if (C->getAPIntValue().zextOrTrunc(BitWidth).isPowerOf2())
4323 return true;
4324
4325 // vscale(power-of-two) is a power-of-two for some targets
4326 if (Val.getOpcode() == ISD::VSCALE &&
4327 getTargetLoweringInfo().isVScaleKnownToBeAPowerOfTwo() &&
4329 return true;
4330
4331 if (Val.getOpcode() == ISD::SMIN || Val.getOpcode() == ISD::SMAX ||
4332 Val.getOpcode() == ISD::UMIN || Val.getOpcode() == ISD::UMAX)
4333 return isKnownToBeAPowerOfTwo(Val.getOperand(1), Depth + 1) &&
4335
4336 if (Val.getOpcode() == ISD::SELECT || Val.getOpcode() == ISD::VSELECT)
4337 return isKnownToBeAPowerOfTwo(Val.getOperand(2), Depth + 1) &&
4339
4340 // Looking for `x & -x` pattern:
4341 // If x == 0:
4342 // x & -x -> 0
4343 // If x != 0:
4344 // x & -x -> non-zero pow2
4345 // so if we find the pattern return whether we know `x` is non-zero.
4346 SDValue X;
4347 if (sd_match(Val, m_And(m_Value(X), m_Neg(m_Deferred(X)))))
4348 return isKnownNeverZero(X, Depth);
4349
4350 if (Val.getOpcode() == ISD::ZERO_EXTEND)
4351 return isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth + 1);
4352
4353 // More could be done here, though the above checks are enough
4354 // to handle some common cases.
4355 return false;
4356}
4357
4359 EVT VT = Op.getValueType();
4360
4361 // Since the number of lanes in a scalable vector is unknown at compile time,
4362 // we track one bit which is implicitly broadcast to all lanes. This means
4363 // that all lanes in a scalable vector are considered demanded.
4364 APInt DemandedElts = VT.isFixedLengthVector()
4366 : APInt(1, 1);
4367 return ComputeNumSignBits(Op, DemandedElts, Depth);
4368}
4369
4370unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
4371 unsigned Depth) const {
4372 EVT VT = Op.getValueType();
4373 assert((VT.isInteger() || VT.isFloatingPoint()) && "Invalid VT!");
4374 unsigned VTBits = VT.getScalarSizeInBits();
4375 unsigned NumElts = DemandedElts.getBitWidth();
4376 unsigned Tmp, Tmp2;
4377 unsigned FirstAnswer = 1;
4378
4379 if (auto *C = dyn_cast<ConstantSDNode>(Op)) {
4380 const APInt &Val = C->getAPIntValue();
4381 return Val.getNumSignBits();
4382 }
4383
4384 if (Depth >= MaxRecursionDepth)
4385 return 1; // Limit search depth.
4386
4387 if (!DemandedElts)
4388 return 1; // No demanded elts, better to assume we don't know anything.
4389
4390 unsigned Opcode = Op.getOpcode();
4391 switch (Opcode) {
4392 default: break;
4393 case ISD::AssertSext:
4394 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4395 return VTBits-Tmp+1;
4396 case ISD::AssertZext:
4397 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4398 return VTBits-Tmp;
4399 case ISD::MERGE_VALUES:
4400 return ComputeNumSignBits(Op.getOperand(Op.getResNo()), DemandedElts,
4401 Depth + 1);
4402 case ISD::SPLAT_VECTOR: {
4403 // Check if the sign bits of source go down as far as the truncated value.
4404 unsigned NumSrcBits = Op.getOperand(0).getValueSizeInBits();
4405 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4406 if (NumSrcSignBits > (NumSrcBits - VTBits))
4407 return NumSrcSignBits - (NumSrcBits - VTBits);
4408 break;
4409 }
4410 case ISD::BUILD_VECTOR:
4411 assert(!VT.isScalableVector());
4412 Tmp = VTBits;
4413 for (unsigned i = 0, e = Op.getNumOperands(); (i < e) && (Tmp > 1); ++i) {
4414 if (!DemandedElts[i])
4415 continue;
4416
4417 SDValue SrcOp = Op.getOperand(i);
4418 // BUILD_VECTOR can implicitly truncate sources, we handle this specially
4419 // for constant nodes to ensure we only look at the sign bits.
4420 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(SrcOp)) {
4421 APInt T = C->getAPIntValue().trunc(VTBits);
4422 Tmp2 = T.getNumSignBits();
4423 } else {
4424 Tmp2 = ComputeNumSignBits(SrcOp, Depth + 1);
4425
4426 if (SrcOp.getValueSizeInBits() != VTBits) {
4427 assert(SrcOp.getValueSizeInBits() > VTBits &&
4428 "Expected BUILD_VECTOR implicit truncation");
4429 unsigned ExtraBits = SrcOp.getValueSizeInBits() - VTBits;
4430 Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1);
4431 }
4432 }
4433 Tmp = std::min(Tmp, Tmp2);
4434 }
4435 return Tmp;
4436
4437 case ISD::VECTOR_SHUFFLE: {
4438 // Collect the minimum number of sign bits that are shared by every vector
4439 // element referenced by the shuffle.
4440 APInt DemandedLHS, DemandedRHS;
4441 const ShuffleVectorSDNode *SVN = cast<ShuffleVectorSDNode>(Op);
4442 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
4443 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
4444 DemandedLHS, DemandedRHS))
4445 return 1;
4446
4447 Tmp = std::numeric_limits<unsigned>::max();
4448 if (!!DemandedLHS)
4449 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedLHS, Depth + 1);
4450 if (!!DemandedRHS) {
4451 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedRHS, Depth + 1);
4452 Tmp = std::min(Tmp, Tmp2);
4453 }
4454 // If we don't know anything, early out and try computeKnownBits fall-back.
4455 if (Tmp == 1)
4456 break;
4457 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
4458 return Tmp;
4459 }
4460
4461 case ISD::BITCAST: {
4462 if (VT.isScalableVector())
4463 break;
4464 SDValue N0 = Op.getOperand(0);
4465 EVT SrcVT = N0.getValueType();
4466 unsigned SrcBits = SrcVT.getScalarSizeInBits();
4467
4468 // Ignore bitcasts from unsupported types..
4469 if (!(SrcVT.isInteger() || SrcVT.isFloatingPoint()))
4470 break;
4471
4472 // Fast handling of 'identity' bitcasts.
4473 if (VTBits == SrcBits)
4474 return ComputeNumSignBits(N0, DemandedElts, Depth + 1);
4475
4476 bool IsLE = getDataLayout().isLittleEndian();
4477
4478 // Bitcast 'large element' scalar/vector to 'small element' vector.
4479 if ((SrcBits % VTBits) == 0) {
4480 assert(VT.isVector() && "Expected bitcast to vector");
4481
4482 unsigned Scale = SrcBits / VTBits;
4483 APInt SrcDemandedElts =
4484 APIntOps::ScaleBitMask(DemandedElts, NumElts / Scale);
4485
4486 // Fast case - sign splat can be simply split across the small elements.
4487 Tmp = ComputeNumSignBits(N0, SrcDemandedElts, Depth + 1);
4488 if (Tmp == SrcBits)
4489 return VTBits;
4490
4491 // Slow case - determine how far the sign extends into each sub-element.
4492 Tmp2 = VTBits;
4493 for (unsigned i = 0; i != NumElts; ++i)
4494 if (DemandedElts[i]) {
4495 unsigned SubOffset = i % Scale;
4496 SubOffset = (IsLE ? ((Scale - 1) - SubOffset) : SubOffset);
4497 SubOffset = SubOffset * VTBits;
4498 if (Tmp <= SubOffset)
4499 return 1;
4500 Tmp2 = std::min(Tmp2, Tmp - SubOffset);
4501 }
4502 return Tmp2;
4503 }
4504 break;
4505 }
4506
4508 // FP_TO_SINT_SAT produces a signed value that fits in the saturating VT.
4509 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
4510 return VTBits - Tmp + 1;
4511 case ISD::SIGN_EXTEND:
4512 Tmp = VTBits - Op.getOperand(0).getScalarValueSizeInBits();
4513 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1) + Tmp;
4515 // Max of the input and what this extends.
4516 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
4517 Tmp = VTBits-Tmp+1;
4518 Tmp2 = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
4519 return std::max(Tmp, Tmp2);
4521 if (VT.isScalableVector())
4522 break;
4523 SDValue Src = Op.getOperand(0);
4524 EVT SrcVT = Src.getValueType();
4525 APInt DemandedSrcElts = DemandedElts.zext(SrcVT.getVectorNumElements());
4526 Tmp = VTBits - SrcVT.getScalarSizeInBits();
4527 return ComputeNumSignBits(Src, DemandedSrcElts, Depth+1) + Tmp;
4528 }
4529 case ISD::SRA:
4530 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4531 // SRA X, C -> adds C sign bits.
4532 if (const APInt *ShAmt =
4534 Tmp = std::min<uint64_t>(Tmp + ShAmt->getZExtValue(), VTBits);
4535 return Tmp;
4536 case ISD::SHL:
4537 if (const APInt *ShAmt =
4538 getValidMaximumShiftAmountConstant(Op, DemandedElts)) {
4539 // shl destroys sign bits, ensure it doesn't shift out all sign bits.
4540 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4541 if (ShAmt->ult(Tmp))
4542 return Tmp - ShAmt->getZExtValue();
4543 }
4544 break;
4545 case ISD::AND:
4546 case ISD::OR:
4547 case ISD::XOR: // NOT is handled here.
4548 // Logical binary ops preserve the number of sign bits at the worst.
4549 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
4550 if (Tmp != 1) {
4551 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
4552 FirstAnswer = std::min(Tmp, Tmp2);
4553 // We computed what we know about the sign bits as our first
4554 // answer. Now proceed to the generic code that uses
4555 // computeKnownBits, and pick whichever answer is better.
4556 }
4557 break;
4558
4559 case ISD::SELECT:
4560 case ISD::VSELECT:
4561 Tmp = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
4562 if (Tmp == 1) return 1; // Early out.
4563 Tmp2 = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
4564 return std::min(Tmp, Tmp2);
4565 case ISD::SELECT_CC:
4566 Tmp = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
4567 if (Tmp == 1) return 1; // Early out.
4568 Tmp2 = ComputeNumSignBits(Op.getOperand(3), DemandedElts, Depth+1);
4569 return std::min(Tmp, Tmp2);
4570
4571 case ISD::SMIN:
4572 case ISD::SMAX: {
4573 // If we have a clamp pattern, we know that the number of sign bits will be
4574 // the minimum of the clamp min/max range.
4575 bool IsMax = (Opcode == ISD::SMAX);
4576 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
4577 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
4578 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
4579 CstHigh =
4580 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
4581 if (CstLow && CstHigh) {
4582 if (!IsMax)
4583 std::swap(CstLow, CstHigh);
4584 if (CstLow->getAPIntValue().sle(CstHigh->getAPIntValue())) {
4585 Tmp = CstLow->getAPIntValue().getNumSignBits();
4586 Tmp2 = CstHigh->getAPIntValue().getNumSignBits();
4587 return std::min(Tmp, Tmp2);
4588 }
4589 }
4590
4591 // Fallback - just get the minimum number of sign bits of the operands.
4592 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4593 if (Tmp == 1)
4594 return 1; // Early out.
4595 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
4596 return std::min(Tmp, Tmp2);
4597 }
4598 case ISD::UMIN:
4599 case ISD::UMAX:
4600 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4601 if (Tmp == 1)
4602 return 1; // Early out.
4603 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
4604 return std::min(Tmp, Tmp2);
4605 case ISD::SADDO:
4606 case ISD::UADDO:
4607 case ISD::SADDO_CARRY:
4608 case ISD::UADDO_CARRY:
4609 case ISD::SSUBO:
4610 case ISD::USUBO:
4611 case ISD::SSUBO_CARRY:
4612 case ISD::USUBO_CARRY:
4613 case ISD::SMULO:
4614 case ISD::UMULO:
4615 if (Op.getResNo() != 1)
4616 break;
4617 // The boolean result conforms to getBooleanContents. Fall through.
4618 // If setcc returns 0/-1, all bits are sign bits.
4619 // We know that we have an integer-based boolean since these operations
4620 // are only available for integer.
4621 if (TLI->getBooleanContents(VT.isVector(), false) ==
4623 return VTBits;
4624 break;
4625 case ISD::SETCC:
4626 case ISD::SETCCCARRY:
4627 case ISD::STRICT_FSETCC:
4628 case ISD::STRICT_FSETCCS: {
4629 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
4630 // If setcc returns 0/-1, all bits are sign bits.
4631 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
4633 return VTBits;
4634 break;
4635 }
4636 case ISD::ROTL:
4637 case ISD::ROTR:
4638 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4639
4640 // If we're rotating an 0/-1 value, then it stays an 0/-1 value.
4641 if (Tmp == VTBits)
4642 return VTBits;
4643
4644 if (ConstantSDNode *C =
4645 isConstOrConstSplat(Op.getOperand(1), DemandedElts)) {
4646 unsigned RotAmt = C->getAPIntValue().urem(VTBits);
4647
4648 // Handle rotate right by N like a rotate left by 32-N.
4649 if (Opcode == ISD::ROTR)
4650 RotAmt = (VTBits - RotAmt) % VTBits;
4651
4652 // If we aren't rotating out all of the known-in sign bits, return the
4653 // number that are left. This handles rotl(sext(x), 1) for example.
4654 if (Tmp > (RotAmt + 1)) return (Tmp - RotAmt);
4655 }
4656 break;
4657 case ISD::ADD:
4658 case ISD::ADDC:
4659 // Add can have at most one carry bit. Thus we know that the output
4660 // is, at worst, one more bit than the inputs.
4661 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4662 if (Tmp == 1) return 1; // Early out.
4663
4664 // Special case decrementing a value (ADD X, -1):
4665 if (ConstantSDNode *CRHS =
4666 isConstOrConstSplat(Op.getOperand(1), DemandedElts))
4667 if (CRHS->isAllOnes()) {
4668 KnownBits Known =
4669 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4670
4671 // If the input is known to be 0 or 1, the output is 0/-1, which is all
4672 // sign bits set.
4673 if ((Known.Zero | 1).isAllOnes())
4674 return VTBits;
4675
4676 // If we are subtracting one from a positive number, there is no carry
4677 // out of the result.
4678 if (Known.isNonNegative())
4679 return Tmp;
4680 }
4681
4682 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
4683 if (Tmp2 == 1) return 1; // Early out.
4684 return std::min(Tmp, Tmp2) - 1;
4685 case ISD::SUB:
4686 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
4687 if (Tmp2 == 1) return 1; // Early out.
4688
4689 // Handle NEG.
4690 if (ConstantSDNode *CLHS =
4691 isConstOrConstSplat(Op.getOperand(0), DemandedElts))
4692 if (CLHS->isZero()) {
4693 KnownBits Known =
4694 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4695 // If the input is known to be 0 or 1, the output is 0/-1, which is all
4696 // sign bits set.
4697 if ((Known.Zero | 1).isAllOnes())
4698 return VTBits;
4699
4700 // If the input is known to be positive (the sign bit is known clear),
4701 // the output of the NEG has the same number of sign bits as the input.
4702 if (Known.isNonNegative())
4703 return Tmp2;
4704
4705 // Otherwise, we treat this like a SUB.
4706 }
4707
4708 // Sub can have at most one carry bit. Thus we know that the output
4709 // is, at worst, one more bit than the inputs.
4710 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4711 if (Tmp == 1) return 1; // Early out.
4712 return std::min(Tmp, Tmp2) - 1;
4713 case ISD::MUL: {
4714 // The output of the Mul can be at most twice the valid bits in the inputs.
4715 unsigned SignBitsOp0 = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4716 if (SignBitsOp0 == 1)
4717 break;
4718 unsigned SignBitsOp1 = ComputeNumSignBits(Op.getOperand(1), Depth + 1);
4719 if (SignBitsOp1 == 1)
4720 break;
4721 unsigned OutValidBits =
4722 (VTBits - SignBitsOp0 + 1) + (VTBits - SignBitsOp1 + 1);
4723 return OutValidBits > VTBits ? 1 : VTBits - OutValidBits + 1;
4724 }
4725 case ISD::SREM:
4726 // The sign bit is the LHS's sign bit, except when the result of the
4727 // remainder is zero. The magnitude of the result should be less than or
4728 // equal to the magnitude of the LHS. Therefore, the result should have
4729 // at least as many sign bits as the left hand side.
4730 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4731 case ISD::TRUNCATE: {
4732 // Check if the sign bits of source go down as far as the truncated value.
4733 unsigned NumSrcBits = Op.getOperand(0).getScalarValueSizeInBits();
4734 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4735 if (NumSrcSignBits > (NumSrcBits - VTBits))
4736 return NumSrcSignBits - (NumSrcBits - VTBits);
4737 break;
4738 }
4739 case ISD::EXTRACT_ELEMENT: {
4740 if (VT.isScalableVector())
4741 break;
4742 const int KnownSign = ComputeNumSignBits(Op.getOperand(0), Depth+1);
4743 const int BitWidth = Op.getValueSizeInBits();
4744 const int Items = Op.getOperand(0).getValueSizeInBits() / BitWidth;
4745
4746 // Get reverse index (starting from 1), Op1 value indexes elements from
4747 // little end. Sign starts at big end.
4748 const int rIndex = Items - 1 - Op.getConstantOperandVal(1);
4749
4750 // If the sign portion ends in our element the subtraction gives correct
4751 // result. Otherwise it gives either negative or > bitwidth result
4752 return std::clamp(KnownSign - rIndex * BitWidth, 0, BitWidth);
4753 }
4755 if (VT.isScalableVector())
4756 break;
4757 // If we know the element index, split the demand between the
4758 // source vector and the inserted element, otherwise assume we need
4759 // the original demanded vector elements and the value.
4760 SDValue InVec = Op.getOperand(0);
4761 SDValue InVal = Op.getOperand(1);
4762 SDValue EltNo = Op.getOperand(2);
4763 bool DemandedVal = true;
4764 APInt DemandedVecElts = DemandedElts;
4765 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
4766 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
4767 unsigned EltIdx = CEltNo->getZExtValue();
4768 DemandedVal = !!DemandedElts[EltIdx];
4769 DemandedVecElts.clearBit(EltIdx);
4770 }
4771 Tmp = std::numeric_limits<unsigned>::max();
4772 if (DemandedVal) {
4773 // TODO - handle implicit truncation of inserted elements.
4774 if (InVal.getScalarValueSizeInBits() != VTBits)
4775 break;
4776 Tmp2 = ComputeNumSignBits(InVal, Depth + 1);
4777 Tmp = std::min(Tmp, Tmp2);
4778 }
4779 if (!!DemandedVecElts) {
4780 Tmp2 = ComputeNumSignBits(InVec, DemandedVecElts, Depth + 1);
4781 Tmp = std::min(Tmp, Tmp2);
4782 }
4783 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
4784 return Tmp;
4785 }
4787 assert(!VT.isScalableVector());
4788 SDValue InVec = Op.getOperand(0);
4789 SDValue EltNo = Op.getOperand(1);
4790 EVT VecVT = InVec.getValueType();
4791 // ComputeNumSignBits not yet implemented for scalable vectors.
4792 if (VecVT.isScalableVector())
4793 break;
4794 const unsigned BitWidth = Op.getValueSizeInBits();
4795 const unsigned EltBitWidth = Op.getOperand(0).getScalarValueSizeInBits();
4796 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4797
4798 // If BitWidth > EltBitWidth the value is anyext:ed, and we do not know
4799 // anything about sign bits. But if the sizes match we can derive knowledge
4800 // about sign bits from the vector operand.
4801 if (BitWidth != EltBitWidth)
4802 break;
4803
4804 // If we know the element index, just demand that vector element, else for
4805 // an unknown element index, ignore DemandedElts and demand them all.
4806 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
4807 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4808 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
4809 DemandedSrcElts =
4810 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
4811
4812 return ComputeNumSignBits(InVec, DemandedSrcElts, Depth + 1);
4813 }
4815 // Offset the demanded elts by the subvector index.
4816 SDValue Src = Op.getOperand(0);
4817 // Bail until we can represent demanded elements for scalable vectors.
4818 if (Src.getValueType().isScalableVector())
4819 break;
4820 uint64_t Idx = Op.getConstantOperandVal(1);
4821 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
4822 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
4823 return ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
4824 }
4825 case ISD::CONCAT_VECTORS: {
4826 if (VT.isScalableVector())
4827 break;
4828 // Determine the minimum number of sign bits across all demanded
4829 // elts of the input vectors. Early out if the result is already 1.
4830 Tmp = std::numeric_limits<unsigned>::max();
4831 EVT SubVectorVT = Op.getOperand(0).getValueType();
4832 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
4833 unsigned NumSubVectors = Op.getNumOperands();
4834 for (unsigned i = 0; (i < NumSubVectors) && (Tmp > 1); ++i) {
4835 APInt DemandedSub =
4836 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
4837 if (!DemandedSub)
4838 continue;
4839 Tmp2 = ComputeNumSignBits(Op.getOperand(i), DemandedSub, Depth + 1);
4840 Tmp = std::min(Tmp, Tmp2);
4841 }
4842 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
4843 return Tmp;
4844 }
4845 case ISD::INSERT_SUBVECTOR: {
4846 if (VT.isScalableVector())
4847 break;
4848 // Demand any elements from the subvector and the remainder from the src its
4849 // inserted into.
4850 SDValue Src = Op.getOperand(0);
4851 SDValue Sub = Op.getOperand(1);
4852 uint64_t Idx = Op.getConstantOperandVal(2);
4853 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
4854 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
4855 APInt DemandedSrcElts = DemandedElts;
4856 DemandedSrcElts.insertBits(APInt::getZero(NumSubElts), Idx);
4857
4858 Tmp = std::numeric_limits<unsigned>::max();
4859 if (!!DemandedSubElts) {
4860 Tmp = ComputeNumSignBits(Sub, DemandedSubElts, Depth + 1);
4861 if (Tmp == 1)
4862 return 1; // early-out
4863 }
4864 if (!!DemandedSrcElts) {
4865 Tmp2 = ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
4866 Tmp = std::min(Tmp, Tmp2);
4867 }
4868 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
4869 return Tmp;
4870 }
4871 case ISD::LOAD: {
4872 LoadSDNode *LD = cast<LoadSDNode>(Op);
4873 if (const MDNode *Ranges = LD->getRanges()) {
4874 if (DemandedElts != 1)
4875 break;
4876
4878 if (VTBits > CR.getBitWidth()) {
4879 switch (LD->getExtensionType()) {
4880 case ISD::SEXTLOAD:
4881 CR = CR.signExtend(VTBits);
4882 break;
4883 case ISD::ZEXTLOAD:
4884 CR = CR.zeroExtend(VTBits);
4885 break;
4886 default:
4887 break;
4888 }
4889 }
4890
4891 if (VTBits != CR.getBitWidth())
4892 break;
4893 return std::min(CR.getSignedMin().getNumSignBits(),
4895 }
4896
4897 break;
4898 }
4901 case ISD::ATOMIC_SWAP:
4913 case ISD::ATOMIC_LOAD: {
4914 Tmp = cast<AtomicSDNode>(Op)->getMemoryVT().getScalarSizeInBits();
4915 // If we are looking at the loaded value.
4916 if (Op.getResNo() == 0) {
4917 if (Tmp == VTBits)
4918 return 1; // early-out
4920 return VTBits - Tmp + 1;
4922 return VTBits - Tmp;
4923 if (Op->getOpcode() == ISD::ATOMIC_LOAD) {
4924 ISD::LoadExtType ETy = cast<AtomicSDNode>(Op)->getExtensionType();
4925 if (ETy == ISD::SEXTLOAD)
4926 return VTBits - Tmp + 1;
4927 if (ETy == ISD::ZEXTLOAD)
4928 return VTBits - Tmp;
4929 }
4930 }
4931 break;
4932 }
4933 }
4934
4935 // If we are looking at the loaded value of the SDNode.
4936 if (Op.getResNo() == 0) {
4937 // Handle LOADX separately here. EXTLOAD case will fallthrough.
4938 if (LoadSDNode *LD = dyn_cast<LoadSDNode>(Op)) {
4939 unsigned ExtType = LD->getExtensionType();
4940 switch (ExtType) {
4941 default: break;
4942 case ISD::SEXTLOAD: // e.g. i16->i32 = '17' bits known.
4943 Tmp = LD->getMemoryVT().getScalarSizeInBits();
4944 return VTBits - Tmp + 1;
4945 case ISD::ZEXTLOAD: // e.g. i16->i32 = '16' bits known.
4946 Tmp = LD->getMemoryVT().getScalarSizeInBits();
4947 return VTBits - Tmp;
4948 case ISD::NON_EXTLOAD:
4949 if (const Constant *Cst = TLI->getTargetConstantFromLoad(LD)) {
4950 // We only need to handle vectors - computeKnownBits should handle
4951 // scalar cases.
4952 Type *CstTy = Cst->getType();
4953 if (CstTy->isVectorTy() && !VT.isScalableVector() &&
4954 (NumElts * VTBits) == CstTy->getPrimitiveSizeInBits() &&
4955 VTBits == CstTy->getScalarSizeInBits()) {
4956 Tmp = VTBits;
4957 for (unsigned i = 0; i != NumElts; ++i) {
4958 if (!DemandedElts[i])
4959 continue;
4960 if (Constant *Elt = Cst->getAggregateElement(i)) {
4961 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
4962 const APInt &Value = CInt->getValue();
4963 Tmp = std::min(Tmp, Value.getNumSignBits());
4964 continue;
4965 }
4966 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
4967 APInt Value = CFP->getValueAPF().bitcastToAPInt();
4968 Tmp = std::min(Tmp, Value.getNumSignBits());
4969 continue;
4970 }
4971 }
4972 // Unknown type. Conservatively assume no bits match sign bit.
4973 return 1;
4974 }
4975 return Tmp;
4976 }
4977 }
4978 break;
4979 }
4980 }
4981 }
4982
4983 // Allow the target to implement this method for its nodes.
4984 if (Opcode >= ISD::BUILTIN_OP_END ||
4985 Opcode == ISD::INTRINSIC_WO_CHAIN ||
4986 Opcode == ISD::INTRINSIC_W_CHAIN ||
4987 Opcode == ISD::INTRINSIC_VOID) {
4988 // TODO: This can probably be removed once target code is audited. This
4989 // is here purely to reduce patch size and review complexity.
4990 if (!VT.isScalableVector()) {
4991 unsigned NumBits =
4992 TLI->ComputeNumSignBitsForTargetNode(Op, DemandedElts, *this, Depth);
4993 if (NumBits > 1)
4994 FirstAnswer = std::max(FirstAnswer, NumBits);
4995 }
4996 }
4997
4998 // Finally, if we can prove that the top bits of the result are 0's or 1's,
4999 // use this information.
5000 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
5001 return std::max(FirstAnswer, Known.countMinSignBits());
5002}
5003
5005 unsigned Depth) const {
5006 unsigned SignBits = ComputeNumSignBits(Op, Depth);
5007 return Op.getScalarValueSizeInBits() - SignBits + 1;
5008}
5009
5011 const APInt &DemandedElts,
5012 unsigned Depth) const {
5013 unsigned SignBits = ComputeNumSignBits(Op, DemandedElts, Depth);
5014 return Op.getScalarValueSizeInBits() - SignBits + 1;
5015}
5016
5018 unsigned Depth) const {
5019 // Early out for FREEZE.
5020 if (Op.getOpcode() == ISD::FREEZE)
5021 return true;
5022
5023 // TODO: Assume we don't know anything for now.
5024 EVT VT = Op.getValueType();
5025 if (VT.isScalableVector())
5026 return false;
5027
5028 APInt DemandedElts = VT.isVector()
5030 : APInt(1, 1);
5031 return isGuaranteedNotToBeUndefOrPoison(Op, DemandedElts, PoisonOnly, Depth);
5032}
5033
5035 const APInt &DemandedElts,
5036 bool PoisonOnly,
5037 unsigned Depth) const {
5038 unsigned Opcode = Op.getOpcode();
5039
5040 // Early out for FREEZE.
5041 if (Opcode == ISD::FREEZE)
5042 return true;
5043
5044 if (Depth >= MaxRecursionDepth)
5045 return false; // Limit search depth.
5046
5047 if (isIntOrFPConstant(Op))
5048 return true;
5049
5050 switch (Opcode) {
5051 case ISD::CONDCODE:
5052 case ISD::VALUETYPE:
5053 case ISD::FrameIndex:
5055 return true;
5056
5057 case ISD::UNDEF:
5058 return PoisonOnly;
5059
5060 case ISD::BUILD_VECTOR:
5061 // NOTE: BUILD_VECTOR has implicit truncation of wider scalar elements -
5062 // this shouldn't affect the result.
5063 for (unsigned i = 0, e = Op.getNumOperands(); i < e; ++i) {
5064 if (!DemandedElts[i])
5065 continue;
5067 Depth + 1))
5068 return false;
5069 }
5070 return true;
5071
5072 // TODO: Search for noundef attributes from library functions.
5073
5074 // TODO: Pointers dereferenced by ISD::LOAD/STORE ops are noundef.
5075
5076 default:
5077 // Allow the target to implement this method for its nodes.
5078 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
5079 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
5081 Op, DemandedElts, *this, PoisonOnly, Depth);
5082 break;
5083 }
5084
5085 // If Op can't create undef/poison and none of its operands are undef/poison
5086 // then Op is never undef/poison.
5087 // NOTE: TargetNodes can handle this in themselves in
5088 // isGuaranteedNotToBeUndefOrPoisonForTargetNode or let
5089 // TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode handle it.
5090 return !canCreateUndefOrPoison(Op, PoisonOnly, /*ConsiderFlags*/ true,
5091 Depth) &&
5092 all_of(Op->ops(), [&](SDValue V) {
5093 return isGuaranteedNotToBeUndefOrPoison(V, PoisonOnly, Depth + 1);
5094 });
5095}
5096
5098 bool ConsiderFlags,
5099 unsigned Depth) const {
5100 // TODO: Assume we don't know anything for now.
5101 EVT VT = Op.getValueType();
5102 if (VT.isScalableVector())
5103 return true;
5104
5105 APInt DemandedElts = VT.isVector()
5107 : APInt(1, 1);
5108 return canCreateUndefOrPoison(Op, DemandedElts, PoisonOnly, ConsiderFlags,
5109 Depth);
5110}
5111
5113 bool PoisonOnly, bool ConsiderFlags,
5114 unsigned Depth) const {
5115 // TODO: Assume we don't know anything for now.
5116 EVT VT = Op.getValueType();
5117 if (VT.isScalableVector())
5118 return true;
5119
5120 unsigned Opcode = Op.getOpcode();
5121 switch (Opcode) {
5122 case ISD::FREEZE:
5125 case ISD::AND:
5126 case ISD::XOR:
5127 case ISD::ROTL:
5128 case ISD::ROTR:
5129 case ISD::FSHL:
5130 case ISD::FSHR:
5131 case ISD::BSWAP:
5132 case ISD::CTPOP:
5133 case ISD::BITREVERSE:
5134 case ISD::PARITY:
5135 case ISD::SIGN_EXTEND:
5136 case ISD::TRUNCATE:
5140 case ISD::BITCAST:
5141 case ISD::BUILD_VECTOR:
5142 case ISD::BUILD_PAIR:
5143 return false;
5144
5145 case ISD::SETCC: {
5146 // Integer setcc cannot create undef or poison.
5147 if (Op.getOperand(0).getValueType().isInteger())
5148 return false;
5149
5150 // FP compares are more complicated. They can create poison for nan/infinity
5151 // based on options and flags. The options and flags also cause special
5152 // nonan condition codes to be used. Those condition codes may be preserved
5153 // even if the nonan flag is dropped somewhere.
5154 ISD::CondCode CCCode = cast<CondCodeSDNode>(Op.getOperand(2))->get();
5155 if (((unsigned)CCCode & 0x10U))
5156 return true;
5157
5159 return Options.NoNaNsFPMath || Options.NoInfsFPMath ||
5160 (ConsiderFlags &&
5161 (Op->getFlags().hasNoNaNs() || Op->getFlags().hasNoInfs()));
5162 }
5163
5164 // Matches hasPoisonGeneratingFlags().
5165 case ISD::ZERO_EXTEND:
5166 return ConsiderFlags && Op->getFlags().hasNonNeg();
5167
5168 case ISD::ADD:
5169 case ISD::SUB:
5170 case ISD::MUL:
5171 // Matches hasPoisonGeneratingFlags().
5172 return ConsiderFlags && (Op->getFlags().hasNoSignedWrap() ||
5173 Op->getFlags().hasNoUnsignedWrap());
5174
5175 case ISD::SHL:
5176 // If the max shift amount isn't in range, then the shift can create poison.
5177 if (!getValidMaximumShiftAmountConstant(Op, DemandedElts))
5178 return true;
5179
5180 // Matches hasPoisonGeneratingFlags().
5181 return ConsiderFlags && (Op->getFlags().hasNoSignedWrap() ||
5182 Op->getFlags().hasNoUnsignedWrap());
5183
5184 // Matches hasPoisonGeneratingFlags().
5185 case ISD::OR:
5186 return ConsiderFlags && Op->getFlags().hasDisjoint();
5187
5189 // Check if we demand any upper (undef) elements.
5190 return !PoisonOnly && DemandedElts.ugt(1);
5191
5193 // Ensure that the element index is in bounds.
5194 EVT VecVT = Op.getOperand(0).getValueType();
5195 KnownBits KnownIdx = computeKnownBits(Op.getOperand(1), Depth + 1);
5196 return KnownIdx.getMaxValue().uge(VecVT.getVectorMinNumElements());
5197 }
5198
5200 // Ensure that the element index is in bounds.
5201 EVT VecVT = Op.getOperand(0).getValueType();
5202 KnownBits KnownIdx = computeKnownBits(Op.getOperand(2), Depth + 1);
5203 return KnownIdx.getMaxValue().uge(VecVT.getVectorMinNumElements());
5204 }
5205
5206 default:
5207 // Allow the target to implement this method for its nodes.
5208 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
5209 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
5211 Op, DemandedElts, *this, PoisonOnly, ConsiderFlags, Depth);
5212 break;
5213 }
5214
5215 // Be conservative and return true.
5216 return true;
5217}
5218
5220 unsigned Opcode = Op.getOpcode();
5221 if (Opcode == ISD::OR)
5222 return Op->getFlags().hasDisjoint() ||
5223 haveNoCommonBitsSet(Op.getOperand(0), Op.getOperand(1));
5224 if (Opcode == ISD::XOR)
5225 return isMinSignedConstant(Op.getOperand(1));
5226 return false;
5227}
5228
5230 return Op.getNumOperands() == 2 && isa<ConstantSDNode>(Op.getOperand(1)) &&
5231 (Op.getOpcode() == ISD::ADD || isADDLike(Op));
5232}
5233
5234bool SelectionDAG::isKnownNeverNaN(SDValue Op, bool SNaN, unsigned Depth) const {
5235 // If we're told that NaNs won't happen, assume they won't.
5236 if (getTarget().Options.NoNaNsFPMath || Op->getFlags().hasNoNaNs())
5237 return true;
5238
5239 if (Depth >= MaxRecursionDepth)
5240 return false; // Limit search depth.
5241
5242 // If the value is a constant, we can obviously see if it is a NaN or not.
5243 if (const ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Op)) {
5244 return !C->getValueAPF().isNaN() ||
5245 (SNaN && !C->getValueAPF().isSignaling());
5246 }
5247
5248 unsigned Opcode = Op.getOpcode();
5249 switch (Opcode) {
5250 case ISD::FADD:
5251 case ISD::FSUB:
5252 case ISD::FMUL:
5253 case ISD::FDIV:
5254 case ISD::FREM:
5255 case ISD::FSIN:
5256 case ISD::FCOS:
5257 case ISD::FMA:
5258 case ISD::FMAD: {
5259 if (SNaN)
5260 return true;
5261 // TODO: Need isKnownNeverInfinity
5262 return false;
5263 }
5264 case ISD::FCANONICALIZE:
5265 case ISD::FEXP:
5266 case ISD::FEXP2:
5267 case ISD::FEXP10:
5268 case ISD::FTRUNC:
5269 case ISD::FFLOOR:
5270 case ISD::FCEIL:
5271 case ISD::FROUND:
5272 case ISD::FROUNDEVEN:
5273 case ISD::FRINT:
5274 case ISD::LRINT:
5275 case ISD::LLRINT:
5276 case ISD::FNEARBYINT:
5277 case ISD::FLDEXP: {
5278 if (SNaN)
5279 return true;
5280 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
5281 }
5282 case ISD::FABS:
5283 case ISD::FNEG:
5284 case ISD::FCOPYSIGN: {
5285 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
5286 }
5287 case ISD::SELECT:
5288 return isKnownNeverNaN(Op.getOperand(1), SNaN, Depth + 1) &&
5289 isKnownNeverNaN(Op.getOperand(2), SNaN, Depth + 1);
5290 case ISD::FP_EXTEND:
5291 case ISD::FP_ROUND: {
5292 if (SNaN)
5293 return true;
5294 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
5295 }
5296 case ISD::SINT_TO_FP:
5297 case ISD::UINT_TO_FP:
5298 return true;
5299 case ISD::FSQRT: // Need is known positive
5300 case ISD::FLOG:
5301 case ISD::FLOG2:
5302 case ISD::FLOG10:
5303 case ISD::FPOWI:
5304 case ISD::FPOW: {
5305 if (SNaN)
5306 return true;
5307 // TODO: Refine on operand
5308 return false;
5309 }
5310 case ISD::FMINNUM:
5311 case ISD::FMAXNUM: {
5312 // Only one needs to be known not-nan, since it will be returned if the
5313 // other ends up being one.
5314 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1) ||
5315 isKnownNeverNaN(Op.getOperand(1), SNaN, Depth + 1);
5316 }
5317 case ISD::FMINNUM_IEEE:
5318 case ISD::FMAXNUM_IEEE: {
5319 if (SNaN)
5320 return true;
5321 // This can return a NaN if either operand is an sNaN, or if both operands
5322 // are NaN.
5323 return (isKnownNeverNaN(Op.getOperand(0), false, Depth + 1) &&
5324 isKnownNeverSNaN(Op.getOperand(1), Depth + 1)) ||
5325 (isKnownNeverNaN(Op.getOperand(1), false, Depth + 1) &&
5326 isKnownNeverSNaN(Op.getOperand(0), Depth + 1));
5327 }
5328 case ISD::FMINIMUM:
5329 case ISD::FMAXIMUM: {
5330 // TODO: Does this quiet or return the origina NaN as-is?
5331 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1) &&
5332 isKnownNeverNaN(Op.getOperand(1), SNaN, Depth + 1);
5333 }
5335 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
5336 }
5337 case ISD::BUILD_VECTOR: {
5338 for (const SDValue &Opnd : Op->ops())
5339 if (!isKnownNeverNaN(Opnd, SNaN, Depth + 1))
5340 return false;
5341 return true;
5342 }
5343 default:
5344 if (Opcode >= ISD::BUILTIN_OP_END ||
5345 Opcode == ISD::INTRINSIC_WO_CHAIN ||
5346 Opcode == ISD::INTRINSIC_W_CHAIN ||
5347 Opcode == ISD::INTRINSIC_VOID) {
5348 return TLI->isKnownNeverNaNForTargetNode(Op, *this, SNaN, Depth);
5349 }
5350
5351 return false;
5352 }
5353}
5354
5356 assert(Op.getValueType().isFloatingPoint() &&
5357 "Floating point type expected");
5358
5359 // If the value is a constant, we can obviously see if it is a zero or not.
5361 Op, [](ConstantFPSDNode *C) { return !C->isZero(); });
5362}
5363
5365 if (Depth >= MaxRecursionDepth)
5366 return false; // Limit search depth.
5367
5368 assert(!Op.getValueType().isFloatingPoint() &&
5369 "Floating point types unsupported - use isKnownNeverZeroFloat");
5370
5371 // If the value is a constant, we can obviously see if it is a zero or not.
5373 [](ConstantSDNode *C) { return !C->isZero(); }))
5374 return true;
5375
5376 // TODO: Recognize more cases here. Most of the cases are also incomplete to
5377 // some degree.
5378 switch (Op.getOpcode()) {
5379 default:
5380 break;
5381
5382 case ISD::OR:
5383 return isKnownNeverZero(Op.getOperand(1), Depth + 1) ||
5384 isKnownNeverZero(Op.getOperand(0), Depth + 1);
5385
5386 case ISD::VSELECT:
5387 case ISD::SELECT:
5388 return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
5389 isKnownNeverZero(Op.getOperand(2), Depth + 1);
5390
5391 case ISD::SHL: {
5392 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
5393 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
5394 KnownBits ValKnown = computeKnownBits(Op.getOperand(0), Depth + 1);
5395 // 1 << X is never zero.
5396 if (ValKnown.One[0])
5397 return true;
5398 // If max shift cnt of known ones is non-zero, result is non-zero.
5399 APInt MaxCnt = computeKnownBits(Op.getOperand(1), Depth + 1).getMaxValue();
5400 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
5401 !ValKnown.One.shl(MaxCnt).isZero())
5402 return true;
5403 break;
5404 }
5405 case ISD::UADDSAT:
5406 case ISD::UMAX:
5407 return isKnownNeverZero(Op.getOperand(1), Depth + 1) ||
5408 isKnownNeverZero(Op.getOperand(0), Depth + 1);
5409
5410 // For smin/smax: If either operand is known negative/positive
5411 // respectively we don't need the other to be known at all.
5412 case ISD::SMAX: {
5413 KnownBits Op1 = computeKnownBits(Op.getOperand(1), Depth + 1);
5414 if (Op1.isStrictlyPositive())
5415 return true;
5416
5417 KnownBits Op0 = computeKnownBits(Op.getOperand(0), Depth + 1);
5418 if (Op0.isStrictlyPositive())
5419 return true;
5420
5421 if (Op1.isNonZero() && Op0.isNonZero())
5422 return true;
5423
5424 return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
5425 isKnownNeverZero(Op.getOperand(0), Depth + 1);
5426 }
5427 case ISD::SMIN: {
5428 KnownBits Op1 = computeKnownBits(Op.getOperand(1), Depth + 1);
5429 if (Op1.isNegative())
5430 return true;
5431
5432 KnownBits Op0 = computeKnownBits(Op.getOperand(0), Depth + 1);
5433 if (Op0.isNegative())
5434 return true;
5435
5436 if (Op1.isNonZero() && Op0.isNonZero())
5437 return true;
5438
5439 return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
5440 isKnownNeverZero(Op.getOperand(0), Depth + 1);
5441 }
5442 case ISD::UMIN:
5443 return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
5444 isKnownNeverZero(Op.getOperand(0), Depth + 1);
5445
5446 case ISD::ROTL:
5447 case ISD::ROTR:
5448 case ISD::BITREVERSE:
5449 case ISD::BSWAP:
5450 case ISD::CTPOP:
5451 case ISD::ABS:
5452 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
5453
5454 case ISD::SRA:
5455 case ISD::SRL: {
5456 if (Op->getFlags().hasExact())
5457 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
5458 KnownBits ValKnown = computeKnownBits(Op.getOperand(0), Depth + 1);
5459 if (ValKnown.isNegative())
5460 return true;
5461 // If max shift cnt of known ones is non-zero, result is non-zero.
5462 APInt MaxCnt = computeKnownBits(Op.getOperand(1), Depth + 1).getMaxValue();
5463 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
5464 !ValKnown.One.lshr(MaxCnt).isZero())
5465 return true;
5466 break;
5467 }
5468 case ISD::UDIV:
5469 case ISD::SDIV:
5470 // div exact can only produce a zero if the dividend is zero.
5471 // TODO: For udiv this is also true if Op1 u<= Op0
5472 if (Op->getFlags().hasExact())
5473 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
5474 break;
5475
5476 case ISD::ADD:
5477 if (Op->getFlags().hasNoUnsignedWrap())
5478 if (isKnownNeverZero(Op.getOperand(1), Depth + 1) ||
5479 isKnownNeverZero(Op.getOperand(0), Depth + 1))
5480 return true;
5481 // TODO: There are a lot more cases we can prove for add.
5482 break;
5483
5484 case ISD::SUB: {
5485 if (isNullConstant(Op.getOperand(0)))
5486 return isKnownNeverZero(Op.getOperand(1), Depth + 1);
5487
5488 std::optional<bool> ne =
5489 KnownBits::ne(computeKnownBits(Op.getOperand(0), Depth + 1),
5490 computeKnownBits(Op.getOperand(1), Depth + 1));
5491 return ne && *ne;
5492 }
5493
5494 case ISD::MUL:
5495 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
5496 if (isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
5497 isKnownNeverZero(Op.getOperand(0), Depth + 1))
5498 return true;
5499 break;
5500
5501 case ISD::ZERO_EXTEND:
5502 case ISD::SIGN_EXTEND:
5503 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
5504 }
5505
5507}
5508
5510 // Check the obvious case.
5511 if (A == B) return true;
5512
5513 // For negative and positive zero.
5514 if (const ConstantFPSDNode *CA = dyn_cast<ConstantFPSDNode>(A))
5515 if (const ConstantFPSDNode *CB = dyn_cast<ConstantFPSDNode>(B))
5516 if (CA->isZero() && CB->isZero()) return true;
5517
5518 // Otherwise they may not be equal.
5519 return false;
5520}
5521
5522// Only bits set in Mask must be negated, other bits may be arbitrary.
5524 if (isBitwiseNot(V, AllowUndefs))
5525 return V.getOperand(0);
5526
5527 // Handle any_extend (not (truncate X)) pattern, where Mask only sets
5528 // bits in the non-extended part.
5529 ConstantSDNode *MaskC = isConstOrConstSplat(Mask);
5530 if (!MaskC || V.getOpcode() != ISD::ANY_EXTEND)
5531 return SDValue();
5532 SDValue ExtArg = V.getOperand(0);
5533 if (ExtArg.getScalarValueSizeInBits() >=
5534 MaskC->getAPIntValue().getActiveBits() &&
5535 isBitwiseNot(ExtArg, AllowUndefs) &&
5536 ExtArg.getOperand(0).getOpcode() == ISD::TRUNCATE &&
5537 ExtArg.getOperand(0).getOperand(0).getValueType() == V.getValueType())
5538 return ExtArg.getOperand(0).getOperand(0);
5539 return SDValue();
5540}
5541
5543 // Match masked merge pattern (X & ~M) op (Y & M)
5544 // Including degenerate case (X & ~M) op M
5545 auto MatchNoCommonBitsPattern = [&](SDValue Not, SDValue Mask,
5546 SDValue Other) {
5547 if (SDValue NotOperand =
5548 getBitwiseNotOperand(Not, Mask, /* AllowUndefs */ true)) {
5549 if (NotOperand->getOpcode() == ISD::ZERO_EXTEND ||
5550 NotOperand->getOpcode() == ISD::TRUNCATE)
5551 NotOperand = NotOperand->getOperand(0);
5552
5553 if (Other == NotOperand)
5554 return true;
5555 if (Other->getOpcode() == ISD::AND)
5556 return NotOperand == Other->getOperand(0) ||
5557 NotOperand == Other->getOperand(1);
5558 }
5559 return false;
5560 };
5561
5562 if (A->getOpcode() == ISD::ZERO_EXTEND || A->getOpcode() == ISD::TRUNCATE)
5563 A = A->getOperand(0);
5564
5565 if (B->getOpcode() == ISD::ZERO_EXTEND || B->getOpcode() == ISD::TRUNCATE)
5566 B = B->getOperand(0);
5567
5568 if (A->getOpcode() == ISD::AND)
5569 return MatchNoCommonBitsPattern(A->getOperand(0), A->getOperand(1), B) ||
5570 MatchNoCommonBitsPattern(A->getOperand(1), A->getOperand(0), B);
5571 return false;
5572}
5573
5574// FIXME: unify with llvm::haveNoCommonBitsSet.
5576 assert(A.getValueType() == B.getValueType() &&
5577 "Values must have the same type");
5580 return true;
5583}
5584
5585static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step,
5586 SelectionDAG &DAG) {
5587 if (cast<ConstantSDNode>(Step)->isZero())
5588 return DAG.getConstant(0, DL, VT);
5589
5590 return SDValue();
5591}
5592
5595 SelectionDAG &DAG) {
5596 int NumOps = Ops.size();
5597 assert(NumOps != 0 && "Can't build an empty vector!");
5598 assert(!VT.isScalableVector() &&
5599 "BUILD_VECTOR cannot be used with scalable types");
5600 assert(VT.getVectorNumElements() == (unsigned)NumOps &&
5601 "Incorrect element count in BUILD_VECTOR!");
5602
5603 // BUILD_VECTOR of UNDEFs is UNDEF.
5604 if (llvm::all_of(Ops, [](SDValue Op) { return Op.isUndef(); }))
5605 return DAG.getUNDEF(VT);
5606
5607 // BUILD_VECTOR of seq extract/insert from the same vector + type is Identity.
5608 SDValue IdentitySrc;
5609 bool IsIdentity = true;
5610 for (int i = 0; i != NumOps; ++i) {
5611 if (Ops[i].getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
5612 Ops[i].getOperand(0).getValueType() != VT ||
5613 (IdentitySrc && Ops[i].getOperand(0) != IdentitySrc) ||
5614 !isa<ConstantSDNode>(Ops[i].getOperand(1)) ||
5615 Ops[i].getConstantOperandAPInt(1) != i) {
5616 IsIdentity = false;
5617 break;
5618 }
5619 IdentitySrc = Ops[i].getOperand(0);
5620 }
5621 if (IsIdentity)
5622 return IdentitySrc;
5623
5624 return SDValue();
5625}
5626
5627/// Try to simplify vector concatenation to an input value, undef, or build
5628/// vector.
5631 SelectionDAG &DAG) {
5632 assert(!Ops.empty() && "Can't concatenate an empty list of vectors!");
5633 assert(llvm::all_of(Ops,
5634 [Ops](SDValue Op) {
5635 return Ops[0].getValueType() == Op.getValueType();
5636 }) &&
5637 "Concatenation of vectors with inconsistent value types!");
5638 assert((Ops[0].getValueType().getVectorElementCount() * Ops.size()) ==
5639 VT.getVectorElementCount() &&
5640 "Incorrect element count in vector concatenation!");
5641
5642 if (Ops.size() == 1)
5643 return Ops[0];
5644
5645 // Concat of UNDEFs is UNDEF.
5646 if (llvm::all_of(Ops, [](SDValue Op) { return Op.isUndef(); }))
5647 return DAG.getUNDEF(VT);
5648
5649 // Scan the operands and look for extract operations from a single source
5650 // that correspond to insertion at the same location via this concatenation:
5651 // concat (extract X, 0*subvec_elts), (extract X, 1*subvec_elts), ...
5652 SDValue IdentitySrc;
5653 bool IsIdentity = true;
5654 for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
5655 SDValue Op = Ops[i];
5656 unsigned IdentityIndex = i * Op.getValueType().getVectorMinNumElements();
5657 if (Op.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
5658 Op.getOperand(0).getValueType() != VT ||
5659 (IdentitySrc && Op.getOperand(0) != IdentitySrc) ||
5660 Op.getConstantOperandVal(1) != IdentityIndex) {
5661 IsIdentity = false;
5662 break;
5663 }
5664 assert((!IdentitySrc || IdentitySrc == Op.getOperand(0)) &&
5665 "Unexpected identity source vector for concat of extracts");
5666 IdentitySrc = Op.getOperand(0);
5667 }
5668 if (IsIdentity) {
5669 assert(IdentitySrc && "Failed to set source vector of extracts");
5670 return IdentitySrc;
5671 }
5672
5673 // The code below this point is only designed to work for fixed width
5674 // vectors, so we bail out for now.
5675 if (VT.isScalableVector())
5676 return SDValue();
5677
5678 // A CONCAT_VECTOR with all UNDEF/BUILD_VECTOR operands can be
5679 // simplified to one big BUILD_VECTOR.
5680 // FIXME: Add support for SCALAR_TO_VECTOR as well.
5681 EVT SVT = VT.getScalarType();
5683 for (SDValue Op : Ops) {
5684 EVT OpVT = Op.getValueType();
5685 if (Op.isUndef())
5686 Elts.append(OpVT.getVectorNumElements(), DAG.getUNDEF(SVT));
5687 else if (Op.getOpcode() == ISD::BUILD_VECTOR)
5688 Elts.append(Op->op_begin(), Op->op_end());
5689 else
5690 return SDValue();
5691 }
5692
5693 // BUILD_VECTOR requires all inputs to be of the same type, find the
5694 // maximum type and extend them all.
5695 for (SDValue Op : Elts)
5696 SVT = (SVT.bitsLT(Op.getValueType()) ? Op.getValueType() : SVT);
5697
5698 if (SVT.bitsGT(VT.getScalarType())) {
5699 for (SDValue &Op : Elts) {
5700 if (Op.isUndef())
5701 Op = DAG.getUNDEF(SVT);
5702 else
5703 Op = DAG.getTargetLoweringInfo().isZExtFree(Op.getValueType(), SVT)
5704 ? DAG.getZExtOrTrunc(Op, DL, SVT)
5705 : DAG.getSExtOrTrunc(Op, DL, SVT);
5706 }
5707 }
5708
5709 SDValue V = DAG.getBuildVector(VT, DL, Elts);
5710 NewSDValueDbgMsg(V, "New node fold concat vectors: ", &DAG);
5711 return V;
5712}
5713
5714/// Gets or creates the specified node.
5715SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT) {
5717 AddNodeIDNode(ID, Opcode, getVTList(VT), std::nullopt);
5718 void *IP = nullptr;
5719 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
5720 return SDValue(E, 0);
5721
5722 auto *N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(),
5723 getVTList(VT));
5724 CSEMap.InsertNode(N, IP);
5725
5726 InsertNode(N);
5727 SDValue V = SDValue(N, 0);
5728 NewSDValueDbgMsg(V, "Creating new node: ", this);
5729 return V;
5730}
5731
5732SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
5733 SDValue N1) {
5734 SDNodeFlags Flags;
5735 if (Inserter)
5736 Flags = Inserter->getFlags();
5737 return getNode(Opcode, DL, VT, N1, Flags);
5738}
5739
5740SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
5741 SDValue N1, const SDNodeFlags Flags) {
5742 assert(N1.getOpcode() != ISD::DELETED_NODE && "Operand is DELETED_NODE!");
5743
5744 // Constant fold unary operations with a vector integer or float operand.
5745 switch (Opcode) {
5746 default:
5747 // FIXME: Entirely reasonable to perform folding of other unary
5748 // operations here as the need arises.
5749 break;
5750 case ISD::FNEG:
5751 case ISD::FABS:
5752 case ISD::FCEIL:
5753 case ISD::FTRUNC:
5754 case ISD::FFLOOR:
5755 case ISD::FP_EXTEND:
5756 case ISD::FP_TO_SINT:
5757 case ISD::FP_TO_UINT:
5758 case ISD::FP_TO_FP16:
5759 case ISD::FP_TO_BF16:
5760 case ISD::TRUNCATE:
5761 case ISD::ANY_EXTEND:
5762 case ISD::ZERO_EXTEND:
5763 case ISD::SIGN_EXTEND:
5764 case ISD::UINT_TO_FP:
5765 case ISD::SINT_TO_FP:
5766 case ISD::FP16_TO_FP:
5767 case ISD::BF16_TO_FP:
5768 case ISD::BITCAST:
5769 case ISD::ABS:
5770 case ISD::BITREVERSE:
5771 case ISD::BSWAP:
5772 case ISD::CTLZ:
5774 case ISD::CTTZ:
5776 case ISD::CTPOP:
5777 case ISD::STEP_VECTOR: {
5778 SDValue Ops = {N1};
5779 if (SDValue Fold = FoldConstantArithmetic(Opcode, DL, VT, Ops))
5780 return Fold;
5781 }
5782 }
5783
5784 unsigned OpOpcode = N1.getNode()->getOpcode();
5785 switch (Opcode) {
5786 case ISD::STEP_VECTOR:
5787 assert(VT.isScalableVector() &&
5788 "STEP_VECTOR can only be used with scalable types");
5789 assert(OpOpcode == ISD::TargetConstant &&
5790 VT.getVectorElementType() == N1.getValueType() &&
5791 "Unexpected step operand");
5792 break;
5793 case ISD::FREEZE:
5794 assert(VT == N1.getValueType() && "Unexpected VT!");
5795 if (isGuaranteedNotToBeUndefOrPoison(N1, /*PoisonOnly*/ false,
5796 /*Depth*/ 1))
5797 return N1;
5798 break;
5799 case ISD::TokenFactor:
5800 case ISD::MERGE_VALUES:
5802 return N1; // Factor, merge or concat of one node? No need.
5803 case ISD::BUILD_VECTOR: {
5804 // Attempt to simplify BUILD_VECTOR.
5805 SDValue Ops[] = {N1};
5806 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
5807 return V;
5808 break;
5809 }
5810 case ISD::FP_ROUND: llvm_unreachable("Invalid method to make FP_ROUND node");
5811 case ISD::FP_EXTEND:
5813 "Invalid FP cast!");
5814 if (N1.getValueType() == VT) return N1; // noop conversion.
5815 assert((!VT.isVector() || VT.getVectorElementCount() ==
5817 "Vector element count mismatch!");
5818 assert(N1.getValueType().bitsLT(VT) && "Invalid fpext node, dst < src!");
5819 if (N1.isUndef())
5820 return getUNDEF(VT);
5821 break;
5822 case ISD::FP_TO_SINT:
5823 case ISD::FP_TO_UINT:
5824 if (N1.isUndef())
5825 return getUNDEF(VT);
5826 break;
5827 case ISD::SINT_TO_FP:
5828 case ISD::UINT_TO_FP:
5829 // [us]itofp(undef) = 0, because the result value is bounded.
5830 if (N1.isUndef())
5831 return getConstantFP(0.0, DL, VT);
5832 break;
5833 case ISD::SIGN_EXTEND:
5834 assert(VT.isInteger() && N1.getValueType().isInteger() &&
5835 "Invalid SIGN_EXTEND!");
5836 assert(VT.isVector() == N1.getValueType().isVector() &&
5837 "SIGN_EXTEND result type type should be vector iff the operand "
5838 "type is vector!");
5839 if (N1.getValueType() == VT) return N1; // noop extension
5840 assert((!VT.isVector() || VT.getVectorElementCount() ==
5842 "Vector element count mismatch!");
5843 assert(N1.getValueType().bitsLT(VT) && "Invalid sext node, dst < src!");
5844 if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND) {
5845 SDNodeFlags Flags;
5846 if (OpOpcode == ISD::ZERO_EXTEND)
5847 Flags.setNonNeg(N1->getFlags().hasNonNeg());
5848 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
5849 }
5850 if (OpOpcode == ISD::UNDEF)
5851 // sext(undef) = 0, because the top bits will all be the same.
5852 return getConstant(0, DL, VT);
5853 break;
5854 case ISD::ZERO_EXTEND:
5855 assert(VT.isInteger() && N1.getValueType().isInteger() &&
5856 "Invalid ZERO_EXTEND!");
5857 assert(VT.isVector() == N1.getValueType().isVector() &&
5858 "ZERO_EXTEND result type type should be vector iff the operand "
5859 "type is vector!");
5860 if (N1.getValueType() == VT) return N1; // noop extension
5861 assert((!VT.isVector() || VT.getVectorElementCount() ==
5863 "Vector element count mismatch!");
5864 assert(N1.getValueType().bitsLT(VT) && "Invalid zext node, dst < src!");
5865 if (OpOpcode == ISD::ZERO_EXTEND) { // (zext (zext x)) -> (zext x)
5866 SDNodeFlags Flags;
5867 Flags.setNonNeg(N1->getFlags().hasNonNeg());
5868 return getNode(ISD::ZERO_EXTEND, DL, VT, N1.getOperand(0), Flags);
5869 }
5870 if (OpOpcode == ISD::UNDEF)
5871 // zext(undef) = 0, because the top bits will be zero.
5872 return getConstant(0, DL, VT);
5873
5874 // Skip unnecessary zext_inreg pattern:
5875 // (zext (trunc x)) -> x iff the upper bits are known zero.
5876 // TODO: Remove (zext (trunc (and x, c))) exception which some targets
5877 // use to recognise zext_inreg patterns.
5878 if (OpOpcode == ISD::TRUNCATE) {
5879 SDValue OpOp = N1.getOperand(0);
5880 if (OpOp.getValueType() == VT) {
5881 if (OpOp.getOpcode() != ISD::AND) {
5884 if (MaskedValueIsZero(OpOp, HiBits)) {
5885 transferDbgValues(N1, OpOp);
5886 return OpOp;
5887 }
5888 }
5889 }
5890 }
5891 break;
5892 case ISD::ANY_EXTEND:
5893 assert(VT.isInteger() && N1.getValueType().isInteger() &&
5894 "Invalid ANY_EXTEND!");
5895 assert(VT.isVector() == N1.getValueType().isVector() &&
5896 "ANY_EXTEND result type type should be vector iff the operand "
5897 "type is vector!");
5898 if (N1.getValueType() == VT) return N1; // noop extension
5899 assert((!VT.isVector() || VT.getVectorElementCount() ==
5901 "Vector element count mismatch!");
5902 assert(N1.getValueType().bitsLT(VT) && "Invalid anyext node, dst < src!");
5903
5904 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
5905 OpOpcode == ISD::ANY_EXTEND) {
5906 SDNodeFlags Flags;
5907 if (OpOpcode == ISD::ZERO_EXTEND)
5908 Flags.setNonNeg(N1->getFlags().hasNonNeg());
5909 // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x)
5910 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
5911 }
5912 if (OpOpcode == ISD::UNDEF)
5913 return getUNDEF(VT);
5914
5915 // (ext (trunc x)) -> x
5916 if (OpOpcode == ISD::TRUNCATE) {
5917 SDValue OpOp = N1.getOperand(0);
5918 if (OpOp.getValueType() == VT) {
5919 transferDbgValues(N1, OpOp);
5920 return OpOp;
5921 }
5922 }
5923 break;
5924 case ISD::TRUNCATE:
5925 assert(VT.isInteger() && N1.getValueType().isInteger() &&
5926 "Invalid TRUNCATE!");
5927 assert(VT.isVector() == N1.getValueType().isVector() &&
5928 "TRUNCATE result type type should be vector iff the operand "
5929 "type is vector!");
5930 if (N1.getValueType() == VT) return N1; // noop truncate
5931 assert((!VT.isVector() || VT.getVectorElementCount() ==
5933 "Vector element count mismatch!");
5934 assert(N1.getValueType().bitsGT(VT) && "Invalid truncate node, src < dst!");
5935 if (OpOpcode == ISD::TRUNCATE)
5936 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
5937 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
5938 OpOpcode == ISD::ANY_EXTEND) {
5939 // If the source is smaller than the dest, we still need an extend.
5941 VT.getScalarType()))
5942 return getNode(OpOpcode, DL, VT, N1.getOperand(0));
5943 if (N1.getOperand(0).getValueType().bitsGT(VT))
5944 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
5945 return N1.getOperand(0);
5946 }
5947 if (OpOpcode == ISD::UNDEF)
5948 return getUNDEF(VT);
5949 if (OpOpcode == ISD::VSCALE && !NewNodesMustHaveLegalTypes)
5950 return getVScale(DL, VT,
5952 break;
5956 assert(VT.isVector() && "This DAG node is restricted to vector types.");
5957 assert(N1.getValueType().bitsLE(VT) &&
5958 "The input must be the same size or smaller than the result.");
5961 "The destination vector type must have fewer lanes than the input.");
5962 break;
5963 case ISD::ABS:
5964 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid ABS!");
5965 if (OpOpcode == ISD::UNDEF)
5966 return getConstant(0, DL, VT);
5967 break;
5968 case ISD::BSWAP:
5969 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BSWAP!");
5970 assert((VT.getScalarSizeInBits() % 16 == 0) &&
5971 "BSWAP types must be a multiple of 16 bits!");
5972 if (OpOpcode == ISD::UNDEF)
5973 return getUNDEF(VT);
5974 // bswap(bswap(X)) -> X.
5975 if (OpOpcode == ISD::BSWAP)
5976 return N1.getOperand(0);
5977 break;
5978 case ISD::BITREVERSE:
5979 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BITREVERSE!");
5980 if (OpOpcode == ISD::UNDEF)
5981 return getUNDEF(VT);
5982 break;
5983 case ISD::BITCAST:
5985 "Cannot BITCAST between types of different sizes!");
5986 if (VT == N1.getValueType()) return N1; // noop conversion.
5987 if (OpOpcode == ISD::BITCAST) // bitconv(bitconv(x)) -> bitconv(x)
5988 return getNode(ISD::BITCAST, DL, VT, N1.getOperand(0));
5989 if (OpOpcode == ISD::UNDEF)
5990 return getUNDEF(VT);
5991 break;
5993 assert(VT.isVector() && !N1.getValueType().isVector() &&
5994 (VT.getVectorElementType() == N1.getValueType() ||
5996 N1.getValueType().isInteger() &&
5998 "Illegal SCALAR_TO_VECTOR node!");
5999 if (OpOpcode == ISD::UNDEF)
6000 return getUNDEF(VT);
6001 // scalar_to_vector(extract_vector_elt V, 0) -> V, top bits are undefined.
6002 if (OpOpcode == ISD::EXTRACT_VECTOR_ELT &&
6003 isa<ConstantSDNode>(N1.getOperand(1)) &&
6004 N1.getConstantOperandVal(1) == 0 &&
6005 N1.getOperand(0).getValueType() == VT)
6006 return N1.getOperand(0);
6007 break;
6008 case ISD::FNEG:
6009 // Negation of an unknown bag of bits is still completely undefined.
6010 if (OpOpcode == ISD::UNDEF)
6011 return getUNDEF(VT);
6012
6013 if (OpOpcode == ISD::FNEG) // --X -> X
6014 return N1.getOperand(0);
6015 break;
6016 case ISD::FABS:
6017 if (OpOpcode == ISD::FNEG) // abs(-X) -> abs(X)
6018 return getNode(ISD::FABS, DL, VT, N1.getOperand(0));
6019 break;
6020 case ISD::VSCALE:
6021 assert(VT == N1.getValueType() && "Unexpected VT!");
6022 break;
6023 case ISD::CTPOP:
6024 if (N1.getValueType().getScalarType() == MVT::i1)
6025 return N1;
6026 break;
6027 case ISD::CTLZ:
6028 case ISD::CTTZ:
6029 if (N1.getValueType().getScalarType() == MVT::i1)
6030 return getNOT(DL, N1, N1.getValueType());
6031 break;
6032 case ISD::VECREDUCE_ADD:
6033 if (N1.getValueType().getScalarType() == MVT::i1)
6034 return getNode(ISD::VECREDUCE_XOR, DL, VT, N1);
6035 break;
6038 if (N1.getValueType().getScalarType() == MVT::i1)
6039 return getNode(ISD::VECREDUCE_OR, DL, VT, N1);
6040 break;
6043 if (N1.getValueType().getScalarType() == MVT::i1)
6044 return getNode(ISD::VECREDUCE_AND, DL, VT, N1);
6045 break;
6046 case ISD::SPLAT_VECTOR:
6047 assert(VT.isVector() && "Wrong return type!");
6048 // FIXME: Hexagon uses i32 scalar for a floating point zero vector so allow
6049 // that for now.
6051 (VT.isFloatingPoint() && N1.getValueType() == MVT::i32) ||
6053 N1.getValueType().isInteger() &&
6055 "Wrong operand type!");
6056 break;
6057 }
6058
6059 SDNode *N;
6060 SDVTList VTs = getVTList(VT);
6061 SDValue Ops[] = {N1};
6062 if (VT != MVT::Glue) { // Don't CSE glue producing nodes
6064 AddNodeIDNode(ID, Opcode, VTs, Ops);
6065 void *IP = nullptr;
6066 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
6067 E->intersectFlagsWith(Flags);
6068 return SDValue(E, 0);
6069 }
6070
6071 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6072 N->setFlags(Flags);
6073 createOperands(N, Ops);
6074 CSEMap.InsertNode(N, IP);
6075 } else {
6076 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6077 createOperands(N, Ops);
6078 }
6079
6080 InsertNode(N);
6081 SDValue V = SDValue(N, 0);
6082 NewSDValueDbgMsg(V, "Creating new node: ", this);
6083 return V;
6084}
6085
6086static std::optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
6087 const APInt &C2) {
6088 switch (Opcode) {
6089 case ISD::ADD: return C1 + C2;
6090 case ISD::SUB: return C1 - C2;
6091 case ISD::MUL: return C1 * C2;
6092 case ISD::AND: return C1 & C2;
6093 case ISD::OR: return C1 | C2;
6094 case ISD::XOR: return C1 ^ C2;
6095 case ISD::SHL: return C1 << C2;
6096 case ISD::SRL: return C1.lshr(C2);
6097 case ISD::SRA: return C1.ashr(C2);
6098 case ISD::ROTL: return C1.rotl(C2);
6099 case ISD::ROTR: return C1.rotr(C2);
6100 case ISD::SMIN: return C1.sle(C2) ? C1 : C2;
6101 case ISD::SMAX: return C1.sge(C2) ? C1 : C2;
6102 case ISD::UMIN: return C1.ule(C2) ? C1 : C2;
6103 case ISD::UMAX: return C1.uge(C2) ? C1 : C2;
6104 case ISD::SADDSAT: return C1.sadd_sat(C2);
6105 case ISD::UADDSAT: return C1.uadd_sat(C2);
6106 case ISD::SSUBSAT: return C1.ssub_sat(C2);
6107 case ISD::USUBSAT: return C1.usub_sat(C2);
6108 case ISD::SSHLSAT: return C1.sshl_sat(C2);
6109 case ISD::USHLSAT: return C1.ushl_sat(C2);
6110 case ISD::UDIV:
6111 if (!C2.getBoolValue())
6112 break;
6113 return C1.udiv(C2);
6114 case ISD::UREM:
6115 if (!C2.getBoolValue())
6116 break;
6117 return C1.urem(C2);
6118 case ISD::SDIV:
6119 if (!C2.getBoolValue())
6120 break;
6121 return C1.sdiv(C2);
6122 case ISD::SREM:
6123 if (!C2.getBoolValue())
6124 break;
6125 return C1.srem(C2);
6126 case ISD::AVGFLOORS:
6127 return APIntOps::avgFloorS(C1, C2);
6128 case ISD::AVGFLOORU:
6129 return APIntOps::avgFloorU(C1, C2);
6130 case ISD::AVGCEILS:
6131 return APIntOps::avgCeilS(C1, C2);
6132 case ISD::AVGCEILU:
6133 return APIntOps::avgCeilU(C1, C2);
6134 case ISD::ABDS:
6135 return APIntOps::abds(C1, C2);
6136 case ISD::ABDU:
6137 return APIntOps::abdu(C1, C2);
6138 case ISD::MULHS:
6139 return APIntOps::mulhs(C1, C2);
6140 case ISD::MULHU:
6141 return APIntOps::mulhu(C1, C2);
6142 }
6143 return std::nullopt;
6144}
6145// Handle constant folding with UNDEF.
6146// TODO: Handle more cases.
6147static std::optional<APInt> FoldValueWithUndef(unsigned Opcode, const APInt &C1,
6148 bool IsUndef1, const APInt &C2,
6149 bool IsUndef2) {
6150 if (!(IsUndef1 || IsUndef2))
6151 return FoldValue(Opcode, C1, C2);
6152
6153 // Fold and(x, undef) -> 0
6154 // Fold mul(x, undef) -> 0
6155 if (Opcode == ISD::AND || Opcode == ISD::MUL)
6156 return APInt::getZero(C1.getBitWidth());
6157
6158 return std::nullopt;
6159}
6160
6162 const GlobalAddressSDNode *GA,
6163 const SDNode *N2) {
6164 if (GA->getOpcode() != ISD::GlobalAddress)
6165 return SDValue();
6166 if (!TLI->isOffsetFoldingLegal(GA))
6167 return SDValue();
6168 auto *C2 = dyn_cast<ConstantSDNode>(N2);
6169 if (!C2)
6170 return SDValue();
6171 int64_t Offset = C2->getSExtValue();
6172 switch (Opcode) {
6173 case ISD::ADD: break;
6174 case ISD::SUB: Offset = -uint64_t(Offset); break;
6175 default: return SDValue();
6176 }
6177 return getGlobalAddress(GA->getGlobal(), SDLoc(C2), VT,
6178 GA->getOffset() + uint64_t(Offset));
6179}
6180
6181bool SelectionDAG::isUndef(unsigned Opcode, ArrayRef<SDValue> Ops) {
6182 switch (Opcode) {
6183 case ISD::SDIV:
6184 case ISD::UDIV:
6185 case ISD::SREM:
6186 case ISD::UREM: {
6187 // If a divisor is zero/undef or any element of a divisor vector is
6188 // zero/undef, the whole op is undef.
6189 assert(Ops.size() == 2 && "Div/rem should have 2 operands");
6190 SDValue Divisor = Ops[1];
6191 if (Divisor.isUndef() || isNullConstant(Divisor))
6192 return true;
6193
6194 return ISD::isBuildVectorOfConstantSDNodes(Divisor.getNode()) &&
6195 llvm::any_of(Divisor->op_values(),
6196 [](SDValue V) { return V.isUndef() ||
6197 isNullConstant(V); });
6198 // TODO: Handle signed overflow.
6199 }
6200 // TODO: Handle oversized shifts.
6201 default:
6202 return false;
6203 }
6204}
6205
6207 EVT VT, ArrayRef<SDValue> Ops) {
6208 // If the opcode is a target-specific ISD node, there's nothing we can
6209 // do here and the operand rules may not line up with the below, so
6210 // bail early.
6211 // We can't create a scalar CONCAT_VECTORS so skip it. It will break
6212 // for concats involving SPLAT_VECTOR. Concats of BUILD_VECTORS are handled by
6213 // foldCONCAT_VECTORS in getNode before this is called.
6214 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::CONCAT_VECTORS)
6215 return SDValue();
6216
6217 unsigned NumOps = Ops.size();
6218 if (NumOps == 0)
6219 return SDValue();
6220
6221 if (isUndef(Opcode, Ops))
6222 return getUNDEF(VT);
6223
6224 // Handle unary special cases.
6225 if (NumOps == 1) {
6226 SDValue N1 = Ops[0];
6227
6228 // Constant fold unary operations with an integer constant operand. Even
6229 // opaque constant will be folded, because the folding of unary operations
6230 // doesn't create new constants with different values. Nevertheless, the
6231 // opaque flag is preserved during folding to prevent future folding with
6232 // other constants.
6233 if (auto *C = dyn_cast<ConstantSDNode>(N1)) {
6234 const APInt &Val = C->getAPIntValue();
6235 switch (Opcode) {
6236 case ISD::SIGN_EXTEND:
6237 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
6238 C->isTargetOpcode(), C->isOpaque());
6239 case ISD::TRUNCATE:
6240 if (C->isOpaque())
6241 break;
6242 [[fallthrough]];
6243 case ISD::ZERO_EXTEND:
6244 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
6245 C->isTargetOpcode(), C->isOpaque());
6246 case ISD::ANY_EXTEND:
6247 // Some targets like RISCV prefer to sign extend some types.
6248 if (TLI->isSExtCheaperThanZExt(N1.getValueType(), VT))
6249 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
6250 C->isTargetOpcode(), C->isOpaque());
6251 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
6252 C->isTargetOpcode(), C->isOpaque());
6253 case ISD::ABS:
6254 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
6255 C->isOpaque());
6256 case ISD::BITREVERSE:
6257 return getConstant(Val.reverseBits(), DL, VT, C->isTargetOpcode(),
6258 C->isOpaque());
6259 case ISD::BSWAP:
6260 return getConstant(Val.byteSwap(), DL, VT, C->isTargetOpcode(),
6261 C->isOpaque());
6262 case ISD::CTPOP:
6263 return getConstant(Val.popcount(), DL, VT, C->isTargetOpcode(),
6264 C->isOpaque());
6265 case ISD::CTLZ:
6267 return getConstant(Val.countl_zero(), DL, VT, C->isTargetOpcode(),
6268 C->isOpaque());
6269 case ISD::CTTZ:
6271 return getConstant(Val.countr_zero(), DL, VT, C->isTargetOpcode(),
6272 C->isOpaque());
6273 case ISD::UINT_TO_FP:
6274 case ISD::SINT_TO_FP: {
6277 (void)apf.convertFromAPInt(Val, Opcode == ISD::SINT_TO_FP,
6279 return getConstantFP(apf, DL, VT);
6280 }
6281 case ISD::FP16_TO_FP:
6282 case ISD::BF16_TO_FP: {
6283 bool Ignored;
6284 APFloat FPV(Opcode == ISD::FP16_TO_FP ? APFloat::IEEEhalf()
6285 : APFloat::BFloat(),
6286 (Val.getBitWidth() == 16) ? Val : Val.trunc(16));
6287
6288 // This can return overflow, underflow, or inexact; we don't care.
6289 // FIXME need to be more flexible about rounding mode.
6290 (void)FPV.convert(EVTToAPFloatSemantics(VT),
6292 return getConstantFP(FPV, DL, VT);
6293 }
6294 case ISD::STEP_VECTOR:
6295 if (SDValue V = FoldSTEP_VECTOR(DL, VT, N1, *this))
6296 return V;
6297 break;
6298 case ISD::BITCAST:
6299 if (VT == MVT::f16 && C->getValueType(0) == MVT::i16)
6300 return getConstantFP(APFloat(APFloat::IEEEhalf(), Val), DL, VT);
6301 if (VT == MVT::f32 && C->getValueType(0) == MVT::i32)
6302 return getConstantFP(APFloat(APFloat::IEEEsingle(), Val), DL, VT);
6303 if (VT == MVT::f64 && C->getValueType(0) == MVT::i64)
6304 return getConstantFP(APFloat(APFloat::IEEEdouble(), Val), DL, VT);
6305 if (VT == MVT::f128 && C->getValueType(0) == MVT::i128)
6306 return getConstantFP(APFloat(APFloat::IEEEquad(), Val), DL, VT);
6307 break;
6308 }
6309 }
6310
6311 // Constant fold unary operations with a floating point constant operand.
6312 if (auto *C = dyn_cast<ConstantFPSDNode>(N1)) {
6313 APFloat V = C->getValueAPF(); // make copy
6314 switch (Opcode) {
6315 case ISD::FNEG:
6316 V.changeSign();
6317 return getConstantFP(V, DL, VT);
6318 case ISD::FABS:
6319 V.clearSign();
6320 return getConstantFP(V, DL, VT);
6321 case ISD::FCEIL: {
6322 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardPositive);
6323 if (fs == APFloat::opOK || fs == APFloat::opInexact)
6324 return getConstantFP(V, DL, VT);
6325 return SDValue();
6326 }
6327 case ISD::FTRUNC: {
6328 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardZero);
6329 if (fs == APFloat::opOK || fs == APFloat::opInexact)
6330 return getConstantFP(V, DL, VT);
6331 return SDValue();
6332 }
6333 case ISD::FFLOOR: {
6334 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardNegative);
6335 if (fs == APFloat::opOK || fs == APFloat::opInexact)
6336 return getConstantFP(V, DL, VT);
6337 return SDValue();
6338 }
6339 case ISD::FP_EXTEND: {
6340 bool ignored;
6341 // This can return overflow, underflow, or inexact; we don't care.
6342 // FIXME need to be more flexible about rounding mode.
6344 &ignored);
6345 return getConstantFP(V, DL, VT);
6346 }
6347 case ISD::FP_TO_SINT:
6348 case ISD::FP_TO_UINT: {
6349 bool ignored;
6350 APSInt IntVal(VT.getSizeInBits(), Opcode == ISD::FP_TO_UINT);
6351 // FIXME need to be more flexible about rounding mode.
6353 V.convertToInteger(IntVal, APFloat::rmTowardZero, &ignored);
6354 if (s == APFloat::opInvalidOp) // inexact is OK, in fact usual
6355 break;
6356 return getConstant(IntVal, DL, VT);
6357 }
6358 case ISD::FP_TO_FP16:
6359 case ISD::FP_TO_BF16: {
6360 bool Ignored;
6361 // This can return overflow, underflow, or inexact; we don't care.
6362 // FIXME need to be more flexible about rounding mode.
6363 (void)V.convert(Opcode == ISD::FP_TO_FP16 ? APFloat::IEEEhalf()
6364 : APFloat::BFloat(),
6366 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
6367 }
6368 case ISD::BITCAST:
6369 if (VT == MVT::i16 && C->getValueType(0) == MVT::f16)
6370 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
6371 VT);
6372 if (VT == MVT::i16 && C->getValueType(0) == MVT::bf16)
6373 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
6374 VT);
6375 if (VT == MVT::i32 && C->getValueType(0) == MVT::f32)
6376 return getConstant((uint32_t)V.bitcastToAPInt().getZExtValue(), DL,
6377 VT);
6378 if (VT == MVT::i64 && C->getValueType(0) == MVT::f64)
6379 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
6380 break;
6381 }
6382 }
6383
6384 // Early-out if we failed to constant fold a bitcast.
6385 if (Opcode == ISD::BITCAST)
6386 return SDValue();
6387 }
6388
6389 // Handle binops special cases.
6390 if (NumOps == 2) {
6391 if (SDValue CFP = foldConstantFPMath(Opcode, DL, VT, Ops))
6392 return CFP;
6393
6394 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
6395 if (auto *C2 = dyn_cast<ConstantSDNode>(Ops[1])) {
6396 if (C1->isOpaque() || C2->isOpaque())
6397 return SDValue();
6398
6399 std::optional<APInt> FoldAttempt =
6400 FoldValue(Opcode, C1->getAPIntValue(), C2->getAPIntValue());
6401 if (!FoldAttempt)
6402 return SDValue();
6403
6404 SDValue Folded = getConstant(*FoldAttempt, DL, VT);
6405 assert((!Folded || !VT.isVector()) &&
6406 "Can't fold vectors ops with scalar operands");
6407 return Folded;
6408 }
6409 }
6410
6411 // fold (add Sym, c) -> Sym+c
6412 if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(Ops[0]))
6413 return FoldSymbolOffset(Opcode, VT, GA, Ops[1].getNode());
6414 if (TLI->isCommutativeBinOp(Opcode))
6415 if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(Ops[1]))
6416 return FoldSymbolOffset(Opcode, VT, GA, Ops[0].getNode());
6417 }
6418
6419 // This is for vector folding only from here on.
6420 if (!VT.isVector())
6421 return SDValue();
6422
6423 ElementCount NumElts = VT.getVectorElementCount();
6424
6425 // See if we can fold through bitcasted integer ops.
6426 if (NumOps == 2 && VT.isFixedLengthVector() && VT.isInteger() &&
6427 Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
6428 Ops[0].getOpcode() == ISD::BITCAST &&
6429 Ops[1].getOpcode() == ISD::BITCAST) {
6430 SDValue N1 = peekThroughBitcasts(Ops[0]);
6431 SDValue N2 = peekThroughBitcasts(Ops[1]);
6432 auto *BV1 = dyn_cast<BuildVectorSDNode>(N1);
6433 auto *BV2 = dyn_cast<BuildVectorSDNode>(N2);
6434 EVT BVVT = N1.getValueType();
6435 if (BV1 && BV2 && BVVT.isInteger() && BVVT == N2.getValueType()) {
6436 bool IsLE = getDataLayout().isLittleEndian();
6437 unsigned EltBits = VT.getScalarSizeInBits();
6438 SmallVector<APInt> RawBits1, RawBits2;
6439 BitVector UndefElts1, UndefElts2;
6440 if (BV1->getConstantRawBits(IsLE, EltBits, RawBits1, UndefElts1) &&
6441 BV2->getConstantRawBits(IsLE, EltBits, RawBits2, UndefElts2)) {
6442 SmallVector<APInt> RawBits;
6443 for (unsigned I = 0, E = NumElts.getFixedValue(); I != E; ++I) {
6444 std::optional<APInt> Fold = FoldValueWithUndef(
6445 Opcode, RawBits1[I], UndefElts1[I], RawBits2[I], UndefElts2[I]);
6446 if (!Fold)
6447 break;
6448 RawBits.push_back(*Fold);
6449 }
6450 if (RawBits.size() == NumElts.getFixedValue()) {
6451 // We have constant folded, but we need to cast this again back to
6452 // the original (possibly legalized) type.
6453 SmallVector<APInt> DstBits;
6454 BitVector DstUndefs;
6456 DstBits, RawBits, DstUndefs,
6457 BitVector(RawBits.size(), false));
6458 EVT BVEltVT = BV1->getOperand(0).getValueType();
6459 unsigned BVEltBits = BVEltVT.getSizeInBits();
6460 SmallVector<SDValue> Ops(DstBits.size(), getUNDEF(BVEltVT));
6461 for (unsigned I = 0, E = DstBits.size(); I != E; ++I) {
6462 if (DstUndefs[I])
6463 continue;
6464 Ops[I] = getConstant(DstBits[I].sext(BVEltBits), DL, BVEltVT);
6465 }
6466 return getBitcast(VT, getBuildVector(BVVT, DL, Ops));
6467 }
6468 }
6469 }
6470 }
6471
6472 // Fold (mul step_vector(C0), C1) to (step_vector(C0 * C1)).
6473 // (shl step_vector(C0), C1) -> (step_vector(C0 << C1))
6474 if ((Opcode == ISD::MUL || Opcode == ISD::SHL) &&
6475 Ops[0].getOpcode() == ISD::STEP_VECTOR) {
6476 APInt RHSVal;
6477 if (ISD::isConstantSplatVector(Ops[1].getNode(), RHSVal)) {
6478 APInt NewStep = Opcode == ISD::MUL
6479 ? Ops[0].getConstantOperandAPInt(0) * RHSVal
6480 : Ops[0].getConstantOperandAPInt(0) << RHSVal;
6481 return getStepVector(DL, VT, NewStep);
6482 }
6483 }
6484
6485 auto IsScalarOrSameVectorSize = [NumElts](const SDValue &Op) {
6486 return !Op.getValueType().isVector() ||
6487 Op.getValueType().getVectorElementCount() == NumElts;
6488 };
6489
6490 auto IsBuildVectorSplatVectorOrUndef = [](const SDValue &Op) {
6491 return Op.isUndef() || Op.getOpcode() == ISD::CONDCODE ||
6492 Op.getOpcode() == ISD::BUILD_VECTOR ||
6493 Op.getOpcode() == ISD::SPLAT_VECTOR;
6494 };
6495
6496 // All operands must be vector types with the same number of elements as
6497 // the result type and must be either UNDEF or a build/splat vector
6498 // or UNDEF scalars.
6499 if (!llvm::all_of(Ops, IsBuildVectorSplatVectorOrUndef) ||
6500 !llvm::all_of(Ops, IsScalarOrSameVectorSize))
6501 return SDValue();
6502
6503 // If we are comparing vectors, then the result needs to be a i1 boolean that
6504 // is then extended back to the legal result type depending on how booleans
6505 // are represented.
6506 EVT SVT = (Opcode == ISD::SETCC ? MVT::i1 : VT.getScalarType());
6507 ISD::NodeType ExtendCode =
6508 (Opcode == ISD::SETCC && SVT != VT.getScalarType())
6511
6512 // Find legal integer scalar type for constant promotion and
6513 // ensure that its scalar size is at least as large as source.
6514 EVT LegalSVT = VT.getScalarType();
6515 if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
6516 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
6517 if (LegalSVT.bitsLT(VT.getScalarType()))
6518 return SDValue();
6519 }
6520
6521 // For scalable vector types we know we're dealing with SPLAT_VECTORs. We
6522 // only have one operand to check. For fixed-length vector types we may have
6523 // a combination of BUILD_VECTOR and SPLAT_VECTOR.
6524 unsigned NumVectorElts = NumElts.isScalable() ? 1 : NumElts.getFixedValue();
6525
6526 // Constant fold each scalar lane separately.
6527 SmallVector<SDValue, 4> ScalarResults;
6528 for (unsigned I = 0; I != NumVectorElts; I++) {
6529 SmallVector<SDValue, 4> ScalarOps;
6530 for (SDValue Op : Ops) {
6531 EVT InSVT = Op.getValueType().getScalarType();
6532 if (Op.getOpcode() != ISD::BUILD_VECTOR &&
6533 Op.getOpcode() != ISD::SPLAT_VECTOR) {
6534 if (Op.isUndef())
6535 ScalarOps.push_back(getUNDEF(InSVT));
6536 else
6537 ScalarOps.push_back(Op);
6538 continue;
6539 }
6540
6541 SDValue ScalarOp =
6542 Op.getOperand(Op.getOpcode() == ISD::SPLAT_VECTOR ? 0 : I);
6543 EVT ScalarVT = ScalarOp.getValueType();
6544
6545 // Build vector (integer) scalar operands may need implicit
6546 // truncation - do this before constant folding.
6547 if (ScalarVT.isInteger() && ScalarVT.bitsGT(InSVT)) {
6548 // Don't create illegally-typed nodes unless they're constants or undef
6549 // - if we fail to constant fold we can't guarantee the (dead) nodes
6550 // we're creating will be cleaned up before being visited for
6551 // legalization.
6552 if (NewNodesMustHaveLegalTypes && !ScalarOp.isUndef() &&
6553 !isa<ConstantSDNode>(ScalarOp) &&
6554 TLI->getTypeAction(*getContext(), InSVT) !=
6556 return SDValue();
6557 ScalarOp = getNode(ISD::TRUNCATE, DL, InSVT, ScalarOp);
6558 }
6559
6560 ScalarOps.push_back(ScalarOp);
6561 }
6562
6563 // Constant fold the scalar operands.
6564 SDValue ScalarResult = getNode(Opcode, DL, SVT, ScalarOps);
6565
6566 // Legalize the (integer) scalar constant if necessary.
6567 if (LegalSVT != SVT)
6568 ScalarResult = getNode(ExtendCode, DL, LegalSVT, ScalarResult);
6569
6570 // Scalar folding only succeeded if the result is a constant or UNDEF.
6571 if (!ScalarResult.isUndef() && ScalarResult.getOpcode() != ISD::Constant &&
6572 ScalarResult.getOpcode() != ISD::ConstantFP)
6573 return SDValue();
6574 ScalarResults.push_back(ScalarResult);
6575 }
6576
6577 SDValue V = NumElts.isScalable() ? getSplatVector(VT, DL, ScalarResults[0])
6578 : getBuildVector(VT, DL, ScalarResults);
6579 NewSDValueDbgMsg(V, "New node fold constant vector: ", this);
6580 return V;
6581}
6582
6584 EVT VT, ArrayRef<SDValue> Ops) {
6585 // TODO: Add support for unary/ternary fp opcodes.
6586 if (Ops.size() != 2)
6587 return SDValue();
6588
6589 // TODO: We don't do any constant folding for strict FP opcodes here, but we
6590 // should. That will require dealing with a potentially non-default
6591 // rounding mode, checking the "opStatus" return value from the APFloat
6592 // math calculations, and possibly other variations.
6593 SDValue N1 = Ops[0];
6594 SDValue N2 = Ops[1];
6595 ConstantFPSDNode *N1CFP = isConstOrConstSplatFP(N1, /*AllowUndefs*/ false);
6596 ConstantFPSDNode *N2CFP = isConstOrConstSplatFP(N2, /*AllowUndefs*/ false);
6597 if (N1CFP && N2CFP) {
6598 APFloat C1 = N1CFP->getValueAPF(); // make copy
6599 const APFloat &C2 = N2CFP->getValueAPF();
6600 switch (Opcode) {
6601 case ISD::FADD:
6603 return getConstantFP(C1, DL, VT);
6604 case ISD::FSUB:
6606 return getConstantFP(C1, DL, VT);
6607 case ISD::FMUL:
6609 return getConstantFP(C1, DL, VT);
6610 case ISD::FDIV:
6612 return getConstantFP(C1, DL, VT);
6613 case ISD::FREM:
6614 C1.mod(C2);
6615 return getConstantFP(C1, DL, VT);
6616 case ISD::FCOPYSIGN:
6617 C1.copySign(C2);
6618 return getConstantFP(C1, DL, VT);
6619 case ISD::FMINNUM:
6620 return getConstantFP(minnum(C1, C2), DL, VT);
6621 case ISD::FMAXNUM:
6622 return getConstantFP(maxnum(C1, C2), DL, VT);
6623 case ISD::FMINIMUM:
6624 return getConstantFP(minimum(C1, C2), DL, VT);
6625 case ISD::FMAXIMUM:
6626 return getConstantFP(maximum(C1, C2), DL, VT);
6627 default: break;
6628 }
6629 }
6630 if (N1CFP && Opcode == ISD::FP_ROUND) {
6631 APFloat C1 = N1CFP->getValueAPF(); // make copy
6632 bool Unused;
6633 // This can return overflow, underflow, or inexact; we don't care.
6634 // FIXME need to be more flexible about rounding mode.
6636 &Unused);
6637 return getConstantFP(C1, DL, VT);
6638 }
6639
6640 switch (Opcode) {
6641 case ISD::FSUB:
6642 // -0.0 - undef --> undef (consistent with "fneg undef")
6643 if (ConstantFPSDNode *N1C = isConstOrConstSplatFP(N1, /*AllowUndefs*/ true))
6644 if (N1C && N1C->getValueAPF().isNegZero() && N2.isUndef())
6645 return getUNDEF(VT);
6646 [[fallthrough]];
6647
6648 case ISD::FADD:
6649 case ISD::FMUL:
6650 case ISD::FDIV:
6651 case ISD::FREM:
6652 // If both operands are undef, the result is undef. If 1 operand is undef,
6653 // the result is NaN. This should match the behavior of the IR optimizer.
6654 if (N1.isUndef() && N2.isUndef())
6655 return getUNDEF(VT);
6656 if (N1.isUndef() || N2.isUndef())
6658 }
6659 return SDValue();
6660}
6661
6663 assert(Val.getValueType().isInteger() && "Invalid AssertAlign!");
6664
6665 // There's no need to assert on a byte-aligned pointer. All pointers are at
6666 // least byte aligned.
6667 if (A == Align(1))
6668 return Val;
6669
6672 ID.AddInteger(A.value());
6673
6674 void *IP = nullptr;
6675 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
6676 return SDValue(E, 0);
6677
6678 auto *N = newSDNode<AssertAlignSDNode>(DL.getIROrder(), DL.getDebugLoc(),
6679 Val.getValueType(), A);
6680 createOperands(N, {Val});
6681
6682 CSEMap.InsertNode(N, IP);
6683 InsertNode(N);
6684
6685 SDValue V(N, 0);
6686 NewSDValueDbgMsg(V, "Creating new node: ", this);
6687 return V;
6688}
6689
6690SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
6691 SDValue N1, SDValue N2) {
6692 SDNodeFlags Flags;
6693 if (Inserter)
6694 Flags = Inserter->getFlags();
6695 return getNode(Opcode, DL, VT, N1, N2, Flags);
6696}
6697
6699 SDValue &N2) const {
6700 if (!TLI->isCommutativeBinOp(Opcode))
6701 return;
6702
6703 // Canonicalize:
6704 // binop(const, nonconst) -> binop(nonconst, const)
6709 if ((N1C && !N2C) || (N1CFP && !N2CFP))
6710 std::swap(N1, N2);
6711
6712 // Canonicalize:
6713 // binop(splat(x), step_vector) -> binop(step_vector, splat(x))
6714 else if (N1.getOpcode() == ISD::SPLAT_VECTOR &&
6716 std::swap(N1, N2);
6717}
6718
6719SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
6720 SDValue N1, SDValue N2, const SDNodeFlags Flags) {
6722 N2.getOpcode() != ISD::DELETED_NODE &&
6723 "Operand is DELETED_NODE!");
6724
6725 canonicalizeCommutativeBinop(Opcode, N1, N2);
6726
6727 auto *N1C = dyn_cast<ConstantSDNode>(N1);
6728 auto *N2C = dyn_cast<ConstantSDNode>(N2);
6729
6730 // Don't allow undefs in vector splats - we might be returning N2 when folding
6731 // to zero etc.
6732 ConstantSDNode *N2CV =
6733 isConstOrConstSplat(N2, /*AllowUndefs*/ false, /*AllowTruncation*/ true);
6734
6735 switch (Opcode) {
6736 default: break;
6737 case ISD::TokenFactor:
6738 assert(VT == MVT::Other && N1.getValueType() == MVT::Other &&
6739 N2.getValueType() == MVT::Other && "Invalid token factor!");
6740 // Fold trivial token factors.
6741 if (N1.getOpcode() == ISD::EntryToken) return N2;
6742 if (N2.getOpcode() == ISD::EntryToken) return N1;
6743 if (N1 == N2) return N1;
6744 break;
6745 case ISD::BUILD_VECTOR: {
6746 // Attempt to simplify BUILD_VECTOR.
6747 SDValue Ops[] = {N1, N2};
6748 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
6749 return V;
6750 break;
6751 }
6752 case ISD::CONCAT_VECTORS: {
6753 SDValue Ops[] = {N1, N2};
6754 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
6755 return V;
6756 break;
6757 }
6758 case ISD::AND:
6759 assert(VT.isInteger() && "This operator does not apply to FP types!");
6760 assert(N1.getValueType() == N2.getValueType() &&
6761 N1.getValueType() == VT && "Binary operator types must match!");
6762 // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's
6763 // worth handling here.
6764 if (N2CV && N2CV->isZero())
6765 return N2;
6766 if (N2CV && N2CV->isAllOnes()) // X & -1 -> X
6767 return N1;
6768 break;
6769 case ISD::OR:
6770 case ISD::XOR:
6771 case ISD::ADD:
6772 case ISD::SUB:
6773 assert(VT.isInteger() && "This operator does not apply to FP types!");
6774 assert(N1.getValueType() == N2.getValueType() &&
6775 N1.getValueType() == VT && "Binary operator types must match!");
6776 // (X ^|+- 0) -> X. This commonly occurs when legalizing i64 values, so
6777 // it's worth handling here.
6778 if (N2CV && N2CV->isZero())
6779 return N1;
6780 if ((Opcode == ISD::ADD || Opcode == ISD::SUB) && VT.isVector() &&
6781 VT.getVectorElementType() == MVT::i1)
6782 return getNode(ISD::XOR, DL, VT, N1, N2);
6783 break;
6784 case ISD::MUL:
6785 assert(VT.isInteger() && "This operator does not apply to FP types!");
6786 assert(N1.getValueType() == N2.getValueType() &&
6787 N1.getValueType() == VT && "Binary operator types must match!");
6788 if (VT.isVector() && VT.getVectorElementType() == MVT::i1)
6789 return getNode(ISD::AND, DL, VT, N1, N2);
6790 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
6791 const APInt &MulImm = N1->getConstantOperandAPInt(0);
6792 const APInt &N2CImm = N2C->getAPIntValue();
6793 return getVScale(DL, VT, MulImm * N2CImm);
6794 }
6795 break;
6796 case ISD::UDIV:
6797 case ISD::UREM:
6798 case ISD::MULHU:
6799 case ISD::MULHS:
6800 case ISD::SDIV:
6801 case ISD::SREM:
6802 case ISD::SADDSAT:
6803 case ISD::SSUBSAT:
6804 case ISD::UADDSAT:
6805 case ISD::USUBSAT:
6806 assert(VT.isInteger() && "This operator does not apply to FP types!");
6807 assert(N1.getValueType() == N2.getValueType() &&
6808 N1.getValueType() == VT && "Binary operator types must match!");
6809 if (VT.isVector() && VT.getVectorElementType() == MVT::i1) {
6810 // fold (add_sat x, y) -> (or x, y) for bool types.
6811 if (Opcode == ISD::SADDSAT || Opcode == ISD::UADDSAT)
6812 return getNode(ISD::OR, DL, VT, N1, N2);
6813 // fold (sub_sat x, y) -> (and x, ~y) for bool types.
6814 if (Opcode == ISD::SSUBSAT || Opcode == ISD::USUBSAT)
6815 return getNode(ISD::AND, DL, VT, N1, getNOT(DL, N2, VT));
6816 }
6817 break;
6818 case ISD::ABDS:
6819 case ISD::ABDU:
6820 assert(VT.isInteger() && "This operator does not apply to FP types!");
6821 assert(N1.getValueType() == N2.getValueType() &&
6822 N1.getValueType() == VT && "Binary operator types must match!");
6823 break;
6824 case ISD::SMIN:
6825 case ISD::UMAX:
6826 assert(VT.isInteger() && "This operator does not apply to FP types!");
6827 assert(N1.getValueType() == N2.getValueType() &&
6828 N1.getValueType() == VT && "Binary operator types must match!");
6829 if (VT.isVector() && VT.getVectorElementType() == MVT::i1)
6830 return getNode(ISD::OR, DL, VT, N1, N2);
6831 break;
6832 case ISD::SMAX:
6833 case ISD::UMIN:
6834 assert(VT.isInteger() && "This operator does not apply to FP types!");
6835 assert(N1.getValueType() == N2.getValueType() &&
6836 N1.getValueType() == VT && "Binary operator types must match!");
6837 if (VT.isVector() && VT.getVectorElementType() == MVT::i1)
6838 return getNode(ISD::AND, DL, VT, N1, N2);
6839 break;
6840 case ISD::FADD:
6841 case ISD::FSUB:
6842 case ISD::FMUL:
6843 case ISD::FDIV:
6844 case ISD::FREM:
6845 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
6846 assert(N1.getValueType() == N2.getValueType() &&
6847 N1.getValueType() == VT && "Binary operator types must match!");
6848 if (SDValue V = simplifyFPBinop(Opcode, N1, N2, Flags))
6849 return V;
6850 break;
6851 case ISD::FCOPYSIGN: // N1 and result must match. N1/N2 need not match.
6852 assert(N1.getValueType() == VT &&
6855 "Invalid FCOPYSIGN!");
6856 break;
6857 case ISD::SHL:
6858 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
6859 const APInt &MulImm = N1->getConstantOperandAPInt(0);
6860 const APInt &ShiftImm = N2C->getAPIntValue();
6861 return getVScale(DL, VT, MulImm << ShiftImm);
6862 }
6863 [[fallthrough]];
6864 case ISD::SRA:
6865 case ISD::SRL:
6866 if (SDValue V = simplifyShift(N1, N2))
6867 return V;
6868 [[fallthrough]];
6869 case ISD::ROTL:
6870 case ISD::ROTR:
6871 assert(VT == N1.getValueType() &&
6872 "Shift operators return type must be the same as their first arg");
6873 assert(VT.isInteger() && N2.getValueType().isInteger() &&
6874 "Shifts only work on integers");
6875 assert((!VT.isVector() || VT == N2.getValueType()) &&
6876 "Vector shift amounts must be in the same as their first arg");
6877 // Verify that the shift amount VT is big enough to hold valid shift
6878 // amounts. This catches things like trying to shift an i1024 value by an
6879 // i8, which is easy to fall into in generic code that uses
6880 // TLI.getShiftAmount().
6883 "Invalid use of small shift amount with oversized value!");
6884
6885 // Always fold shifts of i1 values so the code generator doesn't need to
6886 // handle them. Since we know the size of the shift has to be less than the
6887 // size of the value, the shift/rotate count is guaranteed to be zero.
6888 if (VT == MVT::i1)
6889 return N1;
6890 if (N2CV && N2CV->isZero())
6891 return N1;
6892 break;
6893 case ISD::FP_ROUND:
6894 assert(VT.isFloatingPoint() &&
6896 VT.bitsLE(N1.getValueType()) &&
6897 N2C && (N2C->getZExtValue() == 0 || N2C->getZExtValue() == 1) &&
6898 "Invalid FP_ROUND!");
6899 if (N1.getValueType() == VT) return N1; // noop conversion.
6900 break;
6901 case ISD::AssertSext:
6902 case ISD::AssertZext: {
6903 EVT EVT = cast<VTSDNode>(N2)->getVT();
6904 assert(VT == N1.getValueType() && "Not an inreg extend!");
6905 assert(VT.isInteger() && EVT.isInteger() &&
6906 "Cannot *_EXTEND_INREG FP types");
6907 assert(!EVT.isVector() &&
6908 "AssertSExt/AssertZExt type should be the vector element type "
6909 "rather than the vector type!");
6910 assert(EVT.bitsLE(VT.getScalarType()) && "Not extending!");
6911 if (VT.getScalarType() == EVT) return N1; // noop assertion.
6912 break;
6913 }
6915 EVT EVT = cast<VTSDNode>(N2)->getVT();
6916 assert(VT == N1.getValueType() && "Not an inreg extend!");
6917 assert(VT.isInteger() && EVT.isInteger() &&
6918 "Cannot *_EXTEND_INREG FP types");
6919 assert(EVT.isVector() == VT.isVector() &&
6920 "SIGN_EXTEND_INREG type should be vector iff the operand "
6921 "type is vector!");
6922 assert((!EVT.isVector() ||
6924 "Vector element counts must match in SIGN_EXTEND_INREG");
6925 assert(EVT.bitsLE(VT) && "Not extending!");
6926 if (EVT == VT) return N1; // Not actually extending
6927
6928 auto SignExtendInReg = [&](APInt Val, llvm::EVT ConstantVT) {
6929 unsigned FromBits = EVT.getScalarSizeInBits();
6930 Val <<= Val.getBitWidth() - FromBits;
6931 Val.ashrInPlace(Val.getBitWidth() - FromBits);
6932 return getConstant(Val, DL, ConstantVT);
6933 };
6934
6935 if (N1C) {
6936 const APInt &Val = N1C->getAPIntValue();
6937 return SignExtendInReg(Val, VT);
6938 }
6939
6942 llvm::EVT OpVT = N1.getOperand(0).getValueType();
6943 for (int i = 0, e = VT.getVectorNumElements(); i != e; ++i) {
6944 SDValue Op = N1.getOperand(i);
6945 if (Op.isUndef()) {
6946 Ops.push_back(getUNDEF(OpVT));
6947 continue;
6948 }
6949 ConstantSDNode *C = cast<ConstantSDNode>(Op);
6950 APInt Val = C->getAPIntValue();
6951 Ops.push_back(SignExtendInReg(Val, OpVT));
6952 }
6953 return getBuildVector(VT, DL, Ops);
6954 }
6955
6956 if (N1.getOpcode() == ISD::SPLAT_VECTOR &&
6957 isa<ConstantSDNode>(N1.getOperand(0)))
6958 return getNode(
6959 ISD::SPLAT_VECTOR, DL, VT,
6960 SignExtendInReg(N1.getConstantOperandAPInt(0),
6961 N1.getOperand(0).getValueType()));
6962 break;
6963 }
6965 case ISD::FP_TO_UINT_SAT: {
6966 assert(VT.isInteger() && cast<VTSDNode>(N2)->getVT().isInteger() &&
6967 N1.getValueType().isFloatingPoint() && "Invalid FP_TO_*INT_SAT");
6968 assert(N1.getValueType().isVector() == VT.isVector() &&
6969 "FP_TO_*INT_SAT type should be vector iff the operand type is "
6970 "vector!");
6971 assert((!VT.isVector() || VT.getVectorElementCount() ==
6973 "Vector element counts must match in FP_TO_*INT_SAT");
6974 assert(!cast<VTSDNode>(N2)->getVT().isVector() &&
6975 "Type to saturate to must be a scalar.");
6976 assert(cast<VTSDNode>(N2)->getVT().bitsLE(VT.getScalarType()) &&
6977 "Not extending!");
6978 break;
6979 }
6982 "The result of EXTRACT_VECTOR_ELT must be at least as wide as the \
6983 element type of the vector.");
6984
6985 // Extract from an undefined value or using an undefined index is undefined.
6986 if (N1.isUndef() || N2.isUndef())
6987 return getUNDEF(VT);
6988
6989 // EXTRACT_VECTOR_ELT of out-of-bounds element is an UNDEF for fixed length
6990 // vectors. For scalable vectors we will provide appropriate support for
6991 // dealing with arbitrary indices.
6992 if (N2C && N1.getValueType().isFixedLengthVector() &&
6993 N2C->getAPIntValue().uge(N1.getValueType().getVectorNumElements()))
6994 return getUNDEF(VT);
6995
6996 // EXTRACT_VECTOR_ELT of CONCAT_VECTORS is often formed while lowering is
6997 // expanding copies of large vectors from registers. This only works for
6998 // fixed length vectors, since we need to know the exact number of
6999 // elements.
7000 if (N2C && N1.getOpcode() == ISD::CONCAT_VECTORS &&
7002 unsigned Factor =
7005 N1.getOperand(N2C->getZExtValue() / Factor),
7006 getVectorIdxConstant(N2C->getZExtValue() % Factor, DL));
7007 }
7008
7009 // EXTRACT_VECTOR_ELT of BUILD_VECTOR or SPLAT_VECTOR is often formed while
7010 // lowering is expanding large vector constants.
7011 if (N2C && (N1.getOpcode() == ISD::BUILD_VECTOR ||
7012 N1.getOpcode() == ISD::SPLAT_VECTOR)) {
7015 "BUILD_VECTOR used for scalable vectors");
7016 unsigned Index =
7017 N1.getOpcode() == ISD::BUILD_VECTOR ? N2C->getZExtValue() : 0;
7018 SDValue Elt = N1.getOperand(Index);
7019
7020 if (VT != Elt.getValueType())
7021 // If the vector element type is not legal, the BUILD_VECTOR operands
7022 // are promoted and implicitly truncated, and the result implicitly
7023 // extended. Make that explicit here.
7024 Elt = getAnyExtOrTrunc(Elt, DL, VT);
7025
7026 return Elt;
7027 }
7028
7029 // EXTRACT_VECTOR_ELT of INSERT_VECTOR_ELT is often formed when vector
7030 // operations are lowered to scalars.
7031 if (N1.getOpcode() == ISD::INSERT_VECTOR_ELT) {
7032 // If the indices are the same, return the inserted element else
7033 // if the indices are known different, extract the element from
7034 // the original vector.
7035 SDValue N1Op2 = N1.getOperand(2);
7036 ConstantSDNode *N1Op2C = dyn_cast<ConstantSDNode>(N1Op2);
7037
7038 if (N1Op2C && N2C) {
7039 if (N1Op2C->getZExtValue() == N2C->getZExtValue()) {
7040 if (VT == N1.getOperand(1).getValueType())
7041 return N1.getOperand(1);
7042 if (VT.isFloatingPoint()) {
7044 return getFPExtendOrRound(N1.getOperand(1), DL, VT);
7045 }
7046 return getSExtOrTrunc(N1.getOperand(1), DL, VT);
7047 }
7048 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0), N2);
7049 }
7050 }
7051
7052 // EXTRACT_VECTOR_ELT of v1iX EXTRACT_SUBVECTOR could be formed
7053 // when vector types are scalarized and v1iX is legal.
7054 // vextract (v1iX extract_subvector(vNiX, Idx)) -> vextract(vNiX,Idx).
7055 // Here we are completely ignoring the extract element index (N2),
7056 // which is fine for fixed width vectors, since any index other than 0
7057 // is undefined anyway. However, this cannot be ignored for scalable
7058 // vectors - in theory we could support this, but we don't want to do this
7059 // without a profitability check.
7060 if (N1.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
7062 N1.getValueType().getVectorNumElements() == 1) {
7063 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0),
7064 N1.getOperand(1));
7065 }
7066 break;
7068 assert(N2C && (unsigned)N2C->getZExtValue() < 2 && "Bad EXTRACT_ELEMENT!");
7069 assert(!N1.getValueType().isVector() && !VT.isVector() &&
7070 (N1.getValueType().isInteger() == VT.isInteger()) &&
7071 N1.getValueType() != VT &&
7072 "Wrong types for EXTRACT_ELEMENT!");
7073
7074 // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding
7075 // 64-bit integers into 32-bit parts. Instead of building the extract of
7076 // the BUILD_PAIR, only to have legalize rip it apart, just do it now.
7077 if (N1.getOpcode() == ISD::BUILD_PAIR)
7078 return N1.getOperand(N2C->getZExtValue());
7079
7080 // EXTRACT_ELEMENT of a constant int is also very common.
7081 if (N1C) {
7082 unsigned ElementSize = VT.getSizeInBits();
7083 unsigned Shift = ElementSize * N2C->getZExtValue();
7084 const APInt &Val = N1C->getAPIntValue();
7085 return getConstant(Val.extractBits(ElementSize, Shift), DL, VT);
7086 }
7087 break;
7089 EVT N1VT = N1.getValueType();
7090 assert(VT.isVector() && N1VT.isVector() &&
7091 "Extract subvector VTs must be vectors!");
7093 "Extract subvector VTs must have the same element type!");
7094 assert((VT.isFixedLengthVector() || N1VT.isScalableVector()) &&
7095 "Cannot extract a scalable vector from a fixed length vector!");
7096 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
7098 "Extract subvector must be from larger vector to smaller vector!");
7099 assert(N2C && "Extract subvector index must be a constant");
7100 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
7101 (VT.getVectorMinNumElements() + N2C->getZExtValue()) <=
7102 N1VT.getVectorMinNumElements()) &&
7103 "Extract subvector overflow!");
7104 assert(N2C->getAPIntValue().getBitWidth() ==
7105 TLI->getVectorIdxTy(getDataLayout()).getFixedSizeInBits() &&
7106 "Constant index for EXTRACT_SUBVECTOR has an invalid size");
7107
7108 // Trivial extraction.
7109 if (VT == N1VT)
7110 return N1;
7111
7112 // EXTRACT_SUBVECTOR of an UNDEF is an UNDEF.
7113 if (N1.isUndef())
7114 return getUNDEF(VT);
7115
7116 // EXTRACT_SUBVECTOR of CONCAT_VECTOR can be simplified if the pieces of
7117 // the concat have the same type as the extract.
7118 if (N1.getOpcode() == ISD::CONCAT_VECTORS &&
7119 VT == N1.getOperand(0).getValueType()) {
7120 unsigned Factor = VT.getVectorMinNumElements();
7121 return N1.getOperand(N2C->getZExtValue() / Factor);
7122 }
7123
7124 // EXTRACT_SUBVECTOR of INSERT_SUBVECTOR is often created
7125 // during shuffle legalization.
7126 if (N1.getOpcode() == ISD::INSERT_SUBVECTOR && N2 == N1.getOperand(2) &&
7127 VT == N1.getOperand(1).getValueType())
7128 return N1.getOperand(1);
7129 break;
7130 }
7131 }
7132
7133 // Perform trivial constant folding.
7134 if (SDValue SV = FoldConstantArithmetic(Opcode, DL, VT, {N1, N2}))
7135 return SV;
7136
7137 // Canonicalize an UNDEF to the RHS, even over a constant.
7138 if (N1.isUndef()) {
7139 if (TLI->isCommutativeBinOp(Opcode)) {
7140 std::swap(N1, N2);
7141 } else {
7142 switch (Opcode) {
7143 case ISD::SUB:
7144 return getUNDEF(VT); // fold op(undef, arg2) -> undef
7146 case ISD::UDIV:
7147 case ISD::SDIV:
7148 case ISD::UREM:
7149 case ISD::SREM:
7150 case ISD::SSUBSAT:
7151 case ISD::USUBSAT:
7152 return getConstant(0, DL, VT); // fold op(undef, arg2) -> 0
7153 }
7154 }
7155 }
7156
7157 // Fold a bunch of operators when the RHS is undef.
7158 if (N2.isUndef()) {
7159 switch (Opcode) {
7160 case ISD::XOR:
7161 if (N1.isUndef())
7162 // Handle undef ^ undef -> 0 special case. This is a common
7163 // idiom (misuse).
7164 return getConstant(0, DL, VT);
7165 [[fallthrough]];
7166 case ISD::ADD:
7167 case ISD::SUB:
7168 case ISD::UDIV:
7169 case ISD::SDIV:
7170 case ISD::UREM:
7171 case ISD::SREM:
7172 return getUNDEF(VT); // fold op(arg1, undef) -> undef
7173 case ISD::MUL:
7174 case ISD::AND:
7175 case ISD::SSUBSAT:
7176 case ISD::USUBSAT:
7177 return getConstant(0, DL, VT); // fold op(arg1, undef) -> 0
7178 case ISD::OR:
7179 case ISD::SADDSAT:
7180 case ISD::UADDSAT:
7181 return getAllOnesConstant(DL, VT);
7182 }
7183 }
7184
7185 // Memoize this node if possible.
7186 SDNode *N;
7187 SDVTList VTs = getVTList(VT);
7188 SDValue Ops[] = {N1, N2};
7189 if (VT != MVT::Glue) {
7191 AddNodeIDNode(ID, Opcode, VTs, Ops);
7192 void *IP = nullptr;
7193 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
7194 E->intersectFlagsWith(Flags);
7195 return SDValue(E, 0);
7196 }
7197
7198 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7199 N->setFlags(Flags);
7200 createOperands(N, Ops);
7201 CSEMap.InsertNode(N, IP);
7202 } else {
7203 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7204 createOperands(N, Ops);
7205 }
7206
7207 InsertNode(N);
7208 SDValue V = SDValue(N, 0);
7209 NewSDValueDbgMsg(V, "Creating new node: ", this);
7210 return V;
7211}
7212
7213SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7214 SDValue N1, SDValue N2, SDValue N3) {
7215 SDNodeFlags Flags;
7216 if (Inserter)
7217 Flags = Inserter->getFlags();
7218 return getNode(Opcode, DL, VT, N1, N2, N3, Flags);
7219}
7220
7221SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7222 SDValue N1, SDValue N2, SDValue N3,
7223 const SDNodeFlags Flags) {
7225 N2.getOpcode() != ISD::DELETED_NODE &&
7226 N3.getOpcode() != ISD::DELETED_NODE &&
7227 "Operand is DELETED_NODE!");
7228 // Perform various simplifications.
7229 switch (Opcode) {
7230 case ISD::FMA:
7231 case ISD::FMAD: {
7232 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
7233 assert(N1.getValueType() == VT && N2.getValueType() == VT &&
7234 N3.getValueType() == VT && "FMA types must match!");
7235 ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1);
7236 ConstantFPSDNode *N2CFP = dyn_cast<ConstantFPSDNode>(N2);
7237 ConstantFPSDNode *N3CFP = dyn_cast<ConstantFPSDNode>(N3);
7238 if (N1CFP && N2CFP && N3CFP) {
7239 APFloat V1 = N1CFP->getValueAPF();
7240 const APFloat &V2 = N2CFP->getValueAPF();
7241 const APFloat &V3 = N3CFP->getValueAPF();
7242 if (Opcode == ISD::FMAD) {
7245 } else
7247 return getConstantFP(V1, DL, VT);
7248 }
7249 break;
7250 }
7251 case ISD::BUILD_VECTOR: {
7252 // Attempt to simplify BUILD_VECTOR.
7253 SDValue Ops[] = {N1, N2, N3};
7254 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
7255 return V;
7256 break;
7257 }
7258 case ISD::CONCAT_VECTORS: {
7259 SDValue Ops[] = {N1, N2, N3};
7260 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
7261 return V;
7262 break;
7263 }
7264 case ISD::SETCC: {
7265 assert(VT.isInteger() && "SETCC result type must be an integer!");
7266 assert(N1.getValueType() == N2.getValueType() &&
7267 "SETCC operands must have the same type!");
7268 assert(VT.isVector() == N1.getValueType().isVector() &&
7269 "SETCC type should be vector iff the operand type is vector!");
7270 assert((!VT.isVector() || VT.getVectorElementCount() ==
7272 "SETCC vector element counts must match!");
7273 // Use FoldSetCC to simplify SETCC's.
7274 if (SDValue V = FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get(), DL))
7275 return V;
7276 // Vector constant folding.
7277 SDValue Ops[] = {N1, N2, N3};
7278 if (SDValue V = FoldConstantArithmetic(Opcode, DL, VT, Ops)) {
7279 NewSDValueDbgMsg(V, "New node vector constant folding: ", this);
7280 return V;
7281 }
7282 break;
7283 }
7284 case ISD::SELECT:
7285 case ISD::VSELECT:
7286 if (SDValue V = simplifySelect(N1, N2, N3))
7287 return V;
7288 break;
7290 llvm_unreachable("should use getVectorShuffle constructor!");
7291 case ISD::VECTOR_SPLICE: {
7292 if (cast<ConstantSDNode>(N3)->isZero())
7293 return N1;
7294 break;
7295 }
7297 ConstantSDNode *N3C = dyn_cast<ConstantSDNode>(N3);
7298 // INSERT_VECTOR_ELT into out-of-bounds element is an UNDEF, except
7299 // for scalable vectors where we will generate appropriate code to
7300 // deal with out-of-bounds cases correctly.
7301 if (N3C && N1.getValueType().isFixedLengthVector() &&
7303 return getUNDEF(VT);
7304
7305 // Undefined index can be assumed out-of-bounds, so that's UNDEF too.
7306 if (N3.isUndef())
7307 return getUNDEF(VT);
7308
7309 // If the inserted element is an UNDEF, just use the input vector.
7310 if (N2.isUndef())
7311 return N1;
7312
7313 break;
7314 }
7315 case ISD::INSERT_SUBVECTOR: {
7316 // Inserting undef into undef is still undef.
7317 if (N1.isUndef() && N2.isUndef())
7318 return getUNDEF(VT);
7319
7320 EVT N2VT = N2.getValueType();
7321 assert(VT == N1.getValueType() &&
7322 "Dest and insert subvector source types must match!");
7323 assert(VT.isVector() && N2VT.isVector() &&
7324 "Insert subvector VTs must be vectors!");
7326 "Insert subvector VTs must have the same element type!");
7327 assert((VT.isScalableVector() || N2VT.isFixedLengthVector()) &&
7328 "Cannot insert a scalable vector into a fixed length vector!");
7329 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
7331 "Insert subvector must be from smaller vector to larger vector!");
7332 assert(isa<ConstantSDNode>(N3) &&
7333 "Insert subvector index must be constant");
7334 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
7335 (N2VT.getVectorMinNumElements() + N3->getAsZExtVal()) <=
7337 "Insert subvector overflow!");
7339 TLI->getVectorIdxTy(getDataLayout()).getFixedSizeInBits() &&
7340 "Constant index for INSERT_SUBVECTOR has an invalid size");
7341
7342 // Trivial insertion.
7343 if (VT == N2VT)
7344 return N2;
7345
7346 // If this is an insert of an extracted vector into an undef vector, we
7347 // can just use the input to the extract.
7348 if (N1.isUndef() && N2.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
7349 N2.getOperand(1) == N3 && N2.getOperand(0).getValueType() == VT)
7350 return N2.getOperand(0);
7351 break;
7352 }
7353 case ISD::BITCAST:
7354 // Fold bit_convert nodes from a type to themselves.
7355 if (N1.getValueType() == VT)
7356 return N1;
7357 break;
7358 case ISD::VP_TRUNCATE:
7359 case ISD::VP_SIGN_EXTEND:
7360 case ISD::VP_ZERO_EXTEND:
7361 // Don't create noop casts.
7362 if (N1.getValueType() == VT)
7363 return N1;
7364 break;
7365 }
7366
7367 // Memoize node if it doesn't produce a glue result.
7368 SDNode *N;
7369 SDVTList VTs = getVTList(VT);
7370 SDValue Ops[] = {N1, N2, N3};
7371 if (VT != MVT::Glue) {
7373 AddNodeIDNode(ID, Opcode, VTs, Ops);
7374 void *IP = nullptr;
7375 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
7376 E->intersectFlagsWith(Flags);
7377 return SDValue(E, 0);
7378 }
7379
7380 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7381 N->setFlags(Flags);
7382 createOperands(N, Ops);
7383 CSEMap.InsertNode(N, IP);
7384 } else {
7385 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7386 createOperands(N, Ops);
7387 }
7388
7389 InsertNode(N);
7390 SDValue V = SDValue(N, 0);
7391 NewSDValueDbgMsg(V, "Creating new node: ", this);
7392 return V;
7393}
7394
7395SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7396 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
7397 SDValue Ops[] = { N1, N2, N3, N4 };
7398 return getNode(Opcode, DL, VT, Ops);
7399}
7400
7401SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7402 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
7403 SDValue N5) {
7404 SDValue Ops[] = { N1, N2, N3, N4, N5 };
7405 return getNode(Opcode, DL, VT, Ops);
7406}
7407
7408/// getStackArgumentTokenFactor - Compute a TokenFactor to force all
7409/// the incoming stack arguments to be loaded from the stack.
7411 SmallVector<SDValue, 8> ArgChains;
7412
7413 // Include the original chain at the beginning of the list. When this is
7414 // used by target LowerCall hooks, this helps legalize find the
7415 // CALLSEQ_BEGIN node.
7416 ArgChains.push_back(Chain);
7417
7418 // Add a chain value for each stack argument.
7419 for (SDNode *U : getEntryNode().getNode()->uses())
7420 if (LoadSDNode *L = dyn_cast<LoadSDNode>(U))
7421 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(L->getBasePtr()))
7422 if (FI->getIndex() < 0)
7423 ArgChains.push_back(SDValue(L, 1));
7424
7425 // Build a tokenfactor for all the chains.
7426 return getNode(ISD::TokenFactor, SDLoc(Chain), MVT::Other, ArgChains);
7427}
7428
7429/// getMemsetValue - Vectorized representation of the memset value
7430/// operand.
7432 const SDLoc &dl) {
7433 assert(!Value.isUndef());
7434
7435 unsigned NumBits = VT.getScalarSizeInBits();
7436 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Value)) {
7437 assert(C->getAPIntValue().getBitWidth() == 8);
7438 APInt Val = APInt::getSplat(NumBits, C->getAPIntValue());
7439 if (VT.isInteger()) {
7440 bool IsOpaque = VT.getSizeInBits() > 64 ||
7441 !DAG.getTargetLoweringInfo().isLegalStoreImmediate(C->getSExtValue());
7442 return DAG.getConstant(Val, dl, VT, false, IsOpaque);
7443 }
7444 return DAG.getConstantFP(APFloat(DAG.EVTToAPFloatSemantics(VT), Val), dl,
7445 VT);
7446 }
7447
7448 assert(Value.getValueType() == MVT::i8 && "memset with non-byte fill value?");
7449 EVT IntVT = VT.getScalarType();
7450 if (!IntVT.isInteger())
7451 IntVT = EVT::getIntegerVT(*DAG.getContext(), IntVT.getSizeInBits());
7452
7453 Value = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, Value);
7454 if (NumBits > 8) {
7455 // Use a multiplication with 0x010101... to extend the input to the
7456 // required length.
7457 APInt Magic = APInt::getSplat(NumBits, APInt(8, 0x01));
7458 Value = DAG.getNode(ISD::MUL, dl, IntVT, Value,
7459 DAG.getConstant(Magic, dl, IntVT));
7460 }
7461
7462 if (VT != Value.getValueType() && !VT.isInteger())
7463 Value = DAG.getBitcast(VT.getScalarType(), Value);
7464 if (VT != Value.getValueType())
7465 Value = DAG.getSplatBuildVector(VT, dl, Value);
7466
7467 return Value;
7468}
7469
7470/// getMemsetStringVal - Similar to getMemsetValue. Except this is only
7471/// used when a memcpy is turned into a memset when the source is a constant
7472/// string ptr.
7474 const TargetLowering &TLI,
7475 const ConstantDataArraySlice &Slice) {
7476 // Handle vector with all elements zero.
7477 if (Slice.Array == nullptr) {
7478 if (VT.isInteger())
7479 return DAG.getConstant(0, dl, VT);
7480 if (VT == MVT::f32 || VT == MVT::f64 || VT == MVT::f128)
7481 return DAG.getConstantFP(0.0, dl, VT);
7482 if (VT.isVector()) {
7483 unsigned NumElts = VT.getVectorNumElements();
7484 MVT EltVT = (VT.getVectorElementType() == MVT::f32) ? MVT::i32 : MVT::i64;
7485 return DAG.getNode(ISD::BITCAST, dl, VT,
7486 DAG.getConstant(0, dl,
7488 EltVT, NumElts)));
7489 }
7490 llvm_unreachable("Expected type!");
7491 }
7492
7493 assert(!VT.isVector() && "Can't handle vector type here!");
7494 unsigned NumVTBits = VT.getSizeInBits();
7495 unsigned NumVTBytes = NumVTBits / 8;
7496 unsigned NumBytes = std::min(NumVTBytes, unsigned(Slice.Length));
7497
7498 APInt Val(NumVTBits, 0);
7499 if (DAG.getDataLayout().isLittleEndian()) {
7500 for (unsigned i = 0; i != NumBytes; ++i)
7501 Val |= (uint64_t)(unsigned char)Slice[i] << i*8;
7502 } else {
7503 for (unsigned i = 0; i != NumBytes; ++i)
7504 Val |= (uint64_t)(unsigned char)Slice[i] << (NumVTBytes-i-1)*8;
7505 }
7506
7507 // If the "cost" of materializing the integer immediate is less than the cost
7508 // of a load, then it is cost effective to turn the load into the immediate.
7509 Type *Ty = VT.getTypeForEVT(*DAG.getContext());
7510 if (TLI.shouldConvertConstantLoadToIntImm(Val, Ty))
7511 return DAG.getConstant(Val, dl, VT);
7512 return SDValue();
7513}
7514
7516 const SDLoc &DL,
7517 const SDNodeFlags Flags) {
7518 EVT VT = Base.getValueType();
7519 SDValue Index;
7520
7521 if (Offset.isScalable())
7522 Index = getVScale(DL, Base.getValueType(),
7523 APInt(Base.getValueSizeInBits().getFixedValue(),
7524 Offset.getKnownMinValue()));
7525 else
7526 Index = getConstant(Offset.getFixedValue(), DL, VT);
7527
7528 return getMemBasePlusOffset(Base, Index, DL, Flags);
7529}
7530
7532 const SDLoc &DL,
7533 const SDNodeFlags Flags) {
7534 assert(Offset.getValueType().isInteger());
7535 EVT BasePtrVT = Ptr.getValueType();
7536 return getNode(ISD::ADD, DL, BasePtrVT, Ptr, Offset, Flags);
7537}
7538
7539/// Returns true if memcpy source is constant data.
7541 uint64_t SrcDelta = 0;
7542 GlobalAddressSDNode *G = nullptr;
7543 if (Src.getOpcode() == ISD::GlobalAddress)
7544 G = cast<GlobalAddressSDNode>(Src);
7545 else if (Src.getOpcode() == ISD::ADD &&
7546 Src.getOperand(0).getOpcode() == ISD::GlobalAddress &&
7547 Src.getOperand(1).getOpcode() == ISD::Constant) {
7548 G = cast<GlobalAddressSDNode>(Src.getOperand(0));
7549 SrcDelta = Src.getConstantOperandVal(1);
7550 }
7551 if (!G)
7552 return false;
7553
7554 return getConstantDataArrayInfo(G->getGlobal(), Slice, 8,
7555 SrcDelta + G->getOffset());
7556}
7557
7559 SelectionDAG &DAG) {
7560 // On Darwin, -Os means optimize for size without hurting performance, so
7561 // only really optimize for size when -Oz (MinSize) is used.
7563 return MF.getFunction().hasMinSize();
7564 return DAG.shouldOptForSize();
7565}
7566
7568 SmallVector<SDValue, 32> &OutChains, unsigned From,
7569 unsigned To, SmallVector<SDValue, 16> &OutLoadChains,
7570 SmallVector<SDValue, 16> &OutStoreChains) {
7571 assert(OutLoadChains.size() && "Missing loads in memcpy inlining");
7572 assert(OutStoreChains.size() && "Missing stores in memcpy inlining");
7573 SmallVector<SDValue, 16> GluedLoadChains;
7574 for (unsigned i = From; i < To; ++i) {
7575 OutChains.push_back(OutLoadChains[i]);
7576 GluedLoadChains.push_back(OutLoadChains[i]);
7577 }
7578
7579 // Chain for all loads.
7580 SDValue LoadToken = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
7581 GluedLoadChains);
7582
7583 for (unsigned i = From; i < To; ++i) {
7584 StoreSDNode *ST = dyn_cast<StoreSDNode>(OutStoreChains[i]);
7585 SDValue NewStore = DAG.getTruncStore(LoadToken, dl, ST->getValue(),
7586 ST->getBasePtr(), ST->getMemoryVT(),
7587 ST->getMemOperand());
7588 OutChains.push_back(NewStore);
7589 }
7590}
7591
7593 SDValue Chain, SDValue Dst, SDValue Src,
7594 uint64_t Size, Align Alignment,
7595 bool isVol, bool AlwaysInline,
7596 MachinePointerInfo DstPtrInfo,
7597 MachinePointerInfo SrcPtrInfo,
7598 const AAMDNodes &AAInfo, AAResults *AA) {
7599 // Turn a memcpy of undef to nop.
7600 // FIXME: We need to honor volatile even is Src is undef.
7601 if (Src.isUndef())
7602 return Chain;
7603
7604 // Expand memcpy to a series of load and store ops if the size operand falls
7605 // below a certain threshold.
7606 // TODO: In the AlwaysInline case, if the size is big then generate a loop
7607 // rather than maybe a humongous number of loads and stores.
7608 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
7609 const DataLayout &DL = DAG.getDataLayout();
7610 LLVMContext &C = *DAG.getContext();
7611 std::vector<EVT> MemOps;
7612 bool DstAlignCanChange = false;
7614 MachineFrameInfo &MFI = MF.getFrameInfo();
7615 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
7616 FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Dst);
7617 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
7618 DstAlignCanChange = true;
7619 MaybeAlign SrcAlign = DAG.InferPtrAlign(Src);
7620 if (!SrcAlign || Alignment > *SrcAlign)
7621 SrcAlign = Alignment;
7622 assert(SrcAlign && "SrcAlign must be set");
7624 // If marked as volatile, perform a copy even when marked as constant.
7625 bool CopyFromConstant = !isVol && isMemSrcFromConstant(Src, Slice);
7626 bool isZeroConstant = CopyFromConstant && Slice.Array == nullptr;
7627 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemcpy(OptSize);
7628 const MemOp Op = isZeroConstant
7629 ? MemOp::Set(Size, DstAlignCanChange, Alignment,
7630 /*IsZeroMemset*/ true, isVol)
7631 : MemOp::Copy(Size, DstAlignCanChange, Alignment,
7632 *SrcAlign, isVol, CopyFromConstant);
7633 if (!TLI.findOptimalMemOpLowering(
7634 MemOps, Limit, Op, DstPtrInfo.getAddrSpace(),
7635 SrcPtrInfo.getAddrSpace(), MF.getFunction().getAttributes()))
7636 return SDValue();
7637
7638 if (DstAlignCanChange) {
7639 Type *Ty = MemOps[0].getTypeForEVT(C);
7640 Align NewAlign = DL.getABITypeAlign(Ty);
7641
7642 // Don't promote to an alignment that would require dynamic stack
7643 // realignment which may conflict with optimizations such as tail call
7644 // optimization.
7646 if (!TRI->hasStackRealignment(MF))
7647 while (NewAlign > Alignment && DL.exceedsNaturalStackAlignment(NewAlign))
7648 NewAlign = NewAlign.previous();
7649
7650 if (NewAlign > Alignment) {
7651 // Give the stack frame object a larger alignment if needed.
7652 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
7653 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
7654 Alignment = NewAlign;
7655 }
7656 }
7657
7658 // Prepare AAInfo for loads/stores after lowering this memcpy.
7659 AAMDNodes NewAAInfo = AAInfo;
7660 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
7661
7662 const Value *SrcVal = dyn_cast_if_present<const Value *>(SrcPtrInfo.V);
7663 bool isConstant =
7664 AA && SrcVal &&
7665 AA->pointsToConstantMemory(MemoryLocation(SrcVal, Size, AAInfo));
7666
7667 MachineMemOperand::Flags MMOFlags =
7669 SmallVector<SDValue, 16> OutLoadChains;
7670 SmallVector<SDValue, 16> OutStoreChains;
7671 SmallVector<SDValue, 32> OutChains;
7672 unsigned NumMemOps = MemOps.size();
7673 uint64_t SrcOff = 0, DstOff = 0;
7674 for (unsigned i = 0; i != NumMemOps; ++i) {
7675 EVT VT = MemOps[i];
7676 unsigned VTSize = VT.getSizeInBits() / 8;
7677 SDValue Value, Store;
7678
7679 if (VTSize > Size) {
7680 // Issuing an unaligned load / store pair that overlaps with the previous
7681 // pair. Adjust the offset accordingly.
7682 assert(i == NumMemOps-1 && i != 0);
7683 SrcOff -= VTSize - Size;
7684 DstOff -= VTSize - Size;
7685 }
7686
7687 if (CopyFromConstant &&
7688 (isZeroConstant || (VT.isInteger() && !VT.isVector()))) {
7689 // It's unlikely a store of a vector immediate can be done in a single
7690 // instruction. It would require a load from a constantpool first.
7691 // We only handle zero vectors here.
7692 // FIXME: Handle other cases where store of vector immediate is done in
7693 // a single instruction.
7694 ConstantDataArraySlice SubSlice;
7695 if (SrcOff < Slice.Length) {
7696 SubSlice = Slice;
7697 SubSlice.move(SrcOff);
7698 } else {
7699 // This is an out-of-bounds access and hence UB. Pretend we read zero.
7700 SubSlice.Array = nullptr;
7701 SubSlice.Offset = 0;
7702 SubSlice.Length = VTSize;
7703 }
7704 Value = getMemsetStringVal(VT, dl, DAG, TLI, SubSlice);
7705 if (Value.getNode()) {
7706 Store = DAG.getStore(
7707 Chain, dl, Value,
7708 DAG.getMemBasePlusOffset(Dst, TypeSize::getFixed(DstOff), dl),
7709 DstPtrInfo.getWithOffset(DstOff), Alignment, MMOFlags, NewAAInfo);
7710 OutChains.push_back(Store);
7711 }
7712 }
7713
7714 if (!Store.getNode()) {
7715 // The type might not be legal for the target. This should only happen
7716 // if the type is smaller than a legal type, as on PPC, so the right
7717 // thing to do is generate a LoadExt/StoreTrunc pair. These simplify
7718 // to Load/Store if NVT==VT.
7719 // FIXME does the case above also need this?
7720 EVT NVT = TLI.getTypeToTransformTo(C, VT);
7721 assert(NVT.bitsGE(VT));
7722
7723 bool isDereferenceable =
7724 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
7725 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
7726 if (isDereferenceable)
7728 if (isConstant)
7729 SrcMMOFlags |= MachineMemOperand::MOInvariant;
7730
7731 Value = DAG.getExtLoad(
7732 ISD::EXTLOAD, dl, NVT, Chain,
7733 DAG.getMemBasePlusOffset(Src, TypeSize::getFixed(SrcOff), dl),
7734 SrcPtrInfo.getWithOffset(SrcOff), VT,
7735 commonAlignment(*SrcAlign, SrcOff), SrcMMOFlags, NewAAInfo);
7736 OutLoadChains.push_back(Value.getValue(1));
7737
7738 Store = DAG.getTruncStore(
7739 Chain, dl, Value,
7740 DAG.getMemBasePlusOffset(Dst, TypeSize::getFixed(DstOff), dl),
7741 DstPtrInfo.getWithOffset(DstOff), VT, Alignment, MMOFlags, NewAAInfo);
7742 OutStoreChains.push_back(Store);
7743 }
7744 SrcOff += VTSize;
7745 DstOff += VTSize;
7746 Size -= VTSize;
7747 }
7748
7749 unsigned GluedLdStLimit = MaxLdStGlue == 0 ?
7751 unsigned NumLdStInMemcpy = OutStoreChains.size();
7752
7753 if (NumLdStInMemcpy) {
7754 // It may be that memcpy might be converted to memset if it's memcpy
7755 // of constants. In such a case, we won't have loads and stores, but
7756 // just stores. In the absence of loads, there is nothing to gang up.
7757 if ((GluedLdStLimit <= 1) || !EnableMemCpyDAGOpt) {
7758 // If target does not care, just leave as it.
7759 for (unsigned i = 0; i < NumLdStInMemcpy; ++i) {
7760 OutChains.push_back(OutLoadChains[i]);
7761 OutChains.push_back(OutStoreChains[i]);
7762 }
7763 } else {
7764 // Ld/St less than/equal limit set by target.
7765 if (NumLdStInMemcpy <= GluedLdStLimit) {
7766 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, 0,
7767 NumLdStInMemcpy, OutLoadChains,
7768 OutStoreChains);
7769 } else {
7770 unsigned NumberLdChain = NumLdStInMemcpy / GluedLdStLimit;
7771 unsigned RemainingLdStInMemcpy = NumLdStInMemcpy % GluedLdStLimit;
7772 unsigned GlueIter = 0;
7773
7774 for (unsigned cnt = 0; cnt < NumberLdChain; ++cnt) {
7775 unsigned IndexFrom = NumLdStInMemcpy - GlueIter - GluedLdStLimit;
7776 unsigned IndexTo = NumLdStInMemcpy - GlueIter;
7777
7778 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, IndexFrom, IndexTo,
7779 OutLoadChains, OutStoreChains);
7780 GlueIter += GluedLdStLimit;
7781 }
7782
7783 // Residual ld/st.
7784 if (RemainingLdStInMemcpy) {
7785 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, 0,
7786 RemainingLdStInMemcpy, OutLoadChains,
7787 OutStoreChains);
7788 }
7789 }
7790 }
7791 }
7792 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
7793}
7794
7796 SDValue Chain, SDValue Dst, SDValue Src,
7797 uint64_t Size, Align Alignment,
7798 bool isVol, bool AlwaysInline,
7799 MachinePointerInfo DstPtrInfo,
7800 MachinePointerInfo SrcPtrInfo,
7801 const AAMDNodes &AAInfo) {
7802 // Turn a memmove of undef to nop.
7803 // FIXME: We need to honor volatile even is Src is undef.
7804 if (Src.isUndef())
7805 return Chain;
7806
7807 // Expand memmove to a series of load and store ops if the size operand falls
7808 // below a certain threshold.
7809 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
7810 const DataLayout &DL = DAG.getDataLayout();
7811 LLVMContext &C = *DAG.getContext();
7812 std::vector<EVT> MemOps;
7813 bool DstAlignCanChange = false;
7815 MachineFrameInfo &MFI = MF.getFrameInfo();
7816 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
7817 FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Dst);
7818 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
7819 DstAlignCanChange = true;
7820 MaybeAlign SrcAlign = DAG.InferPtrAlign(Src);
7821 if (!SrcAlign || Alignment > *SrcAlign)
7822 SrcAlign = Alignment;
7823 assert(SrcAlign && "SrcAlign must be set");
7824 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemmove(OptSize);
7825 if (!TLI.findOptimalMemOpLowering(
7826 MemOps, Limit,
7827 MemOp::Copy(Size, DstAlignCanChange, Alignment, *SrcAlign,
7828 /*IsVolatile*/ true),
7829 DstPtrInfo.getAddrSpace(), SrcPtrInfo.getAddrSpace(),
7830 MF.getFunction().getAttributes()))
7831 return SDValue();
7832
7833 if (DstAlignCanChange) {
7834 Type *Ty = MemOps[0].getTypeForEVT(C);
7835 Align NewAlign = DL.getABITypeAlign(Ty);
7836
7837 // Don't promote to an alignment that would require dynamic stack
7838 // realignment which may conflict with optimizations such as tail call
7839 // optimization.
7841 if (!TRI->hasStackRealignment(MF))
7842 while (NewAlign > Alignment && DL.exceedsNaturalStackAlignment(NewAlign))
7843 NewAlign = NewAlign.previous();
7844
7845 if (NewAlign > Alignment) {
7846 // Give the stack frame object a larger alignment if needed.
7847 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
7848 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
7849 Alignment = NewAlign;
7850 }
7851 }
7852
7853 // Prepare AAInfo for loads/stores after lowering this memmove.
7854 AAMDNodes NewAAInfo = AAInfo;
7855 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
7856
7857 MachineMemOperand::Flags MMOFlags =
7859 uint64_t SrcOff = 0, DstOff = 0;
7860 SmallVector<SDValue, 8> LoadValues;
7861 SmallVector<SDValue, 8> LoadChains;
7862 SmallVector<SDValue, 8> OutChains;
7863 unsigned NumMemOps = MemOps.size();
7864 for (unsigned i = 0; i < NumMemOps; i++) {
7865 EVT VT = MemOps[i];
7866 unsigned VTSize = VT.getSizeInBits() / 8;
7867 SDValue Value;
7868
7869 bool isDereferenceable =
7870 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
7871 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
7872 if (isDereferenceable)
7874
7875 Value = DAG.getLoad(
7876 VT, dl, Chain,
7877 DAG.getMemBasePlusOffset(Src, TypeSize::getFixed(SrcOff), dl),
7878 SrcPtrInfo.getWithOffset(SrcOff), *SrcAlign, SrcMMOFlags, NewAAInfo);
7879 LoadValues.push_back(Value);
7880 LoadChains.push_back(Value.getValue(1));
7881 SrcOff += VTSize;
7882 }
7883 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, LoadChains);
7884 OutChains.clear();
7885 for (unsigned i = 0; i < NumMemOps; i++) {
7886 EVT VT = MemOps[i];
7887 unsigned VTSize = VT.getSizeInBits() / 8;
7888 SDValue Store;
7889
7890 Store = DAG.getStore(
7891 Chain, dl, LoadValues[i],
7892 DAG.getMemBasePlusOffset(Dst, TypeSize::getFixed(DstOff), dl),
7893 DstPtrInfo.getWithOffset(DstOff), Alignment, MMOFlags, NewAAInfo);
7894 OutChains.push_back(Store);
7895 DstOff += VTSize;
7896 }
7897
7898 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
7899}
7900
7901/// Lower the call to 'memset' intrinsic function into a series of store
7902/// operations.
7903///
7904/// \param DAG Selection DAG where lowered code is placed.
7905/// \param dl Link to corresponding IR location.
7906/// \param Chain Control flow dependency.
7907/// \param Dst Pointer to destination memory location.
7908/// \param Src Value of byte to write into the memory.
7909/// \param Size Number of bytes to write.
7910/// \param Alignment Alignment of the destination in bytes.
7911/// \param isVol True if destination is volatile.
7912/// \param AlwaysInline Makes sure no function call is generated.
7913/// \param DstPtrInfo IR information on the memory pointer.
7914/// \returns New head in the control flow, if lowering was successful, empty
7915/// SDValue otherwise.
7916///
7917/// The function tries to replace 'llvm.memset' intrinsic with several store
7918/// operations and value calculation code. This is usually profitable for small
7919/// memory size or when the semantic requires inlining.
7921 SDValue Chain, SDValue Dst, SDValue Src,
7922 uint64_t Size, Align Alignment, bool isVol,
7923 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
7924 const AAMDNodes &AAInfo) {
7925 // Turn a memset of undef to nop.
7926 // FIXME: We need to honor volatile even is Src is undef.
7927 if (Src.isUndef())
7928 return Chain;
7929
7930 // Expand memset to a series of load/store ops if the size operand
7931 // falls below a certain threshold.
7932 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
7933 std::vector<EVT> MemOps;
7934 bool DstAlignCanChange = false;
7936 MachineFrameInfo &MFI = MF.getFrameInfo();
7937 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
7938 FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Dst);
7939 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
7940 DstAlignCanChange = true;
7941 bool IsZeroVal = isNullConstant(Src);
7942 unsigned Limit = AlwaysInline ? ~0 : TLI.getMaxStoresPerMemset(OptSize);
7943
7944 if (!TLI.findOptimalMemOpLowering(
7945 MemOps, Limit,
7946 MemOp::Set(Size, DstAlignCanChange, Alignment, IsZeroVal, isVol),
7947 DstPtrInfo.getAddrSpace(), ~0u, MF.getFunction().getAttributes()))
7948 return SDValue();
7949
7950 if (DstAlignCanChange) {
7951 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext());
7952 const DataLayout &DL = DAG.getDataLayout();
7953 Align NewAlign = DL.getABITypeAlign(Ty);
7954
7955 // Don't promote to an alignment that would require dynamic stack
7956 // realignment which may conflict with optimizations such as tail call
7957 // optimization.
7959 if (!TRI->hasStackRealignment(MF))
7960 while (NewAlign > Alignment && DL.exceedsNaturalStackAlignment(NewAlign))
7961 NewAlign = NewAlign.previous();
7962
7963 if (NewAlign > Alignment) {
7964 // Give the stack frame object a larger alignment if needed.
7965 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
7966 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
7967 Alignment = NewAlign;
7968 }
7969 }
7970
7971 SmallVector<SDValue, 8> OutChains;
7972 uint64_t DstOff = 0;
7973 unsigned NumMemOps = MemOps.size();
7974
7975 // Find the largest store and generate the bit pattern for it.
7976 EVT LargestVT = MemOps[0];
7977 for (unsigned i = 1; i < NumMemOps; i++)
7978 if (MemOps[i].bitsGT(LargestVT))
7979 LargestVT = MemOps[i];
7980 SDValue MemSetValue = getMemsetValue(Src, LargestVT, DAG, dl);
7981
7982 // Prepare AAInfo for loads/stores after lowering this memset.
7983 AAMDNodes NewAAInfo = AAInfo;
7984 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
7985
7986 for (unsigned i = 0; i < NumMemOps; i++) {
7987 EVT VT = MemOps[i];
7988 unsigned VTSize = VT.getSizeInBits() / 8;
7989 if (VTSize > Size) {
7990 // Issuing an unaligned load / store pair that overlaps with the previous
7991 // pair. Adjust the offset accordingly.
7992 assert(i == NumMemOps-1 && i != 0);
7993 DstOff -= VTSize - Size;
7994 }
7995
7996 // If this store is smaller than the largest store see whether we can get
7997 // the smaller value for free with a truncate or extract vector element and
7998 // then store.
7999 SDValue Value = MemSetValue;
8000 if (VT.bitsLT(LargestVT)) {
8001 unsigned Index;
8002 unsigned NElts = LargestVT.getSizeInBits() / VT.getSizeInBits();
8003 EVT SVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(), NElts);
8004 if (!LargestVT.isVector() && !VT.isVector() &&
8005 TLI.isTruncateFree(LargestVT, VT))
8006 Value = DAG.getNode(ISD::TRUNCATE, dl, VT, MemSetValue);
8007 else if (LargestVT.isVector() && !VT.isVector() &&
8009 LargestVT.getTypeForEVT(*DAG.getContext()),
8010 VT.getSizeInBits(), Index) &&
8011 TLI.isTypeLegal(SVT) &&
8012 LargestVT.getSizeInBits() == SVT.getSizeInBits()) {
8013 // Target which can combine store(extractelement VectorTy, Idx) can get
8014 // the smaller value for free.
8015 SDValue TailValue = DAG.getNode(ISD::BITCAST, dl, SVT, MemSetValue);
8016 Value = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, VT, TailValue,
8017 DAG.getVectorIdxConstant(Index, dl));
8018 } else
8019 Value = getMemsetValue(Src, VT, DAG, dl);
8020 }
8021 assert(Value.getValueType() == VT && "Value with wrong type.");
8022 SDValue Store = DAG.getStore(
8023 Chain, dl, Value,
8024 DAG.getMemBasePlusOffset(Dst, TypeSize::getFixed(DstOff), dl),
8025 DstPtrInfo.getWithOffset(DstOff), Alignment,
8027 NewAAInfo);
8028 OutChains.push_back(Store);
8029 DstOff += VT.getSizeInBits() / 8;
8030 Size -= VTSize;
8031 }
8032
8033 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
8034}
8035
8037 unsigned AS) {
8038 // Lowering memcpy / memset / memmove intrinsics to calls is only valid if all
8039 // pointer operands can be losslessly bitcasted to pointers of address space 0
8040 if (AS != 0 && !TLI->getTargetMachine().isNoopAddrSpaceCast(AS, 0)) {
8041 report_fatal_error("cannot lower memory intrinsic in address space " +
8042 Twine(AS));
8043 }
8044}
8045
8047 SDValue Src, SDValue Size, Align Alignment,
8048 bool isVol, bool AlwaysInline, bool isTailCall,
8049 MachinePointerInfo DstPtrInfo,
8050 MachinePointerInfo SrcPtrInfo,
8051 const AAMDNodes &AAInfo, AAResults *AA) {
8052 // Check to see if we should lower the memcpy to loads and stores first.
8053 // For cases within the target-specified limits, this is the best choice.
8054 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
8055 if (ConstantSize) {
8056 // Memcpy with size zero? Just return the original chain.
8057 if (ConstantSize->isZero())
8058 return Chain;
8059
8061 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
8062 isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo, AA);
8063 if (Result.getNode())
8064 return Result;
8065 }
8066
8067 // Then check to see if we should lower the memcpy with target-specific
8068 // code. If the target chooses to do this, this is the next best.
8069 if (TSI) {
8070 SDValue Result = TSI->EmitTargetCodeForMemcpy(
8071 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline,
8072 DstPtrInfo, SrcPtrInfo);
8073 if (Result.getNode())
8074 return Result;
8075 }
8076
8077 // If we really need inline code and the target declined to provide it,
8078 // use a (potentially long) sequence of loads and stores.
8079 if (AlwaysInline) {
8080 assert(ConstantSize && "AlwaysInline requires a constant size!");
8082 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
8083 isVol, true, DstPtrInfo, SrcPtrInfo, AAInfo, AA);
8084 }
8085
8088
8089 // FIXME: If the memcpy is volatile (isVol), lowering it to a plain libc
8090 // memcpy is not guaranteed to be safe. libc memcpys aren't required to
8091 // respect volatile, so they may do things like read or write memory
8092 // beyond the given memory regions. But fixing this isn't easy, and most
8093 // people don't care.
8094
8095 // Emit a library call.
8098 Entry.Ty = PointerType::getUnqual(*getContext());
8099 Entry.Node = Dst; Args.push_back(Entry);
8100 Entry.Node = Src; Args.push_back(Entry);
8101
8102 Entry.Ty = getDataLayout().getIntPtrType(*getContext());
8103 Entry.Node = Size; Args.push_back(Entry);
8104 // FIXME: pass in SDLoc
8106 CLI.setDebugLoc(dl)
8107 .setChain(Chain)
8108 .setLibCallee(TLI->getLibcallCallingConv(RTLIB::MEMCPY),
8109 Dst.getValueType().getTypeForEVT(*getContext()),
8110 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMCPY),
8111 TLI->getPointerTy(getDataLayout())),
8112 std::move(Args))
8114 .setTailCall(isTailCall);
8115
8116 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
8117 return CallResult.second;
8118}
8119
8121 SDValue Dst, SDValue Src, SDValue Size,
8122 Type *SizeTy, unsigned ElemSz,
8123 bool isTailCall,
8124 MachinePointerInfo DstPtrInfo,
8125 MachinePointerInfo SrcPtrInfo) {
8126 // Emit a library call.
8129 Entry.Ty = getDataLayout().getIntPtrType(*getContext());
8130 Entry.Node = Dst;
8131 Args.push_back(Entry);
8132
8133 Entry.Node = Src;
8134 Args.push_back(Entry);
8135
8136 Entry.Ty = SizeTy;
8137 Entry.Node = Size;
8138 Args.push_back(Entry);
8139
8140 RTLIB::Libcall LibraryCall =
8142 if (LibraryCall == RTLIB::UNKNOWN_LIBCALL)
8143 report_fatal_error("Unsupported element size");
8144
8146 CLI.setDebugLoc(dl)
8147 .setChain(Chain)
8148 .setLibCallee(TLI->getLibcallCallingConv(LibraryCall),
8150 getExternalSymbol(TLI->getLibcallName(LibraryCall),
8151 TLI->getPointerTy(getDataLayout())),
8152 std::move(Args))
8154 .setTailCall(isTailCall);
8155
8156 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
8157 return CallResult.second;
8158}
8159
8161 SDValue Src, SDValue Size, Align Alignment,
8162 bool isVol, bool isTailCall,
8163 MachinePointerInfo DstPtrInfo,
8164 MachinePointerInfo SrcPtrInfo,
8165 const AAMDNodes &AAInfo, AAResults *AA) {
8166 // Check to see if we should lower the memmove to loads and stores first.
8167 // For cases within the target-specified limits, this is the best choice.
8168 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
8169 if (ConstantSize) {
8170 // Memmove with size zero? Just return the original chain.
8171 if (ConstantSize->isZero())
8172 return Chain;
8173
8175 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
8176 isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo);
8177 if (Result.getNode())
8178 return Result;
8179 }
8180
8181 // Then check to see if we should lower the memmove with target-specific
8182 // code. If the target chooses to do this, this is the next best.
8183 if (TSI) {
8184 SDValue Result =
8185 TSI->EmitTargetCodeForMemmove(*this, dl, Chain, Dst, Src, Size,
8186 Alignment, isVol, DstPtrInfo, SrcPtrInfo);
8187 if (Result.getNode())
8188 return Result;
8189 }
8190
8193
8194 // FIXME: If the memmove is volatile, lowering it to plain libc memmove may
8195 // not be safe. See memcpy above for more details.
8196
8197 // Emit a library call.
8200 Entry.Ty = PointerType::getUnqual(*getContext());
8201 Entry.Node = Dst; Args.push_back(Entry);
8202 Entry.Node = Src; Args.push_back(Entry);
8203
8204 Entry.Ty = getDataLayout().getIntPtrType(*getContext());
8205 Entry.Node = Size; Args.push_back(Entry);
8206 // FIXME: pass in SDLoc
8208 CLI.setDebugLoc(dl)
8209 .setChain(Chain)
8210 .setLibCallee(TLI->getLibcallCallingConv(RTLIB::MEMMOVE),
8211 Dst.getValueType().getTypeForEVT(*getContext()),
8212 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMMOVE),
8213 TLI->getPointerTy(getDataLayout())),
8214 std::move(Args))
8216 .setTailCall(isTailCall);
8217
8218 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
8219 return CallResult.second;
8220}
8221
8223 SDValue Dst, SDValue Src, SDValue Size,
8224 Type *SizeTy, unsigned ElemSz,
8225 bool isTailCall,
8226 MachinePointerInfo DstPtrInfo,
8227 MachinePointerInfo SrcPtrInfo) {
8228 // Emit a library call.
8231 Entry.Ty = getDataLayout().getIntPtrType(*getContext());
8232 Entry.Node = Dst;
8233 Args.push_back(Entry);
8234
8235 Entry.Node = Src;
8236 Args.push_back(Entry);
8237
8238 Entry.Ty = SizeTy;
8239 Entry.Node = Size;
8240 Args.push_back(Entry);
8241
8242 RTLIB::Libcall LibraryCall =
8244 if (LibraryCall == RTLIB::UNKNOWN_LIBCALL)
8245 report_fatal_error("Unsupported element size");
8246
8248 CLI.setDebugLoc(dl)
8249 .setChain(Chain)
8250 .setLibCallee(TLI->getLibcallCallingConv(LibraryCall),
8252 getExternalSymbol(TLI->getLibcallName(LibraryCall),
8253 TLI->getPointerTy(getDataLayout())),
8254 std::move(Args))
8256 .setTailCall(isTailCall);
8257
8258 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
8259 return CallResult.second;
8260}
8261
8263 SDValue Src, SDValue Size, Align Alignment,
8264 bool isVol, bool AlwaysInline, bool isTailCall,
8265 MachinePointerInfo DstPtrInfo,
8266 const AAMDNodes &AAInfo) {
8267 // Check to see if we should lower the memset to stores first.
8268 // For cases within the target-specified limits, this is the best choice.
8269 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
8270 if (ConstantSize) {
8271 // Memset with size zero? Just return the original chain.
8272 if (ConstantSize->isZero())
8273 return Chain;
8274
8275 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
8276 ConstantSize->getZExtValue(), Alignment,
8277 isVol, false, DstPtrInfo, AAInfo);
8278
8279 if (Result.getNode())
8280 return Result;
8281 }
8282
8283 // Then check to see if we should lower the memset with target-specific
8284 // code. If the target chooses to do this, this is the next best.
8285 if (TSI) {
8286 SDValue Result = TSI->EmitTargetCodeForMemset(
8287 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline, DstPtrInfo);
8288 if (Result.getNode())
8289 return Result;
8290 }
8291
8292 // If we really need inline code and the target declined to provide it,
8293 // use a (potentially long) sequence of loads and stores.
8294 if (AlwaysInline) {
8295 assert(ConstantSize && "AlwaysInline requires a constant size!");
8296 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
8297 ConstantSize->getZExtValue(), Alignment,
8298 isVol, true, DstPtrInfo, AAInfo);
8299 assert(Result &&
8300 "getMemsetStores must return a valid sequence when AlwaysInline");
8301 return Result;
8302 }
8303
8305
8306 // Emit a library call.
8307 auto &Ctx = *getContext();
8308 const auto& DL = getDataLayout();
8309
8311 // FIXME: pass in SDLoc
8312 CLI.setDebugLoc(dl).setChain(Chain);
8313
8314 const char *BzeroName = getTargetLoweringInfo().getLibcallName(RTLIB::BZERO);
8315
8316 // Helper function to create an Entry from Node and Type.
8317 const auto CreateEntry = [](SDValue Node, Type *Ty) {
8319 Entry.Node = Node;
8320 Entry.Ty = Ty;
8321 return Entry;
8322 };
8323
8324 // If zeroing out and bzero is present, use it.
8325 if (isNullConstant(Src) && BzeroName) {
8327 Args.push_back(CreateEntry(Dst, PointerType::getUnqual(Ctx)));
8328 Args.push_back(CreateEntry(Size, DL.getIntPtrType(Ctx)));
8329 CLI.setLibCallee(
8330 TLI->getLibcallCallingConv(RTLIB::BZERO), Type::getVoidTy(Ctx),
8331 getExternalSymbol(BzeroName, TLI->getPointerTy(DL)), std::move(Args));
8332 } else {
8334 Args.push_back(CreateEntry(Dst, PointerType::getUnqual(Ctx)));
8335 Args.push_back(CreateEntry(Src, Src.getValueType().getTypeForEVT(Ctx)));
8336 Args.push_back(CreateEntry(Size, DL.getIntPtrType(Ctx)));
8337 CLI.setLibCallee(TLI->getLibcallCallingConv(RTLIB::MEMSET),
8338 Dst.getValueType().getTypeForEVT(Ctx),
8339 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMSET),
8340 TLI->getPointerTy(DL)),
8341 std::move(Args));
8342 }
8343
8344 CLI.setDiscardResult().setTailCall(isTailCall);
8345
8346 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
8347 return CallResult.second;
8348}
8349
8352 Type *SizeTy, unsigned ElemSz,
8353 bool isTailCall,
8354 MachinePointerInfo DstPtrInfo) {
8355 // Emit a library call.
8358 Entry.Ty = getDataLayout().getIntPtrType(*getContext());
8359 Entry.Node = Dst;
8360 Args.push_back(Entry);
8361
8362 Entry.Ty = Type::getInt8Ty(*getContext());
8363 Entry.Node = Value;
8364 Args.push_back(Entry);
8365
8366 Entry.Ty = SizeTy;
8367 Entry.Node = Size;
8368 Args.push_back(Entry);
8369
8370 RTLIB::Libcall LibraryCall =
8372 if (LibraryCall == RTLIB::UNKNOWN_LIBCALL)
8373 report_fatal_error("Unsupported element size");
8374
8376 CLI.setDebugLoc(dl)
8377 .setChain(Chain)
8378 .setLibCallee(TLI->getLibcallCallingConv(LibraryCall),
8380 getExternalSymbol(TLI->getLibcallName(LibraryCall),
8381 TLI->getPointerTy(getDataLayout())),
8382 std::move(Args))
8384 .setTailCall(isTailCall);
8385
8386 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
8387 return CallResult.second;
8388}
8389
8390SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
8391 SDVTList VTList, ArrayRef<SDValue> Ops,
8392 MachineMemOperand *MMO) {
8394 ID.AddInteger(MemVT.getRawBits());
8395 AddNodeIDNode(ID, Opcode, VTList, Ops);
8396 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
8397 ID.AddInteger(MMO->getFlags());
8398 void* IP = nullptr;
8399 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
8400 cast<AtomicSDNode>(E)->refineAlignment(MMO);
8401 return SDValue(E, 0);
8402 }
8403
8404 auto *N = newSDNode<AtomicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
8405 VTList, MemVT, MMO);
8406 createOperands(N, Ops);
8407
8408 CSEMap.InsertNode(N, IP);
8409 InsertNode(N);
8410 return SDValue(N, 0);
8411}
8412
8414 EVT MemVT, SDVTList VTs, SDValue Chain,
8415 SDValue Ptr, SDValue Cmp, SDValue Swp,
8416 MachineMemOperand *MMO) {
8417 assert(Opcode == ISD::ATOMIC_CMP_SWAP ||
8419 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types");
8420
8421 SDValue Ops[] = {Chain, Ptr, Cmp, Swp};
8422 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
8423}
8424
8425SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
8426 SDValue Chain, SDValue Ptr, SDValue Val,
8427 MachineMemOperand *MMO) {
8428 assert((Opcode == ISD::ATOMIC_LOAD_ADD ||
8429 Opcode == ISD::ATOMIC_LOAD_SUB ||
8430 Opcode == ISD::ATOMIC_LOAD_AND ||
8431 Opcode == ISD::ATOMIC_LOAD_CLR ||
8432 Opcode == ISD::ATOMIC_LOAD_OR ||
8433 Opcode == ISD::ATOMIC_LOAD_XOR ||
8434 Opcode == ISD::ATOMIC_LOAD_NAND ||
8435 Opcode == ISD::ATOMIC_LOAD_MIN ||
8436 Opcode == ISD::ATOMIC_LOAD_MAX ||
8437 Opcode == ISD::ATOMIC_LOAD_UMIN ||
8438 Opcode == ISD::ATOMIC_LOAD_UMAX ||
8439 Opcode == ISD::ATOMIC_LOAD_FADD ||
8440 Opcode == ISD::ATOMIC_LOAD_FSUB ||
8441 Opcode == ISD::ATOMIC_LOAD_FMAX ||
8442 Opcode == ISD::ATOMIC_LOAD_FMIN ||
8443 Opcode == ISD::ATOMIC_LOAD_UINC_WRAP ||
8444 Opcode == ISD::ATOMIC_LOAD_UDEC_WRAP ||
8445 Opcode == ISD::ATOMIC_SWAP ||
8446 Opcode == ISD::ATOMIC_STORE) &&
8447 "Invalid Atomic Op");
8448
8449 EVT VT = Val.getValueType();
8450
8451 SDVTList VTs = Opcode == ISD::ATOMIC_STORE ? getVTList(MVT::Other) :
8452 getVTList(VT, MVT::Other);
8453 SDValue Ops[] = {Chain, Ptr, Val};
8454 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
8455}
8456
8457SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
8458 EVT VT, SDValue Chain, SDValue Ptr,
8459 MachineMemOperand *MMO) {
8460 assert(Opcode == ISD::ATOMIC_LOAD && "Invalid Atomic Op");
8461
8462 SDVTList VTs = getVTList(VT, MVT::Other);
8463 SDValue Ops[] = {Chain, Ptr};
8464 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
8465}
8466
8467/// getMergeValues - Create a MERGE_VALUES node from the given operands.
8469 if (Ops.size() == 1)
8470 return Ops[0];
8471
8473 VTs.reserve(Ops.size());
8474 for (const SDValue &Op : Ops)
8475 VTs.push_back(Op.getValueType());
8476 return getNode(ISD::MERGE_VALUES, dl, getVTList(VTs), Ops);
8477}
8478
8480 unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef<SDValue> Ops,
8481 EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment,
8483 const AAMDNodes &AAInfo) {
8484 if (Size.hasValue() && !Size.getValue())
8486
8488 MachineMemOperand *MMO =
8489 MF.getMachineMemOperand(PtrInfo, Flags, Size, Alignment, AAInfo);
8490
8491 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, MMO);
8492}
8493
8495 SDVTList VTList,
8496 ArrayRef<SDValue> Ops, EVT MemVT,
8497 MachineMemOperand *MMO) {
8498 assert((Opcode == ISD::INTRINSIC_VOID ||
8499 Opcode == ISD::INTRINSIC_W_CHAIN ||
8500 Opcode == ISD::PREFETCH ||
8501 (Opcode <= (unsigned)std::numeric_limits<int>::max() &&
8502 (int)Opcode >= ISD::FIRST_TARGET_MEMORY_OPCODE)) &&
8503 "Opcode is not a memory-accessing opcode!");
8504
8505 // Memoize the node unless it returns a glue result.
8507 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
8509 AddNodeIDNode(ID, Opcode, VTList, Ops);
8510 ID.AddInteger(getSyntheticNodeSubclassData<MemIntrinsicSDNode>(
8511 Opcode, dl.getIROrder(), VTList, MemVT, MMO));
8512 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
8513 ID.AddInteger(MMO->getFlags());
8514 ID.AddInteger(MemVT.getRawBits());
8515 void *IP = nullptr;
8516 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
8517 cast<MemIntrinsicSDNode>(E)->refineAlignment(MMO);
8518 return SDValue(E, 0);
8519 }
8520
8521 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
8522 VTList, MemVT, MMO);
8523 createOperands(N, Ops);
8524
8525 CSEMap.InsertNode(N, IP);
8526 } else {
8527 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
8528 VTList, MemVT, MMO);
8529 createOperands(N, Ops);
8530 }
8531 InsertNode(N);
8532 SDValue V(N, 0);
8533 NewSDValueDbgMsg(V, "Creating new node: ", this);
8534 return V;
8535}
8536
8538 SDValue Chain, int FrameIndex,
8539 int64_t Size, int64_t Offset) {
8540 const unsigned Opcode = IsStart ? ISD::LIFETIME_START : ISD::LIFETIME_END;
8541 const auto VTs = getVTList(MVT::Other);
8542 SDValue Ops[2] = {
8543 Chain,
8544 getFrameIndex(FrameIndex,
8545 getTargetLoweringInfo().getFrameIndexTy(getDataLayout()),
8546 true)};
8547
8549 AddNodeIDNode(ID, Opcode, VTs, Ops);
8550 ID.AddInteger(FrameIndex);
8551 ID.AddInteger(Size);
8552 ID.AddInteger(Offset);
8553 void *IP = nullptr;
8554 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
8555 return SDValue(E, 0);
8556
8557 LifetimeSDNode *N = newSDNode<LifetimeSDNode>(
8558 Opcode, dl.getIROrder(), dl.getDebugLoc(), VTs, Size, Offset);
8559 createOperands(N, Ops);
8560 CSEMap.InsertNode(N, IP);
8561 InsertNode(N);
8562 SDValue V(N, 0);
8563 NewSDValueDbgMsg(V, "Creating new node: ", this);
8564 return V;
8565}
8566
8568 uint64_t Guid, uint64_t Index,
8569 uint32_t Attr) {
8570 const unsigned Opcode = ISD::PSEUDO_PROBE;
8571 const auto VTs = getVTList(MVT::Other);
8572 SDValue Ops[] = {Chain};
8574 AddNodeIDNode(ID, Opcode, VTs, Ops);
8575 ID.AddInteger(Guid);
8576 ID.AddInteger(Index);
8577 void *IP = nullptr;
8578 if (SDNode *E = FindNodeOrInsertPos(ID, Dl, IP))
8579 return SDValue(E, 0);
8580
8581 auto *N = newSDNode<PseudoProbeSDNode>(
8582 Opcode, Dl.getIROrder(), Dl.getDebugLoc(), VTs, Guid, Index, Attr);
8583 createOperands(N, Ops);
8584 CSEMap.InsertNode(N, IP);
8585 InsertNode(N);
8586 SDValue V(N, 0);
8587 NewSDValueDbgMsg(V, "Creating new node: ", this);
8588 return V;
8589}
8590
8591/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
8592/// MachinePointerInfo record from it. This is particularly useful because the
8593/// code generator has many cases where it doesn't bother passing in a
8594/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
8596 SelectionDAG &DAG, SDValue Ptr,
8597 int64_t Offset = 0) {
8598 // If this is FI+Offset, we can model it.
8599 if (const FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr))
8601 FI->getIndex(), Offset);
8602
8603 // If this is (FI+Offset1)+Offset2, we can model it.
8604 if (Ptr.getOpcode() != ISD::ADD ||
8605 !isa<ConstantSDNode>(Ptr.getOperand(1)) ||
8606 !isa<FrameIndexSDNode>(Ptr.getOperand(0)))
8607 return Info;
8608
8609 int FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
8611 DAG.getMachineFunction(), FI,
8612 Offset + cast<ConstantSDNode>(Ptr.getOperand(1))->getSExtValue());
8613}
8614
8615/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
8616/// MachinePointerInfo record from it. This is particularly useful because the
8617/// code generator has many cases where it doesn't bother passing in a
8618/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
8620 SelectionDAG &DAG, SDValue Ptr,
8621 SDValue OffsetOp) {
8622 // If the 'Offset' value isn't a constant, we can't handle this.
8623 if (ConstantSDNode *OffsetNode = dyn_cast<ConstantSDNode>(OffsetOp))
8624 return InferPointerInfo(Info, DAG, Ptr, OffsetNode->getSExtValue());
8625 if (OffsetOp.isUndef())
8626 return InferPointerInfo(Info, DAG, Ptr);
8627 return Info;
8628}
8629
8631 EVT VT, const SDLoc &dl, SDValue Chain,
8633 MachinePointerInfo PtrInfo, EVT MemVT,
8634 Align Alignment,
8635 MachineMemOperand::Flags MMOFlags,
8636 const AAMDNodes &AAInfo, const MDNode *Ranges) {
8637 assert(Chain.getValueType() == MVT::Other &&
8638 "Invalid chain type");
8639
8640 MMOFlags |= MachineMemOperand::MOLoad;
8641 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
8642 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
8643 // clients.
8644 if (PtrInfo.V.isNull())
8645 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
8646
8649 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
8650 Alignment, AAInfo, Ranges);
8651 return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO);
8652}
8653
8655 EVT VT, const SDLoc &dl, SDValue Chain,
8656 SDValue Ptr, SDValue Offset, EVT MemVT,
8657 MachineMemOperand *MMO) {
8658 if (VT == MemVT) {
8659 ExtType = ISD::NON_EXTLOAD;
8660 } else if (ExtType == ISD::NON_EXTLOAD) {
8661 assert(VT == MemVT && "Non-extending load from different memory type!");
8662 } else {
8663 // Extending load.
8664 assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) &&
8665 "Should only be an extending load, not truncating!");
8666 assert(VT.isInteger() == MemVT.isInteger() &&
8667 "Cannot convert from FP to Int or Int -> FP!");
8668 assert(VT.isVector() == MemVT.isVector() &&
8669 "Cannot use an ext load to convert to or from a vector!");
8670 assert((!VT.isVector() ||
8672 "Cannot use an ext load to change the number of vector elements!");
8673 }
8674
8675 bool Indexed = AM != ISD::UNINDEXED;
8676 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
8677
8678 SDVTList VTs = Indexed ?
8679 getVTList(VT, Ptr.getValueType(), MVT::Other) : getVTList(VT, MVT::Other);
8680 SDValue Ops[] = { Chain, Ptr, Offset };
8682 AddNodeIDNode(ID, ISD::LOAD, VTs, Ops);
8683 ID.AddInteger(MemVT.getRawBits());
8684 ID.AddInteger(getSyntheticNodeSubclassData<LoadSDNode>(
8685 dl.getIROrder(), VTs, AM, ExtType, MemVT, MMO));
8686 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
8687 ID.AddInteger(MMO->getFlags());
8688 void *IP = nullptr;
8689 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
8690 cast<LoadSDNode>(E)->refineAlignment(MMO);
8691 return SDValue(E, 0);
8692 }
8693 auto *N = newSDNode<LoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
8694 ExtType, MemVT, MMO);
8695 createOperands(N, Ops);
8696
8697 CSEMap.InsertNode(N, IP);
8698 InsertNode(N);
8699 SDValue V(N, 0);
8700 NewSDValueDbgMsg(V, "Creating new node: ", this);
8701 return V;
8702}
8703
8706 MaybeAlign Alignment,
8707 MachineMemOperand::Flags MMOFlags,
8708 const AAMDNodes &AAInfo, const MDNode *Ranges) {
8709 SDValue Undef = getUNDEF(Ptr.getValueType());
8710 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
8711 PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges);
8712}
8713
8716 SDValue Undef = getUNDEF(Ptr.getValueType());
8717 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
8718 VT, MMO);
8719}
8720
8722 EVT VT, SDValue Chain, SDValue Ptr,
8723 MachinePointerInfo PtrInfo, EVT MemVT,
8724 MaybeAlign Alignment,
8725 MachineMemOperand::Flags MMOFlags,
8726 const AAMDNodes &AAInfo) {
8727 SDValue Undef = getUNDEF(Ptr.getValueType());
8728 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, PtrInfo,
8729 MemVT, Alignment, MMOFlags, AAInfo);
8730}
8731
8733 EVT VT, SDValue Chain, SDValue Ptr, EVT MemVT,
8734 MachineMemOperand *MMO) {
8735 SDValue Undef = getUNDEF(Ptr.getValueType());
8736 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef,
8737 MemVT, MMO);
8738}
8739
8743 LoadSDNode *LD = cast<LoadSDNode>(OrigLoad);
8744 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
8745 // Don't propagate the invariant or dereferenceable flags.
8746 auto MMOFlags =
8747 LD->getMemOperand()->getFlags() &
8749 return getLoad(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
8750 LD->getChain(), Base, Offset, LD->getPointerInfo(),
8751 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo());
8752}
8753
8756 Align Alignment,
8757 MachineMemOperand::Flags MMOFlags,
8758 const AAMDNodes &AAInfo) {
8759 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
8760
8761 MMOFlags |= MachineMemOperand::MOStore;
8762 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
8763
8764 if (PtrInfo.V.isNull())
8765 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
8766
8769 MachineMemOperand *MMO =
8770 MF.getMachineMemOperand(PtrInfo, MMOFlags, Size, Alignment, AAInfo);
8771 return getStore(Chain, dl, Val, Ptr, MMO);
8772}
8773
8776 assert(Chain.getValueType() == MVT::Other &&
8777 "Invalid chain type");
8778 EVT VT = Val.getValueType();
8779 SDVTList VTs = getVTList(MVT::Other);
8780 SDValue Undef = getUNDEF(Ptr.getValueType());
8781 SDValue Ops[] = { Chain, Val, Ptr, Undef };
8783 AddNodeIDNode(ID, ISD::STORE, VTs, Ops);
8784 ID.AddInteger(VT.getRawBits());
8785 ID.AddInteger(getSyntheticNodeSubclassData<StoreSDNode>(
8786 dl.getIROrder(), VTs, ISD::UNINDEXED, false, VT, MMO));
8787 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
8788 ID.AddInteger(MMO->getFlags());
8789 void *IP = nullptr;
8790 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
8791 cast<StoreSDNode>(E)->refineAlignment(MMO);
8792 return SDValue(E, 0);
8793 }
8794 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
8795 ISD::UNINDEXED, false, VT, MMO);
8796 createOperands(N, Ops);
8797
8798 CSEMap.InsertNode(N, IP);
8799 InsertNode(N);
8800 SDValue V(N, 0);
8801 NewSDValueDbgMsg(V, "Creating new node: ", this);
8802 return V;
8803}
8804
8807 EVT SVT, Align Alignment,
8808 MachineMemOperand::Flags MMOFlags,
8809 const AAMDNodes &AAInfo) {
8810 assert(Chain.getValueType() == MVT::Other &&
8811 "Invalid chain type");
8812
8813 MMOFlags |= MachineMemOperand::MOStore;
8814 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
8815
8816 if (PtrInfo.V.isNull())
8817 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
8818
8821 PtrInfo, MMOFlags, LocationSize::precise(SVT.getStoreSize()), Alignment,
8822 AAInfo);
8823 return getTruncStore(Chain, dl, Val, Ptr, SVT, MMO);
8824}
8825
8827 SDValue Ptr, EVT SVT,
8828 MachineMemOperand *MMO) {
8829 EVT VT = Val.getValueType();
8830
8831 assert(Chain.getValueType() == MVT::Other &&
8832 "Invalid chain type");
8833 if (VT == SVT)
8834 return getStore(Chain, dl, Val, Ptr, MMO);
8835
8837 "Should only be a truncating store, not extending!");
8838 assert(VT.isInteger() == SVT.isInteger() &&
8839 "Can't do FP-INT conversion!");
8840 assert(VT.isVector() == SVT.isVector() &&
8841 "Cannot use trunc store to convert to or from a vector!");
8842 assert((!VT.isVector() ||
8844 "Cannot use trunc store to change the number of vector elements!");
8845
8846 SDVTList VTs = getVTList(MVT::Other);
8847 SDValue Undef = getUNDEF(Ptr.getValueType());
8848 SDValue Ops[] = { Chain, Val, Ptr, Undef };
8850 AddNodeIDNode(ID, ISD::STORE, VTs, Ops);
8851 ID.AddInteger(SVT.getRawBits());
8852 ID.AddInteger(getSyntheticNodeSubclassData<StoreSDNode>(
8853 dl.getIROrder(), VTs, ISD::UNINDEXED, true, SVT, MMO));
8854 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
8855 ID.AddInteger(MMO->getFlags());
8856 void *IP = nullptr;
8857 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
8858 cast<StoreSDNode>(E)->refineAlignment(MMO);
8859 return SDValue(E, 0);
8860 }
8861 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
8862 ISD::UNINDEXED, true, SVT, MMO);
8863 createOperands(N, Ops);
8864
8865 CSEMap.InsertNode(N, IP);
8866 InsertNode(N);
8867 SDValue V(N, 0);
8868 NewSDValueDbgMsg(V, "Creating new node: ", this);
8869 return V;
8870}
8871
8875 StoreSDNode *ST = cast<StoreSDNode>(OrigStore);
8876 assert(ST->getOffset().isUndef() && "Store is already a indexed store!");
8877 SDVTList VTs = getVTList(Base.getValueType(), MVT::Other);
8878 SDValue Ops[] = { ST->getChain(), ST->getValue(), Base, Offset };
8880 AddNodeIDNode(ID, ISD::STORE, VTs, Ops);
8881 ID.AddInteger(ST->getMemoryVT().getRawBits());
8882 ID.AddInteger(ST->getRawSubclassData());
8883 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
8884 ID.AddInteger(ST->getMemOperand()->getFlags());
8885 void *IP = nullptr;
8886 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
8887 return SDValue(E, 0);
8888
8889 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
8890 ST->isTruncatingStore(), ST->getMemoryVT(),
8891 ST->getMemOperand());
8892 createOperands(N, Ops);
8893
8894 CSEMap.InsertNode(N, IP);
8895 InsertNode(N);
8896 SDValue V(N, 0);
8897 NewSDValueDbgMsg(V, "Creating new node: ", this);
8898 return V;
8899}
8900
8902 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl,
8903 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL,
8904 MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment,
8905 MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo,
8906 const MDNode *Ranges, bool IsExpanding) {
8907 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
8908
8909 MMOFlags |= MachineMemOperand::MOLoad;
8910 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
8911 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
8912 // clients.
8913 if (PtrInfo.V.isNull())
8914 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
8915
8918 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
8919 Alignment, AAInfo, Ranges);
8920 return getLoadVP(AM, ExtType, VT, dl, Chain, Ptr, Offset, Mask, EVL, MemVT,
8921 MMO, IsExpanding);
8922}
8923
8925 ISD::LoadExtType ExtType, EVT VT,
8926 const SDLoc &dl, SDValue Chain, SDValue Ptr,
8927 SDValue Offset, SDValue Mask, SDValue EVL,
8928 EVT MemVT, MachineMemOperand *MMO,
8929 bool IsExpanding) {
8930 bool Indexed = AM != ISD::UNINDEXED;
8931 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
8932
8933 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
8934 : getVTList(VT, MVT::Other);
8935 SDValue Ops[] = {Chain, Ptr, Offset, Mask, EVL};
8937 AddNodeIDNode(ID, ISD::VP_LOAD, VTs, Ops);
8938 ID.AddInteger(MemVT.getRawBits());
8939 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadSDNode>(
8940 dl.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
8941 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
8942 ID.AddInteger(MMO->getFlags());
8943 void *IP = nullptr;
8944 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
8945 cast<VPLoadSDNode>(E)->refineAlignment(MMO);
8946 return SDValue(E, 0);
8947 }
8948 auto *N = newSDNode<VPLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
8949 ExtType, IsExpanding, MemVT, MMO);
8950 createOperands(N, Ops);
8951
8952 CSEMap.InsertNode(N, IP);
8953 InsertNode(N);
8954 SDValue V(N, 0);
8955 NewSDValueDbgMsg(V, "Creating new node: ", this);
8956 return V;
8957}
8958
8960 SDValue Ptr, SDValue Mask, SDValue EVL,
8961 MachinePointerInfo PtrInfo,
8962 MaybeAlign Alignment,
8963 MachineMemOperand::Flags MMOFlags,
8964 const AAMDNodes &AAInfo, const MDNode *Ranges,
8965 bool IsExpanding) {
8966 SDValue Undef = getUNDEF(Ptr.getValueType());
8967 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
8968 Mask, EVL, PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges,
8969 IsExpanding);
8970}
8971
8973 SDValue Ptr, SDValue Mask, SDValue EVL,
8974 MachineMemOperand *MMO, bool IsExpanding) {
8975 SDValue Undef = getUNDEF(Ptr.getValueType());
8976 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
8977 Mask, EVL, VT, MMO, IsExpanding);
8978}
8979
8981 EVT VT, SDValue Chain, SDValue Ptr,
8982 SDValue Mask, SDValue EVL,
8983 MachinePointerInfo PtrInfo, EVT MemVT,
8984 MaybeAlign Alignment,
8985 MachineMemOperand::Flags MMOFlags,
8986 const AAMDNodes &AAInfo, bool IsExpanding) {
8987 SDValue Undef = getUNDEF(Ptr.getValueType());
8988 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
8989 EVL, PtrInfo, MemVT, Alignment, MMOFlags, AAInfo, nullptr,
8990 IsExpanding);
8991}
8992
8994 EVT VT, SDValue Chain, SDValue Ptr,
8995 SDValue Mask, SDValue EVL, EVT MemVT,
8996 MachineMemOperand *MMO, bool IsExpanding) {
8997 SDValue Undef = getUNDEF(Ptr.getValueType());
8998 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
8999 EVL, MemVT, MMO, IsExpanding);
9000}
9001
9005 auto *LD = cast<VPLoadSDNode>(OrigLoad);
9006 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
9007 // Don't propagate the invariant or dereferenceable flags.
9008 auto MMOFlags =
9009 LD->getMemOperand()->getFlags() &
9011 return getLoadVP(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
9012 LD->getChain(), Base, Offset, LD->getMask(),
9013 LD->getVectorLength(), LD->getPointerInfo(),
9014 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo(),
9015 nullptr, LD->isExpandingLoad());
9016}
9017
9020 SDValue EVL, EVT MemVT, MachineMemOperand *MMO,
9021 ISD::MemIndexedMode AM, bool IsTruncating,
9022 bool IsCompressing) {
9023 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9024 bool Indexed = AM != ISD::UNINDEXED;
9025 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
9026 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
9027 : getVTList(MVT::Other);
9028 SDValue Ops[] = {Chain, Val, Ptr, Offset, Mask, EVL};
9030 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
9031 ID.AddInteger(MemVT.getRawBits());
9032 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
9033 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
9034 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9035 ID.AddInteger(MMO->getFlags());
9036 void *IP = nullptr;
9037 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9038 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
9039 return SDValue(E, 0);
9040 }
9041 auto *N = newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
9042 IsTruncating, IsCompressing, MemVT, MMO);
9043 createOperands(N, Ops);
9044
9045 CSEMap.InsertNode(N, IP);
9046 InsertNode(N);
9047 SDValue V(N, 0);
9048 NewSDValueDbgMsg(V, "Creating new node: ", this);
9049 return V;
9050}
9051
9053 SDValue Val, SDValue Ptr, SDValue Mask,
9054 SDValue EVL, MachinePointerInfo PtrInfo,
9055 EVT SVT, Align Alignment,
9056 MachineMemOperand::Flags MMOFlags,
9057 const AAMDNodes &AAInfo,
9058 bool IsCompressing) {
9059 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9060
9061 MMOFlags |= MachineMemOperand::MOStore;
9062 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
9063
9064 if (PtrInfo.V.isNull())
9065 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
9066
9069 PtrInfo, MMOFlags, LocationSize::precise(SVT.getStoreSize()), Alignment,
9070 AAInfo);
9071 return getTruncStoreVP(Chain, dl, Val, Ptr, Mask, EVL, SVT, MMO,
9072 IsCompressing);
9073}
9074
9076 SDValue Val, SDValue Ptr, SDValue Mask,
9077 SDValue EVL, EVT SVT,
9078 MachineMemOperand *MMO,
9079 bool IsCompressing) {
9080 EVT VT = Val.getValueType();
9081
9082 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9083 if (VT == SVT)
9084 return getStoreVP(Chain, dl, Val, Ptr, getUNDEF(Ptr.getValueType()), Mask,
9085 EVL, VT, MMO, ISD::UNINDEXED,
9086 /*IsTruncating*/ false, IsCompressing);
9087
9089 "Should only be a truncating store, not extending!");
9090 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
9091 assert(VT.isVector() == SVT.isVector() &&
9092 "Cannot use trunc store to convert to or from a vector!");
9093 assert((!VT.isVector() ||
9095 "Cannot use trunc store to change the number of vector elements!");
9096
9097 SDVTList VTs = getVTList(MVT::Other);
9098 SDValue Undef = getUNDEF(Ptr.getValueType());
9099 SDValue Ops[] = {Chain, Val, Ptr, Undef, Mask, EVL};
9101 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
9102 ID.AddInteger(SVT.getRawBits());
9103 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
9104 dl.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
9105 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9106 ID.AddInteger(MMO->getFlags());
9107 void *IP = nullptr;
9108 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9109 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
9110 return SDValue(E, 0);
9111 }
9112 auto *N =
9113 newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
9114 ISD::UNINDEXED, true, IsCompressing, SVT, MMO);
9115 createOperands(N, Ops);
9116
9117 CSEMap.InsertNode(N, IP);
9118 InsertNode(N);
9119 SDValue V(N, 0);
9120 NewSDValueDbgMsg(V, "Creating new node: ", this);
9121 return V;
9122}
9123
9127 auto *ST = cast<VPStoreSDNode>(OrigStore);
9128 assert(ST->getOffset().isUndef() && "Store is already an indexed store!");
9129 SDVTList VTs = getVTList(Base.getValueType(), MVT::Other);
9130 SDValue Ops[] = {ST->getChain(), ST->getValue(), Base,
9131 Offset, ST->getMask(), ST->getVectorLength()};
9133 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
9134 ID.AddInteger(ST->getMemoryVT().getRawBits());
9135 ID.AddInteger(ST->getRawSubclassData());
9136 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
9137 ID.AddInteger(ST->getMemOperand()->getFlags());
9138 void *IP = nullptr;
9139 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
9140 return SDValue(E, 0);
9141
9142 auto *N = newSDNode<VPStoreSDNode>(
9143 dl.getIROrder(), dl.getDebugLoc(), VTs, AM, ST->isTruncatingStore(),
9144 ST->isCompressingStore(), ST->getMemoryVT(), ST->getMemOperand());
9145 createOperands(N, Ops);
9146
9147 CSEMap.InsertNode(N, IP);
9148 InsertNode(N);
9149 SDValue V(N, 0);
9150 NewSDValueDbgMsg(V, "Creating new node: ", this);
9151 return V;
9152}
9153
9155 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL,
9156 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask,
9157 SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding) {
9158 bool Indexed = AM != ISD::UNINDEXED;
9159 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
9160
9161 SDValue Ops[] = {Chain, Ptr, Offset, Stride, Mask, EVL};
9162 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
9163 : getVTList(VT, MVT::Other);
9165 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_LOAD, VTs, Ops);
9166 ID.AddInteger(VT.getRawBits());
9167 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedLoadSDNode>(
9168 DL.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
9169 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9170
9171 void *IP = nullptr;
9172 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
9173 cast<VPStridedLoadSDNode>(E)->refineAlignment(MMO);
9174 return SDValue(E, 0);
9175 }
9176
9177 auto *N =
9178 newSDNode<VPStridedLoadSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, AM,
9179 ExtType, IsExpanding, MemVT, MMO);
9180 createOperands(N, Ops);
9181 CSEMap.InsertNode(N, IP);
9182 InsertNode(N);
9183 SDValue V(N, 0);
9184 NewSDValueDbgMsg(V, "Creating new node: ", this);
9185 return V;
9186}
9187
9189 SDValue Ptr, SDValue Stride,
9190 SDValue Mask, SDValue EVL,
9191 MachineMemOperand *MMO,
9192 bool IsExpanding) {
9193 SDValue Undef = getUNDEF(Ptr.getValueType());
9195 Undef, Stride, Mask, EVL, VT, MMO, IsExpanding);
9196}
9197
9199 ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain,
9200 SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT,
9201 MachineMemOperand *MMO, bool IsExpanding) {
9202 SDValue Undef = getUNDEF(Ptr.getValueType());
9203 return getStridedLoadVP(ISD::UNINDEXED, ExtType, VT, DL, Chain, Ptr, Undef,
9204 Stride, Mask, EVL, MemVT, MMO, IsExpanding);
9205}
9206
9208 SDValue Val, SDValue Ptr,
9209 SDValue Offset, SDValue Stride,
9210 SDValue Mask, SDValue EVL, EVT MemVT,
9211 MachineMemOperand *MMO,
9213 bool IsTruncating, bool IsCompressing) {
9214 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9215 bool Indexed = AM != ISD::UNINDEXED;
9216 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
9217 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
9218 : getVTList(MVT::Other);
9219 SDValue Ops[] = {Chain, Val, Ptr, Offset, Stride, Mask, EVL};
9221 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
9222 ID.AddInteger(MemVT.getRawBits());
9223 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
9224 DL.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
9225 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9226 void *IP = nullptr;
9227 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
9228 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
9229 return SDValue(E, 0);
9230 }
9231 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
9232 VTs, AM, IsTruncating,
9233 IsCompressing, MemVT, MMO);
9234 createOperands(N, Ops);
9235
9236 CSEMap.InsertNode(N, IP);
9237 InsertNode(N);
9238 SDValue V(N, 0);
9239 NewSDValueDbgMsg(V, "Creating new node: ", this);
9240 return V;
9241}
9242
9244 SDValue Val, SDValue Ptr,
9245 SDValue Stride, SDValue Mask,
9246 SDValue EVL, EVT SVT,
9247 MachineMemOperand *MMO,
9248 bool IsCompressing) {
9249 EVT VT = Val.getValueType();
9250
9251 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9252 if (VT == SVT)
9253 return getStridedStoreVP(Chain, DL, Val, Ptr, getUNDEF(Ptr.getValueType()),
9254 Stride, Mask, EVL, VT, MMO, ISD::UNINDEXED,
9255 /*IsTruncating*/ false, IsCompressing);
9256
9258 "Should only be a truncating store, not extending!");
9259 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
9260 assert(VT.isVector() == SVT.isVector() &&
9261 "Cannot use trunc store to convert to or from a vector!");
9262 assert((!VT.isVector() ||
9264 "Cannot use trunc store to change the number of vector elements!");
9265
9266 SDVTList VTs = getVTList(MVT::Other);
9267 SDValue Undef = getUNDEF(Ptr.getValueType());
9268 SDValue Ops[] = {Chain, Val, Ptr, Undef, Stride, Mask, EVL};
9270 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
9271 ID.AddInteger(SVT.getRawBits());
9272 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
9273 DL.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
9274 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9275 void *IP = nullptr;
9276 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
9277 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
9278 return SDValue(E, 0);
9279 }
9280 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
9281 VTs, ISD::UNINDEXED, true,
9282 IsCompressing, SVT, MMO);
9283 createOperands(N, Ops);
9284
9285 CSEMap.InsertNode(N, IP);
9286 InsertNode(N);
9287 SDValue V(N, 0);
9288 NewSDValueDbgMsg(V, "Creating new node: ", this);
9289 return V;
9290}
9291
9294 ISD::MemIndexType IndexType) {
9295 assert(Ops.size() == 6 && "Incompatible number of operands");
9296
9298 AddNodeIDNode(ID, ISD::VP_GATHER, VTs, Ops);
9299 ID.AddInteger(VT.getRawBits());
9300 ID.AddInteger(getSyntheticNodeSubclassData<VPGatherSDNode>(
9301 dl.getIROrder(), VTs, VT, MMO, IndexType));
9302 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9303 ID.AddInteger(MMO->getFlags());
9304 void *IP = nullptr;
9305 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9306 cast<VPGatherSDNode>(E)->refineAlignment(MMO);
9307 return SDValue(E, 0);
9308 }
9309
9310 auto *N = newSDNode<VPGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
9311 VT, MMO, IndexType);
9312 createOperands(N, Ops);
9313
9314 assert(N->getMask().getValueType().getVectorElementCount() ==
9315 N->getValueType(0).getVectorElementCount() &&
9316 "Vector width mismatch between mask and data");
9317 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
9318 N->getValueType(0).getVectorElementCount().isScalable() &&
9319 "Scalable flags of index and data do not match");
9321 N->getIndex().getValueType().getVectorElementCount(),
9322 N->getValueType(0).getVectorElementCount()) &&
9323 "Vector width mismatch between index and data");
9324 assert(isa<ConstantSDNode>(N->getScale()) &&
9325 N->getScale()->getAsAPIntVal().isPowerOf2() &&
9326 "Scale should be a constant power of 2");
9327
9328 CSEMap.InsertNode(N, IP);
9329 InsertNode(N);
9330 SDValue V(N, 0);
9331 NewSDValueDbgMsg(V, "Creating new node: ", this);
9332 return V;
9333}
9334
9337 MachineMemOperand *MMO,
9338 ISD::MemIndexType IndexType) {
9339 assert(Ops.size() == 7 && "Incompatible number of operands");
9340
9342 AddNodeIDNode(ID, ISD::VP_SCATTER, VTs, Ops);
9343 ID.AddInteger(VT.getRawBits());
9344 ID.AddInteger(getSyntheticNodeSubclassData<VPScatterSDNode>(
9345 dl.getIROrder(), VTs, VT, MMO, IndexType));
9346 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9347 ID.AddInteger(MMO->getFlags());
9348 void *IP = nullptr;
9349 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9350 cast<VPScatterSDNode>(E)->refineAlignment(MMO);
9351 return SDValue(E, 0);
9352 }
9353 auto *N = newSDNode<VPScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
9354 VT, MMO, IndexType);
9355 createOperands(N, Ops);
9356
9357 assert(N->getMask().getValueType().getVectorElementCount() ==
9358 N->getValue().getValueType().getVectorElementCount() &&
9359 "Vector width mismatch between mask and data");
9360 assert(
9361 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
9362 N->getValue().getValueType().getVectorElementCount().isScalable() &&
9363 "Scalable flags of index and data do not match");
9365 N->getIndex().getValueType().getVectorElementCount(),
9366 N->getValue().getValueType().getVectorElementCount()) &&
9367 "Vector width mismatch between index and data");
9368 assert(isa<ConstantSDNode>(N->getScale()) &&
9369 N->getScale()->getAsAPIntVal().isPowerOf2() &&
9370 "Scale should be a constant power of 2");
9371
9372 CSEMap.InsertNode(N, IP);
9373 InsertNode(N);
9374 SDValue V(N, 0);
9375 NewSDValueDbgMsg(V, "Creating new node: ", this);
9376 return V;
9377}
9378
9381 SDValue PassThru, EVT MemVT,
9382 MachineMemOperand *MMO,
9384 ISD::LoadExtType ExtTy, bool isExpanding) {
9385 bool Indexed = AM != ISD::UNINDEXED;
9386 assert((Indexed || Offset.isUndef()) &&
9387 "Unindexed masked load with an offset!");
9388 SDVTList VTs = Indexed ? getVTList(VT, Base.getValueType(), MVT::Other)
9389 : getVTList(VT, MVT::Other);
9390 SDValue Ops[] = {Chain, Base, Offset, Mask, PassThru};
9392 AddNodeIDNode(ID, ISD::MLOAD, VTs, Ops);
9393 ID.AddInteger(MemVT.getRawBits());
9394 ID.AddInteger(getSyntheticNodeSubclassData<MaskedLoadSDNode>(
9395 dl.getIROrder(), VTs, AM, ExtTy, isExpanding, MemVT, MMO));
9396 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9397 ID.AddInteger(MMO->getFlags());
9398 void *IP = nullptr;
9399 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9400 cast<MaskedLoadSDNode>(E)->refineAlignment(MMO);
9401 return SDValue(E, 0);
9402 }
9403 auto *N = newSDNode<MaskedLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
9404 AM, ExtTy, isExpanding, MemVT, MMO);
9405 createOperands(N, Ops);
9406
9407 CSEMap.InsertNode(N, IP);
9408 InsertNode(N);
9409 SDValue V(N, 0);
9410 NewSDValueDbgMsg(V, "Creating new node: ", this);
9411 return V;
9412}
9413
9417 MaskedLoadSDNode *LD = cast<MaskedLoadSDNode>(OrigLoad);
9418 assert(LD->getOffset().isUndef() && "Masked load is already a indexed load!");
9419 return getMaskedLoad(OrigLoad.getValueType(), dl, LD->getChain(), Base,
9420 Offset, LD->getMask(), LD->getPassThru(),
9421 LD->getMemoryVT(), LD->getMemOperand(), AM,
9422 LD->getExtensionType(), LD->isExpandingLoad());
9423}
9424
9427 SDValue Mask, EVT MemVT,
9428 MachineMemOperand *MMO,
9429 ISD::MemIndexedMode AM, bool IsTruncating,
9430 bool IsCompressing) {
9431 assert(Chain.getValueType() == MVT::Other &&
9432 "Invalid chain type");
9433 bool Indexed = AM != ISD::UNINDEXED;
9434 assert((Indexed || Offset.isUndef()) &&
9435 "Unindexed masked store with an offset!");
9436 SDVTList VTs = Indexed ? getVTList(Base.getValueType(), MVT::Other)
9437 : getVTList(MVT::Other);
9438 SDValue Ops[] = {Chain, Val, Base, Offset, Mask};
9440 AddNodeIDNode(ID, ISD::MSTORE, VTs, Ops);
9441 ID.AddInteger(MemVT.getRawBits());
9442 ID.AddInteger(getSyntheticNodeSubclassData<MaskedStoreSDNode>(
9443 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
9444 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9445 ID.AddInteger(MMO->getFlags());
9446 void *IP = nullptr;
9447 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9448 cast<MaskedStoreSDNode>(E)->refineAlignment(MMO);
9449 return SDValue(E, 0);
9450 }
9451 auto *N =
9452 newSDNode<MaskedStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
9453 IsTruncating, IsCompressing, MemVT, MMO);
9454 createOperands(N, Ops);
9455
9456 CSEMap.InsertNode(N, IP);
9457 InsertNode(N);
9458 SDValue V(N, 0);
9459 NewSDValueDbgMsg(V, "Creating new node: ", this);
9460 return V;
9461}
9462
9466 MaskedStoreSDNode *ST = cast<MaskedStoreSDNode>(OrigStore);
9467 assert(ST->getOffset().isUndef() &&
9468 "Masked store is already a indexed store!");
9469 return getMaskedStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
9470 ST->getMask(), ST->getMemoryVT(), ST->getMemOperand(),
9471 AM, ST->isTruncatingStore(), ST->isCompressingStore());
9472}
9473
9476 MachineMemOperand *MMO,
9477 ISD::MemIndexType IndexType,
9478 ISD::LoadExtType ExtTy) {
9479 assert(Ops.size() == 6 && "Incompatible number of operands");
9480
9482 AddNodeIDNode(ID, ISD::MGATHER, VTs, Ops);
9483 ID.AddInteger(MemVT.getRawBits());
9484 ID.AddInteger(getSyntheticNodeSubclassData<MaskedGatherSDNode>(
9485 dl.getIROrder(), VTs, MemVT, MMO, IndexType, ExtTy));
9486 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9487 ID.AddInteger(MMO->getFlags());
9488 void *IP = nullptr;
9489 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9490 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
9491 return SDValue(E, 0);
9492 }
9493
9494 auto *N = newSDNode<MaskedGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(),
9495 VTs, MemVT, MMO, IndexType, ExtTy);
9496 createOperands(N, Ops);
9497
9498 assert(N->getPassThru().getValueType() == N->getValueType(0) &&
9499 "Incompatible type of the PassThru value in MaskedGatherSDNode");
9500 assert(N->getMask().getValueType().getVectorElementCount() ==
9501 N->getValueType(0).getVectorElementCount() &&
9502 "Vector width mismatch between mask and data");
9503 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
9504 N->getValueType(0).getVectorElementCount().isScalable() &&
9505 "Scalable flags of index and data do not match");
9507 N->getIndex().getValueType().getVectorElementCount(),
9508 N->getValueType(0).getVectorElementCount()) &&
9509 "Vector width mismatch between index and data");
9510 assert(isa<ConstantSDNode>(N->getScale()) &&
9511 N->getScale()->getAsAPIntVal().isPowerOf2() &&
9512 "Scale should be a constant power of 2");
9513
9514 CSEMap.InsertNode(N, IP);
9515 InsertNode(N);
9516 SDValue V(N, 0);
9517 NewSDValueDbgMsg(V, "Creating new node: ", this);
9518 return V;
9519}
9520
9523 MachineMemOperand *MMO,
9524 ISD::MemIndexType IndexType,
9525 bool IsTrunc) {
9526 assert(Ops.size() == 6 && "Incompatible number of operands");
9527
9529 AddNodeIDNode(ID, ISD::MSCATTER, VTs, Ops);
9530 ID.AddInteger(MemVT.getRawBits());
9531 ID.AddInteger(getSyntheticNodeSubclassData<MaskedScatterSDNode>(
9532 dl.getIROrder(), VTs, MemVT, MMO, IndexType, IsTrunc));
9533 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9534 ID.AddInteger(MMO->getFlags());
9535 void *IP = nullptr;
9536 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9537 cast<MaskedScatterSDNode>(E)->refineAlignment(MMO);
9538 return SDValue(E, 0);
9539 }
9540
9541 auto *N = newSDNode<MaskedScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(),
9542 VTs, MemVT, MMO, IndexType, IsTrunc);
9543 createOperands(N, Ops);
9544
9545 assert(N->getMask().getValueType().getVectorElementCount() ==
9546 N->getValue().getValueType().getVectorElementCount() &&
9547 "Vector width mismatch between mask and data");
9548 assert(
9549 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
9550 N->getValue().getValueType().getVectorElementCount().isScalable() &&
9551 "Scalable flags of index and data do not match");
9553 N->getIndex().getValueType().getVectorElementCount(),
9554 N->getValue().getValueType().getVectorElementCount()) &&
9555 "Vector width mismatch between index and data");
9556 assert(isa<ConstantSDNode>(N->getScale()) &&
9557 N->getScale()->getAsAPIntVal().isPowerOf2() &&
9558 "Scale should be a constant power of 2");
9559
9560 CSEMap.InsertNode(N, IP);
9561 InsertNode(N);
9562 SDValue V(N, 0);
9563 NewSDValueDbgMsg(V, "Creating new node: ", this);
9564 return V;
9565}
9566
9568 EVT MemVT, MachineMemOperand *MMO) {
9569 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9570 SDVTList VTs = getVTList(MVT::Other);
9571 SDValue Ops[] = {Chain, Ptr};
9574 ID.AddInteger(MemVT.getRawBits());
9575 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
9576 ISD::GET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
9577 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9578 ID.AddInteger(MMO->getFlags());
9579 void *IP = nullptr;
9580 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
9581 return SDValue(E, 0);
9582
9583 auto *N = newSDNode<FPStateAccessSDNode>(ISD::GET_FPENV_MEM, dl.getIROrder(),
9584 dl.getDebugLoc(), VTs, MemVT, MMO);
9585 createOperands(N, Ops);
9586
9587 CSEMap.InsertNode(N, IP);
9588 InsertNode(N);
9589 SDValue V(N, 0);
9590 NewSDValueDbgMsg(V, "Creating new node: ", this);
9591 return V;
9592}
9593
9595 EVT MemVT, MachineMemOperand *MMO) {
9596 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9597 SDVTList VTs = getVTList(MVT::Other);
9598 SDValue Ops[] = {Chain, Ptr};
9601 ID.AddInteger(MemVT.getRawBits());
9602 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
9603 ISD::SET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
9604 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9605 ID.AddInteger(MMO->getFlags());
9606 void *IP = nullptr;
9607 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
9608 return SDValue(E, 0);
9609
9610 auto *N = newSDNode<FPStateAccessSDNode>(ISD::SET_FPENV_MEM, dl.getIROrder(),
9611 dl.getDebugLoc(), VTs, MemVT, MMO);
9612 createOperands(N, Ops);
9613
9614 CSEMap.InsertNode(N, IP);
9615 InsertNode(N);
9616 SDValue V(N, 0);
9617 NewSDValueDbgMsg(V, "Creating new node: ", this);
9618 return V;
9619}
9620
9622 // select undef, T, F --> T (if T is a constant), otherwise F
9623 // select, ?, undef, F --> F
9624 // select, ?, T, undef --> T
9625 if (Cond.isUndef())
9626 return isConstantValueOfAnyType(T) ? T : F;
9627 if (T.isUndef())
9628 return F;
9629 if (F.isUndef())
9630 return T;
9631
9632 // select true, T, F --> T
9633 // select false, T, F --> F
9634 if (auto *CondC = dyn_cast<ConstantSDNode>(Cond))
9635 return CondC->isZero() ? F : T;
9636
9637 // TODO: This should simplify VSELECT with non-zero constant condition using
9638 // something like this (but check boolean contents to be complete?):
9639 if (ConstantSDNode *CondC = isConstOrConstSplat(Cond, /*AllowUndefs*/ false,
9640 /*AllowTruncation*/ true))
9641 if (CondC->isZero())
9642 return F;
9643
9644 // select ?, T, T --> T
9645 if (T == F)
9646 return T;
9647
9648 return SDValue();
9649}
9650
9652 // shift undef, Y --> 0 (can always assume that the undef value is 0)
9653 if (X.isUndef())
9654 return getConstant(0, SDLoc(X.getNode()), X.getValueType());
9655 // shift X, undef --> undef (because it may shift by the bitwidth)
9656 if (Y.isUndef())
9657 return getUNDEF(X.getValueType());
9658
9659 // shift 0, Y --> 0
9660 // shift X, 0 --> X
9662 return X;
9663
9664 // shift X, C >= bitwidth(X) --> undef
9665 // All vector elements must be too big (or undef) to avoid partial undefs.
9666 auto isShiftTooBig = [X](ConstantSDNode *Val) {
9667 return !Val || Val->getAPIntValue().uge(X.getScalarValueSizeInBits());
9668 };
9669 if (ISD::matchUnaryPredicate(Y, isShiftTooBig, true))
9670 return getUNDEF(X.getValueType());
9671
9672 // shift i1/vXi1 X, Y --> X (any non-zero shift amount is undefined).
9673 if (X.getValueType().getScalarType() == MVT::i1)
9674 return X;
9675
9676 return SDValue();
9677}
9678
9680 SDNodeFlags Flags) {
9681 // If this operation has 'nnan' or 'ninf' and at least 1 disallowed operand
9682 // (an undef operand can be chosen to be Nan/Inf), then the result of this
9683 // operation is poison. That result can be relaxed to undef.
9684 ConstantFPSDNode *XC = isConstOrConstSplatFP(X, /* AllowUndefs */ true);
9685 ConstantFPSDNode *YC = isConstOrConstSplatFP(Y, /* AllowUndefs */ true);
9686 bool HasNan = (XC && XC->getValueAPF().isNaN()) ||
9687 (YC && YC->getValueAPF().isNaN());
9688 bool HasInf = (XC && XC->getValueAPF().isInfinity()) ||
9689 (YC && YC->getValueAPF().isInfinity());
9690
9691 if (Flags.hasNoNaNs() && (HasNan || X.isUndef() || Y.isUndef()))
9692 return getUNDEF(X.getValueType());
9693
9694 if (Flags.hasNoInfs() && (HasInf || X.isUndef() || Y.isUndef()))
9695 return getUNDEF(X.getValueType());
9696
9697 if (!YC)
9698 return SDValue();
9699
9700 // X + -0.0 --> X
9701 if (Opcode == ISD::FADD)
9702 if (YC->getValueAPF().isNegZero())
9703 return X;
9704
9705 // X - +0.0 --> X
9706 if (Opcode == ISD::FSUB)
9707 if (YC->getValueAPF().isPosZero())
9708 return X;
9709
9710 // X * 1.0 --> X
9711 // X / 1.0 --> X
9712 if (Opcode == ISD::FMUL || Opcode == ISD::FDIV)
9713 if (YC->getValueAPF().isExactlyValue(1.0))
9714 return X;
9715
9716 // X * 0.0 --> 0.0
9717 if (Opcode == ISD::FMUL && Flags.hasNoNaNs() && Flags.hasNoSignedZeros())
9718 if (YC->getValueAPF().isZero())
9719 return getConstantFP(0.0, SDLoc(Y), Y.getValueType());
9720
9721 return SDValue();
9722}
9723
9725 SDValue Ptr, SDValue SV, unsigned Align) {
9726 SDValue Ops[] = { Chain, Ptr, SV, getTargetConstant(Align, dl, MVT::i32) };
9727 return getNode(ISD::VAARG, dl, getVTList(VT, MVT::Other), Ops);
9728}
9729
9730SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9731 ArrayRef<SDUse> Ops) {
9732 switch (Ops.size()) {
9733 case 0: return getNode(Opcode, DL, VT);
9734 case 1: return getNode(Opcode, DL, VT, static_cast<const SDValue>(Ops[0]));
9735 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]);
9736 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]);
9737 default: break;
9738 }
9739
9740 // Copy from an SDUse array into an SDValue array for use with
9741 // the regular getNode logic.
9742 SmallVector<SDValue, 8> NewOps(Ops.begin(), Ops.end());
9743 return getNode(Opcode, DL, VT, NewOps);
9744}
9745
9746SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9747 ArrayRef<SDValue> Ops) {
9748 SDNodeFlags Flags;
9749 if (Inserter)
9750 Flags = Inserter->getFlags();
9751 return getNode(Opcode, DL, VT, Ops, Flags);
9752}
9753
9754SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9755 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
9756 unsigned NumOps = Ops.size();
9757 switch (NumOps) {
9758 case 0: return getNode(Opcode, DL, VT);
9759 case 1: return getNode(Opcode, DL, VT, Ops[0], Flags);
9760 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Flags);
9761 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2], Flags);
9762 default: break;
9763 }
9764
9765#ifndef NDEBUG
9766 for (const auto &Op : Ops)
9767 assert(Op.getOpcode() != ISD::DELETED_NODE &&
9768 "Operand is DELETED_NODE!");
9769#endif
9770
9771 switch (Opcode) {
9772 default: break;
9773 case ISD::BUILD_VECTOR:
9774 // Attempt to simplify BUILD_VECTOR.
9775 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
9776 return V;
9777 break;
9779 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
9780 return V;
9781 break;
9782 case ISD::SELECT_CC:
9783 assert(NumOps == 5 && "SELECT_CC takes 5 operands!");
9784 assert(Ops[0].getValueType() == Ops[1].getValueType() &&
9785 "LHS and RHS of condition must have same type!");
9786 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
9787 "True and False arms of SelectCC must have same type!");
9788 assert(Ops[2].getValueType() == VT &&
9789 "select_cc node must be of same type as true and false value!");
9790 assert((!Ops[0].getValueType().isVector() ||
9791 Ops[0].getValueType().getVectorElementCount() ==
9792 VT.getVectorElementCount()) &&
9793 "Expected select_cc with vector result to have the same sized "
9794 "comparison type!");
9795 break;
9796 case ISD::BR_CC:
9797 assert(NumOps == 5 && "BR_CC takes 5 operands!");
9798 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
9799 "LHS/RHS of comparison should match types!");
9800 break;
9801 case ISD::VP_ADD:
9802 case ISD::VP_SUB:
9803 // If it is VP_ADD/VP_SUB mask operation then turn it to VP_XOR
9804 if (VT.isVector() && VT.getVectorElementType() == MVT::i1)
9805 Opcode = ISD::VP_XOR;
9806 break;
9807 case ISD::VP_MUL:
9808 // If it is VP_MUL mask operation then turn it to VP_AND
9809 if (VT.isVector() && VT.getVectorElementType() == MVT::i1)
9810 Opcode = ISD::VP_AND;
9811 break;
9812 case ISD::VP_REDUCE_MUL:
9813 // If it is VP_REDUCE_MUL mask operation then turn it to VP_REDUCE_AND
9814 if (VT == MVT::i1)
9815 Opcode = ISD::VP_REDUCE_AND;
9816 break;
9817 case ISD::VP_REDUCE_ADD:
9818 // If it is VP_REDUCE_ADD mask operation then turn it to VP_REDUCE_XOR
9819 if (VT == MVT::i1)
9820 Opcode = ISD::VP_REDUCE_XOR;
9821 break;
9822 case ISD::VP_REDUCE_SMAX:
9823 case ISD::VP_REDUCE_UMIN:
9824 // If it is VP_REDUCE_SMAX/VP_REDUCE_UMIN mask operation then turn it to
9825 // VP_REDUCE_AND.
9826 if (VT == MVT::i1)
9827 Opcode = ISD::VP_REDUCE_AND;
9828 break;
9829 case ISD::VP_REDUCE_SMIN:
9830 case ISD::VP_REDUCE_UMAX:
9831 // If it is VP_REDUCE_SMIN/VP_REDUCE_UMAX mask operation then turn it to
9832 // VP_REDUCE_OR.
9833 if (VT == MVT::i1)
9834 Opcode = ISD::VP_REDUCE_OR;
9835 break;
9836 }
9837
9838 // Memoize nodes.
9839 SDNode *N;
9840 SDVTList VTs = getVTList(VT);
9841
9842 if (VT != MVT::Glue) {
9844 AddNodeIDNode(ID, Opcode, VTs, Ops);
9845 void *IP = nullptr;
9846
9847 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
9848 return SDValue(E, 0);
9849
9850 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9851 createOperands(N, Ops);
9852
9853 CSEMap.InsertNode(N, IP);
9854 } else {
9855 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9856 createOperands(N, Ops);
9857 }
9858
9859 N->setFlags(Flags);
9860 InsertNode(N);
9861 SDValue V(N, 0);
9862 NewSDValueDbgMsg(V, "Creating new node: ", this);
9863 return V;
9864}
9865
9866SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
9867 ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops) {
9868 return getNode(Opcode, DL, getVTList(ResultTys), Ops);
9869}
9870
9871SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
9872 ArrayRef<SDValue> Ops) {
9873 SDNodeFlags Flags;
9874 if (Inserter)
9875 Flags = Inserter->getFlags();
9876 return getNode(Opcode, DL, VTList, Ops, Flags);
9877}
9878
9879SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
9880 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
9881 if (VTList.NumVTs == 1)
9882 return getNode(Opcode, DL, VTList.VTs[0], Ops, Flags);
9883
9884#ifndef NDEBUG
9885 for (const auto &Op : Ops)
9886 assert(Op.getOpcode() != ISD::DELETED_NODE &&
9887 "Operand is DELETED_NODE!");
9888#endif
9889
9890 switch (Opcode) {
9891 case ISD::SADDO:
9892 case ISD::UADDO:
9893 case ISD::SSUBO:
9894 case ISD::USUBO: {
9895 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
9896 "Invalid add/sub overflow op!");
9897 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
9898 Ops[0].getValueType() == Ops[1].getValueType() &&
9899 Ops[0].getValueType() == VTList.VTs[0] &&
9900 "Binary operator types must match!");
9901 SDValue N1 = Ops[0], N2 = Ops[1];
9902 canonicalizeCommutativeBinop(Opcode, N1, N2);
9903
9904 // (X +- 0) -> X with zero-overflow.
9905 ConstantSDNode *N2CV = isConstOrConstSplat(N2, /*AllowUndefs*/ false,
9906 /*AllowTruncation*/ true);
9907 if (N2CV && N2CV->isZero()) {
9908 SDValue ZeroOverFlow = getConstant(0, DL, VTList.VTs[1]);
9909 return getNode(ISD::MERGE_VALUES, DL, VTList, {N1, ZeroOverFlow}, Flags);
9910 }
9911
9912 if (VTList.VTs[0].isVector() &&
9913 VTList.VTs[0].getVectorElementType() == MVT::i1 &&
9914 VTList.VTs[1].getVectorElementType() == MVT::i1) {
9915 SDValue F1 = getFreeze(N1);
9916 SDValue F2 = getFreeze(N2);
9917 // {vXi1,vXi1} (u/s)addo(vXi1 x, vXi1y) -> {xor(x,y),and(x,y)}
9918 if (Opcode == ISD::UADDO || Opcode == ISD::SADDO)
9919 return getNode(ISD::MERGE_VALUES, DL, VTList,
9920 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
9921 getNode(ISD::AND, DL, VTList.VTs[1], F1, F2)},
9922 Flags);
9923 // {vXi1,vXi1} (u/s)subo(vXi1 x, vXi1y) -> {xor(x,y),and(~x,y)}
9924 if (Opcode == ISD::USUBO || Opcode == ISD::SSUBO) {
9925 SDValue NotF1 = getNOT(DL, F1, VTList.VTs[0]);
9926 return getNode(ISD::MERGE_VALUES, DL, VTList,
9927 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
9928 getNode(ISD::AND, DL, VTList.VTs[1], NotF1, F2)},
9929 Flags);
9930 }
9931 }
9932 break;
9933 }
9934 case ISD::SADDO_CARRY:
9935 case ISD::UADDO_CARRY:
9936 case ISD::SSUBO_CARRY:
9937 case ISD::USUBO_CARRY:
9938 assert(VTList.NumVTs == 2 && Ops.size() == 3 &&
9939 "Invalid add/sub overflow op!");
9940 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
9941 Ops[0].getValueType() == Ops[1].getValueType() &&
9942 Ops[0].getValueType() == VTList.VTs[0] &&
9943 Ops[2].getValueType() == VTList.VTs[1] &&
9944 "Binary operator types must match!");
9945 break;
9946 case ISD::SMUL_LOHI:
9947 case ISD::UMUL_LOHI: {
9948 assert(VTList.NumVTs == 2 && Ops.size() == 2 && "Invalid mul lo/hi op!");
9949 assert(VTList.VTs[0].isInteger() && VTList.VTs[0] == VTList.VTs[1] &&
9950 VTList.VTs[0] == Ops[0].getValueType() &&
9951 VTList.VTs[0] == Ops[1].getValueType() &&
9952 "Binary operator types must match!");
9953 // Constant fold.
9954 ConstantSDNode *LHS = dyn_cast<ConstantSDNode>(Ops[0]);
9955 ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(Ops[1]);
9956 if (LHS && RHS) {
9957 unsigned Width = VTList.VTs[0].getScalarSizeInBits();
9958 unsigned OutWidth = Width * 2;
9959 APInt Val = LHS->getAPIntValue();
9960 APInt Mul = RHS->getAPIntValue();
9961 if (Opcode == ISD::SMUL_LOHI) {
9962 Val = Val.sext(OutWidth);
9963 Mul = Mul.sext(OutWidth);
9964 } else {
9965 Val = Val.zext(OutWidth);
9966 Mul = Mul.zext(OutWidth);
9967 }
9968 Val *= Mul;
9969
9970 SDValue Hi =
9971 getConstant(Val.extractBits(Width, Width), DL, VTList.VTs[0]);
9972 SDValue Lo = getConstant(Val.trunc(Width), DL, VTList.VTs[0]);
9973 return getNode(ISD::MERGE_VALUES, DL, VTList, {Lo, Hi}, Flags);
9974 }
9975 break;
9976 }
9977 case ISD::FFREXP: {
9978 assert(VTList.NumVTs == 2 && Ops.size() == 1 && "Invalid ffrexp op!");
9979 assert(VTList.VTs[0].isFloatingPoint() && VTList.VTs[1].isInteger() &&
9980 VTList.VTs[0] == Ops[0].getValueType() && "frexp type mismatch");
9981
9982 if (const ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Ops[0])) {
9983 int FrexpExp;
9984 APFloat FrexpMant =
9985 frexp(C->getValueAPF(), FrexpExp, APFloat::rmNearestTiesToEven);
9986 SDValue Result0 = getConstantFP(FrexpMant, DL, VTList.VTs[0]);
9987 SDValue Result1 =
9988 getConstant(FrexpMant.isFinite() ? FrexpExp : 0, DL, VTList.VTs[1]);
9989 return getNode(ISD::MERGE_VALUES, DL, VTList, {Result0, Result1}, Flags);
9990 }
9991
9992 break;
9993 }
9995 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
9996 "Invalid STRICT_FP_EXTEND!");
9997 assert(VTList.VTs[0].isFloatingPoint() &&
9998 Ops[1].getValueType().isFloatingPoint() && "Invalid FP cast!");
9999 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
10000 "STRICT_FP_EXTEND result type should be vector iff the operand "
10001 "type is vector!");
10002 assert((!VTList.VTs[0].isVector() ||
10003 VTList.VTs[0].getVectorElementCount() ==
10004 Ops[1].getValueType().getVectorElementCount()) &&
10005 "Vector element count mismatch!");
10006 assert(Ops[1].getValueType().bitsLT(VTList.VTs[0]) &&
10007 "Invalid fpext node, dst <= src!");
10008 break;
10010 assert(VTList.NumVTs == 2 && Ops.size() == 3 && "Invalid STRICT_FP_ROUND!");
10011 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
10012 "STRICT_FP_ROUND result type should be vector iff the operand "
10013 "type is vector!");
10014 assert((!VTList.VTs[0].isVector() ||
10015 VTList.VTs[0].getVectorElementCount() ==
10016 Ops[1].getValueType().getVectorElementCount()) &&
10017 "Vector element count mismatch!");
10018 assert(VTList.VTs[0].isFloatingPoint() &&
10019 Ops[1].getValueType().isFloatingPoint() &&
10020 VTList.VTs[0].bitsLT(Ops[1].getValueType()) &&
10021 isa<ConstantSDNode>(Ops[2]) &&
10022 (Ops[2]->getAsZExtVal() == 0 || Ops[2]->getAsZExtVal() == 1) &&
10023 "Invalid STRICT_FP_ROUND!");
10024 break;
10025#if 0
10026 // FIXME: figure out how to safely handle things like
10027 // int foo(int x) { return 1 << (x & 255); }
10028 // int bar() { return foo(256); }
10029 case ISD::SRA_PARTS:
10030 case ISD::SRL_PARTS:
10031 case ISD::SHL_PARTS:
10032 if (N3.getOpcode() == ISD::SIGN_EXTEND_INREG &&
10033 cast<VTSDNode>(N3.getOperand(1))->getVT() != MVT::i1)
10034 return getNode(Opcode, DL, VT, N1, N2, N3.getOperand(0));
10035 else if (N3.getOpcode() == ISD::AND)
10036 if (ConstantSDNode *AndRHS = dyn_cast<ConstantSDNode>(N3.getOperand(1))) {
10037 // If the and is only masking out bits that cannot effect the shift,
10038 // eliminate the and.
10039 unsigned NumBits = VT.getScalarSizeInBits()*2;
10040 if ((AndRHS->getValue() & (NumBits-1)) == NumBits-1)
10041 return getNode(Opcode, DL, VT, N1, N2, N3.getOperand(0));
10042 }
10043 break;
10044#endif
10045 }
10046
10047 // Memoize the node unless it returns a glue result.
10048 SDNode *N;
10049 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
10051 AddNodeIDNode(ID, Opcode, VTList, Ops);
10052 void *IP = nullptr;
10053 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
10054 return SDValue(E, 0);
10055
10056 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
10057 createOperands(N, Ops);
10058 CSEMap.InsertNode(N, IP);
10059 } else {
10060 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
10061 createOperands(N, Ops);
10062 }
10063
10064 N->setFlags(Flags);
10065 InsertNode(N);
10066 SDValue V(N, 0);
10067 NewSDValueDbgMsg(V, "Creating new node: ", this);
10068 return V;
10069}
10070
10071SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
10072 SDVTList VTList) {
10073 return getNode(Opcode, DL, VTList, std::nullopt);
10074}
10075
10076SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
10077 SDValue N1) {
10078 SDValue Ops[] = { N1 };
10079 return getNode(Opcode, DL, VTList, Ops);
10080}
10081
10082SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
10083 SDValue N1, SDValue N2) {
10084 SDValue Ops[] = { N1, N2 };
10085 return getNode(Opcode, DL, VTList, Ops);
10086}
10087
10088SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
10089 SDValue N1, SDValue N2, SDValue N3) {
10090 SDValue Ops[] = { N1, N2, N3 };
10091 return getNode(Opcode, DL, VTList, Ops);
10092}
10093
10094SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
10095 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
10096 SDValue Ops[] = { N1, N2, N3, N4 };
10097 return getNode(Opcode, DL, VTList, Ops);
10098}
10099
10100SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
10101 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
10102 SDValue N5) {
10103 SDValue Ops[] = { N1, N2, N3, N4, N5 };
10104 return getNode(Opcode, DL, VTList, Ops);
10105}
10106
10108 return makeVTList(SDNode::getValueTypeList(VT), 1);
10109}
10110
10113 ID.AddInteger(2U);
10114 ID.AddInteger(VT1.getRawBits());
10115 ID.AddInteger(VT2.getRawBits());
10116
10117 void *IP = nullptr;
10118 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
10119 if (!Result) {
10120 EVT *Array = Allocator.Allocate<EVT>(2);
10121 Array[0] = VT1;
10122 Array[1] = VT2;
10123 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 2);
10124 VTListMap.InsertNode(Result, IP);
10125 }
10126 return Result->getSDVTList();
10127}
10128
10131 ID.AddInteger(3U);
10132 ID.AddInteger(VT1.getRawBits());
10133 ID.AddInteger(VT2.getRawBits());
10134 ID.AddInteger(VT3.getRawBits());
10135
10136 void *IP = nullptr;
10137 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
10138 if (!Result) {
10139 EVT *Array = Allocator.Allocate<EVT>(3);
10140 Array[0] = VT1;
10141 Array[1] = VT2;
10142 Array[2] = VT3;
10143 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 3);
10144 VTListMap.InsertNode(Result, IP);
10145 }
10146 return Result->getSDVTList();
10147}
10148
10151 ID.AddInteger(4U);
10152 ID.AddInteger(VT1.getRawBits());
10153 ID.AddInteger(VT2.getRawBits());
10154 ID.AddInteger(VT3.getRawBits());
10155 ID.AddInteger(VT4.getRawBits());
10156
10157 void *IP = nullptr;
10158 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
10159 if (!Result) {
10160 EVT *Array = Allocator.Allocate<EVT>(4);
10161 Array[0] = VT1;
10162 Array[1] = VT2;
10163 Array[2] = VT3;
10164 Array[3] = VT4;
10165 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 4);
10166 VTListMap.InsertNode(Result, IP);
10167 }
10168 return Result->getSDVTList();
10169}
10170
10172 unsigned NumVTs = VTs.size();
10174 ID.AddInteger(NumVTs);
10175 for (unsigned index = 0; index < NumVTs; index++) {
10176 ID.AddInteger(VTs[index].getRawBits());
10177 }
10178
10179 void *IP = nullptr;
10180 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
10181 if (!Result) {
10182 EVT *Array = Allocator.Allocate<EVT>(NumVTs);
10183 llvm::copy(VTs, Array);
10184 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, NumVTs);
10185 VTListMap.InsertNode(Result, IP);
10186 }
10187 return Result->getSDVTList();
10188}
10189
10190
10191/// UpdateNodeOperands - *Mutate* the specified node in-place to have the
10192/// specified operands. If the resultant node already exists in the DAG,
10193/// this does not modify the specified node, instead it returns the node that
10194/// already exists. If the resultant node does not exist in the DAG, the
10195/// input node is returned. As a degenerate case, if you specify the same
10196/// input operands as the node already has, the input node is returned.
10198 assert(N->getNumOperands() == 1 && "Update with wrong number of operands");
10199
10200 // Check to see if there is no change.
10201 if (Op == N->getOperand(0)) return N;
10202
10203 // See if the modified node already exists.
10204 void *InsertPos = nullptr;
10205 if (SDNode *Existing = FindModifiedNodeSlot(N, Op, InsertPos))
10206 return Existing;
10207
10208 // Nope it doesn't. Remove the node from its current place in the maps.
10209 if (InsertPos)
10210 if (!RemoveNodeFromCSEMaps(N))
10211 InsertPos = nullptr;
10212
10213 // Now we update the operands.
10214 N->OperandList[0].set(Op);
10215
10217 // If this gets put into a CSE map, add it.
10218 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
10219 return N;
10220}
10221
10223 assert(N->getNumOperands() == 2 && "Update with wrong number of operands");
10224
10225 // Check to see if there is no change.
10226 if (Op1 == N->getOperand(0) && Op2 == N->getOperand(1))
10227 return N; // No operands changed, just return the input node.
10228
10229 // See if the modified node already exists.
10230 void *InsertPos = nullptr;
10231 if (SDNode *Existing = FindModifiedNodeSlot(N, Op1, Op2, InsertPos))
10232 return Existing;
10233
10234 // Nope it doesn't. Remove the node from its current place in the maps.
10235 if (InsertPos)
10236 if (!RemoveNodeFromCSEMaps(N))
10237 InsertPos = nullptr;
10238
10239 // Now we update the operands.
10240 if (N->OperandList[0] != Op1)
10241 N->OperandList[0].set(Op1);
10242 if (N->OperandList[1] != Op2)
10243 N->OperandList[1].set(Op2);
10244
10246 // If this gets put into a CSE map, add it.
10247 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
10248 return N;
10249}
10250
10253 SDValue Ops[] = { Op1, Op2, Op3 };
10254 return UpdateNodeOperands(N, Ops);
10255}
10256
10259 SDValue Op3, SDValue Op4) {
10260 SDValue Ops[] = { Op1, Op2, Op3, Op4 };
10261 return UpdateNodeOperands(N, Ops);
10262}
10263
10266 SDValue Op3, SDValue Op4, SDValue Op5) {
10267 SDValue Ops[] = { Op1, Op2, Op3, Op4, Op5 };
10268 return UpdateNodeOperands(N, Ops);
10269}
10270
10273 unsigned NumOps = Ops.size();
10274 assert(N->getNumOperands() == NumOps &&
10275 "Update with wrong number of operands");
10276
10277 // If no operands changed just return the input node.
10278 if (std::equal(Ops.begin(), Ops.end(), N->op_begin()))
10279 return N;
10280
10281 // See if the modified node already exists.
10282 void *InsertPos = nullptr;
10283 if (SDNode *Existing = FindModifiedNodeSlot(N, Ops, InsertPos))
10284 return Existing;
10285
10286 // Nope it doesn't. Remove the node from its current place in the maps.
10287 if (InsertPos)
10288 if (!RemoveNodeFromCSEMaps(N))
10289 InsertPos = nullptr;
10290
10291 // Now we update the operands.
10292 for (unsigned i = 0; i != NumOps; ++i)
10293 if (N->OperandList[i] != Ops[i])
10294 N->OperandList[i].set(Ops[i]);
10295
10297 // If this gets put into a CSE map, add it.
10298 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
10299 return N;
10300}
10301
10302/// DropOperands - Release the operands and set this node to have
10303/// zero operands.
10305 // Unlike the code in MorphNodeTo that does this, we don't need to
10306 // watch for dead nodes here.
10307 for (op_iterator I = op_begin(), E = op_end(); I != E; ) {
10308 SDUse &Use = *I++;
10309 Use.set(SDValue());
10310 }
10311}
10312
10314 ArrayRef<MachineMemOperand *> NewMemRefs) {
10315 if (NewMemRefs.empty()) {
10316 N->clearMemRefs();
10317 return;
10318 }
10319
10320 // Check if we can avoid allocating by storing a single reference directly.
10321 if (NewMemRefs.size() == 1) {
10322 N->MemRefs = NewMemRefs[0];
10323 N->NumMemRefs = 1;
10324 return;
10325 }
10326
10327 MachineMemOperand **MemRefsBuffer =
10328 Allocator.template Allocate<MachineMemOperand *>(NewMemRefs.size());
10329 llvm::copy(NewMemRefs, MemRefsBuffer);
10330 N->MemRefs = MemRefsBuffer;
10331 N->NumMemRefs = static_cast<int>(NewMemRefs.size());
10332}
10333
10334/// SelectNodeTo - These are wrappers around MorphNodeTo that accept a
10335/// machine opcode.
10336///
10338 EVT VT) {
10339 SDVTList VTs = getVTList(VT);
10340 return SelectNodeTo(N, MachineOpc, VTs, std::nullopt);
10341}
10342
10344 EVT VT, SDValue Op1) {
10345 SDVTList VTs = getVTList(VT);
10346 SDValue Ops[] = { Op1 };
10347 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10348}
10349
10351 EVT VT, SDValue Op1,
10352 SDValue Op2) {
10353 SDVTList VTs = getVTList(VT);
10354 SDValue Ops[] = { Op1, Op2 };
10355 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10356}
10357
10359 EVT VT, SDValue Op1,
10360 SDValue Op2, SDValue Op3) {
10361 SDVTList VTs = getVTList(VT);
10362 SDValue Ops[] = { Op1, Op2, Op3 };
10363 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10364}
10365
10367 EVT VT, ArrayRef<SDValue> Ops) {
10368 SDVTList VTs = getVTList(VT);
10369 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10370}
10371
10373 EVT VT1, EVT VT2, ArrayRef<SDValue> Ops) {
10374 SDVTList VTs = getVTList(VT1, VT2);
10375 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10376}
10377
10379 EVT VT1, EVT VT2) {
10380 SDVTList VTs = getVTList(VT1, VT2);
10381 return SelectNodeTo(N, MachineOpc, VTs, std::nullopt);
10382}
10383
10385 EVT VT1, EVT VT2, EVT VT3,
10386 ArrayRef<SDValue> Ops) {
10387 SDVTList VTs = getVTList(VT1, VT2, VT3);
10388 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10389}
10390
10392 EVT VT1, EVT VT2,
10393 SDValue Op1, SDValue Op2) {
10394 SDVTList VTs = getVTList(VT1, VT2);
10395 SDValue Ops[] = { Op1, Op2 };
10396 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10397}
10398
10400 SDVTList VTs,ArrayRef<SDValue> Ops) {
10401 SDNode *New = MorphNodeTo(N, ~MachineOpc, VTs, Ops);
10402 // Reset the NodeID to -1.
10403 New->setNodeId(-1);
10404 if (New != N) {
10405 ReplaceAllUsesWith(N, New);
10407 }
10408 return New;
10409}
10410
10411/// UpdateSDLocOnMergeSDNode - If the opt level is -O0 then it throws away
10412/// the line number information on the merged node since it is not possible to
10413/// preserve the information that operation is associated with multiple lines.
10414/// This will make the debugger working better at -O0, were there is a higher
10415/// probability having other instructions associated with that line.
10416///
10417/// For IROrder, we keep the smaller of the two
10418SDNode *SelectionDAG::UpdateSDLocOnMergeSDNode(SDNode *N, const SDLoc &OLoc) {
10419 DebugLoc NLoc = N->getDebugLoc();
10420 if (NLoc && OptLevel == CodeGenOptLevel::None && OLoc.getDebugLoc() != NLoc) {
10421 N->setDebugLoc(DebugLoc());
10422 }
10423 unsigned Order = std::min(N->getIROrder(), OLoc.getIROrder());
10424 N->setIROrder(Order);
10425 return N;
10426}
10427
10428/// MorphNodeTo - This *mutates* the specified node to have the specified
10429/// return type, opcode, and operands.
10430///
10431/// Note that MorphNodeTo returns the resultant node. If there is already a
10432/// node of the specified opcode and operands, it returns that node instead of
10433/// the current one. Note that the SDLoc need not be the same.
10434///
10435/// Using MorphNodeTo is faster than creating a new node and swapping it in
10436/// with ReplaceAllUsesWith both because it often avoids allocating a new
10437/// node, and because it doesn't require CSE recalculation for any of
10438/// the node's users.
10439///
10440/// However, note that MorphNodeTo recursively deletes dead nodes from the DAG.
10441/// As a consequence it isn't appropriate to use from within the DAG combiner or
10442/// the legalizer which maintain worklists that would need to be updated when
10443/// deleting things.
10445 SDVTList VTs, ArrayRef<SDValue> Ops) {
10446 // If an identical node already exists, use it.
10447 void *IP = nullptr;
10448 if (VTs.VTs[VTs.NumVTs-1] != MVT::Glue) {
10450 AddNodeIDNode(ID, Opc, VTs, Ops);
10451 if (SDNode *ON = FindNodeOrInsertPos(ID, SDLoc(N), IP))
10452 return UpdateSDLocOnMergeSDNode(ON, SDLoc(N));
10453 }
10454
10455 if (!RemoveNodeFromCSEMaps(N))
10456 IP = nullptr;
10457
10458 // Start the morphing.
10459 N->NodeType = Opc;
10460 N->ValueList = VTs.VTs;
10461 N->NumValues = VTs.NumVTs;
10462
10463 // Clear the operands list, updating used nodes to remove this from their
10464 // use list. Keep track of any operands that become dead as a result.
10465 SmallPtrSet<SDNode*, 16> DeadNodeSet;
10466 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
10467 SDUse &Use = *I++;
10468 SDNode *Used = Use.getNode();
10469 Use.set(SDValue());
10470 if (Used->use_empty())
10471 DeadNodeSet.insert(Used);
10472 }
10473
10474 // For MachineNode, initialize the memory references information.
10475 if (MachineSDNode *MN = dyn_cast<MachineSDNode>(N))
10476 MN->clearMemRefs();
10477
10478 // Swap for an appropriately sized array from the recycler.
10479 removeOperands(N);
10480 createOperands(N, Ops);
10481
10482 // Delete any nodes that are still dead after adding the uses for the
10483 // new operands.
10484 if (!DeadNodeSet.empty()) {
10485 SmallVector<SDNode *, 16> DeadNodes;
10486 for (SDNode *N : DeadNodeSet)
10487 if (N->use_empty())
10488 DeadNodes.push_back(N);
10489 RemoveDeadNodes(DeadNodes);
10490 }
10491
10492 if (IP)
10493 CSEMap.InsertNode(N, IP); // Memoize the new node.
10494 return N;
10495}
10496
10498 unsigned OrigOpc = Node->getOpcode();
10499 unsigned NewOpc;
10500 switch (OrigOpc) {
10501 default:
10502 llvm_unreachable("mutateStrictFPToFP called with unexpected opcode!");
10503#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
10504 case ISD::STRICT_##DAGN: NewOpc = ISD::DAGN; break;
10505#define CMP_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
10506 case ISD::STRICT_##DAGN: NewOpc = ISD::SETCC; break;
10507#include "llvm/IR/ConstrainedOps.def"
10508 }
10509
10510 assert(Node->getNumValues() == 2 && "Unexpected number of results!");
10511
10512 // We're taking this node out of the chain, so we need to re-link things.
10513 SDValue InputChain = Node->getOperand(0);
10514 SDValue OutputChain = SDValue(Node, 1);
10515 ReplaceAllUsesOfValueWith(OutputChain, InputChain);
10516
10518 for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
10519 Ops.push_back(Node->getOperand(i));
10520
10521 SDVTList VTs = getVTList(Node->getValueType(0));
10522 SDNode *Res = MorphNodeTo(Node, NewOpc, VTs, Ops);
10523
10524 // MorphNodeTo can operate in two ways: if an existing node with the
10525 // specified operands exists, it can just return it. Otherwise, it
10526 // updates the node in place to have the requested operands.
10527 if (Res == Node) {
10528 // If we updated the node in place, reset the node ID. To the isel,
10529 // this should be just like a newly allocated machine node.
10530 Res->setNodeId(-1);
10531 } else {
10532 ReplaceAllUsesWith(Node, Res);
10533 RemoveDeadNode(Node);
10534 }
10535
10536 return Res;
10537}
10538
10539/// getMachineNode - These are used for target selectors to create a new node
10540/// with specified return type(s), MachineInstr opcode, and operands.
10541///
10542/// Note that getMachineNode returns the resultant node. If there is already a
10543/// node of the specified opcode and operands, it returns that node instead of
10544/// the current one.
10546 EVT VT) {
10547 SDVTList VTs = getVTList(VT);
10548 return getMachineNode(Opcode, dl, VTs, std::nullopt);
10549}
10550
10552 EVT VT, SDValue Op1) {
10553 SDVTList VTs = getVTList(VT);
10554 SDValue Ops[] = { Op1 };
10555 return getMachineNode(Opcode, dl, VTs, Ops);
10556}
10557
10559 EVT VT, SDValue Op1, SDValue Op2) {
10560 SDVTList VTs = getVTList(VT);
10561 SDValue Ops[] = { Op1, Op2 };
10562 return getMachineNode(Opcode, dl, VTs, Ops);
10563}
10564
10566 EVT VT, SDValue Op1, SDValue Op2,
10567 SDValue Op3) {
10568 SDVTList VTs = getVTList(VT);
10569 SDValue Ops[] = { Op1, Op2, Op3 };
10570 return getMachineNode(Opcode, dl, VTs, Ops);
10571}
10572
10574 EVT VT, ArrayRef<SDValue> Ops) {
10575 SDVTList VTs = getVTList(VT);
10576 return getMachineNode(Opcode, dl, VTs, Ops);
10577}
10578
10580 EVT VT1, EVT VT2, SDValue Op1,
10581 SDValue Op2) {
10582 SDVTList VTs = getVTList(VT1, VT2);
10583 SDValue Ops[] = { Op1, Op2 };
10584 return getMachineNode(Opcode, dl, VTs, Ops);
10585}
10586
10588 EVT VT1, EVT VT2, SDValue Op1,
10589 SDValue Op2, SDValue Op3) {
10590 SDVTList VTs = getVTList(VT1, VT2);
10591 SDValue Ops[] = { Op1, Op2, Op3 };
10592 return getMachineNode(Opcode, dl, VTs, Ops);
10593}
10594
10596 EVT VT1, EVT VT2,
10597 ArrayRef<SDValue> Ops) {
10598 SDVTList VTs = getVTList(VT1, VT2);
10599 return getMachineNode(Opcode, dl, VTs, Ops);
10600}
10601
10603 EVT VT1, EVT VT2, EVT VT3,
10604 SDValue Op1, SDValue Op2) {
10605 SDVTList VTs = getVTList(VT1, VT2, VT3);
10606 SDValue Ops[] = { Op1, Op2 };
10607 return getMachineNode(Opcode, dl, VTs, Ops);
10608}
10609
10611 EVT VT1, EVT VT2, EVT VT3,
10612 SDValue Op1, SDValue Op2,
10613 SDValue Op3) {
10614 SDVTList VTs = getVTList(VT1, VT2, VT3);
10615 SDValue Ops[] = { Op1, Op2, Op3 };
10616 return getMachineNode(Opcode, dl, VTs, Ops);
10617}
10618
10620 EVT VT1, EVT VT2, EVT VT3,
10621 ArrayRef<SDValue> Ops) {
10622 SDVTList VTs = getVTList(VT1, VT2, VT3);
10623 return getMachineNode(Opcode, dl, VTs, Ops);
10624}
10625
10627 ArrayRef<EVT> ResultTys,
10628 ArrayRef<SDValue> Ops) {
10629 SDVTList VTs = getVTList(ResultTys);
10630 return getMachineNode(Opcode, dl, VTs, Ops);
10631}
10632
10634 SDVTList VTs,
10635 ArrayRef<SDValue> Ops) {
10636 bool DoCSE = VTs.VTs[VTs.NumVTs-1] != MVT::Glue;
10638 void *IP = nullptr;
10639
10640 if (DoCSE) {
10642 AddNodeIDNode(ID, ~Opcode, VTs, Ops);
10643 IP = nullptr;
10644 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
10645 return cast<MachineSDNode>(UpdateSDLocOnMergeSDNode(E, DL));
10646 }
10647 }
10648
10649 // Allocate a new MachineSDNode.
10650 N = newSDNode<MachineSDNode>(~Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
10651 createOperands(N, Ops);
10652
10653 if (DoCSE)
10654 CSEMap.InsertNode(N, IP);
10655
10656 InsertNode(N);
10657 NewSDValueDbgMsg(SDValue(N, 0), "Creating new machine node: ", this);
10658 return N;
10659}
10660
10661/// getTargetExtractSubreg - A convenience function for creating
10662/// TargetOpcode::EXTRACT_SUBREG nodes.
10664 SDValue Operand) {
10665 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
10666 SDNode *Subreg = getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL,
10667 VT, Operand, SRIdxVal);
10668 return SDValue(Subreg, 0);
10669}
10670
10671/// getTargetInsertSubreg - A convenience function for creating
10672/// TargetOpcode::INSERT_SUBREG nodes.
10674 SDValue Operand, SDValue Subreg) {
10675 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
10676 SDNode *Result = getMachineNode(TargetOpcode::INSERT_SUBREG, DL,
10677 VT, Operand, Subreg, SRIdxVal);
10678 return SDValue(Result, 0);
10679}
10680
10681/// getNodeIfExists - Get the specified node if it's already available, or
10682/// else return NULL.
10684 ArrayRef<SDValue> Ops) {
10685 SDNodeFlags Flags;
10686 if (Inserter)
10687 Flags = Inserter->getFlags();
10688 return getNodeIfExists(Opcode, VTList, Ops, Flags);
10689}
10690
10693 const SDNodeFlags Flags) {
10694 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {
10696 AddNodeIDNode(ID, Opcode, VTList, Ops);
10697 void *IP = nullptr;
10698 if (SDNode *E = FindNodeOrInsertPos(ID, SDLoc(), IP)) {
10699 E->intersectFlagsWith(Flags);
10700 return E;
10701 }
10702 }
10703 return nullptr;
10704}
10705
10706/// doesNodeExist - Check if a node exists without modifying its flags.
10707bool SelectionDAG::doesNodeExist(unsigned Opcode, SDVTList VTList,
10708 ArrayRef<SDValue> Ops) {
10709 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {
10711 AddNodeIDNode(ID, Opcode, VTList, Ops);
10712 void *IP = nullptr;
10713 if (FindNodeOrInsertPos(ID, SDLoc(), IP))
10714 return true;
10715 }
10716 return false;
10717}
10718
10719/// getDbgValue - Creates a SDDbgValue node.
10720///
10721/// SDNode
10723 SDNode *N, unsigned R, bool IsIndirect,
10724 const DebugLoc &DL, unsigned O) {
10725 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
10726 "Expected inlined-at fields to agree");
10727 return new (DbgInfo->getAlloc())
10728 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromNode(N, R),
10729 {}, IsIndirect, DL, O,
10730 /*IsVariadic=*/false);
10731}
10732
10733/// Constant
10735 DIExpression *Expr,
10736 const Value *C,
10737 const DebugLoc &DL, unsigned O) {
10738 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
10739 "Expected inlined-at fields to agree");
10740 return new (DbgInfo->getAlloc())
10741 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromConst(C), {},
10742 /*IsIndirect=*/false, DL, O,
10743 /*IsVariadic=*/false);
10744}
10745
10746/// FrameIndex
10748 DIExpression *Expr, unsigned FI,
10749 bool IsIndirect,
10750 const DebugLoc &DL,
10751 unsigned O) {
10752 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
10753 "Expected inlined-at fields to agree");
10754 return getFrameIndexDbgValue(Var, Expr, FI, {}, IsIndirect, DL, O);
10755}
10756
10757/// FrameIndex with dependencies
10759 DIExpression *Expr, unsigned FI,
10760 ArrayRef<SDNode *> Dependencies,
10761 bool IsIndirect,
10762 const DebugLoc &DL,
10763 unsigned O) {
10764 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
10765 "Expected inlined-at fields to agree");
10766 return new (DbgInfo->getAlloc())
10767 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromFrameIdx(FI),
10768 Dependencies, IsIndirect, DL, O,
10769 /*IsVariadic=*/false);
10770}
10771
10772/// VReg
10774 unsigned VReg, bool IsIndirect,
10775 const DebugLoc &DL, unsigned O) {
10776 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
10777 "Expected inlined-at fields to agree");
10778 return new (DbgInfo->getAlloc())
10779 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromVReg(VReg),
10780 {}, IsIndirect, DL, O,
10781 /*IsVariadic=*/false);
10782}
10783
10786 ArrayRef<SDNode *> Dependencies,
10787 bool IsIndirect, const DebugLoc &DL,
10788 unsigned O, bool IsVariadic) {
10789 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
10790 "Expected inlined-at fields to agree");
10791 return new (DbgInfo->getAlloc())
10792 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, Locs, Dependencies, IsIndirect,
10793 DL, O, IsVariadic);
10794}
10795
10797 unsigned OffsetInBits, unsigned SizeInBits,
10798 bool InvalidateDbg) {
10799 SDNode *FromNode = From.getNode();
10800 SDNode *ToNode = To.getNode();
10801 assert(FromNode && ToNode && "Can't modify dbg values");
10802
10803 // PR35338
10804 // TODO: assert(From != To && "Redundant dbg value transfer");
10805 // TODO: assert(FromNode != ToNode && "Intranode dbg value transfer");
10806 if (From == To || FromNode == ToNode)
10807 return;
10808
10809 if (!FromNode->getHasDebugValue())
10810 return;
10811
10812 SDDbgOperand FromLocOp =
10813 SDDbgOperand::fromNode(From.getNode(), From.getResNo());
10815
10817 for (SDDbgValue *Dbg : GetDbgValues(FromNode)) {
10818 if (Dbg->isInvalidated())
10819 continue;
10820
10821 // TODO: assert(!Dbg->isInvalidated() && "Transfer of invalid dbg value");
10822
10823 // Create a new location ops vector that is equal to the old vector, but
10824 // with each instance of FromLocOp replaced with ToLocOp.
10825 bool Changed = false;
10826 auto NewLocOps = Dbg->copyLocationOps();
10827 std::replace_if(
10828 NewLocOps.begin(), NewLocOps.end(),
10829 [&Changed, FromLocOp](const SDDbgOperand &Op) {
10830 bool Match = Op == FromLocOp;
10831 Changed |= Match;
10832 return Match;
10833 },
10834 ToLocOp);
10835 // Ignore this SDDbgValue if we didn't find a matching location.
10836 if (!Changed)
10837 continue;
10838
10839 DIVariable *Var = Dbg->getVariable();
10840 auto *Expr = Dbg->getExpression();
10841 // If a fragment is requested, update the expression.
10842 if (SizeInBits) {
10843 // When splitting a larger (e.g., sign-extended) value whose
10844 // lower bits are described with an SDDbgValue, do not attempt
10845 // to transfer the SDDbgValue to the upper bits.
10846 if (auto FI = Expr->getFragmentInfo())
10847 if (OffsetInBits + SizeInBits > FI->SizeInBits)
10848 continue;
10849 auto Fragment = DIExpression::createFragmentExpression(Expr, OffsetInBits,
10850 SizeInBits);
10851 if (!Fragment)
10852 continue;
10853 Expr = *Fragment;
10854 }
10855
10856 auto AdditionalDependencies = Dbg->getAdditionalDependencies();
10857 // Clone the SDDbgValue and move it to To.
10858 SDDbgValue *Clone = getDbgValueList(
10859 Var, Expr, NewLocOps, AdditionalDependencies, Dbg->isIndirect(),
10860 Dbg->getDebugLoc(), std::max(ToNode->getIROrder(), Dbg->getOrder()),
10861 Dbg->isVariadic());
10862 ClonedDVs.push_back(Clone);
10863
10864 if (InvalidateDbg) {
10865 // Invalidate value and indicate the SDDbgValue should not be emitted.
10866 Dbg->setIsInvalidated();
10867 Dbg->setIsEmitted();
10868 }
10869 }
10870
10871 for (SDDbgValue *Dbg : ClonedDVs) {
10872 assert(is_contained(Dbg->getSDNodes(), ToNode) &&
10873 "Transferred DbgValues should depend on the new SDNode");
10874 AddDbgValue(Dbg, false);
10875 }
10876}
10877
10879 if (!N.getHasDebugValue())
10880 return;
10881
10883 for (auto *DV : GetDbgValues(&N)) {
10884 if (DV->isInvalidated())
10885 continue;
10886 switch (N.getOpcode()) {
10887 default:
10888 break;
10889 case ISD::ADD: {
10890 SDValue N0 = N.getOperand(0);
10891 SDValue N1 = N.getOperand(1);
10892 if (!isa<ConstantSDNode>(N0)) {
10893 bool RHSConstant = isa<ConstantSDNode>(N1);
10895 if (RHSConstant)
10896 Offset = N.getConstantOperandVal(1);
10897 // We are not allowed to turn indirect debug values variadic, so
10898 // don't salvage those.
10899 if (!RHSConstant && DV->isIndirect())
10900 continue;
10901
10902 // Rewrite an ADD constant node into a DIExpression. Since we are
10903 // performing arithmetic to compute the variable's *value* in the
10904 // DIExpression, we need to mark the expression with a
10905 // DW_OP_stack_value.
10906 auto *DIExpr = DV->getExpression();
10907 auto NewLocOps = DV->copyLocationOps();
10908 bool Changed = false;
10909 size_t OrigLocOpsSize = NewLocOps.size();
10910 for (size_t i = 0; i < OrigLocOpsSize; ++i) {
10911 // We're not given a ResNo to compare against because the whole
10912 // node is going away. We know that any ISD::ADD only has one
10913 // result, so we can assume any node match is using the result.
10914 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
10915 NewLocOps[i].getSDNode() != &N)
10916 continue;
10917 NewLocOps[i] = SDDbgOperand::fromNode(N0.getNode(), N0.getResNo());
10918 if (RHSConstant) {
10921 DIExpr = DIExpression::appendOpsToArg(DIExpr, ExprOps, i, true);
10922 } else {
10923 // Convert to a variadic expression (if not already).
10924 // convertToVariadicExpression() returns a const pointer, so we use
10925 // a temporary const variable here.
10926 const auto *TmpDIExpr =
10930 ExprOps.push_back(NewLocOps.size());
10931 ExprOps.push_back(dwarf::DW_OP_plus);
10934 NewLocOps.push_back(RHS);
10935 DIExpr = DIExpression::appendOpsToArg(TmpDIExpr, ExprOps, i, true);
10936 }
10937 Changed = true;
10938 }
10939 (void)Changed;
10940 assert(Changed && "Salvage target doesn't use N");
10941
10942 bool IsVariadic =
10943 DV->isVariadic() || OrigLocOpsSize != NewLocOps.size();
10944
10945 auto AdditionalDependencies = DV->getAdditionalDependencies();
10946 SDDbgValue *Clone = getDbgValueList(
10947 DV->getVariable(), DIExpr, NewLocOps, AdditionalDependencies,
10948 DV->isIndirect(), DV->getDebugLoc(), DV->getOrder(), IsVariadic);
10949 ClonedDVs.push_back(Clone);
10950 DV->setIsInvalidated();
10951 DV->setIsEmitted();
10952 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting";
10953 N0.getNode()->dumprFull(this);
10954 dbgs() << " into " << *DIExpr << '\n');
10955 }
10956 break;
10957 }
10958 case ISD::TRUNCATE: {
10959 SDValue N0 = N.getOperand(0);
10960 TypeSize FromSize = N0.getValueSizeInBits();
10961 TypeSize ToSize = N.getValueSizeInBits(0);
10962
10963 DIExpression *DbgExpression = DV->getExpression();
10964 auto ExtOps = DIExpression::getExtOps(FromSize, ToSize, false);
10965 auto NewLocOps = DV->copyLocationOps();
10966 bool Changed = false;
10967 for (size_t i = 0; i < NewLocOps.size(); ++i) {
10968 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
10969 NewLocOps[i].getSDNode() != &N)
10970 continue;
10971
10972 NewLocOps[i] = SDDbgOperand::fromNode(N0.getNode(), N0.getResNo());
10973 DbgExpression = DIExpression::appendOpsToArg(DbgExpression, ExtOps, i);
10974 Changed = true;
10975 }
10976 assert(Changed && "Salvage target doesn't use N");
10977 (void)Changed;
10978
10979 SDDbgValue *Clone =
10980 getDbgValueList(DV->getVariable(), DbgExpression, NewLocOps,
10981 DV->getAdditionalDependencies(), DV->isIndirect(),
10982 DV->getDebugLoc(), DV->getOrder(), DV->isVariadic());
10983
10984 ClonedDVs.push_back(Clone);
10985 DV->setIsInvalidated();
10986 DV->setIsEmitted();
10987 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting"; N0.getNode()->dumprFull(this);
10988 dbgs() << " into " << *DbgExpression << '\n');
10989 break;
10990 }
10991 }
10992 }
10993
10994 for (SDDbgValue *Dbg : ClonedDVs) {
10995 assert(!Dbg->getSDNodes().empty() &&
10996 "Salvaged DbgValue should depend on a new SDNode");
10997 AddDbgValue(Dbg, false);
10998 }
10999}
11000
11001/// Creates a SDDbgLabel node.
11003 const DebugLoc &DL, unsigned O) {
11004 assert(cast<DILabel>(Label)->isValidLocationForIntrinsic(DL) &&
11005 "Expected inlined-at fields to agree");
11006 return new (DbgInfo->getAlloc()) SDDbgLabel(Label, DL, O);
11007}
11008
11009namespace {
11010
11011/// RAUWUpdateListener - Helper for ReplaceAllUsesWith - When the node
11012/// pointed to by a use iterator is deleted, increment the use iterator
11013/// so that it doesn't dangle.
11014///
11015class RAUWUpdateListener : public SelectionDAG::DAGUpdateListener {
11018
11019 void NodeDeleted(SDNode *N, SDNode *E) override {
11020 // Increment the iterator as needed.
11021 while (UI != UE && N == *UI)
11022 ++UI;
11023 }
11024
11025public:
11026 RAUWUpdateListener(SelectionDAG &d,
11029 : SelectionDAG::DAGUpdateListener(d), UI(ui), UE(ue) {}
11030};
11031
11032} // end anonymous namespace
11033
11034/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
11035/// This can cause recursive merging of nodes in the DAG.
11036///
11037/// This version assumes From has a single result value.
11038///
11040 SDNode *From = FromN.getNode();
11041 assert(From->getNumValues() == 1 && FromN.getResNo() == 0 &&
11042 "Cannot replace with this method!");
11043 assert(From != To.getNode() && "Cannot replace uses of with self");
11044
11045 // Preserve Debug Values
11046 transferDbgValues(FromN, To);
11047 // Preserve extra info.
11048 copyExtraInfo(From, To.getNode());
11049
11050 // Iterate over all the existing uses of From. New uses will be added
11051 // to the beginning of the use list, which we avoid visiting.
11052 // This specifically avoids visiting uses of From that arise while the
11053 // replacement is happening, because any such uses would be the result
11054 // of CSE: If an existing node looks like From after one of its operands
11055 // is replaced by To, we don't want to replace of all its users with To
11056 // too. See PR3018 for more info.
11057 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
11058 RAUWUpdateListener Listener(*this, UI, UE);
11059 while (UI != UE) {
11060 SDNode *User = *UI;
11061
11062 // This node is about to morph, remove its old self from the CSE maps.
11063 RemoveNodeFromCSEMaps(User);
11064
11065 // A user can appear in a use list multiple times, and when this
11066 // happens the uses are usually next to each other in the list.
11067 // To help reduce the number of CSE recomputations, process all
11068 // the uses of this user that we can find this way.
11069 do {
11070 SDUse &Use = UI.getUse();
11071 ++UI;
11072 Use.set(To);
11073 if (To->isDivergent() != From->isDivergent())
11075 } while (UI != UE && *UI == User);
11076 // Now that we have modified User, add it back to the CSE maps. If it
11077 // already exists there, recursively merge the results together.
11078 AddModifiedNodeToCSEMaps(User);
11079 }
11080
11081 // If we just RAUW'd the root, take note.
11082 if (FromN == getRoot())
11083 setRoot(To);
11084}
11085
11086/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
11087/// This can cause recursive merging of nodes in the DAG.
11088///
11089/// This version assumes that for each value of From, there is a
11090/// corresponding value in To in the same position with the same type.
11091///
11093#ifndef NDEBUG
11094 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
11095 assert((!From->hasAnyUseOfValue(i) ||
11096 From->getValueType(i) == To->getValueType(i)) &&
11097 "Cannot use this version of ReplaceAllUsesWith!");
11098#endif
11099
11100 // Handle the trivial case.
11101 if (From == To)
11102 return;
11103
11104 // Preserve Debug Info. Only do this if there's a use.
11105 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
11106 if (From->hasAnyUseOfValue(i)) {
11107 assert((i < To->getNumValues()) && "Invalid To location");
11109 }
11110 // Preserve extra info.
11111 copyExtraInfo(From, To);
11112
11113 // Iterate over just the existing users of From. See the comments in
11114 // the ReplaceAllUsesWith above.
11115 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
11116 RAUWUpdateListener Listener(*this, UI, UE);
11117 while (UI != UE) {
11118 SDNode *User = *UI;
11119
11120 // This node is about to morph, remove its old self from the CSE maps.
11121 RemoveNodeFromCSEMaps(User);
11122
11123 // A user can appear in a use list multiple times, and when this
11124 // happens the uses are usually next to each other in the list.
11125 // To help reduce the number of CSE recomputations, process all
11126 // the uses of this user that we can find this way.
11127 do {
11128 SDUse &Use = UI.getUse();
11129 ++UI;
11130 Use.setNode(To);
11131 if (To->isDivergent() != From->isDivergent())
11133 } while (UI != UE && *UI == User);
11134
11135 // Now that we have modified User, add it back to the CSE maps. If it
11136 // already exists there, recursively merge the results together.
11137 AddModifiedNodeToCSEMaps(User);
11138 }
11139
11140 // If we just RAUW'd the root, take note.
11141 if (From == getRoot().getNode())
11142 setRoot(SDValue(To, getRoot().getResNo()));
11143}
11144
11145/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
11146/// This can cause recursive merging of nodes in the DAG.
11147///
11148/// This version can replace From with any result values. To must match the
11149/// number and types of values returned by From.
11151 if (From->getNumValues() == 1) // Handle the simple case efficiently.
11152 return ReplaceAllUsesWith(SDValue(From, 0), To[0]);
11153
11154 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) {
11155 // Preserve Debug Info.
11156 transferDbgValues(SDValue(From, i), To[i]);
11157 // Preserve extra info.
11158 copyExtraInfo(From, To[i].getNode());
11159 }
11160
11161 // Iterate over just the existing users of From. See the comments in
11162 // the ReplaceAllUsesWith above.
11163 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
11164 RAUWUpdateListener Listener(*this, UI, UE);
11165 while (UI != UE) {
11166 SDNode *User = *UI;
11167
11168 // This node is about to morph, remove its old self from the CSE maps.
11169 RemoveNodeFromCSEMaps(User);
11170
11171 // A user can appear in a use list multiple times, and when this happens the
11172 // uses are usually next to each other in the list. To help reduce the
11173 // number of CSE and divergence recomputations, process all the uses of this
11174 // user that we can find this way.
11175 bool To_IsDivergent = false;
11176 do {
11177 SDUse &Use = UI.getUse();
11178 const SDValue &ToOp = To[Use.getResNo()];
11179 ++UI;
11180 Use.set(ToOp);
11181 To_IsDivergent |= ToOp->isDivergent();
11182 } while (UI != UE && *UI == User);
11183
11184 if (To_IsDivergent != From->isDivergent())
11186
11187 // Now that we have modified User, add it back to the CSE maps. If it
11188 // already exists there, recursively merge the results together.
11189 AddModifiedNodeToCSEMaps(User);
11190 }
11191
11192 // If we just RAUW'd the root, take note.
11193 if (From == getRoot().getNode())
11194 setRoot(SDValue(To[getRoot().getResNo()]));
11195}
11196
11197/// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
11198/// uses of other values produced by From.getNode() alone. The Deleted
11199/// vector is handled the same way as for ReplaceAllUsesWith.
11201 // Handle the really simple, really trivial case efficiently.
11202 if (From == To) return;
11203
11204 // Handle the simple, trivial, case efficiently.
11205 if (From.getNode()->getNumValues() == 1) {
11207 return;
11208 }
11209
11210 // Preserve Debug Info.
11212 copyExtraInfo(From.getNode(), To.getNode());
11213
11214 // Iterate over just the existing users of From. See the comments in
11215 // the ReplaceAllUsesWith above.
11216 SDNode::use_iterator UI = From.getNode()->use_begin(),
11217 UE = From.getNode()->use_end();
11218 RAUWUpdateListener Listener(*this, UI, UE);
11219 while (UI != UE) {
11220 SDNode *User = *UI;
11221 bool UserRemovedFromCSEMaps = false;
11222
11223 // A user can appear in a use list multiple times, and when this
11224 // happens the uses are usually next to each other in the list.
11225 // To help reduce the number of CSE recomputations, process all
11226 // the uses of this user that we can find this way.
11227 do {
11228 SDUse &Use = UI.getUse();
11229
11230 // Skip uses of different values from the same node.
11231 if (Use.getResNo() != From.getResNo()) {
11232 ++UI;
11233 continue;
11234 }
11235
11236 // If this node hasn't been modified yet, it's still in the CSE maps,
11237 // so remove its old self from the CSE maps.
11238 if (!UserRemovedFromCSEMaps) {
11239 RemoveNodeFromCSEMaps(User);
11240 UserRemovedFromCSEMaps = true;
11241 }
11242
11243 ++UI;
11244 Use.set(To);
11245 if (To->isDivergent() != From->isDivergent())
11247 } while (UI != UE && *UI == User);
11248 // We are iterating over all uses of the From node, so if a use
11249 // doesn't use the specific value, no changes are made.
11250 if (!UserRemovedFromCSEMaps)
11251 continue;
11252
11253 // Now that we have modified User, add it back to the CSE maps. If it
11254 // already exists there, recursively merge the results together.
11255 AddModifiedNodeToCSEMaps(User);
11256 }
11257
11258 // If we just RAUW'd the root, take note.
11259 if (From == getRoot())
11260 setRoot(To);
11261}
11262
11263namespace {
11264
11265/// UseMemo - This class is used by SelectionDAG::ReplaceAllUsesOfValuesWith
11266/// to record information about a use.
11267struct UseMemo {
11268 SDNode *User;
11269 unsigned Index;
11270 SDUse *Use;
11271};
11272
11273/// operator< - Sort Memos by User.
11274bool operator<(const UseMemo &L, const UseMemo &R) {
11275 return (intptr_t)L.User < (intptr_t)R.User;
11276}
11277
11278/// RAUOVWUpdateListener - Helper for ReplaceAllUsesOfValuesWith - When the node
11279/// pointed to by a UseMemo is deleted, set the User to nullptr to indicate that
11280/// the node already has been taken care of recursively.
11281class RAUOVWUpdateListener : public SelectionDAG::DAGUpdateListener {
11283
11284 void NodeDeleted(SDNode *N, SDNode *E) override {
11285 for (UseMemo &Memo : Uses)
11286 if (Memo.User == N)
11287 Memo.User = nullptr;
11288 }
11289
11290public:
11291 RAUOVWUpdateListener(SelectionDAG &d, SmallVector<UseMemo, 4> &uses)
11292 : SelectionDAG::DAGUpdateListener(d), Uses(uses) {}
11293};
11294
11295} // end anonymous namespace
11296
11298 if (TLI->isSDNodeAlwaysUniform(N)) {
11299 assert(!TLI->isSDNodeSourceOfDivergence(N, FLI, UA) &&
11300 "Conflicting divergence information!");
11301 return false;
11302 }
11303 if (TLI->isSDNodeSourceOfDivergence(N, FLI, UA))
11304 return true;
11305 for (const auto &Op : N->ops()) {
11306 if (Op.Val.getValueType() != MVT::Other && Op.getNode()->isDivergent())
11307 return true;
11308 }
11309 return false;
11310}
11311
11313 SmallVector<SDNode *, 16> Worklist(1, N);
11314 do {
11315 N = Worklist.pop_back_val();
11316 bool IsDivergent = calculateDivergence(N);
11317 if (N->SDNodeBits.IsDivergent != IsDivergent) {
11318 N->SDNodeBits.IsDivergent = IsDivergent;
11319 llvm::append_range(Worklist, N->uses());
11320 }
11321 } while (!Worklist.empty());
11322}
11323
11324void SelectionDAG::CreateTopologicalOrder(std::vector<SDNode *> &Order) {
11326 Order.reserve(AllNodes.size());
11327 for (auto &N : allnodes()) {
11328 unsigned NOps = N.getNumOperands();
11329 Degree[&N] = NOps;
11330 if (0 == NOps)
11331 Order.push_back(&N);
11332 }
11333 for (size_t I = 0; I != Order.size(); ++I) {
11334 SDNode *N = Order[I];
11335 for (auto *U : N->uses()) {
11336 unsigned &UnsortedOps = Degree[U];
11337 if (0 == --UnsortedOps)
11338 Order.push_back(U);
11339 }
11340 }
11341}
11342
11343#ifndef NDEBUG
11345 std::vector<SDNode *> TopoOrder;
11346 CreateTopologicalOrder(TopoOrder);
11347 for (auto *N : TopoOrder) {
11348 assert(calculateDivergence(N) == N->isDivergent() &&
11349 "Divergence bit inconsistency detected");
11350 }
11351}
11352#endif
11353
11354/// ReplaceAllUsesOfValuesWith - Replace any uses of From with To, leaving
11355/// uses of other values produced by From.getNode() alone. The same value
11356/// may appear in both the From and To list. The Deleted vector is
11357/// handled the same way as for ReplaceAllUsesWith.
11359 const SDValue *To,
11360 unsigned Num){
11361 // Handle the simple, trivial case efficiently.
11362 if (Num == 1)
11363 return ReplaceAllUsesOfValueWith(*From, *To);
11364
11365 transferDbgValues(*From, *To);
11366 copyExtraInfo(From->getNode(), To->getNode());
11367
11368 // Read up all the uses and make records of them. This helps
11369 // processing new uses that are introduced during the
11370 // replacement process.
11372 for (unsigned i = 0; i != Num; ++i) {
11373 unsigned FromResNo = From[i].getResNo();
11374 SDNode *FromNode = From[i].getNode();
11375 for (SDNode::use_iterator UI = FromNode->use_begin(),
11376 E = FromNode->use_end(); UI != E; ++UI) {
11377 SDUse &Use = UI.getUse();
11378 if (Use.getResNo() == FromResNo) {
11379 UseMemo Memo = { *UI, i, &Use };
11380 Uses.push_back(Memo);
11381 }
11382 }
11383 }
11384
11385 // Sort the uses, so that all the uses from a given User are together.
11387 RAUOVWUpdateListener Listener(*this, Uses);
11388
11389 for (unsigned UseIndex = 0, UseIndexEnd = Uses.size();
11390 UseIndex != UseIndexEnd; ) {
11391 // We know that this user uses some value of From. If it is the right
11392 // value, update it.
11393 SDNode *User = Uses[UseIndex].User;
11394 // If the node has been deleted by recursive CSE updates when updating
11395 // another node, then just skip this entry.
11396 if (User == nullptr) {
11397 ++UseIndex;
11398 continue;
11399 }
11400
11401 // This node is about to morph, remove its old self from the CSE maps.
11402 RemoveNodeFromCSEMaps(User);
11403
11404 // The Uses array is sorted, so all the uses for a given User
11405 // are next to each other in the list.
11406 // To help reduce the number of CSE recomputations, process all
11407 // the uses of this user that we can find this way.
11408 do {
11409 unsigned i = Uses[UseIndex].Index;
11410 SDUse &Use = *Uses[UseIndex].Use;
11411 ++UseIndex;
11412
11413 Use.set(To[i]);
11414 } while (UseIndex != UseIndexEnd && Uses[UseIndex].User == User);
11415
11416 // Now that we have modified User, add it back to the CSE maps. If it
11417 // already exists there, recursively merge the results together.
11418 AddModifiedNodeToCSEMaps(User);
11419 }
11420}
11421
11422/// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
11423/// based on their topological order. It returns the maximum id and a vector
11424/// of the SDNodes* in assigned order by reference.
11426 unsigned DAGSize = 0;
11427
11428 // SortedPos tracks the progress of the algorithm. Nodes before it are
11429 // sorted, nodes after it are unsorted. When the algorithm completes
11430 // it is at the end of the list.
11431 allnodes_iterator SortedPos = allnodes_begin();
11432
11433 // Visit all the nodes. Move nodes with no operands to the front of
11434 // the list immediately. Annotate nodes that do have operands with their
11435 // operand count. Before we do this, the Node Id fields of the nodes
11436 // may contain arbitrary values. After, the Node Id fields for nodes
11437 // before SortedPos will contain the topological sort index, and the
11438 // Node Id fields for nodes At SortedPos and after will contain the
11439 // count of outstanding operands.
11441 checkForCycles(&N, this);
11442 unsigned Degree = N.getNumOperands();
11443 if (Degree == 0) {
11444 // A node with no uses, add it to the result array immediately.
11445 N.setNodeId(DAGSize++);
11446 allnodes_iterator Q(&N);
11447 if (Q != SortedPos)
11448 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(Q));
11449 assert(SortedPos != AllNodes.end() && "Overran node list");
11450 ++SortedPos;
11451 } else {
11452 // Temporarily use the Node Id as scratch space for the degree count.
11453 N.setNodeId(Degree);
11454 }
11455 }
11456
11457 // Visit all the nodes. As we iterate, move nodes into sorted order,
11458 // such that by the time the end is reached all nodes will be sorted.
11459 for (SDNode &Node : allnodes()) {
11460 SDNode *N = &Node;
11461 checkForCycles(N, this);
11462 // N is in sorted position, so all its uses have one less operand
11463 // that needs to be sorted.
11464 for (SDNode *P : N->uses()) {
11465 unsigned Degree = P->getNodeId();
11466 assert(Degree != 0 && "Invalid node degree");
11467 --Degree;
11468 if (Degree == 0) {
11469 // All of P's operands are sorted, so P may sorted now.
11470 P->setNodeId(DAGSize++);
11471 if (P->getIterator() != SortedPos)
11472 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(P));
11473 assert(SortedPos != AllNodes.end() && "Overran node list");
11474 ++SortedPos;
11475 } else {
11476 // Update P's outstanding operand count.
11477 P->setNodeId(Degree);
11478 }
11479 }
11480 if (Node.getIterator() == SortedPos) {
11481#ifndef NDEBUG
11483 SDNode *S = &*++I;
11484 dbgs() << "Overran sorted position:\n";
11485 S->dumprFull(this); dbgs() << "\n";
11486 dbgs() << "Checking if this is due to cycles\n";
11487 checkForCycles(this, true);
11488#endif
11489 llvm_unreachable(nullptr);
11490 }
11491 }
11492
11493 assert(SortedPos == AllNodes.end() &&
11494 "Topological sort incomplete!");
11495 assert(AllNodes.front().getOpcode() == ISD::EntryToken &&
11496 "First node in topological sort is not the entry token!");
11497 assert(AllNodes.front().getNodeId() == 0 &&
11498 "First node in topological sort has non-zero id!");
11499 assert(AllNodes.front().getNumOperands() == 0 &&
11500 "First node in topological sort has operands!");
11501 assert(AllNodes.back().getNodeId() == (int)DAGSize-1 &&
11502 "Last node in topologic sort has unexpected id!");
11503 assert(AllNodes.back().use_empty() &&
11504 "Last node in topologic sort has users!");
11505 assert(DAGSize == allnodes_size() && "Node count mismatch!");
11506 return DAGSize;
11507}
11508
11509/// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the
11510/// value is produced by SD.
11511void SelectionDAG::AddDbgValue(SDDbgValue *DB, bool isParameter) {
11512 for (SDNode *SD : DB->getSDNodes()) {
11513 if (!SD)
11514 continue;
11515 assert(DbgInfo->getSDDbgValues(SD).empty() || SD->getHasDebugValue());
11516 SD->setHasDebugValue(true);
11517 }
11518 DbgInfo->add(DB, isParameter);
11519}
11520
11521void SelectionDAG::AddDbgLabel(SDDbgLabel *DB) { DbgInfo->add(DB); }
11522
11524 SDValue NewMemOpChain) {
11525 assert(isa<MemSDNode>(NewMemOpChain) && "Expected a memop node");
11526 assert(NewMemOpChain.getValueType() == MVT::Other && "Expected a token VT");
11527 // The new memory operation must have the same position as the old load in
11528 // terms of memory dependency. Create a TokenFactor for the old load and new
11529 // memory operation and update uses of the old load's output chain to use that
11530 // TokenFactor.
11531 if (OldChain == NewMemOpChain || OldChain.use_empty())
11532 return NewMemOpChain;
11533
11534 SDValue TokenFactor = getNode(ISD::TokenFactor, SDLoc(OldChain), MVT::Other,
11535 OldChain, NewMemOpChain);
11536 ReplaceAllUsesOfValueWith(OldChain, TokenFactor);
11537 UpdateNodeOperands(TokenFactor.getNode(), OldChain, NewMemOpChain);
11538 return TokenFactor;
11539}
11540
11542 SDValue NewMemOp) {
11543 assert(isa<MemSDNode>(NewMemOp.getNode()) && "Expected a memop node");
11544 SDValue OldChain = SDValue(OldLoad, 1);
11545 SDValue NewMemOpChain = NewMemOp.getValue(1);
11546 return makeEquivalentMemoryOrdering(OldChain, NewMemOpChain);
11547}
11548
11550 Function **OutFunction) {
11551 assert(isa<ExternalSymbolSDNode>(Op) && "Node should be an ExternalSymbol");
11552
11553 auto *Symbol = cast<ExternalSymbolSDNode>(Op)->getSymbol();
11554 auto *Module = MF->getFunction().getParent();
11555 auto *Function = Module->getFunction(Symbol);
11556
11557 if (OutFunction != nullptr)
11558 *OutFunction = Function;
11559
11560 if (Function != nullptr) {
11561 auto PtrTy = TLI->getPointerTy(getDataLayout(), Function->getAddressSpace());
11562 return getGlobalAddress(Function, SDLoc(Op), PtrTy);
11563 }
11564
11565 std::string ErrorStr;
11566 raw_string_ostream ErrorFormatter(ErrorStr);
11567 ErrorFormatter << "Undefined external symbol ";
11568 ErrorFormatter << '"' << Symbol << '"';
11569 report_fatal_error(Twine(ErrorFormatter.str()));
11570}
11571
11572//===----------------------------------------------------------------------===//
11573// SDNode Class
11574//===----------------------------------------------------------------------===//
11575
11577 ConstantSDNode *Const = dyn_cast<ConstantSDNode>(V);
11578 return Const != nullptr && Const->isZero();
11579}
11580
11582 ConstantFPSDNode *Const = dyn_cast<ConstantFPSDNode>(V);
11583 return Const != nullptr && Const->isZero() && !Const->isNegative();
11584}
11585
11587 ConstantSDNode *Const = dyn_cast<ConstantSDNode>(V);
11588 return Const != nullptr && Const->isAllOnes();
11589}
11590
11592 ConstantSDNode *Const = dyn_cast<ConstantSDNode>(V);
11593 return Const != nullptr && Const->isOne();
11594}
11595
11597 ConstantSDNode *Const = dyn_cast<ConstantSDNode>(V);
11598 return Const != nullptr && Const->isMinSignedValue();
11599}
11600
11601bool llvm::isNeutralConstant(unsigned Opcode, SDNodeFlags Flags, SDValue V,
11602 unsigned OperandNo) {
11603 // NOTE: The cases should match with IR's ConstantExpr::getBinOpIdentity().
11604 // TODO: Target-specific opcodes could be added.
11605 if (auto *ConstV = isConstOrConstSplat(V, /*AllowUndefs*/ false,
11606 /*AllowTruncation*/ true)) {
11607 APInt Const = ConstV->getAPIntValue().trunc(V.getScalarValueSizeInBits());
11608 switch (Opcode) {
11609 case ISD::ADD:
11610 case ISD::OR:
11611 case ISD::XOR:
11612 case ISD::UMAX:
11613 return Const.isZero();
11614 case ISD::MUL:
11615 return Const.isOne();
11616 case ISD::AND:
11617 case ISD::UMIN:
11618 return Const.isAllOnes();
11619 case ISD::SMAX:
11620 return Const.isMinSignedValue();
11621 case ISD::SMIN:
11622 return Const.isMaxSignedValue();
11623 case ISD::SUB:
11624 case ISD::SHL:
11625 case ISD::SRA:
11626 case ISD::SRL:
11627 return OperandNo == 1 && Const.isZero();
11628 case ISD::UDIV:
11629 case ISD::SDIV:
11630 return OperandNo == 1 && Const.isOne();
11631 }
11632 } else if (auto *ConstFP = isConstOrConstSplatFP(V)) {
11633 switch (Opcode) {
11634 case ISD::FADD:
11635 return ConstFP->isZero() &&
11636 (Flags.hasNoSignedZeros() || ConstFP->isNegative());
11637 case ISD::FSUB:
11638 return OperandNo == 1 && ConstFP->isZero() &&
11639 (Flags.hasNoSignedZeros() || !ConstFP->isNegative());
11640 case ISD::FMUL:
11641 return ConstFP->isExactlyValue(1.0);
11642 case ISD::FDIV:
11643 return OperandNo == 1 && ConstFP->isExactlyValue(1.0);
11644 case ISD::FMINNUM:
11645 case ISD::FMAXNUM: {
11646 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
11647 EVT VT = V.getValueType();
11649 APFloat NeutralAF = !Flags.hasNoNaNs()
11650 ? APFloat::getQNaN(Semantics)
11651 : !Flags.hasNoInfs()
11652 ? APFloat::getInf(Semantics)
11653 : APFloat::getLargest(Semantics);
11654 if (Opcode == ISD::FMAXNUM)
11655 NeutralAF.changeSign();
11656
11657 return ConstFP->isExactlyValue(NeutralAF);
11658 }
11659 }
11660 }
11661 return false;
11662}
11663
11665 while (V.getOpcode() == ISD::BITCAST)
11666 V = V.getOperand(0);
11667 return V;
11668}
11669
11671 while (V.getOpcode() == ISD::BITCAST && V.getOperand(0).hasOneUse())
11672 V = V.getOperand(0);
11673 return V;
11674}
11675
11677 while (V.getOpcode() == ISD::EXTRACT_SUBVECTOR)
11678 V = V.getOperand(0);
11679 return V;
11680}
11681
11683 while (V.getOpcode() == ISD::TRUNCATE)
11684 V = V.getOperand(0);
11685 return V;
11686}
11687
11688bool llvm::isBitwiseNot(SDValue V, bool AllowUndefs) {
11689 if (V.getOpcode() != ISD::XOR)
11690 return false;
11691 V = peekThroughBitcasts(V.getOperand(1));
11692 unsigned NumBits = V.getScalarValueSizeInBits();
11693 ConstantSDNode *C =
11694 isConstOrConstSplat(V, AllowUndefs, /*AllowTruncation*/ true);
11695 return C && (C->getAPIntValue().countr_one() >= NumBits);
11696}
11697
11699 bool AllowTruncation) {
11700 EVT VT = N.getValueType();
11701 APInt DemandedElts = VT.isFixedLengthVector()
11703 : APInt(1, 1);
11704 return isConstOrConstSplat(N, DemandedElts, AllowUndefs, AllowTruncation);
11705}
11706
11708 bool AllowUndefs,
11709 bool AllowTruncation) {
11710 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N))
11711 return CN;
11712
11713 // SplatVectors can truncate their operands. Ignore that case here unless
11714 // AllowTruncation is set.
11715 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
11716 EVT VecEltVT = N->getValueType(0).getVectorElementType();
11717 if (auto *CN = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
11718 EVT CVT = CN->getValueType(0);
11719 assert(CVT.bitsGE(VecEltVT) && "Illegal splat_vector element extension");
11720 if (AllowTruncation || CVT == VecEltVT)
11721 return CN;
11722 }
11723 }
11724
11725 if (BuildVectorSDNode *BV = dyn_cast<BuildVectorSDNode>(N)) {
11726 BitVector UndefElements;
11727 ConstantSDNode *CN = BV->getConstantSplatNode(DemandedElts, &UndefElements);
11728
11729 // BuildVectors can truncate their operands. Ignore that case here unless
11730 // AllowTruncation is set.
11731 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
11732 if (CN && (UndefElements.none() || AllowUndefs)) {
11733 EVT CVT = CN->getValueType(0);
11734 EVT NSVT = N.getValueType().getScalarType();
11735 assert(CVT.bitsGE(NSVT) && "Illegal build vector element extension");
11736 if (AllowTruncation || (CVT == NSVT))
11737 return CN;
11738 }
11739 }
11740
11741 return nullptr;
11742}
11743
11745 EVT VT = N.getValueType();
11746 APInt DemandedElts = VT.isFixedLengthVector()
11748 : APInt(1, 1);
11749 return isConstOrConstSplatFP(N, DemandedElts, AllowUndefs);
11750}
11751
11753 const APInt &DemandedElts,
11754 bool AllowUndefs) {
11755 if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N))
11756 return CN;
11757
11758 if (BuildVectorSDNode *BV = dyn_cast<BuildVectorSDNode>(N)) {
11759 BitVector UndefElements;
11760 ConstantFPSDNode *CN =
11761 BV->getConstantFPSplatNode(DemandedElts, &UndefElements);
11762 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
11763 if (CN && (UndefElements.none() || AllowUndefs))
11764 return CN;
11765 }
11766
11767 if (N.getOpcode() == ISD::SPLAT_VECTOR)
11768 if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N.getOperand(0)))
11769 return CN;
11770
11771 return nullptr;
11772}
11773
11774bool llvm::isNullOrNullSplat(SDValue N, bool AllowUndefs) {
11775 // TODO: may want to use peekThroughBitcast() here.
11776 ConstantSDNode *C =
11777 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
11778 return C && C->isZero();
11779}
11780
11781bool llvm::isOneOrOneSplat(SDValue N, bool AllowUndefs) {
11782 ConstantSDNode *C =
11783 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation*/ true);
11784 return C && C->isOne();
11785}
11786
11787bool llvm::isAllOnesOrAllOnesSplat(SDValue N, bool AllowUndefs) {
11789 unsigned BitWidth = N.getScalarValueSizeInBits();
11790 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs);
11791 return C && C->isAllOnes() && C->getValueSizeInBits(0) == BitWidth;
11792}
11793
11795 DropOperands();
11796}
11797
11798GlobalAddressSDNode::GlobalAddressSDNode(unsigned Opc, unsigned Order,
11799 const DebugLoc &DL,
11800 const GlobalValue *GA, EVT VT,
11801 int64_t o, unsigned TF)
11802 : SDNode(Opc, Order, DL, getSDVTList(VT)), Offset(o), TargetFlags(TF) {
11803 TheGlobal = GA;
11804}
11805
11807 EVT VT, unsigned SrcAS,
11808 unsigned DestAS)
11809 : SDNode(ISD::ADDRSPACECAST, Order, dl, getSDVTList(VT)),
11810 SrcAddrSpace(SrcAS), DestAddrSpace(DestAS) {}
11811
11812MemSDNode::MemSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl,
11813 SDVTList VTs, EVT memvt, MachineMemOperand *mmo)
11814 : SDNode(Opc, Order, dl, VTs), MemoryVT(memvt), MMO(mmo) {
11815 MemSDNodeBits.IsVolatile = MMO->isVolatile();
11816 MemSDNodeBits.IsNonTemporal = MMO->isNonTemporal();
11817 MemSDNodeBits.IsDereferenceable = MMO->isDereferenceable();
11818 MemSDNodeBits.IsInvariant = MMO->isInvariant();
11819
11820 // We check here that the size of the memory operand fits within the size of
11821 // the MMO. This is because the MMO might indicate only a possible address
11822 // range instead of specifying the affected memory addresses precisely.
11823 assert(
11824 (!MMO->getType().isValid() ||
11826 "Size mismatch!");
11827}
11828
11829/// Profile - Gather unique data for the node.
11830///
11832 AddNodeIDNode(ID, this);
11833}
11834
11835namespace {
11836
11837 struct EVTArray {
11838 std::vector<EVT> VTs;
11839
11840 EVTArray() {
11841 VTs.reserve(MVT::VALUETYPE_SIZE);
11842 for (unsigned i = 0; i < MVT::VALUETYPE_SIZE; ++i)
11843 VTs.push_back(MVT((MVT::SimpleValueType)i));
11844 }
11845 };
11846
11847} // end anonymous namespace
11848
11849/// getValueTypeList - Return a pointer to the specified value type.
11850///
11851const EVT *SDNode::getValueTypeList(EVT VT) {
11852 static std::set<EVT, EVT::compareRawBits> EVTs;
11853 static EVTArray SimpleVTArray;
11854 static sys::SmartMutex<true> VTMutex;
11855
11856 if (VT.isExtended()) {
11857 sys::SmartScopedLock<true> Lock(VTMutex);
11858 return &(*EVTs.insert(VT).first);
11859 }
11860 assert(VT.getSimpleVT() < MVT::VALUETYPE_SIZE && "Value type out of range!");
11861 return &SimpleVTArray.VTs[VT.getSimpleVT().SimpleTy];
11862}
11863
11864/// hasNUsesOfValue - Return true if there are exactly NUSES uses of the
11865/// indicated value. This method ignores uses of other values defined by this
11866/// operation.
11867bool SDNode::hasNUsesOfValue(unsigned NUses, unsigned Value) const {
11868 assert(Value < getNumValues() && "Bad value!");
11869
11870 // TODO: Only iterate over uses of a given value of the node
11871 for (SDNode::use_iterator UI = use_begin(), E = use_end(); UI != E; ++UI) {
11872 if (UI.getUse().getResNo() == Value) {
11873 if (NUses == 0)
11874 return false;
11875 --NUses;
11876 }
11877 }
11878
11879 // Found exactly the right number of uses?
11880 return NUses == 0;
11881}
11882
11883/// hasAnyUseOfValue - Return true if there are any use of the indicated
11884/// value. This method ignores uses of other values defined by this operation.
11885bool SDNode::hasAnyUseOfValue(unsigned Value) const {
11886 assert(Value < getNumValues() && "Bad value!");
11887
11888 for (SDNode::use_iterator UI = use_begin(), E = use_end(); UI != E; ++UI)
11889 if (UI.getUse().getResNo() == Value)
11890 return true;
11891
11892 return false;
11893}
11894
11895/// isOnlyUserOf - Return true if this node is the only use of N.
11896bool SDNode::isOnlyUserOf(const SDNode *N) const {
11897 bool Seen = false;
11898 for (const SDNode *User : N->uses()) {
11899 if (User == this)
11900 Seen = true;
11901 else
11902 return false;
11903 }
11904
11905 return Seen;
11906}
11907
11908/// Return true if the only users of N are contained in Nodes.
11910 bool Seen = false;
11911 for (const SDNode *User : N->uses()) {
11912 if (llvm::is_contained(Nodes, User))
11913 Seen = true;
11914 else
11915 return false;
11916 }
11917
11918 return Seen;
11919}
11920
11921/// isOperand - Return true if this node is an operand of N.
11922bool SDValue::isOperandOf(const SDNode *N) const {
11923 return is_contained(N->op_values(), *this);
11924}
11925
11926bool SDNode::isOperandOf(const SDNode *N) const {
11927 return any_of(N->op_values(),
11928 [this](SDValue Op) { return this == Op.getNode(); });
11929}
11930
11931/// reachesChainWithoutSideEffects - Return true if this operand (which must
11932/// be a chain) reaches the specified operand without crossing any
11933/// side-effecting instructions on any chain path. In practice, this looks
11934/// through token factors and non-volatile loads. In order to remain efficient,
11935/// this only looks a couple of nodes in, it does not do an exhaustive search.
11936///
11937/// Note that we only need to examine chains when we're searching for
11938/// side-effects; SelectionDAG requires that all side-effects are represented
11939/// by chains, even if another operand would force a specific ordering. This
11940/// constraint is necessary to allow transformations like splitting loads.
11942 unsigned Depth) const {
11943 if (*this == Dest) return true;
11944
11945 // Don't search too deeply, we just want to be able to see through
11946 // TokenFactor's etc.
11947 if (Depth == 0) return false;
11948
11949 // If this is a token factor, all inputs to the TF happen in parallel.
11950 if (getOpcode() == ISD::TokenFactor) {
11951 // First, try a shallow search.
11952 if (is_contained((*this)->ops(), Dest)) {
11953 // We found the chain we want as an operand of this TokenFactor.
11954 // Essentially, we reach the chain without side-effects if we could
11955 // serialize the TokenFactor into a simple chain of operations with
11956 // Dest as the last operation. This is automatically true if the
11957 // chain has one use: there are no other ordering constraints.
11958 // If the chain has more than one use, we give up: some other
11959 // use of Dest might force a side-effect between Dest and the current
11960 // node.
11961 if (Dest.hasOneUse())
11962 return true;
11963 }
11964 // Next, try a deep search: check whether every operand of the TokenFactor
11965 // reaches Dest.
11966 return llvm::all_of((*this)->ops(), [=](SDValue Op) {
11967 return Op.reachesChainWithoutSideEffects(Dest, Depth - 1);
11968 });
11969 }
11970
11971 // Loads don't have side effects, look through them.
11972 if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(*this)) {
11973 if (Ld->isUnordered())
11974 return Ld->getChain().reachesChainWithoutSideEffects(Dest, Depth-1);
11975 }
11976 return false;
11977}
11978
11979bool SDNode::hasPredecessor(const SDNode *N) const {
11982 Worklist.push_back(this);
11983 return hasPredecessorHelper(N, Visited, Worklist);
11984}
11985
11987 this->Flags.intersectWith(Flags);
11988}
11989
11990SDValue
11992 ArrayRef<ISD::NodeType> CandidateBinOps,
11993 bool AllowPartials) {
11994 // The pattern must end in an extract from index 0.
11995 if (Extract->getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
11996 !isNullConstant(Extract->getOperand(1)))
11997 return SDValue();
11998
11999 // Match against one of the candidate binary ops.
12000 SDValue Op = Extract->getOperand(0);
12001 if (llvm::none_of(CandidateBinOps, [Op](ISD::NodeType BinOp) {
12002 return Op.getOpcode() == unsigned(BinOp);
12003 }))
12004 return SDValue();
12005
12006 // Floating-point reductions may require relaxed constraints on the final step
12007 // of the reduction because they may reorder intermediate operations.
12008 unsigned CandidateBinOp = Op.getOpcode();
12009 if (Op.getValueType().isFloatingPoint()) {
12010 SDNodeFlags Flags = Op->getFlags();
12011 switch (CandidateBinOp) {
12012 case ISD::FADD:
12013 if (!Flags.hasNoSignedZeros() || !Flags.hasAllowReassociation())
12014 return SDValue();
12015 break;
12016 default:
12017 llvm_unreachable("Unhandled FP opcode for binop reduction");
12018 }
12019 }
12020
12021 // Matching failed - attempt to see if we did enough stages that a partial
12022 // reduction from a subvector is possible.
12023 auto PartialReduction = [&](SDValue Op, unsigned NumSubElts) {
12024 if (!AllowPartials || !Op)
12025 return SDValue();
12026 EVT OpVT = Op.getValueType();
12027 EVT OpSVT = OpVT.getScalarType();
12028 EVT SubVT = EVT::getVectorVT(*getContext(), OpSVT, NumSubElts);
12029 if (!TLI->isExtractSubvectorCheap(SubVT, OpVT, 0))
12030 return SDValue();
12031 BinOp = (ISD::NodeType)CandidateBinOp;
12032 return getNode(ISD::EXTRACT_SUBVECTOR, SDLoc(Op), SubVT, Op,
12034 };
12035
12036 // At each stage, we're looking for something that looks like:
12037 // %s = shufflevector <8 x i32> %op, <8 x i32> undef,
12038 // <8 x i32> <i32 2, i32 3, i32 undef, i32 undef,
12039 // i32 undef, i32 undef, i32 undef, i32 undef>
12040 // %a = binop <8 x i32> %op, %s
12041 // Where the mask changes according to the stage. E.g. for a 3-stage pyramid,
12042 // we expect something like:
12043 // <4,5,6,7,u,u,u,u>
12044 // <2,3,u,u,u,u,u,u>
12045 // <1,u,u,u,u,u,u,u>
12046 // While a partial reduction match would be:
12047 // <2,3,u,u,u,u,u,u>
12048 // <1,u,u,u,u,u,u,u>
12049 unsigned Stages = Log2_32(Op.getValueType().getVectorNumElements());
12050 SDValue PrevOp;
12051 for (unsigned i = 0; i < Stages; ++i) {
12052 unsigned MaskEnd = (1 << i);
12053
12054 if (Op.getOpcode() != CandidateBinOp)
12055 return PartialReduction(PrevOp, MaskEnd);
12056
12057 SDValue Op0 = Op.getOperand(0);
12058 SDValue Op1 = Op.getOperand(1);
12059
12060 ShuffleVectorSDNode *Shuffle = dyn_cast<ShuffleVectorSDNode>(Op0);
12061 if (Shuffle) {
12062 Op = Op1;
12063 } else {
12064 Shuffle = dyn_cast<ShuffleVectorSDNode>(Op1);
12065 Op = Op0;
12066 }
12067
12068 // The first operand of the shuffle should be the same as the other operand
12069 // of the binop.
12070 if (!Shuffle || Shuffle->getOperand(0) != Op)
12071 return PartialReduction(PrevOp, MaskEnd);
12072
12073 // Verify the shuffle has the expected (at this stage of the pyramid) mask.
12074 for (int Index = 0; Index < (int)MaskEnd; ++Index)
12075 if (Shuffle->getMaskElt(Index) != (int)(MaskEnd + Index))
12076 return PartialReduction(PrevOp, MaskEnd);
12077
12078 PrevOp = Op;
12079 }
12080
12081 // Handle subvector reductions, which tend to appear after the shuffle
12082 // reduction stages.
12083 while (Op.getOpcode() == CandidateBinOp) {
12084 unsigned NumElts = Op.getValueType().getVectorNumElements();
12085 SDValue Op0 = Op.getOperand(0);
12086 SDValue Op1 = Op.getOperand(1);
12087 if (Op0.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
12089 Op0.getOperand(0) != Op1.getOperand(0))
12090 break;
12091 SDValue Src = Op0.getOperand(0);
12092 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
12093 if (NumSrcElts != (2 * NumElts))
12094 break;
12095 if (!(Op0.getConstantOperandAPInt(1) == 0 &&
12096 Op1.getConstantOperandAPInt(1) == NumElts) &&
12097 !(Op1.getConstantOperandAPInt(1) == 0 &&
12098 Op0.getConstantOperandAPInt(1) == NumElts))
12099 break;
12100 Op = Src;
12101 }
12102
12103 BinOp = (ISD::NodeType)CandidateBinOp;
12104 return Op;
12105}
12106
12108 EVT VT = N->getValueType(0);
12109 EVT EltVT = VT.getVectorElementType();
12110 unsigned NE = VT.getVectorNumElements();
12111
12112 SDLoc dl(N);
12113
12114 // If ResNE is 0, fully unroll the vector op.
12115 if (ResNE == 0)
12116 ResNE = NE;
12117 else if (NE > ResNE)
12118 NE = ResNE;
12119
12120 if (N->getNumValues() == 2) {
12121 SmallVector<SDValue, 8> Scalars0, Scalars1;
12122 SmallVector<SDValue, 4> Operands(N->getNumOperands());
12123 EVT VT1 = N->getValueType(1);
12124 EVT EltVT1 = VT1.getVectorElementType();
12125
12126 unsigned i;
12127 for (i = 0; i != NE; ++i) {
12128 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
12129 SDValue Operand = N->getOperand(j);
12130 EVT OperandVT = Operand.getValueType();
12131
12132 // A vector operand; extract a single element.
12133 EVT OperandEltVT = OperandVT.getVectorElementType();
12134 Operands[j] = getNode(ISD::EXTRACT_VECTOR_ELT, dl, OperandEltVT,
12135 Operand, getVectorIdxConstant(i, dl));
12136 }
12137
12138 SDValue EltOp = getNode(N->getOpcode(), dl, {EltVT, EltVT1}, Operands);
12139 Scalars0.push_back(EltOp);
12140 Scalars1.push_back(EltOp.getValue(1));
12141 }
12142
12143 SDValue Vec0 = getBuildVector(VT, dl, Scalars0);
12144 SDValue Vec1 = getBuildVector(VT1, dl, Scalars1);
12145 return getMergeValues({Vec0, Vec1}, dl);
12146 }
12147
12148 assert(N->getNumValues() == 1 &&
12149 "Can't unroll a vector with multiple results!");
12150
12152 SmallVector<SDValue, 4> Operands(N->getNumOperands());
12153
12154 unsigned i;
12155 for (i= 0; i != NE; ++i) {
12156 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
12157 SDValue Operand = N->getOperand(j);
12158 EVT OperandVT = Operand.getValueType();
12159 if (OperandVT.isVector()) {
12160 // A vector operand; extract a single element.
12161 EVT OperandEltVT = OperandVT.getVectorElementType();
12162 Operands[j] = getNode(ISD::EXTRACT_VECTOR_ELT, dl, OperandEltVT,
12163 Operand, getVectorIdxConstant(i, dl));
12164 } else {
12165 // A scalar operand; just use it as is.
12166 Operands[j] = Operand;
12167 }
12168 }
12169
12170 switch (N->getOpcode()) {
12171 default: {
12172 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands,
12173 N->getFlags()));
12174 break;
12175 }
12176 case ISD::VSELECT:
12177 Scalars.push_back(getNode(ISD::SELECT, dl, EltVT, Operands));
12178 break;
12179 case ISD::SHL:
12180 case ISD::SRA:
12181 case ISD::SRL:
12182 case ISD::ROTL:
12183 case ISD::ROTR:
12184 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands[0],
12186 Operands[1])));
12187 break;
12189 EVT ExtVT = cast<VTSDNode>(Operands[1])->getVT().getVectorElementType();
12190 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT,
12191 Operands[0],
12192 getValueType(ExtVT)));
12193 }
12194 }
12195 }
12196
12197 for (; i < ResNE; ++i)
12198 Scalars.push_back(getUNDEF(EltVT));
12199
12200 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResNE);
12201 return getBuildVector(VecVT, dl, Scalars);
12202}
12203
12204std::pair<SDValue, SDValue> SelectionDAG::UnrollVectorOverflowOp(
12205 SDNode *N, unsigned ResNE) {
12206 unsigned Opcode = N->getOpcode();
12207 assert((Opcode == ISD::UADDO || Opcode == ISD::SADDO ||
12208 Opcode == ISD::USUBO || Opcode == ISD::SSUBO ||
12209 Opcode == ISD::UMULO || Opcode == ISD::SMULO) &&
12210 "Expected an overflow opcode");
12211
12212 EVT ResVT = N->getValueType(0);
12213 EVT OvVT = N->getValueType(1);
12214 EVT ResEltVT = ResVT.getVectorElementType();
12215 EVT OvEltVT = OvVT.getVectorElementType();
12216 SDLoc dl(N);
12217
12218 // If ResNE is 0, fully unroll the vector op.
12219 unsigned NE = ResVT.getVectorNumElements();
12220 if (ResNE == 0)
12221 ResNE = NE;
12222 else if (NE > ResNE)
12223 NE = ResNE;
12224
12225 SmallVector<SDValue, 8> LHSScalars;
12226 SmallVector<SDValue, 8> RHSScalars;
12227 ExtractVectorElements(N->getOperand(0), LHSScalars, 0, NE);
12228 ExtractVectorElements(N->getOperand(1), RHSScalars, 0, NE);
12229
12230 EVT SVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), ResEltVT);
12231 SDVTList VTs = getVTList(ResEltVT, SVT);
12232 SmallVector<SDValue, 8> ResScalars;
12233 SmallVector<SDValue, 8> OvScalars;
12234 for (unsigned i = 0; i < NE; ++i) {
12235 SDValue Res = getNode(Opcode, dl, VTs, LHSScalars[i], RHSScalars[i]);
12236 SDValue Ov =
12237 getSelect(dl, OvEltVT, Res.getValue(1),
12238 getBoolConstant(true, dl, OvEltVT, ResVT),
12239 getConstant(0, dl, OvEltVT));
12240
12241 ResScalars.push_back(Res);
12242 OvScalars.push_back(Ov);
12243 }
12244
12245 ResScalars.append(ResNE - NE, getUNDEF(ResEltVT));
12246 OvScalars.append(ResNE - NE, getUNDEF(OvEltVT));
12247
12248 EVT NewResVT = EVT::getVectorVT(*getContext(), ResEltVT, ResNE);
12249 EVT NewOvVT = EVT::getVectorVT(*getContext(), OvEltVT, ResNE);
12250 return std::make_pair(getBuildVector(NewResVT, dl, ResScalars),
12251 getBuildVector(NewOvVT, dl, OvScalars));
12252}
12253
12256 unsigned Bytes,
12257 int Dist) const {
12258 if (LD->isVolatile() || Base->isVolatile())
12259 return false;
12260 // TODO: probably too restrictive for atomics, revisit
12261 if (!LD->isSimple())
12262 return false;
12263 if (LD->isIndexed() || Base->isIndexed())
12264 return false;
12265 if (LD->getChain() != Base->getChain())
12266 return false;
12267 EVT VT = LD->getMemoryVT();
12268 if (VT.getSizeInBits() / 8 != Bytes)
12269 return false;
12270
12271 auto BaseLocDecomp = BaseIndexOffset::match(Base, *this);
12272 auto LocDecomp = BaseIndexOffset::match(LD, *this);
12273
12274 int64_t Offset = 0;
12275 if (BaseLocDecomp.equalBaseIndex(LocDecomp, *this, Offset))
12276 return (Dist * (int64_t)Bytes == Offset);
12277 return false;
12278}
12279
12280/// InferPtrAlignment - Infer alignment of a load / store address. Return
12281/// std::nullopt if it cannot be inferred.
12283 // If this is a GlobalAddress + cst, return the alignment.
12284 const GlobalValue *GV = nullptr;
12285 int64_t GVOffset = 0;
12286 if (TLI->isGAPlusOffset(Ptr.getNode(), GV, GVOffset)) {
12287 unsigned PtrWidth = getDataLayout().getPointerTypeSizeInBits(GV->getType());
12288 KnownBits Known(PtrWidth);
12290 unsigned AlignBits = Known.countMinTrailingZeros();
12291 if (AlignBits)
12292 return commonAlignment(Align(1ull << std::min(31U, AlignBits)), GVOffset);
12293 }
12294
12295 // If this is a direct reference to a stack slot, use information about the
12296 // stack slot's alignment.
12297 int FrameIdx = INT_MIN;
12298 int64_t FrameOffset = 0;
12299 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr)) {
12300 FrameIdx = FI->getIndex();
12301 } else if (isBaseWithConstantOffset(Ptr) &&
12302 isa<FrameIndexSDNode>(Ptr.getOperand(0))) {
12303 // Handle FI+Cst
12304 FrameIdx = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
12305 FrameOffset = Ptr.getConstantOperandVal(1);
12306 }
12307
12308 if (FrameIdx != INT_MIN) {
12310 return commonAlignment(MFI.getObjectAlign(FrameIdx), FrameOffset);
12311 }
12312
12313 return std::nullopt;
12314}
12315
12316/// Split the scalar node with EXTRACT_ELEMENT using the provided
12317/// VTs and return the low/high part.
12318std::pair<SDValue, SDValue> SelectionDAG::SplitScalar(const SDValue &N,
12319 const SDLoc &DL,
12320 const EVT &LoVT,
12321 const EVT &HiVT) {
12322 assert(!LoVT.isVector() && !HiVT.isVector() && !N.getValueType().isVector() &&
12323 "Split node must be a scalar type");
12324 SDValue Lo =
12326 SDValue Hi =
12328 return std::make_pair(Lo, Hi);
12329}
12330
12331/// GetSplitDestVTs - Compute the VTs needed for the low/hi parts of a type
12332/// which is split (or expanded) into two not necessarily identical pieces.
12333std::pair<EVT, EVT> SelectionDAG::GetSplitDestVTs(const EVT &VT) const {
12334 // Currently all types are split in half.
12335 EVT LoVT, HiVT;
12336 if (!VT.isVector())
12337 LoVT = HiVT = TLI->getTypeToTransformTo(*getContext(), VT);
12338 else
12339 LoVT = HiVT = VT.getHalfNumVectorElementsVT(*getContext());
12340
12341 return std::make_pair(LoVT, HiVT);
12342}
12343
12344/// GetDependentSplitDestVTs - Compute the VTs needed for the low/hi parts of a
12345/// type, dependent on an enveloping VT that has been split into two identical
12346/// pieces. Sets the HiIsEmpty flag when hi type has zero storage size.
12347std::pair<EVT, EVT>
12349 bool *HiIsEmpty) const {
12350 EVT EltTp = VT.getVectorElementType();
12351 // Examples:
12352 // custom VL=8 with enveloping VL=8/8 yields 8/0 (hi empty)
12353 // custom VL=9 with enveloping VL=8/8 yields 8/1
12354 // custom VL=10 with enveloping VL=8/8 yields 8/2
12355 // etc.
12356 ElementCount VTNumElts = VT.getVectorElementCount();
12357 ElementCount EnvNumElts = EnvVT.getVectorElementCount();
12358 assert(VTNumElts.isScalable() == EnvNumElts.isScalable() &&
12359 "Mixing fixed width and scalable vectors when enveloping a type");
12360 EVT LoVT, HiVT;
12361 if (VTNumElts.getKnownMinValue() > EnvNumElts.getKnownMinValue()) {
12362 LoVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
12363 HiVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts - EnvNumElts);
12364 *HiIsEmpty = false;
12365 } else {
12366 // Flag that hi type has zero storage size, but return split envelop type
12367 // (this would be easier if vector types with zero elements were allowed).
12368 LoVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts);
12369 HiVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
12370 *HiIsEmpty = true;
12371 }
12372 return std::make_pair(LoVT, HiVT);
12373}
12374
12375/// SplitVector - Split the vector with EXTRACT_SUBVECTOR and return the
12376/// low/high part.
12377std::pair<SDValue, SDValue>
12378SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT,
12379 const EVT &HiVT) {
12380 assert(LoVT.isScalableVector() == HiVT.isScalableVector() &&
12381 LoVT.isScalableVector() == N.getValueType().isScalableVector() &&
12382 "Splitting vector with an invalid mixture of fixed and scalable "
12383 "vector types");
12385 N.getValueType().getVectorMinNumElements() &&
12386 "More vector elements requested than available!");
12387 SDValue Lo, Hi;
12388 Lo =
12390 // For scalable vectors it is safe to use LoVT.getVectorMinNumElements()
12391 // (rather than having to use ElementCount), because EXTRACT_SUBVECTOR scales
12392 // IDX with the runtime scaling factor of the result vector type. For
12393 // fixed-width result vectors, that runtime scaling factor is 1.
12396 return std::make_pair(Lo, Hi);
12397}
12398
12399std::pair<SDValue, SDValue> SelectionDAG::SplitEVL(SDValue N, EVT VecVT,
12400 const SDLoc &DL) {
12401 // Split the vector length parameter.
12402 // %evl -> umin(%evl, %halfnumelts) and usubsat(%evl - %halfnumelts).
12403 EVT VT = N.getValueType();
12405 "Expecting the mask to be an evenly-sized vector");
12406 unsigned HalfMinNumElts = VecVT.getVectorMinNumElements() / 2;
12407 SDValue HalfNumElts =
12408 VecVT.isFixedLengthVector()
12409 ? getConstant(HalfMinNumElts, DL, VT)
12410 : getVScale(DL, VT, APInt(VT.getScalarSizeInBits(), HalfMinNumElts));
12411 SDValue Lo = getNode(ISD::UMIN, DL, VT, N, HalfNumElts);
12412 SDValue Hi = getNode(ISD::USUBSAT, DL, VT, N, HalfNumElts);
12413 return std::make_pair(Lo, Hi);
12414}
12415
12416/// Widen the vector up to the next power of two using INSERT_SUBVECTOR.
12418 EVT VT = N.getValueType();
12421 return getNode(ISD::INSERT_SUBVECTOR, DL, WideVT, getUNDEF(WideVT), N,
12423}
12424
12427 unsigned Start, unsigned Count,
12428 EVT EltVT) {
12429 EVT VT = Op.getValueType();
12430 if (Count == 0)
12431 Count = VT.getVectorNumElements();
12432 if (EltVT == EVT())
12433 EltVT = VT.getVectorElementType();
12434 SDLoc SL(Op);
12435 for (unsigned i = Start, e = Start + Count; i != e; ++i) {
12436 Args.push_back(getNode(ISD::EXTRACT_VECTOR_ELT, SL, EltVT, Op,
12437 getVectorIdxConstant(i, SL)));
12438 }
12439}
12440
12441// getAddressSpace - Return the address space this GlobalAddress belongs to.
12443 return getGlobal()->getType()->getAddressSpace();
12444}
12445
12448 return Val.MachineCPVal->getType();
12449 return Val.ConstVal->getType();
12450}
12451
12452bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue, APInt &SplatUndef,
12453 unsigned &SplatBitSize,
12454 bool &HasAnyUndefs,
12455 unsigned MinSplatBits,
12456 bool IsBigEndian) const {
12457 EVT VT = getValueType(0);
12458 assert(VT.isVector() && "Expected a vector type");
12459 unsigned VecWidth = VT.getSizeInBits();
12460 if (MinSplatBits > VecWidth)
12461 return false;
12462
12463 // FIXME: The widths are based on this node's type, but build vectors can
12464 // truncate their operands.
12465 SplatValue = APInt(VecWidth, 0);
12466 SplatUndef = APInt(VecWidth, 0);
12467
12468 // Get the bits. Bits with undefined values (when the corresponding element
12469 // of the vector is an ISD::UNDEF value) are set in SplatUndef and cleared
12470 // in SplatValue. If any of the values are not constant, give up and return
12471 // false.
12472 unsigned int NumOps = getNumOperands();
12473 assert(NumOps > 0 && "isConstantSplat has 0-size build vector");
12474 unsigned EltWidth = VT.getScalarSizeInBits();
12475
12476 for (unsigned j = 0; j < NumOps; ++j) {
12477 unsigned i = IsBigEndian ? NumOps - 1 - j : j;
12478 SDValue OpVal = getOperand(i);
12479 unsigned BitPos = j * EltWidth;
12480
12481 if (OpVal.isUndef())
12482 SplatUndef.setBits(BitPos, BitPos + EltWidth);
12483 else if (auto *CN = dyn_cast<ConstantSDNode>(OpVal))
12484 SplatValue.insertBits(CN->getAPIntValue().zextOrTrunc(EltWidth), BitPos);
12485 else if (auto *CN = dyn_cast<ConstantFPSDNode>(OpVal))
12486 SplatValue.insertBits(CN->getValueAPF().bitcastToAPInt(), BitPos);
12487 else
12488 return false;
12489 }
12490
12491 // The build_vector is all constants or undefs. Find the smallest element
12492 // size that splats the vector.
12493 HasAnyUndefs = (SplatUndef != 0);
12494
12495 // FIXME: This does not work for vectors with elements less than 8 bits.
12496 while (VecWidth > 8) {
12497 // If we can't split in half, stop here.
12498 if (VecWidth & 1)
12499 break;
12500
12501 unsigned HalfSize = VecWidth / 2;
12502 APInt HighValue = SplatValue.extractBits(HalfSize, HalfSize);
12503 APInt LowValue = SplatValue.extractBits(HalfSize, 0);
12504 APInt HighUndef = SplatUndef.extractBits(HalfSize, HalfSize);
12505 APInt LowUndef = SplatUndef.extractBits(HalfSize, 0);
12506
12507 // If the two halves do not match (ignoring undef bits), stop here.
12508 if ((HighValue & ~LowUndef) != (LowValue & ~HighUndef) ||
12509 MinSplatBits > HalfSize)
12510 break;
12511
12512 SplatValue = HighValue | LowValue;
12513 SplatUndef = HighUndef & LowUndef;
12514
12515 VecWidth = HalfSize;
12516 }
12517
12518 // FIXME: The loop above only tries to split in halves. But if the input
12519 // vector for example is <3 x i16> it wouldn't be able to detect a
12520 // SplatBitSize of 16. No idea if that is a design flaw currently limiting
12521 // optimizations. I guess that back in the days when this helper was created
12522 // vectors normally was power-of-2 sized.
12523
12524 SplatBitSize = VecWidth;
12525 return true;
12526}
12527
12529 BitVector *UndefElements) const {
12530 unsigned NumOps = getNumOperands();
12531 if (UndefElements) {
12532 UndefElements->clear();
12533 UndefElements->resize(NumOps);
12534 }
12535 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
12536 if (!DemandedElts)
12537 return SDValue();
12538 SDValue Splatted;
12539 for (unsigned i = 0; i != NumOps; ++i) {
12540 if (!DemandedElts[i])
12541 continue;
12542 SDValue Op = getOperand(i);
12543 if (Op.isUndef()) {
12544 if (UndefElements)
12545 (*UndefElements)[i] = true;
12546 } else if (!Splatted) {
12547 Splatted = Op;
12548 } else if (Splatted != Op) {
12549 return SDValue();
12550 }
12551 }
12552
12553 if (!Splatted) {
12554 unsigned FirstDemandedIdx = DemandedElts.countr_zero();
12555 assert(getOperand(FirstDemandedIdx).isUndef() &&
12556 "Can only have a splat without a constant for all undefs.");
12557 return getOperand(FirstDemandedIdx);
12558 }
12559
12560 return Splatted;
12561}
12562
12564 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
12565 return getSplatValue(DemandedElts, UndefElements);
12566}
12567
12569 SmallVectorImpl<SDValue> &Sequence,
12570 BitVector *UndefElements) const {
12571 unsigned NumOps = getNumOperands();
12572 Sequence.clear();
12573 if (UndefElements) {
12574 UndefElements->clear();
12575 UndefElements->resize(NumOps);
12576 }
12577 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
12578 if (!DemandedElts || NumOps < 2 || !isPowerOf2_32(NumOps))
12579 return false;
12580
12581 // Set the undefs even if we don't find a sequence (like getSplatValue).
12582 if (UndefElements)
12583 for (unsigned I = 0; I != NumOps; ++I)
12584 if (DemandedElts[I] && getOperand(I).isUndef())
12585 (*UndefElements)[I] = true;
12586
12587 // Iteratively widen the sequence length looking for repetitions.
12588 for (unsigned SeqLen = 1; SeqLen < NumOps; SeqLen *= 2) {
12589 Sequence.append(SeqLen, SDValue());
12590 for (unsigned I = 0; I != NumOps; ++I) {
12591 if (!DemandedElts[I])
12592 continue;
12593 SDValue &SeqOp = Sequence[I % SeqLen];
12595 if (Op.isUndef()) {
12596 if (!SeqOp)
12597 SeqOp = Op;
12598 continue;
12599 }
12600 if (SeqOp && !SeqOp.isUndef() && SeqOp != Op) {
12601 Sequence.clear();
12602 break;
12603 }
12604 SeqOp = Op;
12605 }
12606 if (!Sequence.empty())
12607 return true;
12608 }
12609
12610 assert(Sequence.empty() && "Failed to empty non-repeating sequence pattern");
12611 return false;
12612}
12613
12615 BitVector *UndefElements) const {
12616 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
12617 return getRepeatedSequence(DemandedElts, Sequence, UndefElements);
12618}
12619
12622 BitVector *UndefElements) const {
12623 return dyn_cast_or_null<ConstantSDNode>(
12624 getSplatValue(DemandedElts, UndefElements));
12625}
12626
12629 return dyn_cast_or_null<ConstantSDNode>(getSplatValue(UndefElements));
12630}
12631
12634 BitVector *UndefElements) const {
12635 return dyn_cast_or_null<ConstantFPSDNode>(
12636 getSplatValue(DemandedElts, UndefElements));
12637}
12638
12641 return dyn_cast_or_null<ConstantFPSDNode>(getSplatValue(UndefElements));
12642}
12643
12644int32_t
12646 uint32_t BitWidth) const {
12647 if (ConstantFPSDNode *CN =
12648 dyn_cast_or_null<ConstantFPSDNode>(getSplatValue(UndefElements))) {
12649 bool IsExact;
12650 APSInt IntVal(BitWidth);
12651 const APFloat &APF = CN->getValueAPF();
12652 if (APF.convertToInteger(IntVal, APFloat::rmTowardZero, &IsExact) !=
12653 APFloat::opOK ||
12654 !IsExact)
12655 return -1;
12656
12657 return IntVal.exactLogBase2();
12658 }
12659 return -1;
12660}
12661
12663 bool IsLittleEndian, unsigned DstEltSizeInBits,
12664 SmallVectorImpl<APInt> &RawBitElements, BitVector &UndefElements) const {
12665 // Early-out if this contains anything but Undef/Constant/ConstantFP.
12666 if (!isConstant())
12667 return false;
12668
12669 unsigned NumSrcOps = getNumOperands();
12670 unsigned SrcEltSizeInBits = getValueType(0).getScalarSizeInBits();
12671 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
12672 "Invalid bitcast scale");
12673
12674 // Extract raw src bits.
12675 SmallVector<APInt> SrcBitElements(NumSrcOps,
12676 APInt::getZero(SrcEltSizeInBits));
12677 BitVector SrcUndeElements(NumSrcOps, false);
12678
12679 for (unsigned I = 0; I != NumSrcOps; ++I) {
12681 if (Op.isUndef()) {
12682 SrcUndeElements.set(I);
12683 continue;
12684 }
12685 auto *CInt = dyn_cast<ConstantSDNode>(Op);
12686 auto *CFP = dyn_cast<ConstantFPSDNode>(Op);
12687 assert((CInt || CFP) && "Unknown constant");
12688 SrcBitElements[I] = CInt ? CInt->getAPIntValue().trunc(SrcEltSizeInBits)
12689 : CFP->getValueAPF().bitcastToAPInt();
12690 }
12691
12692 // Recast to dst width.
12693 recastRawBits(IsLittleEndian, DstEltSizeInBits, RawBitElements,
12694 SrcBitElements, UndefElements, SrcUndeElements);
12695 return true;
12696}
12697
12698void BuildVectorSDNode::recastRawBits(bool IsLittleEndian,
12699 unsigned DstEltSizeInBits,
12700 SmallVectorImpl<APInt> &DstBitElements,
12701 ArrayRef<APInt> SrcBitElements,
12702 BitVector &DstUndefElements,
12703 const BitVector &SrcUndefElements) {
12704 unsigned NumSrcOps = SrcBitElements.size();
12705 unsigned SrcEltSizeInBits = SrcBitElements[0].getBitWidth();
12706 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
12707 "Invalid bitcast scale");
12708 assert(NumSrcOps == SrcUndefElements.size() &&
12709 "Vector size mismatch");
12710
12711 unsigned NumDstOps = (NumSrcOps * SrcEltSizeInBits) / DstEltSizeInBits;
12712 DstUndefElements.clear();
12713 DstUndefElements.resize(NumDstOps, false);
12714 DstBitElements.assign(NumDstOps, APInt::getZero(DstEltSizeInBits));
12715
12716 // Concatenate src elements constant bits together into dst element.
12717 if (SrcEltSizeInBits <= DstEltSizeInBits) {
12718 unsigned Scale = DstEltSizeInBits / SrcEltSizeInBits;
12719 for (unsigned I = 0; I != NumDstOps; ++I) {
12720 DstUndefElements.set(I);
12721 APInt &DstBits = DstBitElements[I];
12722 for (unsigned J = 0; J != Scale; ++J) {
12723 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
12724 if (SrcUndefElements[Idx])
12725 continue;
12726 DstUndefElements.reset(I);
12727 const APInt &SrcBits = SrcBitElements[Idx];
12728 assert(SrcBits.getBitWidth() == SrcEltSizeInBits &&
12729 "Illegal constant bitwidths");
12730 DstBits.insertBits(SrcBits, J * SrcEltSizeInBits);
12731 }
12732 }
12733 return;
12734 }
12735
12736 // Split src element constant bits into dst elements.
12737 unsigned Scale = SrcEltSizeInBits / DstEltSizeInBits;
12738 for (unsigned I = 0; I != NumSrcOps; ++I) {
12739 if (SrcUndefElements[I]) {
12740 DstUndefElements.set(I * Scale, (I + 1) * Scale);
12741 continue;
12742 }
12743 const APInt &SrcBits = SrcBitElements[I];
12744 for (unsigned J = 0; J != Scale; ++J) {
12745 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
12746 APInt &DstBits = DstBitElements[Idx];
12747 DstBits = SrcBits.extractBits(DstEltSizeInBits, J * DstEltSizeInBits);
12748 }
12749 }
12750}
12751
12753 for (const SDValue &Op : op_values()) {
12754 unsigned Opc = Op.getOpcode();
12755 if (Opc != ISD::UNDEF && Opc != ISD::Constant && Opc != ISD::ConstantFP)
12756 return false;
12757 }
12758 return true;
12759}
12760
12761std::optional<std::pair<APInt, APInt>>
12763 unsigned NumOps = getNumOperands();
12764 if (NumOps < 2)
12765 return std::nullopt;
12766
12767 if (!isa<ConstantSDNode>(getOperand(0)) ||
12768 !isa<ConstantSDNode>(getOperand(1)))
12769 return std::nullopt;
12770
12771 unsigned EltSize = getValueType(0).getScalarSizeInBits();
12772 APInt Start = getConstantOperandAPInt(0).trunc(EltSize);
12773 APInt Stride = getConstantOperandAPInt(1).trunc(EltSize) - Start;
12774
12775 if (Stride.isZero())
12776 return std::nullopt;
12777
12778 for (unsigned i = 2; i < NumOps; ++i) {
12779 if (!isa<ConstantSDNode>(getOperand(i)))
12780 return std::nullopt;
12781
12782 APInt Val = getConstantOperandAPInt(i).trunc(EltSize);
12783 if (Val != (Start + (Stride * i)))
12784 return std::nullopt;
12785 }
12786
12787 return std::make_pair(Start, Stride);
12788}
12789
12790bool ShuffleVectorSDNode::isSplatMask(const int *Mask, EVT VT) {
12791 // Find the first non-undef value in the shuffle mask.
12792 unsigned i, e;
12793 for (i = 0, e = VT.getVectorNumElements(); i != e && Mask[i] < 0; ++i)
12794 /* search */;
12795
12796 // If all elements are undefined, this shuffle can be considered a splat
12797 // (although it should eventually get simplified away completely).
12798 if (i == e)
12799 return true;
12800
12801 // Make sure all remaining elements are either undef or the same as the first
12802 // non-undef value.
12803 for (int Idx = Mask[i]; i != e; ++i)
12804 if (Mask[i] >= 0 && Mask[i] != Idx)
12805 return false;
12806 return true;
12807}
12808
12809// Returns the SDNode if it is a constant integer BuildVector
12810// or constant integer.
12812 if (isa<ConstantSDNode>(N))
12813 return N.getNode();
12815 return N.getNode();
12816 // Treat a GlobalAddress supporting constant offset folding as a
12817 // constant integer.
12818 if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(N))
12819 if (GA->getOpcode() == ISD::GlobalAddress &&
12820 TLI->isOffsetFoldingLegal(GA))
12821 return GA;
12822 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
12823 isa<ConstantSDNode>(N.getOperand(0)))
12824 return N.getNode();
12825 return nullptr;
12826}
12827
12828// Returns the SDNode if it is a constant float BuildVector
12829// or constant float.
12831 if (isa<ConstantFPSDNode>(N))
12832 return N.getNode();
12833
12835 return N.getNode();
12836
12837 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
12838 isa<ConstantFPSDNode>(N.getOperand(0)))
12839 return N.getNode();
12840
12841 return nullptr;
12842}
12843
12844void SelectionDAG::createOperands(SDNode *Node, ArrayRef<SDValue> Vals) {
12845 assert(!Node->OperandList && "Node already has operands");
12847 "too many operands to fit into SDNode");
12848 SDUse *Ops = OperandRecycler.allocate(
12849 ArrayRecycler<SDUse>::Capacity::get(Vals.size()), OperandAllocator);
12850
12851 bool IsDivergent = false;
12852 for (unsigned I = 0; I != Vals.size(); ++I) {
12853 Ops[I].setUser(Node);
12854 Ops[I].setInitial(Vals[I]);
12855 if (Ops[I].Val.getValueType() != MVT::Other) // Skip Chain. It does not carry divergence.
12856 IsDivergent |= Ops[I].getNode()->isDivergent();
12857 }
12858 Node->NumOperands = Vals.size();
12859 Node->OperandList = Ops;
12860 if (!TLI->isSDNodeAlwaysUniform(Node)) {
12861 IsDivergent |= TLI->isSDNodeSourceOfDivergence(Node, FLI, UA);
12862 Node->SDNodeBits.IsDivergent = IsDivergent;
12863 }
12865}
12866
12869 size_t Limit = SDNode::getMaxNumOperands();
12870 while (Vals.size() > Limit) {
12871 unsigned SliceIdx = Vals.size() - Limit;
12872 auto ExtractedTFs = ArrayRef<SDValue>(Vals).slice(SliceIdx, Limit);
12873 SDValue NewTF = getNode(ISD::TokenFactor, DL, MVT::Other, ExtractedTFs);
12874 Vals.erase(Vals.begin() + SliceIdx, Vals.end());
12875 Vals.emplace_back(NewTF);
12876 }
12877 return getNode(ISD::TokenFactor, DL, MVT::Other, Vals);
12878}
12879
12881 EVT VT, SDNodeFlags Flags) {
12882 switch (Opcode) {
12883 default:
12884 return SDValue();
12885 case ISD::ADD:
12886 case ISD::OR:
12887 case ISD::XOR:
12888 case ISD::UMAX:
12889 return getConstant(0, DL, VT);
12890 case ISD::MUL:
12891 return getConstant(1, DL, VT);
12892 case ISD::AND:
12893 case ISD::UMIN:
12894 return getAllOnesConstant(DL, VT);
12895 case ISD::SMAX:
12897 case ISD::SMIN:
12899 case ISD::FADD:
12900 return getConstantFP(-0.0, DL, VT);
12901 case ISD::FMUL:
12902 return getConstantFP(1.0, DL, VT);
12903 case ISD::FMINNUM:
12904 case ISD::FMAXNUM: {
12905 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
12906 const fltSemantics &Semantics = EVTToAPFloatSemantics(VT);
12907 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics) :
12908 !Flags.hasNoInfs() ? APFloat::getInf(Semantics) :
12909 APFloat::getLargest(Semantics);
12910 if (Opcode == ISD::FMAXNUM)
12911 NeutralAF.changeSign();
12912
12913 return getConstantFP(NeutralAF, DL, VT);
12914 }
12915 case ISD::FMINIMUM:
12916 case ISD::FMAXIMUM: {
12917 // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
12918 const fltSemantics &Semantics = EVTToAPFloatSemantics(VT);
12919 APFloat NeutralAF = !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
12920 : APFloat::getLargest(Semantics);
12921 if (Opcode == ISD::FMAXIMUM)
12922 NeutralAF.changeSign();
12923
12924 return getConstantFP(NeutralAF, DL, VT);
12925 }
12926
12927 }
12928}
12929
12930/// Helper used to make a call to a library function that has one argument of
12931/// pointer type.
12932///
12933/// Such functions include 'fegetmode', 'fesetenv' and some others, which are
12934/// used to get or set floating-point state. They have one argument of pointer
12935/// type, which points to the memory region containing bits of the
12936/// floating-point state. The value returned by such function is ignored in the
12937/// created call.
12938///
12939/// \param LibFunc Reference to library function (value of RTLIB::Libcall).
12940/// \param Ptr Pointer used to save/load state.
12941/// \param InChain Ingoing token chain.
12942/// \returns Outgoing chain token.
12944 SDValue InChain,
12945 const SDLoc &DLoc) {
12946 assert(InChain.getValueType() == MVT::Other && "Expected token chain");
12949 Entry.Node = Ptr;
12950 Entry.Ty = Ptr.getValueType().getTypeForEVT(*getContext());
12951 Args.push_back(Entry);
12952 RTLIB::Libcall LC = static_cast<RTLIB::Libcall>(LibFunc);
12953 SDValue Callee = getExternalSymbol(TLI->getLibcallName(LC),
12954 TLI->getPointerTy(getDataLayout()));
12956 CLI.setDebugLoc(DLoc).setChain(InChain).setLibCallee(
12957 TLI->getLibcallCallingConv(LC), Type::getVoidTy(*getContext()), Callee,
12958 std::move(Args));
12959 return TLI->LowerCallTo(CLI).second;
12960}
12961
12963 assert(From && To && "Invalid SDNode; empty source SDValue?");
12964 auto I = SDEI.find(From);
12965 if (I == SDEI.end())
12966 return;
12967
12968 // Use of operator[] on the DenseMap may cause an insertion, which invalidates
12969 // the iterator, hence the need to make a copy to prevent a use-after-free.
12970 NodeExtraInfo NEI = I->second;
12971 if (LLVM_LIKELY(!NEI.PCSections) && LLVM_LIKELY(!NEI.MMRA)) {
12972 // No deep copy required for the types of extra info set.
12973 //
12974 // FIXME: Investigate if other types of extra info also need deep copy. This
12975 // depends on the types of nodes they can be attached to: if some extra info
12976 // is only ever attached to nodes where a replacement To node is always the
12977 // node where later use and propagation of the extra info has the intended
12978 // semantics, no deep copy is required.
12979 SDEI[To] = std::move(NEI);
12980 return;
12981 }
12982
12983 // We need to copy NodeExtraInfo to all _new_ nodes that are being introduced
12984 // through the replacement of From with To. Otherwise, replacements of a node
12985 // (From) with more complex nodes (To and its operands) may result in lost
12986 // extra info where the root node (To) is insignificant in further propagating
12987 // and using extra info when further lowering to MIR.
12988 //
12989 // In the first step pre-populate the visited set with the nodes reachable
12990 // from the old From node. This avoids copying NodeExtraInfo to parts of the
12991 // DAG that is not new and should be left untouched.
12992 SmallVector<const SDNode *> Leafs{From}; // Leafs reachable with VisitFrom.
12993 DenseSet<const SDNode *> FromReach; // The set of nodes reachable from From.
12994 auto VisitFrom = [&](auto &&Self, const SDNode *N, int MaxDepth) {
12995 if (MaxDepth == 0) {
12996 // Remember this node in case we need to increase MaxDepth and continue
12997 // populating FromReach from this node.
12998 Leafs.emplace_back(N);
12999 return;
13000 }
13001 if (!FromReach.insert(N).second)
13002 return;
13003 for (const SDValue &Op : N->op_values())
13004 Self(Self, Op.getNode(), MaxDepth - 1);
13005 };
13006
13007 // Copy extra info to To and all its transitive operands (that are new).
13009 auto DeepCopyTo = [&](auto &&Self, const SDNode *N) {
13010 if (FromReach.contains(N))
13011 return true;
13012 if (!Visited.insert(N).second)
13013 return true;
13014 if (getEntryNode().getNode() == N)
13015 return false;
13016 for (const SDValue &Op : N->op_values()) {
13017 if (!Self(Self, Op.getNode()))
13018 return false;
13019 }
13020 // Copy only if entry node was not reached.
13021 SDEI[N] = NEI;
13022 return true;
13023 };
13024
13025 // We first try with a lower MaxDepth, assuming that the path to common
13026 // operands between From and To is relatively short. This significantly
13027 // improves performance in the common case. The initial MaxDepth is big
13028 // enough to avoid retry in the common case; the last MaxDepth is large
13029 // enough to avoid having to use the fallback below (and protects from
13030 // potential stack exhaustion from recursion).
13031 for (int PrevDepth = 0, MaxDepth = 16; MaxDepth <= 1024;
13032 PrevDepth = MaxDepth, MaxDepth *= 2, Visited.clear()) {
13033 // StartFrom is the previous (or initial) set of leafs reachable at the
13034 // previous maximum depth.
13036 std::swap(StartFrom, Leafs);
13037 for (const SDNode *N : StartFrom)
13038 VisitFrom(VisitFrom, N, MaxDepth - PrevDepth);
13039 if (LLVM_LIKELY(DeepCopyTo(DeepCopyTo, To)))
13040 return;
13041 // This should happen very rarely (reached the entry node).
13042 LLVM_DEBUG(dbgs() << __func__ << ": MaxDepth=" << MaxDepth << " too low\n");
13043 assert(!Leafs.empty());
13044 }
13045
13046 // This should not happen - but if it did, that means the subgraph reachable
13047 // from From has depth greater or equal to maximum MaxDepth, and VisitFrom()
13048 // could not visit all reachable common operands. Consequently, we were able
13049 // to reach the entry node.
13050 errs() << "warning: incomplete propagation of SelectionDAG::NodeExtraInfo\n";
13051 assert(false && "From subgraph too complex - increase max. MaxDepth?");
13052 // Best-effort fallback if assertions disabled.
13053 SDEI[To] = std::move(NEI);
13054}
13055
13056#ifndef NDEBUG
13057static void checkForCyclesHelper(const SDNode *N,
13060 const llvm::SelectionDAG *DAG) {
13061 // If this node has already been checked, don't check it again.
13062 if (Checked.count(N))
13063 return;
13064
13065 // If a node has already been visited on this depth-first walk, reject it as
13066 // a cycle.
13067 if (!Visited.insert(N).second) {
13068 errs() << "Detected cycle in SelectionDAG\n";
13069 dbgs() << "Offending node:\n";
13070 N->dumprFull(DAG); dbgs() << "\n";
13071 abort();
13072 }
13073
13074 for (const SDValue &Op : N->op_values())
13075 checkForCyclesHelper(Op.getNode(), Visited, Checked, DAG);
13076
13077 Checked.insert(N);
13078 Visited.erase(N);
13079}
13080#endif
13081
13083 const llvm::SelectionDAG *DAG,
13084 bool force) {
13085#ifndef NDEBUG
13086 bool check = force;
13087#ifdef EXPENSIVE_CHECKS
13088 check = true;
13089#endif // EXPENSIVE_CHECKS
13090 if (check) {
13091 assert(N && "Checking nonexistent SDNode");
13094 checkForCyclesHelper(N, visited, checked, DAG);
13095 }
13096#endif // !NDEBUG
13097}
13098
13099void llvm::checkForCycles(const llvm::SelectionDAG *DAG, bool force) {
13100 checkForCycles(DAG->getRoot().getNode(), DAG, force);
13101}
MachineBasicBlock & MBB
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...
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
This file implements the BitVector class.
BlockVerifier::State From
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
Analysis containing CSE Info
Definition: CSEInfo.cpp:27
static std::optional< bool > isBigEndian(const SmallDenseMap< int64_t, int64_t, 8 > &MemOffset2Idx, int64_t LowestIdx)
Given a map from byte offsets in memory to indices in a load/store, determine if that map corresponds...
#define __asan_unpoison_memory_region(p, size)
Definition: Compiler.h:460
#define LLVM_LIKELY(EXPR)
Definition: Compiler.h:240
This file contains the declarations for the subclasses of Constant, which represent the different fla...
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
Looks at all the uses of the given value Returns the Liveness deduced from the uses of this value Adds all uses that cause the result to be MaybeLive to MaybeLiveRetUses If the result is MaybeLiveUses might be modified but its content should be ignored(since it might not be complete). DeadArgumentEliminationPass
Given that RA is a live propagate it s liveness to any other values it uses(according to Uses). void DeadArgumentEliminationPass
Given that RA is a live value
#define LLVM_DEBUG(X)
Definition: Debug.h:101
This file defines the DenseSet and SmallDenseSet classes.
This file contains constants used for implementing Dwarf debug support.
uint64_t Size
Symbol * Sym
Definition: ELF_riscv.cpp:479
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
This file defines a hash set that can be used to remove duplication of nodes in a graph.
Rewrite Partial Register Uses
#define check(cond)
static const unsigned MaxDepth
static LVOptions Options
Definition: LVOptions.cpp:25
static Register getMemsetValue(Register Val, LLT Ty, MachineIRBuilder &MIB)
static bool shouldLowerMemFuncForSize(const MachineFunction &MF)
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition: Lint.cpp:528
static Align getPrefTypeAlign(EVT VT, SelectionDAG &DAG)
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
#define G(x, y, z)
Definition: MD5.cpp:56
mir Rename Register Operands
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
unsigned const TargetRegisterInfo * TRI
This file provides utility analysis objects describing memory locations.
This file contains the declarations for metadata subclasses.
static unsigned getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
#define P(N)
PowerPC Reduce CR logical Operation
const SmallVectorImpl< MachineOperand > & Cond
Contains matchers for matching SelectionDAG nodes and values.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file contains some templates that are useful if you are working with the STL at all.
static uint64_t umul_ov(uint64_t i, uint64_t j, bool &Overflow)
static SDValue getMemsetStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, const AAMDNodes &AAInfo)
Lower the call to 'memset' intrinsic function into a series of store operations.
static std::optional< APInt > FoldValueWithUndef(unsigned Opcode, const APInt &C1, bool IsUndef1, const APInt &C2, bool IsUndef2)
static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step, SelectionDAG &DAG)
static void AddNodeIDNode(FoldingSetNodeID &ID, unsigned OpC, SDVTList VTList, ArrayRef< SDValue > OpList)
static SDValue getMemsetStringVal(EVT VT, const SDLoc &dl, SelectionDAG &DAG, const TargetLowering &TLI, const ConstantDataArraySlice &Slice)
getMemsetStringVal - Similar to getMemsetValue.
static cl::opt< bool > EnableMemCpyDAGOpt("enable-memcpy-dag-opt", cl::Hidden, cl::init(true), cl::desc("Gang up loads and stores generated by inlining of memcpy"))
static bool haveNoCommonBitsSetCommutative(SDValue A, SDValue B)
static void AddNodeIDValueTypes(FoldingSetNodeID &ID, SDVTList VTList)
AddNodeIDValueTypes - Value type lists are intern'd so we can represent them solely with their pointe...
static void commuteShuffle(SDValue &N1, SDValue &N2, MutableArrayRef< int > M)
Swaps the values of N1 and N2.
static bool isMemSrcFromConstant(SDValue Src, ConstantDataArraySlice &Slice)
Returns true if memcpy source is constant data.
static SDValue getMemmoveLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo)
static SDValue getMemcpyLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo, AAResults *AA)
static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC)
AddNodeIDOpcode - Add the node opcode to the NodeID data.
static ISD::CondCode getSetCCInverseImpl(ISD::CondCode Op, bool isIntegerLike)
static bool doNotCSE(SDNode *N)
doNotCSE - Return true if CSE should not be performed for this node.
static cl::opt< int > MaxLdStGlue("ldstmemcpy-glue-max", cl::desc("Number limit for gluing ld/st of memcpy."), cl::Hidden, cl::init(0))
static void AddNodeIDOperands(FoldingSetNodeID &ID, ArrayRef< SDValue > Ops)
AddNodeIDOperands - Various routines for adding operands to the NodeID data.
static SDValue foldCONCAT_VECTORS(const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG)
Try to simplify vector concatenation to an input value, undef, or build vector.
static MachinePointerInfo InferPointerInfo(const MachinePointerInfo &Info, SelectionDAG &DAG, SDValue Ptr, int64_t Offset=0)
InferPointerInfo - If the specified ptr/offset is a frame index, infer a MachinePointerInfo record fr...
static void AddNodeIDCustom(FoldingSetNodeID &ID, const SDNode *N)
If this is an SDNode with special info, add this info to the NodeID data.
static void NewSDValueDbgMsg(SDValue V, StringRef Msg, SelectionDAG *G)
static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs)
makeVTList - Return an instance of the SDVTList struct initialized with the specified members.
static void VerifySDNode(SDNode *N, const TargetLowering *TLI)
VerifySDNode - Check the given SDNode. Aborts if it is invalid.
static void checkForCyclesHelper(const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallPtrSetImpl< const SDNode * > &Checked, const llvm::SelectionDAG *DAG)
static void chainLoadsAndStoresForMemcpy(SelectionDAG &DAG, const SDLoc &dl, SmallVector< SDValue, 32 > &OutChains, unsigned From, unsigned To, SmallVector< SDValue, 16 > &OutLoadChains, SmallVector< SDValue, 16 > &OutStoreChains)
static int isSignedOp(ISD::CondCode Opcode)
For an integer comparison, return 1 if the comparison is a signed operation and 2 if the result is an...
static std::optional< APInt > FoldValue(unsigned Opcode, const APInt &C1, const APInt &C2)
static SDValue FoldBUILD_VECTOR(const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG)
static void checkAddrSpaceIsValidForLibcall(const TargetLowering *TLI, unsigned AS)
static Constant * ConstantFold(Instruction *I, const DataLayout &DL, const SmallDenseMap< Value *, Constant * > &ConstantPool)
Try to fold instruction I into a constant.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file describes how to lower LLVM code to machine code.
static std::optional< unsigned > getOpcode(ArrayRef< VPValue * > Values)
Returns the opcode of Values or ~0 if they do not all agree.
Definition: VPlanSLP.cpp:191
static OverflowResult mapOverflowResult(ConstantRange::OverflowResult OR)
Convert ConstantRange OverflowResult into ValueTracking OverflowResult.
Value * RHS
Value * LHS
static unsigned getSize(unsigned Kind)
bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal=false)
Checks whether the given location points to constant memory, or if OrLocal is true whether it points ...
static APFloat getQNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for QNaN values.
Definition: APFloat.h:988
opStatus divide(const APFloat &RHS, roundingMode RM)
Definition: APFloat.h:1069
void copySign(const APFloat &RHS)
Definition: APFloat.h:1163
opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition: APFloat.cpp:5196
opStatus subtract(const APFloat &RHS, roundingMode RM)
Definition: APFloat.h:1051
bool isExactlyValue(double V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
Definition: APFloat.h:1278
opStatus add(const APFloat &RHS, roundingMode RM)
Definition: APFloat.h:1042
bool isFinite() const
Definition: APFloat.h:1300
bool isNaN() const
Definition: APFloat.h:1293
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
Definition: APFloat.h:1193
opStatus multiply(const APFloat &RHS, roundingMode RM)
Definition: APFloat.h:1060
opStatus fusedMultiplyAdd(const APFloat &Multiplicand, const APFloat &Addend, roundingMode RM)
Definition: APFloat.h:1096
bool isZero() const
Definition: APFloat.h:1291
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition: APFloat.h:1006
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition: APFloat.h:1185
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition: APFloat.h:966
opStatus mod(const APFloat &RHS)
Definition: APFloat.h:1087
bool isPosZero() const
Definition: APFloat.h:1306
bool isNegZero() const
Definition: APFloat.h:1307
void changeSign()
Definition: APFloat.h:1158
static APFloat getNaN(const fltSemantics &Sem, bool Negative=false, uint64_t payload=0)
Factory for NaN values.
Definition: APFloat.h:977
bool isInfinity() const
Definition: APFloat.h:1292
Class for arbitrary precision integers.
Definition: APInt.h:76
APInt umul_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1941
APInt usub_sat(const APInt &RHS) const
Definition: APInt.cpp:2025
APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition: APInt.cpp:1543
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition: APInt.h:212
void clearBit(unsigned BitPosition)
Set a given bit to 0.
Definition: APInt.h:1385
APInt zext(unsigned width) const
Zero extend to a new width.
Definition: APInt.cpp:981
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition: APInt.h:207
uint64_t getZExtValue() const
Get zero extended value.
Definition: APInt.h:1491
void setHighBits(unsigned hiBits)
Set the top hiBits bits.
Definition: APInt.h:1370
unsigned popcount() const
Count the number of bits set.
Definition: APInt.h:1620
void setBitsFrom(unsigned loBit)
Set the top bits starting from loBit.
Definition: APInt.h:1364
APInt getHiBits(unsigned numBits) const
Compute an APInt containing numBits highbits from this APInt.
Definition: APInt.cpp:608
APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition: APInt.cpp:1002
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition: APInt.h:1463
APInt trunc(unsigned width) const
Truncate to new width.
Definition: APInt.cpp:906
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition: APInt.h:1308
APInt abs() const
Get the absolute value.
Definition: APInt.h:1737
APInt sadd_sat(const APInt &RHS) const
Definition: APInt.cpp:1996
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition: APInt.h:349
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition: APInt.h:1160
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition: APInt.h:358
APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition: APInt.cpp:1636
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition: APInt.h:1439
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition: APInt.h:1089
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition: APInt.h:187
bool isNegative() const
Determine sign of this APInt.
Definition: APInt.h:307
APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition: APInt.cpp:1614
void clearAllBits()
Set every bit to 0.
Definition: APInt.h:1375
APInt rotr(unsigned rotateAmt) const
Rotate right by rotateAmt.
Definition: APInt.cpp:1124
APInt reverseBits() const
Definition: APInt.cpp:737
void ashrInPlace(unsigned ShiftAmt)
Arithmetic right-shift this APInt by ShiftAmt in place.
Definition: APInt.h:812
bool sle(const APInt &RHS) const
Signed less or equal comparison.
Definition: APInt.h:1144
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition: APInt.h:1589
unsigned getNumSignBits() const
Computes the number of leading bits of this APInt that are equal to its sign bit.
Definition: APInt.h:1578
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition: APInt.h:1548
static APInt getSplat(unsigned NewLen, const APInt &V)
Return a value containing V broadcasted over NewLen bits.
Definition: APInt.cpp:620
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition: APInt.h:197
APInt sshl_sat(const APInt &RHS) const
Definition: APInt.cpp:2056
APInt ushl_sat(const APInt &RHS) const
Definition: APInt.cpp:2070
APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
Definition: APInt.cpp:1010
APInt rotl(unsigned rotateAmt) const
Rotate left by rotateAmt.
Definition: APInt.cpp:1111
void insertBits(const APInt &SubBits, unsigned bitPosition)
Insert the bits from a smaller APInt starting at bitPosition.
Definition: APInt.cpp:368
void clearLowBits(unsigned loBits)
Set bottom loBits bits to 0.
Definition: APInt.h:1395
unsigned logBase2() const
Definition: APInt.h:1703
APInt uadd_sat(const APInt &RHS) const
Definition: APInt.cpp:2006
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition: APInt.h:805
void setAllBits()
Set every bit to 1.
Definition: APInt.h:1297
APInt srem(const APInt &RHS) const
Function for signed remainder operation.
Definition: APInt.cpp:1706
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition: APInt.h:312
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition: APInt.h:1128
APInt sext(unsigned width) const
Sign extend to a new width.
Definition: APInt.cpp:954
void setBits(unsigned loBit, unsigned hiBit)
Set the bits from loBit (inclusive) to hiBit (exclusive) to 1.
Definition: APInt.h:1345
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition: APInt.h:851
APInt byteSwap() const
Definition: APInt.cpp:715
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition: APInt.h:1235
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition: APInt.h:418
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition: APInt.h:284
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition: APInt.h:178
void setLowBits(unsigned loBits)
Set the bottom loBits bits.
Definition: APInt.h:1367
APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
Definition: APInt.cpp:453
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition: APInt.h:1215
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition: APInt.h:264
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition: APInt.h:217
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
Definition: APInt.h:836
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition: APInt.h:829
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition: APInt.h:1199
APInt ssub_sat(const APInt &RHS) const
Definition: APInt.cpp:2015
An arbitrary precision integer that knows its signedness.
Definition: APSInt.h:23
AddrSpaceCastSDNode(unsigned Order, const DebugLoc &dl, EVT VT, unsigned SrcAS, unsigned DestAS)
Recycle small arrays allocated from a BumpPtrAllocator.
Definition: ArrayRecycler.h:28
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
iterator end() const
Definition: ArrayRef.h:154
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:165
iterator begin() const
Definition: ArrayRef.h:153
bool empty() const
empty - Check if the array is empty.
Definition: ArrayRef.h:160
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
Definition: ArrayRef.h:195
This is an SDNode representing atomic operations.
static BaseIndexOffset match(const SDNode *N, const SelectionDAG &DAG)
Parses tree in N for base, index, offset addresses.
BitVector & reset()
Definition: BitVector.h:392
void resize(unsigned N, bool t=false)
resize - Grow or shrink the bitvector.
Definition: BitVector.h:341
void clear()
clear - Removes all bits from the bitvector.
Definition: BitVector.h:335
BitVector & set()
Definition: BitVector.h:351
bool none() const
none - Returns true if none of the bits are set.
Definition: BitVector.h:188
size_type size() const
size - Returns the number of bits in this bitvector.
Definition: BitVector.h:159
unsigned getTargetFlags() const
const BlockAddress * getBlockAddress() const
The address of a basic block.
Definition: Constants.h:889
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
A "pseudo-class" with methods for operating on BUILD_VECTORs.
bool getConstantRawBits(bool IsLittleEndian, unsigned DstEltSizeInBits, SmallVectorImpl< APInt > &RawBitElements, BitVector &UndefElements) const
Extract the raw bit data from a build vector of Undef, Constant or ConstantFP node elements.
static void recastRawBits(bool IsLittleEndian, unsigned DstEltSizeInBits, SmallVectorImpl< APInt > &DstBitElements, ArrayRef< APInt > SrcBitElements, BitVector &DstUndefElements, const BitVector &SrcUndefElements)
Recast bit data SrcBitElements to DstEltSizeInBits wide elements.
bool getRepeatedSequence(const APInt &DemandedElts, SmallVectorImpl< SDValue > &Sequence, BitVector *UndefElements=nullptr) const
Find the shortest repeating sequence of values in the build vector.
ConstantFPSDNode * getConstantFPSplatNode(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted constant FP or null if this is not a constant FP splat.
std::optional< std::pair< APInt, APInt > > isConstantSequence() const
If this BuildVector is constant and represents the numerical series "<a, a+n, a+2n,...
SDValue getSplatValue(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted value or a null value if this is not a splat.
bool isConstantSplat(APInt &SplatValue, APInt &SplatUndef, unsigned &SplatBitSize, bool &HasAnyUndefs, unsigned MinSplatBits=0, bool isBigEndian=false) const
Check if this is a constant splat, and if so, find the smallest element size that splats the vector.
ConstantSDNode * getConstantSplatNode(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted constant or null if this is not a constant splat.
int32_t getConstantFPSplatPow2ToLog2Int(BitVector *UndefElements, uint32_t BitWidth) const
If this is a constant FP splat and the splatted constant FP is an exact power or 2,...
LLVM_ATTRIBUTE_RETURNS_NONNULL void * Allocate(size_t Size, Align Alignment)
Allocate space at the specified alignment.
Definition: Allocator.h:148
void Reset()
Deallocate all but the current slab and reset the current pointer to the beginning of it,...
Definition: Allocator.h:123
static bool isValueValidForType(EVT VT, const APFloat &Val)
const APFloat & getValueAPF() const
bool isExactlyValue(double V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
ConstantFP - Floating Point Values [float, double].
Definition: Constants.h:268
This is the shared class of boolean and integer constants.
Definition: Constants.h:80
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition: Constants.h:148
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition: Constants.h:145
bool isMachineConstantPoolEntry() const
This class represents a range of values.
Definition: ConstantRange.h:47
ConstantRange multiply(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a multiplication of a value in thi...
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
static ConstantRange fromKnownBits(const KnownBits &Known, bool IsSigned)
Initialize a range based on a known bits constraint.
OverflowResult unsignedSubMayOverflow(const ConstantRange &Other) const
Return whether unsigned sub of the two ranges always/never overflows.
OverflowResult unsignedAddMayOverflow(const ConstantRange &Other) const
Return whether unsigned add of the two ranges always/never overflows.
KnownBits toKnownBits() const
Return known bits for values in this range.
ConstantRange zeroExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
APInt getSignedMin() const
Return the smallest signed value contained in the ConstantRange.
OverflowResult unsignedMulMayOverflow(const ConstantRange &Other) const
Return whether unsigned mul of the two ranges always/never overflows.
ConstantRange signExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
APInt getSignedMax() const
Return the largest signed value contained in the ConstantRange.
OverflowResult
Represents whether an operation on the given constant range is known to always or never overflow.
@ AlwaysOverflowsHigh
Always overflows in the direction of signed/unsigned max value.
@ AlwaysOverflowsLow
Always overflows in the direction of signed/unsigned min value.
@ MayOverflow
May or may not overflow.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
OverflowResult signedSubMayOverflow(const ConstantRange &Other) const
Return whether signed sub of the two ranges always/never overflows.
uint64_t getZExtValue() const
const APInt & getAPIntValue() const
This is an important base class in LLVM.
Definition: Constant.h:41
Constant * getSplatValue(bool AllowPoison=false) const
If all elements of the vector constant have the same value, return that value.
Definition: Constants.cpp:1699
Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
Definition: Constants.cpp:432
DWARF expression.
static ExtOps getExtOps(unsigned FromSize, unsigned ToSize, bool Signed)
Returns the ops for a zero- or sign-extension in a DIExpression.
static void appendOffset(SmallVectorImpl< uint64_t > &Ops, int64_t Offset)
Append Ops with operations to apply the Offset.
static DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
static const DIExpression * convertToVariadicExpression(const DIExpression *Expr)
If Expr is a non-variadic expression (i.e.
static std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
Base class for variables.
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 isLittleEndian() const
Layout endianness...
Definition: DataLayout.h:238
IntegerType * getIntPtrType(LLVMContext &C, unsigned AddressSpace=0) const
Returns an integer type with size at least as big as that of a pointer in the given address space.
Definition: DataLayout.cpp:878
Align getABITypeAlign(Type *Ty) const
Returns the minimum ABI-required alignment for the specified type.
Definition: DataLayout.cpp:865
unsigned getPointerTypeSizeInBits(Type *) const
Layout pointer size, in bits, based on the type.
Definition: DataLayout.cpp:763
Align getPrefTypeAlign(Type *Ty) const
Returns the preferred stack/global alignment for the specified type.
Definition: DataLayout.cpp:874
A debug info location.
Definition: DebugLoc.h:33
void reserve(size_type NumEntries)
Grow the densemap so that it can contain at least NumEntries items before resizing again.
Definition: DenseMap.h:103
Implements a dense probed hash-table based set.
Definition: DenseSet.h:271
const char * getSymbol() const
FoldingSetNodeID - This class is used to gather all the unique data bits of a node.
Definition: FoldingSet.h:320
MachineBasicBlock * MBB
MBB - The current block.
Data structure describing the variable locations in a function.
bool hasOptSize() const
Optimize this function for size (-Os) or minimum size (-Oz).
Definition: Function.h:681
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition: Function.h:678
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition: Function.h:339
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition: Function.cpp:356
unsigned getAddressSpace() const
const GlobalValue * getGlobal() const
bool isThreadLocal() const
If the value is "Thread Local", its value isn't shared by the threads.
Definition: GlobalValue.h:263
unsigned getAddressSpace() const
Definition: GlobalValue.h:205
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:656
PointerType * getType() const
Global values are always pointers.
Definition: GlobalValue.h:294
This class is used to form a handle around another node that is persistent and is updated across invo...
static bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
constexpr bool isValid() const
Definition: LowLevelType.h:145
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:67
This SDNode is used for LIFETIME_START/LIFETIME_END values, which indicate the offet and size that ar...
This class is used to represent ISD::LOAD nodes.
static LocationSize precise(uint64_t Value)
TypeSize getValue() const
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:40
Metadata node.
Definition: Metadata.h:1067
Machine Value Type.
SimpleValueType SimpleTy
static MVT getIntegerVT(unsigned BitWidth)
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
Abstract base class for all machine specific constantpool value subclasses.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
bool isFixedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a fixed stack object.
void setObjectAlignment(int ObjectIdx, Align Alignment)
setObjectAlignment - Change the alignment of the specified stack object.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
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.
Function & getFunction()
Return the LLVM function that this machine code represents.
const LLVMTargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
A description of a memory reference used in the backend.
LocationSize getSize() const
Return the size in bytes of the memory reference.
Flags
Flags values. These may be or'd together.
@ MOVolatile
The memory access is volatile.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MOInvariant
The memory access always returns the same value (or traps).
@ MOStore
The memory access writes data.
const MachinePointerInfo & getPointerInfo() const
Flags getFlags() const
Return the raw flags of the source value,.
An SDNode that represents everything that will be needed to construct a MachineInstr.
This class is used to represent an MGATHER node.
This class is used to represent an MLOAD node.
This class is used to represent an MSCATTER node.
This class is used to represent an MSTORE node.
This SDNode is used for target intrinsics that touch memory and need an associated MachineMemOperand.
MemSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt, MachineMemOperand *MMO)
MachineMemOperand * MMO
Memory reference information.
MachineMemOperand * getMemOperand() const
Return a MachineMemOperand object describing the memory reference performed by operation.
const MachinePointerInfo & getPointerInfo() const
unsigned getRawSubclassData() const
Return the SubclassData value, without HasDebugValue.
EVT getMemoryVT() const
Return the type of the in-memory value.
Representation for a specific memory location.
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
Function * getFunction(StringRef Name) const
Look up the specified function in the module symbol table.
Definition: Module.cpp:191
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition: ArrayRef.h:307
The optimization diagnostic interface.
Pass interface - Implemented by all 'passes'.
Definition: Pass.h:94
static PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
Definition: DerivedTypes.h:662
unsigned getAddressSpace() const
Return the address space of the Pointer type.
Definition: DerivedTypes.h:679
bool isNull() const
Test if the pointer held in the union is null, regardless of which type it is.
Definition: PointerUnion.h:142
Analysis providing profile information.
void Deallocate(SubClass *E)
Deallocate - Release storage for the pointed-to object.
Keeps track of dbg_value information through SDISel.
Definition: SelectionDAG.h:159
BumpPtrAllocator & getAlloc()
Definition: SelectionDAG.h:188
void add(SDDbgValue *V, bool isParameter)
void erase(const SDNode *Node)
Invalidate all DbgValues attached to the node and remove it from the Node-to-DbgValues map.
ArrayRef< SDDbgValue * > getSDDbgValues(const SDNode *Node) const
Definition: SelectionDAG.h:194
Holds the information from a dbg_label node through SDISel.
Holds the information for a single machine location through SDISel; either an SDNode,...
static SDDbgOperand fromNode(SDNode *Node, unsigned ResNo)
static SDDbgOperand fromFrameIdx(unsigned FrameIdx)
static SDDbgOperand fromVReg(unsigned VReg)
static SDDbgOperand fromConst(const Value *Const)
@ SDNODE
Value is the result of an expression.
Holds the information from a dbg_value node through SDISel.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
const DebugLoc & getDebugLoc() const
unsigned getIROrder() const
This class provides iterator support for SDUse operands that use a specific SDNode.
Represents one node in the SelectionDAG.
ArrayRef< SDUse > ops() const
const APInt & getAsAPIntVal() const
Helper method returns the APInt value of a ConstantSDNode.
void dumprFull(const SelectionDAG *G=nullptr) const
printrFull to dbgs().
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
bool isDivergent() const
bool isOnlyUserOf(const SDNode *N) const
Return true if this node is the only use of N.
iterator_range< value_op_iterator > op_values() const
unsigned getIROrder() const
Return the node ordering.
static constexpr size_t getMaxNumOperands()
Return the maximum number of operands that a SDNode can hold.
MemSDNodeBitfields MemSDNodeBits
void Profile(FoldingSetNodeID &ID) const
Gather unique data for the node.
bool getHasDebugValue() const
SDNodeFlags getFlags() const
void setNodeId(int Id)
Set unique node id.
void intersectFlagsWith(const SDNodeFlags Flags)
Clear any flags in this node that aren't also set in Flags.
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.
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
bool use_empty() const
Return true if there are no uses of this node.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
unsigned getNumOperands() const
Return the number of values used by this operation.
const SDValue & getOperand(unsigned Num) const
static bool areOnlyUsersOf(ArrayRef< const SDNode * > Nodes, const SDNode *N)
Return true if all the users of N are contained in Nodes.
use_iterator use_begin() const
Provide iteration support to walk over all uses of an SDNode.
bool isOperandOf(const SDNode *N) const
Return true if this node is an operand of N.
const APInt & getConstantOperandAPInt(unsigned Num) const
Helper method returns the APInt of a ConstantSDNode operand.
bool hasPredecessor(const SDNode *N) const
Return true if N is a predecessor of this node.
bool hasAnyUseOfValue(unsigned Value) const
Return true if there are any use of the indicated value.
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
bool isUndef() const
Return true if the type of the node type undefined.
bool hasNUsesOfValue(unsigned NUses, unsigned Value) const
Return true if there are exactly NUSES uses of the indicated value.
op_iterator op_end() const
op_iterator op_begin() const
static use_iterator use_end()
void DropOperands()
Release the operands and set this node to have zero operands.
Represents a use of a SDNode.
SDNode * getNode() const
Convenience function for get().getNode().
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
bool hasOneUse() const
Return true if there is exactly one node using value ResNo of Node.
bool isOperandOf(const SDNode *N) const
Return true if this node is an operand of N.
bool reachesChainWithoutSideEffects(SDValue Dest, unsigned Depth=2) const
Return true if this operand (which must be a chain) reaches the specified operand without crossing an...
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const SDValue & getOperand(unsigned i) const
bool use_empty() const
Return true if there are no nodes using value ResNo of Node.
const APInt & getConstantOperandAPInt(unsigned i) const
uint64_t getScalarValueSizeInBits() const
unsigned getResNo() const
get the index which selects a specific result in the SDNode
uint64_t getConstantOperandVal(unsigned i) const
unsigned getOpcode() const
virtual SDValue EmitTargetCodeForMemset(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, SDValue Op3, Align Alignment, bool isVolatile, bool AlwaysInline, MachinePointerInfo DstPtrInfo) const
Emit target-specific code that performs a memset.
virtual SDValue EmitTargetCodeForMemmove(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, SDValue Op3, Align Alignment, bool isVolatile, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const
Emit target-specific code that performs a memmove.
virtual SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, SDValue Op3, Align Alignment, bool isVolatile, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const
Emit target-specific code that performs a memcpy.
SDNodeFlags getFlags() const
Definition: SelectionDAG.h:379
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
Definition: SelectionDAG.h:225
Align getReducedAlign(EVT VT, bool UseABI)
In most cases this function returns the ABI alignment for a given type, except for illegal vector typ...
SDValue getShiftAmountOperand(EVT LHSTy, SDValue Op)
Return the specified value casted to the target's desired shift amount type.
SDValue getExtLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, EVT MemVT, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
SDValue getExtLoadVP(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT, SDValue Chain, SDValue Ptr, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT MemVT, MaybeAlign Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, bool IsExpanding=false)
SDValue getSplatSourceVector(SDValue V, int &SplatIndex)
If V is a splatted value, return the source vector and its splat index.
SDValue getLabelNode(unsigned Opcode, const SDLoc &dl, SDValue Root, MCSymbol *Label)
OverflowKind computeOverflowForUnsignedSub(SDValue N0, SDValue N1) const
Determine if the result of the unsigned sub of 2 nodes can overflow.
unsigned ComputeMaxSignificantBits(SDValue Op, unsigned Depth=0) const
Get the upper bound on bit size for this Value Op as a signed integer.
const SDValue & getRoot() const
Return the root tag of the SelectionDAG.
Definition: SelectionDAG.h:551
SDValue getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVol, bool isTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), AAResults *AA=nullptr)
SDValue getMaskedGather(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType, ISD::LoadExtType ExtTy)
bool isKnownNeverSNaN(SDValue Op, unsigned Depth=0) const
SDValue getAddrSpaceCast(const SDLoc &dl, EVT VT, SDValue Ptr, unsigned SrcAS, unsigned DestAS)
Return an AddrSpaceCastSDNode.
SDValue getSelect(const SDLoc &DL, EVT VT, SDValue Cond, SDValue LHS, SDValue RHS)
Helper function to make it easier to build Select's if you just have operands and don't want to check...
SDValue getStackArgumentTokenFactor(SDValue Chain)
Compute a TokenFactor to force all the incoming stack arguments to be loaded from the stack.
const TargetSubtargetInfo & getSubtarget() const
Definition: SelectionDAG.h:474
const APInt * getValidMaximumShiftAmountConstant(SDValue V, const APInt &DemandedElts) const
If a SHL/SRA/SRL node V has constant shift amounts that are all less than the element bit-width of th...
SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
void updateDivergence(SDNode *N)
SDValue getSplatValue(SDValue V, bool LegalTypes=false)
If V is a splat vector, return its scalar source operand by extracting that element from the source v...
SDValue FoldSetCC(EVT VT, SDValue N1, SDValue N2, ISD::CondCode Cond, const SDLoc &dl)
Constant fold a setcc to true or false.
MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
void ExtractVectorElements(SDValue Op, SmallVectorImpl< SDValue > &Args, unsigned Start=0, unsigned Count=0, EVT EltVT=EVT())
Append the extracted elements from Start to Count out of the vector Op in Args.
SDValue getNeutralElement(unsigned Opcode, const SDLoc &DL, EVT VT, SDNodeFlags Flags)
Get the (commutative) neutral element for the given opcode, if it exists.
SDValue getAtomicMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Value, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo)
SDValue getVScale(const SDLoc &DL, EVT VT, APInt MulImm, bool ConstantFold=true)
Return a node that represents the runtime scaling 'MulImm * RuntimeVL'.
SDValue getPseudoProbeNode(const SDLoc &Dl, SDValue Chain, uint64_t Guid, uint64_t Index, uint32_t Attr)
Creates a PseudoProbeSDNode with function GUID Guid and the index of the block Index it is probing,...
SDValue getFreeze(SDValue V)
Return a freeze using the SDLoc of the value operand.
SDNode * SelectNodeTo(SDNode *N, unsigned MachineOpc, EVT VT)
These are used for target selectors to mutate the specified node to have the specified return type,...
SelectionDAG(const TargetMachine &TM, CodeGenOptLevel)
SDValue getBitcastedSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
SDValue getConstantPool(const Constant *C, EVT VT, MaybeAlign Align=std::nullopt, int Offs=0, bool isT=false, unsigned TargetFlags=0)
SDValue getStridedLoadVP(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL, SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding=false)
SDNode * isConstantIntBuildVectorOrConstantInt(SDValue N) const
Test whether the given value is a constant int or similar node.
SDValue getAtomicCmpSwap(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDVTList VTs, SDValue Chain, SDValue Ptr, SDValue Cmp, SDValue Swp, MachineMemOperand *MMO)
Gets a node for an atomic cmpxchg op.
SDValue makeEquivalentMemoryOrdering(SDValue OldChain, SDValue NewMemOpChain)
If an existing load has uses of its chain, create a token factor node with that chain and the new mem...
SDDbgValue * getVRegDbgValue(DIVariable *Var, DIExpression *Expr, unsigned VReg, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a VReg SDDbgValue node.
void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To, unsigned Num)
Like ReplaceAllUsesOfValueWith, but for multiple values at once.
SDValue getJumpTableDebugInfo(int JTI, SDValue Chain, const SDLoc &DL)
SDValue getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond, SDValue Chain=SDValue(), bool IsSignaling=false)
Helper function to make it easier to build SetCC's if you just have an ISD::CondCode instead of an SD...
SDValue getSymbolFunctionGlobalAddress(SDValue Op, Function **TargetFunction=nullptr)
Return a GlobalAddress of the function from the current module with name matching the given ExternalS...
SDValue UnrollVectorOp(SDNode *N, unsigned ResNE=0)
Utility function used by legalize and lowering to "unroll" a vector operation by splitting out the sc...
SDValue getConstantFP(double Val, const SDLoc &DL, EVT VT, bool isTarget=false)
Create a ConstantFPSDNode wrapping a constant value.
OverflowKind
Used to represent the possible overflow behavior of an operation.
bool isADDLike(SDValue Op) const
Return true if the specified operand is an ISD::OR or ISD::XOR node that can be treated as an ISD::AD...
bool haveNoCommonBitsSet(SDValue A, SDValue B) const
Return true if A and B have no common bits set.
bool calculateDivergence(SDNode *N)
SDValue getElementCount(const SDLoc &DL, EVT VT, ElementCount EC, bool ConstantFold=true)
SDValue getGetFPEnv(SDValue Chain, const SDLoc &dl, SDValue Ptr, EVT MemVT, MachineMemOperand *MMO)
SDValue getAssertAlign(const SDLoc &DL, SDValue V, Align A)
Return an AssertAlignSDNode.
SDNode * mutateStrictFPToFP(SDNode *Node)
Mutate the specified strict FP node to its non-strict equivalent, unlinking the node from its chain a...
SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr)
Loads are not normal binary operators: their result type is not determined by their operands,...
SDValue getBitcastedZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
SDValue getStepVector(const SDLoc &DL, EVT ResVT, const APInt &StepVal)
Returns a vector of type ResVT whose elements contain the linear sequence <0, Step,...
SDValue getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDValue Chain, SDValue Ptr, SDValue Val, MachineMemOperand *MMO)
Gets a node for an atomic op, produces result (if relevant) and chain and takes 2 operands.
Align getEVTAlign(EVT MemoryVT) const
Compute the default alignment value for the given type.
bool shouldOptForSize() const
SDValue getNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a bitwise NOT operation as (XOR Val, -1).
SDValue getVPZExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op, SDValue Mask, SDValue EVL)
Convert a vector-predicated Op, which must be an integer vector, to the vector-type VT,...
const TargetLowering & getTargetLoweringInfo() const
Definition: SelectionDAG.h:478
bool isEqualTo(SDValue A, SDValue B) const
Test whether two SDValues are known to compare equal.
static constexpr unsigned MaxRecursionDepth
Definition: SelectionDAG.h:448
SDValue getStridedStoreVP(SDValue Chain, const SDLoc &DL, SDValue Val, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
SDValue expandVACopy(SDNode *Node)
Expand the specified ISD::VACOPY node as the Legalize pass would.
SDValue getIndexedMaskedLoad(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
APInt computeVectorKnownZeroElements(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
For each demanded element of a vector, see if it is known to be zero.
void AddDbgValue(SDDbgValue *DB, bool isParameter)
Add a dbg_value SDNode.
bool NewNodesMustHaveLegalTypes
When true, additional steps are taken to ensure that getConstant() and similar functions return DAG n...
Definition: SelectionDAG.h:387
std::pair< EVT, EVT > GetSplitDestVTs(const EVT &VT) const
Compute the VTs needed for the low/hi parts of a type which is split (or expanded) into two not neces...
void salvageDebugInfo(SDNode &N)
To be invoked on an SDNode that is slated to be erased.
SDNode * MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs, ArrayRef< SDValue > Ops)
This mutates the specified node to have the specified return type, opcode, and operands.
std::pair< SDValue, SDValue > UnrollVectorOverflowOp(SDNode *N, unsigned ResNE=0)
Like UnrollVectorOp(), but for the [US](ADD|SUB|MUL)O family of opcodes.
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.
SDValue getGatherVP(SDVTList VTs, EVT VT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
Definition: SelectionDAG.h:828
SDValue getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVol, bool AlwaysInline, bool isTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), AAResults *AA=nullptr)
SDValue getBitcastedAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
bool isSplatValue(SDValue V, const APInt &DemandedElts, APInt &UndefElts, unsigned Depth=0) const
Test whether V has a splatted value for all the demanded elements.
void DeleteNode(SDNode *N)
Remove the specified node from the system.
SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
SDDbgValue * getDbgValueList(DIVariable *Var, DIExpression *Expr, ArrayRef< SDDbgOperand > Locs, ArrayRef< SDNode * > Dependencies, bool IsIndirect, const DebugLoc &DL, unsigned O, bool IsVariadic)
Creates a SDDbgValue node from a list of locations.
SDValue getNegative(SDValue Val, const SDLoc &DL, EVT VT)
Create negative operation as (SUB 0, Val).
void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
SDValue simplifySelect(SDValue Cond, SDValue TVal, SDValue FVal)
Try to simplify a select/vselect into 1 of its operands or a constant.
SDValue getZeroExtendInReg(SDValue Op, const SDLoc &DL, EVT VT)
Return the expression required to zero extend the Op value assuming it was the smaller SrcTy value.
const DataLayout & getDataLayout() const
Definition: SelectionDAG.h:472
SDNode * isConstantFPBuildVectorOrConstantFP(SDValue N) const
Test whether the given value is a constant FP or similar node.
SDValue expandVAArg(SDNode *Node)
Expand the specified ISD::VAARG node as the Legalize pass would.
SDValue getTokenFactor(const SDLoc &DL, SmallVectorImpl< SDValue > &Vals)
Creates a new TokenFactor containing Vals.
bool doesNodeExist(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops)
Check if a node exists without modifying its flags.
bool areNonVolatileConsecutiveLoads(LoadSDNode *LD, LoadSDNode *Base, unsigned Bytes, int Dist) const
Return true if loads are next to each other and can be merged.
SDDbgLabel * getDbgLabel(DILabel *Label, const DebugLoc &DL, unsigned O)
Creates a SDDbgLabel node.
SDValue getStoreVP(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
OverflowKind computeOverflowForUnsignedMul(SDValue N0, SDValue N1) const
Determine if the result of the unsigned mul of 2 nodes can overflow.
void copyExtraInfo(SDNode *From, SDNode *To)
Copy extra info associated with one node to another.
SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
SDValue getGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT, int64_t offset=0, bool isTargetGA=false, unsigned TargetFlags=0)
SDValue getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVol, bool AlwaysInline, bool isTailCall, MachinePointerInfo DstPtrInfo, const AAMDNodes &AAInfo=AAMDNodes())
SDValue getVAArg(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue SV, unsigned Align)
VAArg produces a result and token chain, and takes a pointer and a source value as input.
SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
SDValue getAllOnesConstant(const SDLoc &DL, EVT VT, bool IsTarget=false, bool IsOpaque=false)
Definition: SelectionDAG.h:659
SDValue getMDNode(const MDNode *MD)
Return an MDNodeSDNode which holds an MDNode.
void clear()
Clear state and free memory necessary to make this SelectionDAG ready to process a new block.
void ReplaceAllUsesWith(SDValue From, SDValue To)
Modify anything using 'From' to use 'To' instead.
SDValue getCommutedVectorShuffle(const ShuffleVectorSDNode &SV)
Returns an ISD::VECTOR_SHUFFLE node semantically equivalent to the shuffle node in input but with swa...
std::pair< SDValue, SDValue > SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the vector with EXTRACT_SUBVECTOR using the provided VTs and return the low/high part.
const APInt * getValidShiftAmountConstant(SDValue V, const APInt &DemandedElts) const
If a SHL/SRA/SRL node V has a constant or splat constant shift amount that is less than the element b...
SDValue makeStateFunctionCall(unsigned LibFunc, SDValue Ptr, SDValue InChain, const SDLoc &DLoc)
Helper used to make a call to a library function that has one argument of pointer type.
bool isGuaranteedNotToBeUndefOrPoison(SDValue Op, bool PoisonOnly=false, unsigned Depth=0) const
Return true if this function can prove that Op is never poison and, if PoisonOnly is false,...
SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
Helper function to build ISD::STORE nodes.
SDValue getIndexedLoadVP(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
SDValue getSrcValue(const Value *v)
Construct a node to track a Value* through the backend.
SDValue getSplatVector(EVT VT, const SDLoc &DL, SDValue Op)
Definition: SelectionDAG.h:862
SDValue getAtomicMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo)
OverflowKind computeOverflowForSignedMul(SDValue N0, SDValue N1) const
Determine if the result of the signed mul of 2 nodes can overflow.
MaybeAlign InferPtrAlign(SDValue Ptr) const
Infer alignment of a load / store address.
bool MaskedValueIsAllOnes(SDValue Op, const APInt &Mask, unsigned Depth=0) const
Return true if '(Op & Mask) == Mask'.
bool SignBitIsZero(SDValue Op, unsigned Depth=0) const
Return true if the sign bit of Op is known to be zero.
SDValue getRegister(unsigned Reg, EVT VT)
void init(MachineFunction &NewMF, OptimizationRemarkEmitter &NewORE, Pass *PassPtr, const TargetLibraryInfo *LibraryInfo, UniformityInfo *UA, ProfileSummaryInfo *PSIin, BlockFrequencyInfo *BFIin, FunctionVarLocs const *FnVarLocs)
Prepare this SelectionDAG to process code in the given MachineFunction.
void RemoveDeadNodes()
This method deletes all unreachable nodes in the SelectionDAG.
void RemoveDeadNode(SDNode *N)
Remove the specified node from the system.
void AddDbgLabel(SDDbgLabel *DB)
Add a dbg_label SDNode.
bool isConstantValueOfAnyType(SDValue N) const
SDValue getTargetExtractSubreg(int SRIdx, const SDLoc &DL, EVT VT, SDValue Operand)
A convenience function for creating TargetInstrInfo::EXTRACT_SUBREG nodes.
SDValue getBasicBlock(MachineBasicBlock *MBB)
SDValue getSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either sign-extending or trunca...
bool isKnownToBeAPowerOfTwo(SDValue Val, unsigned Depth=0) const
Test if the given value is known to have exactly one bit set.
SDValue getEHLabel(const SDLoc &dl, SDValue Root, MCSymbol *Label)
SDValue getIndexedStoreVP(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
bool isKnownNeverZero(SDValue Op, unsigned Depth=0) const
Test whether the given SDValue is known to contain non-zero value(s).
SDValue getIndexedStore(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
SDValue getSetFPEnv(SDValue Chain, const SDLoc &dl, SDValue Ptr, EVT MemVT, MachineMemOperand *MMO)
SDValue getBoolExtOrTrunc(SDValue Op, const SDLoc &SL, EVT VT, EVT OpVT)
Convert Op, which must be of integer type, to the integer type VT, by using an extension appropriate ...
SDValue getMaskedStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Base, SDValue Offset, SDValue Mask, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
static const fltSemantics & EVTToAPFloatSemantics(EVT VT)
Returns an APFloat semantics tag appropriate for the given type.
SDValue getExternalSymbol(const char *Sym, EVT VT)
const TargetMachine & getTarget() const
Definition: SelectionDAG.h:473
std::pair< SDValue, SDValue > getStrictFPExtendOrRound(SDValue Op, SDValue Chain, const SDLoc &DL, EVT VT)
Convert Op, which must be a STRICT operation of float type, to the float type VT, by either extending...
std::pair< SDValue, SDValue > SplitEVL(SDValue N, EVT VecVT, const SDLoc &DL)
Split the explicit vector length parameter of a VP operation.
SDValue getPtrExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either truncating it or perform...
SDValue getVPLogicalNOT(const SDLoc &DL, SDValue Val, SDValue Mask, SDValue EVL, EVT VT)
Create a vector-predicated logical NOT operation as (VP_XOR Val, BooleanOne, Mask,...
SDValue getAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either any-extending or truncat...
iterator_range< allnodes_iterator > allnodes()
Definition: SelectionDAG.h:543
SDValue getBlockAddress(const BlockAddress *BA, EVT VT, int64_t Offset=0, bool isTarget=false, unsigned TargetFlags=0)
SDValue WidenVector(const SDValue &N, const SDLoc &DL)
Widen the vector up to the next power of two using INSERT_SUBVECTOR.
bool isKnownNeverZeroFloat(SDValue Op) const
Test whether the given floating point SDValue is known to never be positive or negative zero.
SDValue getLoadVP(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, const MDNode *Ranges=nullptr, bool IsExpanding=false)
SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
SDDbgValue * getConstantDbgValue(DIVariable *Var, DIExpression *Expr, const Value *C, const DebugLoc &DL, unsigned O)
Creates a constant SDDbgValue node.
SDValue getScatterVP(SDVTList VTs, EVT VT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
SDValue getValueType(EVT)
ArrayRef< SDDbgValue * > GetDbgValues(const SDNode *SD) const
Get the debug values which reference the given SDNode.
SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
OverflowKind computeOverflowForSignedAdd(SDValue N0, SDValue N1) const
Determine if the result of the signed addition of 2 nodes can overflow.
SDValue getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of float type, to the float type VT, by either extending or rounding (by tr...
unsigned AssignTopologicalOrder()
Topological-sort the AllNodes list and a assign a unique node id for each node in the DAG based on th...
ilist< SDNode >::size_type allnodes_size() const
Definition: SelectionDAG.h:539
SDValue getAtomicMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo)
bool isKnownNeverNaN(SDValue Op, bool SNaN=false, unsigned Depth=0) const
Test whether the given SDValue (or all elements of it, if it is a vector) is known to never be NaN.
SDValue getIndexedMaskedStore(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
SDValue getTruncStoreVP(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, bool IsCompressing=false)
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
Definition: SelectionDAG.h:676
unsigned ComputeNumSignBits(SDValue Op, unsigned Depth=0) const
Return the number of times the sign bit of the register is replicated into the other bits.
bool MaskedVectorIsZero(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
Return true if 'Op' is known to be zero in DemandedElts.
SDValue getBoolConstant(bool V, const SDLoc &DL, EVT VT, EVT OpVT)
Create a true or false constant of type VT using the target's BooleanContent for type OpVT.
SDDbgValue * getFrameIndexDbgValue(DIVariable *Var, DIExpression *Expr, unsigned FI, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a FrameIndex SDDbgValue node.
SDValue getExtStridedLoadVP(ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain, SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding=false)
SDValue getJumpTable(int JTI, EVT VT, bool isTarget=false, unsigned TargetFlags=0)
bool isBaseWithConstantOffset(SDValue Op) const
Return true if the specified operand is an ISD::ADD with a ConstantSDNode on the right-hand side,...
SDValue getVPPtrExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op, SDValue Mask, SDValue EVL)
Convert a vector-predicated Op, which must be of integer type, to the vector-type integer type VT,...
SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
void ReplaceAllUsesOfValueWith(SDValue From, SDValue To)
Replace any uses of From with To, leaving uses of other values produced by From.getNode() alone.
MachineFunction & getMachineFunction() const
Definition: SelectionDAG.h:469
SDValue getPtrExtendInReg(SDValue Op, const SDLoc &DL, EVT VT)
Return the expression required to extend the Op as a pointer value assuming it was the smaller SrcTy ...
bool canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts, bool PoisonOnly=false, bool ConsiderFlags=true, unsigned Depth=0) const
Return true if Op can create undef or poison from non-undef & non-poison operands.
OverflowKind computeOverflowForUnsignedAdd(SDValue N0, SDValue N1) const
Determine if the result of the unsigned addition of 2 nodes can overflow.
SDValue getSplatBuildVector(EVT VT, const SDLoc &DL, SDValue Op)
Return a splat ISD::BUILD_VECTOR node, consisting of Op splatted to all elements.
Definition: SelectionDAG.h:845
SDValue FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops)
SDValue getFrameIndex(int FI, EVT VT, bool isTarget=false)
SDValue getTruncStridedStoreVP(SDValue Chain, const SDLoc &DL, SDValue Val, SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT SVT, MachineMemOperand *MMO, bool IsCompressing=false)
void canonicalizeCommutativeBinop(unsigned Opcode, SDValue &N1, SDValue &N2) const
Swap N1 and N2 if Opcode is a commutative binary opcode and the canonical form expects the opposite o...
KnownBits computeKnownBits(SDValue Op, unsigned Depth=0) const
Determine which bits of Op are known to be either zero or one and return them in Known.
SDValue getRegisterMask(const uint32_t *RegMask)
SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
SDValue getCondCode(ISD::CondCode Cond)
SDValue getLifetimeNode(bool IsStart, const SDLoc &dl, SDValue Chain, int FrameIndex, int64_t Size, int64_t Offset=-1)
Creates a LifetimeSDNode that starts (IsStart==true) or ends (IsStart==false) the lifetime of the por...
bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth=0) const
Return true if 'Op & Mask' is known to be zero.
OverflowKind computeOverflowForSignedSub(SDValue N0, SDValue N1) const
Determine if the result of the signed sub of 2 nodes can overflow.
LLVMContext * getContext() const
Definition: SelectionDAG.h:485
SDValue simplifyFPBinop(unsigned Opcode, SDValue X, SDValue Y, SDNodeFlags Flags)
Try to simplify a floating-point binary operation into 1 of its operands or a constant.
const SDValue & setRoot(SDValue N)
Set the current root tag of the SelectionDAG.
Definition: SelectionDAG.h:560
const APInt * getValidMinimumShiftAmountConstant(SDValue V, const APInt &DemandedElts) const
If a SHL/SRA/SRL node V has constant shift amounts that are all less than the element bit-width of th...
SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL, bool LegalTypes=true)
SDValue getMemIntrinsicNode(unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef< SDValue > Ops, EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags Flags=MachineMemOperand::MOLoad|MachineMemOperand::MOStore, LocationSize Size=0, const AAMDNodes &AAInfo=AAMDNodes())
Creates a MemIntrinsicNode that may produce a result and takes a list of operands.
SDValue getTargetExternalSymbol(const char *Sym, EVT VT, unsigned TargetFlags=0)
SDValue getMCSymbol(MCSymbol *Sym, EVT VT)
bool isUndef(unsigned Opcode, ArrayRef< SDValue > Ops)
Return true if the result of this operation is always undefined.
SDValue CreateStackTemporary(TypeSize Bytes, Align Alignment)
Create a stack temporary based on the size in bytes and the alignment.
SDNode * UpdateNodeOperands(SDNode *N, SDValue Op)
Mutate the specified node in-place to have the specified operands.
std::pair< EVT, EVT > GetDependentSplitDestVTs(const EVT &VT, const EVT &EnvVT, bool *HiIsEmpty) const
Compute the VTs needed for the low/hi parts of a type, dependent on an enveloping VT that has been sp...
SDValue foldConstantFPMath(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops)
Fold floating-point operations when all operands are constants and/or undefined.
SDNode * getNodeIfExists(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops, const SDNodeFlags Flags)
Get the specified node if it's already available, or else return NULL.
SDValue FoldSymbolOffset(unsigned Opcode, EVT VT, const GlobalAddressSDNode *GA, const SDNode *N2)
SDValue getIndexedLoad(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
SDValue getTargetInsertSubreg(int SRIdx, const SDLoc &DL, EVT VT, SDValue Operand, SDValue Subreg)
A convenience function for creating TargetInstrInfo::INSERT_SUBREG nodes.
SDValue getEntryNode() const
Return the token chain corresponding to the entry of the function.
Definition: SelectionDAG.h:554
SDDbgValue * getDbgValue(DIVariable *Var, DIExpression *Expr, SDNode *N, unsigned R, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a SDDbgValue node.
SDValue getMaskedLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Base, SDValue Offset, SDValue Mask, SDValue Src0, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, ISD::LoadExtType, bool IsExpanding=false)
SDValue getSplat(EVT VT, const SDLoc &DL, SDValue Op)
Returns a node representing a splat of one value into all lanes of the provided vector type.
Definition: SelectionDAG.h:878
std::pair< SDValue, SDValue > SplitScalar(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the scalar node with EXTRACT_ELEMENT using the provided VTs and return the low/high part.
SDValue matchBinOpReduction(SDNode *Extract, ISD::NodeType &BinOp, ArrayRef< ISD::NodeType > CandidateBinOps, bool AllowPartials=false)
Match a binop + shuffle pyramid that represents a horizontal reduction over the elements of a vector ...
SDValue getVectorShuffle(EVT VT, const SDLoc &dl, SDValue N1, SDValue N2, ArrayRef< int > Mask)
Return an ISD::VECTOR_SHUFFLE node.
SDValue simplifyShift(SDValue X, SDValue Y)
Try to simplify a shift into 1 of its operands or a constant.
void transferDbgValues(SDValue From, SDValue To, unsigned OffsetInBits=0, unsigned SizeInBits=0, bool InvalidateDbg=true)
Transfer debug values from one node to another, while optionally generating fragment expressions for ...
SDValue getLogicalNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a logical NOT operation as (XOR Val, BooleanOne).
SDValue getMaskedScatter(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType, bool IsTruncating=false)
ilist< SDNode >::iterator allnodes_iterator
Definition: SelectionDAG.h:534
This SDNode is used to implement the code generator support for the llvm IR shufflevector instruction...
static bool isSplatMask(const int *Mask, EVT VT)
int getMaskElt(unsigned Idx) const
ArrayRef< int > getMask() const
static void commuteMask(MutableArrayRef< int > Mask)
Change values in a shuffle permute mask assuming the two vector operands have swapped position.
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
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 assign(size_type NumElts, ValueParamT Elt)
Definition: SmallVector.h:717
reference emplace_back(ArgTypes &&... Args)
Definition: SmallVector.h:950
void reserve(size_type N)
Definition: SmallVector.h:676
iterator erase(const_iterator CI)
Definition: SmallVector.h:750
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
Definition: SmallVector.h:696
void push_back(const T &Elt)
Definition: SmallVector.h:426
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.
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
Information about stack frame layout on the target.
virtual TargetStackID::Value getStackIDForScalableVectors() const
Returns the StackID that scalable vectors should be associated with.
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
Completely target-dependent object reference.
unsigned getTargetFlags() const
Provides information about what library functions are available for the current target.
CallingConv::ID getLibcallCallingConv(RTLIB::Libcall Call) const
Get the CallingConv that should be used for the specified libcall.
virtual bool shouldConvertConstantLoadToIntImm(const APInt &Imm, Type *Ty) const
Return true if it is beneficial to convert a load of a constant to just the constant itself.
virtual bool isSExtCheaperThanZExt(EVT FromTy, EVT ToTy) const
Return true if sign-extension from FromTy to ToTy is cheaper than zero-extension.
virtual MVT getVectorIdxTy(const DataLayout &DL) const
Returns the type to be used for the index operand of: ISD::INSERT_VECTOR_ELT, ISD::EXTRACT_VECTOR_ELT...
const TargetMachine & getTargetMachine() const
virtual bool isZExtFree(Type *FromTy, Type *ToTy) const
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
unsigned getMaxStoresPerMemcpy(bool OptSize) const
Get maximum # of store operations permitted for llvm.memcpy.
virtual bool isCommutativeBinOp(unsigned Opcode) const
Returns true if the opcode is a commutative binary operation.
virtual ISD::NodeType getExtendForAtomicOps() const
Returns how the platform's atomic operations are extended (ZERO_EXTEND, SIGN_EXTEND,...
virtual bool isExtractSubvectorCheap(EVT ResVT, EVT SrcVT, unsigned Index) const
Return true if EXTRACT_SUBVECTOR is cheap for extracting this result type from this source type with ...
virtual bool shallExtractConstSplatVectorElementToStore(Type *VectorTy, unsigned ElemSizeInBits, unsigned &Index) const
Return true if the target shall perform extract vector element and store given that the vector is kno...
virtual bool isTruncateFree(Type *FromTy, Type *ToTy) const
Return true if it's free to truncate a value of type FromTy to type ToTy.
virtual EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const
Return the ValueType of the result of SETCC operations.
EVT getShiftAmountTy(EVT LHSTy, const DataLayout &DL, bool LegalTypes=true) const
Returns the type for the shift amount of a shift opcode.
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
BooleanContent getBooleanContents(bool isVec, bool isFloat) const
For targets without i1 registers, this gives the nature of the high-bits of boolean values held in ty...
bool isCondCodeLegal(ISD::CondCode CC, MVT VT) const
Return true if the specified condition code is legal on this target.
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
bool isOperationLegal(unsigned Op, EVT VT) const
Return true if the specified operation is legal on this target.
BooleanContent
Enum that describes how the target represents true/false values.
unsigned getMaxStoresPerMemmove(bool OptSize) const
Get maximum # of store operations permitted for llvm.memmove.
virtual unsigned getMaxGluedStoresPerMemcpy() const
Get maximum # of store operations to be glued together.
Align getMinStackArgumentAlignment() const
Return the minimum stack alignment of an argument.
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
const char * getLibcallName(RTLIB::Libcall Call) const
Get the libcall routine name for the specified libcall.
std::vector< ArgListEntry > ArgListTy
virtual bool hasVectorBlend() const
Return true if the target has a vector blend instruction.
unsigned getMaxStoresPerMemset(bool OptSize) const
Get maximum # of store operations permitted for llvm.memset.
MVT getFrameIndexTy(const DataLayout &DL) const
Return the type for frame index, which is determined by the alloca address space specified through th...
virtual bool isLegalStoreImmediate(int64_t Value) const
Return true if the specified immediate is legal for the value input of a store instruction.
unsigned getVectorTypeBreakdown(LLVMContext &Context, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const
Vector types are broken down into some number of legal first class types.
static ISD::NodeType getExtendForContent(BooleanContent Content)
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual void computeKnownBitsForFrameIndex(int FIOp, KnownBits &Known, const MachineFunction &MF) const
Determine which of the bits of FrameIndex FIOp are known to be 0.
virtual unsigned ComputeNumSignBitsForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, unsigned Depth=0) const
This method can be implemented by targets that want to expose additional information about sign bits ...
virtual void verifyTargetSDNode(const SDNode *N) const
Check the given SDNode. Aborts if it is invalid.
virtual bool findOptimalMemOpLowering(std::vector< EVT > &MemOps, unsigned Limit, const MemOp &Op, unsigned DstAS, unsigned SrcAS, const AttributeList &FuncAttributes) const
Determines the optimal series of memory ops to replace the memset / memcpy.
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
virtual bool isKnownNeverNaNForTargetNode(SDValue Op, const SelectionDAG &DAG, bool SNaN=false, unsigned Depth=0) const
If SNaN is false,.
virtual void computeKnownBitsForTargetNode(const SDValue Op, KnownBits &Known, const APInt &DemandedElts, const SelectionDAG &DAG, unsigned Depth=0) const
Determine which of the bits specified in Mask are known to be either zero or one and return them in t...
virtual bool isSDNodeSourceOfDivergence(const SDNode *N, FunctionLoweringInfo *FLI, UniformityInfo *UA) const
virtual bool isSDNodeAlwaysUniform(const SDNode *N) const
virtual bool isSplatValueForTargetNode(SDValue Op, const APInt &DemandedElts, APInt &UndefElts, const SelectionDAG &DAG, unsigned Depth=0) const
Return true if vector Op has the same value across all DemandedElts, indicating any elements which ma...
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const
Return true if folding a constant offset with the given GlobalAddress is legal.
virtual const Constant * getTargetConstantFromLoad(LoadSDNode *LD) const
This method returns the constant pool value that will be loaded by LD.
virtual bool isGAPlusOffset(SDNode *N, const GlobalValue *&GA, int64_t &Offset) const
Returns true (and the GlobalValue and the offset) if the node is a GlobalAddress + offset.
virtual bool isGuaranteedNotToBeUndefOrPoisonForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, bool PoisonOnly, unsigned Depth) const
Return true if this function can prove that Op is never poison and, if PoisonOnly is false,...
virtual bool canCreateUndefOrPoisonForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, bool PoisonOnly, bool ConsiderFlags, unsigned Depth) const
Return true if Op can create undef or poison from non-undef & non-poison operands.
Primary interface to the complete machine description for the target machine.
Definition: TargetMachine.h:76
virtual bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const
Returns true if a cast between SrcAS and DestAS is a noop.
const Triple & getTargetTriple() const
TargetOptions Options
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const SelectionDAGTargetInfo * getSelectionDAGInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetLowering * getTargetLowering() const
bool isOSDarwin() const
Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, XROS, or DriverKit).
Definition: Triple.h:553
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition: TypeSize.h:330
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
bool isVectorTy() const
True if this is an instance of VectorType.
Definition: Type.h:265
unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
static Type * getVoidTy(LLVMContext &C)
static IntegerType * getInt8Ty(LLVMContext &C)
TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
A Use represents the edge between a Value definition and its users.
Definition: Use.h:43
void set(Value *Val)
Definition: Value.h:882
This class is used to represent an VP_GATHER node.
This class is used to represent a VP_LOAD node.
This class is used to represent an VP_SCATTER node.
This class is used to represent a VP_STORE node.
This class is used to represent an EXPERIMENTAL_VP_STRIDED_LOAD node.
This class is used to represent an EXPERIMENTAL_VP_STRIDED_STORE node.
LLVM Value Representation.
Definition: Value.h:74
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:255
std::pair< iterator, bool > insert(const ValueT &V)
Definition: DenseSet.h:206
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition: DenseSet.h:185
constexpr ScalarTy getFixedValue() const
Definition: TypeSize.h:187
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition: TypeSize.h:217
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition: TypeSize.h:171
constexpr bool isKnownEven() const
A return value of true indicates we know at compile time that the number of elements (vscale * Min) i...
Definition: TypeSize.h:176
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition: TypeSize.h:168
static constexpr bool isKnownGE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition: TypeSize.h:224
A raw_ostream that writes to an std::string.
Definition: raw_ostream.h:660
std::string & str()
Returns the string's reference.
Definition: raw_ostream.h:678
SmartMutex - A mutex with a compile time constant parameter that indicates whether this mutex should ...
Definition: Mutex.h:28
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
APInt mulhu(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on zero-extended operands.
Definition: APInt.cpp:3100
const APInt abdu(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be unsigned.
Definition: APInt.h:2203
APInt avgCeilU(const APInt &C1, const APInt &C2)
Compute the ceil of the unsigned average of C1 and C2.
Definition: APInt.cpp:3087
APInt avgFloorU(const APInt &C1, const APInt &C2)
Compute the floor of the unsigned average of C1 and C2.
Definition: APInt.cpp:3077
const APInt abds(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be signed.
Definition: APInt.h:2198
APInt mulhs(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on sign-extended operands.
Definition: APInt.cpp:3092
APInt ScaleBitMask(const APInt &A, unsigned NewBitWidth, bool MatchAllBits=false)
Splat/Merge neighboring bits to widen/narrow the bitmask represented by.
Definition: APInt.cpp:2978
APInt avgFloorS(const APInt &C1, const APInt &C2)
Compute the floor of the signed average of C1 and C2.
Definition: APInt.cpp:3072
APInt avgCeilS(const APInt &C1, const APInt &C2)
Compute the ceil of the signed average of C1 and C2.
Definition: APInt.cpp:3082
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition: CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
CondCode getSetCCInverse(CondCode Operation, bool isIntegerLike)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
CondCode getSetCCAndOperation(CondCode Op1, CondCode Op2, EVT Type)
Return the result of a logical AND between different comparisons of identical values: ((X op1 Y) & (X...
bool isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are ~0 ...
bool isNON_EXTLoad(const SDNode *N)
Returns true if the specified node is a non-extending load.
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition: ISDOpcodes.h:40
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
Definition: ISDOpcodes.h:750
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition: ISDOpcodes.h:236
@ CTLZ_ZERO_UNDEF
Definition: ISDOpcodes.h:723
@ TargetConstantPool
Definition: ISDOpcodes.h:168
@ MDNODE_SDNODE
MDNODE_SDNODE - This is a node that holdes an MDNode*, which is used to reference metadata in the IR.
Definition: ISDOpcodes.h:1177
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
Definition: ISDOpcodes.h:476
@ ATOMIC_LOAD_FMAX
Definition: ISDOpcodes.h:1282
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition: ISDOpcodes.h:44
@ VECREDUCE_SEQ_FADD
Generic reduction nodes.
Definition: ISDOpcodes.h:1345
@ VECREDUCE_SMIN
Definition: ISDOpcodes.h:1376
@ FGETSIGN
INT = FGETSIGN(FP) - Return the sign bit of the specified floating point value as an integer 0/1 valu...
Definition: ISDOpcodes.h:497
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
Definition: ISDOpcodes.h:250
@ ATOMIC_LOAD_NAND
Definition: ISDOpcodes.h:1275
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition: ISDOpcodes.h:559
@ JUMP_TABLE_DEBUG_INFO
JUMP_TABLE_DEBUG_INFO - Jumptable debug info.
Definition: ISDOpcodes.h:1066
@ BSWAP
Byte Swap and Counting operators.
Definition: ISDOpcodes.h:714
@ TargetBlockAddress
Definition: ISDOpcodes.h:170
@ ConstantFP
Definition: ISDOpcodes.h:77
@ ATOMIC_LOAD_MAX
Definition: ISDOpcodes.h:1277
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, ptr, val) This corresponds to "store atomic" instruction.
Definition: ISDOpcodes.h:1247
@ ATOMIC_LOAD_UMIN
Definition: ISDOpcodes.h:1278
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
Definition: ISDOpcodes.h:269
@ FMAD
FMAD - Perform a * b + c, while getting the same result as the separately rounded operations.
Definition: ISDOpcodes.h:487
@ FMAXNUM_IEEE
Definition: ISDOpcodes.h:985
@ ADD
Simple integer binary arithmetic operators.
Definition: ISDOpcodes.h:239
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
Definition: ISDOpcodes.h:1037
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition: ISDOpcodes.h:783
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition: ISDOpcodes.h:483
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition: ISDOpcodes.h:199
@ 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:1260
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition: ISDOpcodes.h:790
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition: ISDOpcodes.h:543
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
Definition: ISDOpcodes.h:1361
@ FADD
Simple binary floating point operators.
Definition: ISDOpcodes.h:390
@ VECREDUCE_FMAXIMUM
FMINIMUM/FMAXIMUM nodes propatate NaNs and signed zeroes using the llvm.minimum and llvm....
Definition: ISDOpcodes.h:1365
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition: ISDOpcodes.h:688
@ SIGN_EXTEND_VECTOR_INREG
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
Definition: ISDOpcodes.h:820
@ VECREDUCE_SMAX
Definition: ISDOpcodes.h:1375
@ STRICT_FSETCCS
Definition: ISDOpcodes.h:477
@ FP16_TO_FP
FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions and truncation for half-preci...
Definition: ISDOpcodes.h:913
@ ATOMIC_LOAD_OR
Definition: ISDOpcodes.h:1273
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
Definition: ISDOpcodes.h:903
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition: ISDOpcodes.h:229
@ ATOMIC_LOAD_XOR
Definition: ISDOpcodes.h:1274
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
Definition: ISDOpcodes.h:939
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
Definition: ISDOpcodes.h:1406
@ ATOMIC_LOAD_FADD
Definition: ISDOpcodes.h:1280
@ GlobalTLSAddress
Definition: ISDOpcodes.h:79
@ SRCVALUE
SRCVALUE - This is a node type that holds a Value* that is used to make reference to a value in the L...
Definition: ISDOpcodes.h:1173
@ FrameIndex
Definition: ISDOpcodes.h:80
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
Definition: ISDOpcodes.h:1108
@ SIGN_EXTEND
Conversion operators.
Definition: ISDOpcodes.h:774
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
Definition: ISDOpcodes.h:662
@ SCALAR_TO_VECTOR
SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a scalar value into element 0 of the...
Definition: ISDOpcodes.h:620
@ TargetExternalSymbol
Definition: ISDOpcodes.h:169
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
Definition: ISDOpcodes.h:1358
@ CTTZ_ZERO_UNDEF
Bit counting operators with an undefined result for zero inputs.
Definition: ISDOpcodes.h:722
@ TargetJumpTable
Definition: ISDOpcodes.h:167
@ TargetIndex
TargetIndex - Like a constant pool entry, but with completely target-dependent semantics.
Definition: ISDOpcodes.h:177
@ PREFETCH
PREFETCH - This corresponds to a prefetch intrinsic.
Definition: ISDOpcodes.h:1227
@ VECREDUCE_FMIN
Definition: ISDOpcodes.h:1362
@ 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:758
@ FNEG
Perform various unary floating-point operations inspired by libm.
Definition: ISDOpcodes.h:930
@ ATOMIC_LOAD_FSUB
Definition: ISDOpcodes.h:1281
@ BR_CC
BR_CC - Conditional branch.
Definition: ISDOpcodes.h:1083
@ SSUBO
Same for subtraction.
Definition: ISDOpcodes.h:327
@ ATOMIC_LOAD_MIN
Definition: ISDOpcodes.h:1276
@ STEP_VECTOR
STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised of a linear sequence of unsign...
Definition: ISDOpcodes.h:646
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition: ISDOpcodes.h:500
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition: ISDOpcodes.h:349
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition: ISDOpcodes.h:727
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
Definition: ISDOpcodes.h:1243
@ UNDEF
UNDEF - An undefined node.
Definition: ISDOpcodes.h:211
@ VECREDUCE_UMAX
Definition: ISDOpcodes.h:1377
@ RegisterMask
Definition: ISDOpcodes.h:75
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition: ISDOpcodes.h:222
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition: ISDOpcodes.h:627
@ AssertAlign
AssertAlign - These nodes record if a register contains a value that has a known alignment and the tr...
Definition: ISDOpcodes.h:68
@ ATOMIC_LOAD_FMIN
Definition: ISDOpcodes.h:1283
@ BasicBlock
Various leaf nodes.
Definition: ISDOpcodes.h:71
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition: ISDOpcodes.h:323
@ TargetGlobalAddress
TargetGlobalAddress - Like GlobalAddress, but the DAG does no folding or anything else with this node...
Definition: ISDOpcodes.h:164
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
Definition: ISDOpcodes.h:1370
@ MULHU
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
Definition: ISDOpcodes.h:651
@ SHL
Shift and rotation operations.
Definition: ISDOpcodes.h:705
@ ATOMIC_LOAD_CLR
Definition: ISDOpcodes.h:1272
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
Definition: ISDOpcodes.h:600
@ ATOMIC_LOAD_AND
Definition: ISDOpcodes.h:1271
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition: ISDOpcodes.h:573
@ FMINNUM_IEEE
FMINNUM_IEEE/FMAXNUM_IEEE - Perform floating-point minimumNumber or maximumNumber on two values,...
Definition: ISDOpcodes.h:984
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
Definition: ISDOpcodes.h:47
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition: ISDOpcodes.h:535
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition: ISDOpcodes.h:780
@ TargetConstantFP
Definition: ISDOpcodes.h:159
@ FP_TO_UINT_SAT
Definition: ISDOpcodes.h:856
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
Definition: ISDOpcodes.h:742
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
Definition: ISDOpcodes.h:1335
@ ATOMIC_CMP_SWAP
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo,...
Definition: ISDOpcodes.h:1254
@ ATOMIC_LOAD_UMAX
Definition: ISDOpcodes.h:1279
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum or maximum on two values.
Definition: ISDOpcodes.h:971
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition: ISDOpcodes.h:359
@ SMULO
Same for multiplication.
Definition: ISDOpcodes.h:331
@ TargetFrameIndex
Definition: ISDOpcodes.h:166
@ ConstantPool
Definition: ISDOpcodes.h:82
@ ANY_EXTEND_VECTOR_INREG
ANY_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register any-extension of the low la...
Definition: ISDOpcodes.h:809
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition: ISDOpcodes.h:798
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition: ISDOpcodes.h:674
@ LIFETIME_START
This corresponds to the llvm.lifetime.
Definition: ISDOpcodes.h:1310
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition: ISDOpcodes.h:888
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition: ISDOpcodes.h:736
@ UADDO_CARRY
Carry-using nodes for multiple precision addition and subtraction.
Definition: ISDOpcodes.h:303
@ HANDLENODE
HANDLENODE node - Used as a handle for various purposes.
Definition: ISDOpcodes.h:1197
@ VECREDUCE_UMIN
Definition: ISDOpcodes.h:1378
@ BF16_TO_FP
BF16_TO_FP, FP_TO_BF16 - These operators are used to perform promotions and truncation for bfloat16.
Definition: ISDOpcodes.h:922
@ ATOMIC_LOAD_UDEC_WRAP
Definition: ISDOpcodes.h:1285
@ ATOMIC_LOAD_ADD
Definition: ISDOpcodes.h:1269
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition: ISDOpcodes.h:465
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
Definition: ISDOpcodes.h:990
@ ATOMIC_LOAD_SUB
Definition: ISDOpcodes.h:1270
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition: ISDOpcodes.h:836
@ 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:470
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition: ISDOpcodes.h:680
@ 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:1013
@ PSEUDO_PROBE
Pseudo probe for AutoFDO, as a place holder in a basic block to improve the sample counts quality.
Definition: ISDOpcodes.h:1330
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
Definition: ISDOpcodes.h:657
@ VECREDUCE_FMUL
Definition: ISDOpcodes.h:1359
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
Definition: ISDOpcodes.h:279
@ SPLAT_VECTOR_PARTS
SPLAT_VECTOR_PARTS(SCALAR1, SCALAR2, ...) - Returns a vector with the scalar values joined together a...
Definition: ISDOpcodes.h:636
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition: ISDOpcodes.h:524
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition: ISDOpcodes.h:52
@ VECTOR_SPLICE
VECTOR_SPLICE(VEC1, VEC2, IMM) - Returns a subvector of the same type as VEC1/VEC2 from CONCAT_VECTOR...
Definition: ISDOpcodes.h:612
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
Definition: ISDOpcodes.h:1268
@ ExternalSymbol
Definition: ISDOpcodes.h:83
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
Definition: ISDOpcodes.h:944
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition: ISDOpcodes.h:869
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
Definition: ISDOpcodes.h:831
@ ADDRSPACECAST
ADDRSPACECAST - This operator converts between pointers of different address spaces.
Definition: ISDOpcodes.h:907
@ 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:855
@ VECREDUCE_FMINIMUM
Definition: ISDOpcodes.h:1366
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition: ISDOpcodes.h:786
@ VAARG
VAARG - VAARG has four operands: an input chain, a pointer, a SRCVALUE, and the alignment.
Definition: ISDOpcodes.h:1152
@ BlockAddress
Definition: ISDOpcodes.h:84
@ VECREDUCE_SEQ_FMUL
Definition: ISDOpcodes.h:1346
@ SHL_PARTS
SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded integer shift operations.
Definition: ISDOpcodes.h:763
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition: ISDOpcodes.h:61
@ ATOMIC_LOAD_UINC_WRAP
Definition: ISDOpcodes.h:1284
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition: ISDOpcodes.h:493
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition: ISDOpcodes.h:340
@ AssertZext
Definition: ISDOpcodes.h:62
@ SET_FPENV_MEM
Sets the current floating point environment.
Definition: ISDOpcodes.h:1018
@ SADDO_CARRY
Carry-using overflow-aware nodes for multiple precision addition and subtraction.
Definition: ISDOpcodes.h:313
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition: ISDOpcodes.h:192
@ TargetGlobalTLSAddress
Definition: ISDOpcodes.h:165
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition: ISDOpcodes.h:515
unsigned getVPForBaseOpcode(unsigned Opcode)
Translate this non-VP Opcode to its corresponding VP Opcode.
bool isBuildVectorOfConstantSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantSDNode or undef.
NodeType getExtForLoadExtType(bool IsFP, LoadExtType)
bool matchUnaryPredicate(SDValue Op, std::function< bool(ConstantSDNode *)> Match, bool AllowUndefs=false)
Hook for matching ConstantSDNode predicate.
bool isZEXTLoad(const SDNode *N)
Returns true if the specified node is a ZEXTLOAD.
bool matchUnaryFpPredicate(SDValue Op, std::function< bool(ConstantFPSDNode *)> Match, bool AllowUndefs=false)
Hook for matching ConstantFPSDNode predicate.
static const int FIRST_TARGET_MEMORY_OPCODE
FIRST_TARGET_MEMORY_OPCODE - Target-specific pre-isel operations which do not reference a specific me...
Definition: ISDOpcodes.h:1418
bool isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are 0 o...
bool isVectorShrinkable(const SDNode *N, unsigned NewEltSize, bool Signed)
Returns true if the specified node is a vector where all elements can be truncated to the specified e...
bool matchUnaryPredicateImpl(SDValue Op, std::function< bool(ConstNodeType *)> Match, bool AllowUndefs=false)
Attempt to match a unary predicate against a scalar/splat constant or every element of a constant BUI...
bool isVPBinaryOp(unsigned Opcode)
Whether this is a vector-predicated binary operation opcode.
CondCode getSetCCInverse(CondCode Operation, EVT Type)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
std::optional< unsigned > getBaseOpcodeForVP(unsigned Opcode, bool hasFPExcept)
Translate this VP Opcode to its corresponding non-VP Opcode.
bool isTrueWhenEqual(CondCode Cond)
Return true if the specified condition returns true if the two operands to the condition are equal.
Definition: ISDOpcodes.h:1587
std::optional< unsigned > getVPMaskIdx(unsigned Opcode)
The operand position of the vector mask.
unsigned getUnorderedFlavor(CondCode Cond)
This function returns 0 if the condition is always false if an operand is a NaN, 1 if the condition i...
Definition: ISDOpcodes.h:1592
std::optional< unsigned > getVPExplicitVectorLengthIdx(unsigned Opcode)
The operand position of the explicit vector length parameter.
bool isEXTLoad(const SDNode *N)
Returns true if the specified node is a EXTLOAD.
bool allOperandsUndef(const SDNode *N)
Return true if the node has at least one operand and all operands of the specified node are ISD::UNDE...
bool isFreezeUndef(const SDNode *N)
Return true if the specified node is FREEZE(UNDEF).
CondCode getSetCCSwappedOperands(CondCode Operation)
Return the operation corresponding to (Y op X) when given the operation for (X op Y).
MemIndexType
MemIndexType enum - This enum defines how to interpret MGATHER/SCATTER's index parameter when calcula...
Definition: ISDOpcodes.h:1491
bool isBuildVectorAllZeros(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are 0 or undef.
bool isConstantSplatVector(const SDNode *N, APInt &SplatValue)
Node predicates.
bool matchBinaryPredicate(SDValue LHS, SDValue RHS, std::function< bool(ConstantSDNode *, ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTypeMismatch=false)
Attempt to match a binary predicate against a pair of scalar/splat constants or every element of a pa...
bool isVPReduction(unsigned Opcode)
Whether this is a vector-predicated reduction opcode.
MemIndexedMode
MemIndexedMode enum - This enum defines the load / store indexed addressing modes.
Definition: ISDOpcodes.h:1478
bool isBuildVectorOfConstantFPSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantFPSDNode or undef.
bool isSEXTLoad(const SDNode *N)
Returns true if the specified node is a SEXTLOAD.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
Definition: ISDOpcodes.h:1529
bool isBuildVectorAllOnes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are ~0 or undef.
NodeType getVecReduceBaseOpcode(unsigned VecReduceOpcode)
Get underlying scalar opcode for VECREDUCE opcode.
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
Definition: ISDOpcodes.h:1509
bool isVPOpcode(unsigned Opcode)
Whether this is a vector-predicated Opcode.
CondCode getSetCCOrOperation(CondCode Op1, CondCode Op2, EVT Type)
Return the result of a logical OR between different comparisons of identical values: ((X op1 Y) | (X ...
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
deferredval_ty< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
Definition: PatternMatch.h:854
BinaryOp_match< cst_pred_ty< is_zero_int >, ValTy, Instruction::Sub > m_Neg(const ValTy &V)
Matches a 'Neg' as 'sub 0, V'.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
Definition: PatternMatch.h:92
Libcall
RTLIB::Libcall enum - This enum defines all of the runtime library calls the backend can emit.
Libcall getMEMCPY_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMCPY_ELEMENT_UNORDERED_ATOMIC - Return MEMCPY_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
Libcall getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMSET_ELEMENT_UNORDERED_ATOMIC - Return MEMSET_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
Libcall getMEMMOVE_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMMOVE_ELEMENT_UNORDERED_ATOMIC - Return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_* value for the given e...
bool sd_match(SDNode *N, const SelectionDAG *DAG, Pattern &&P)
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:450
@ DW_OP_LLVM_arg
Only used in LLVM metadata.
Definition: Dwarf.h:146
std::lock_guard< SmartMutex< mt_only > > SmartScopedLock
Definition: Mutex.h:69
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
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
bool operator<(int64_t V1, const APSInt &V2)
Definition: APSInt.h:361
ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred)
getICmpCondCode - Return the ISD condition code corresponding to the given LLVM IR integer condition ...
Definition: Analysis.cpp:233
SDValue peekThroughExtractSubvectors(SDValue V)
Return the non-extracted vector source operand of V if it exists.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1722
bool isNullConstant(SDValue V)
Returns true if V is a constant integer zero.
bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition: MathExtras.h:239
bool isAllOnesOrAllOnesSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant -1 integer or a splatted vector of a constant -1 integer (with...
Definition: Utils.cpp:1525
SDValue getBitwiseNotOperand(SDValue V, SDValue Mask, bool AllowUndefs)
If V is a bitwise not, returns the inverted operand.
SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are are tuples (A,...
Definition: STLExtras.h:2406
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition: bit.h:307
bool isIntOrFPConstant(SDValue V)
Return true if V is either a integer or FP constant.
bool getAlign(const Function &F, unsigned index, unsigned &align)
bool getConstantDataArrayInfo(const Value *V, ConstantDataArraySlice &Slice, unsigned ElementSize, uint64_t Offset=0)
Returns true if the value V is a pointer into a ConstantDataArray.
int bit_width(T Value)
Returns the number of bits needed to represent Value if Value is nonzero.
Definition: bit.h:317
LLVM_READONLY APFloat maximum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximum semantics.
Definition: APFloat.h:1436
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition: STLExtras.h:2073
bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition: STLExtras.h:656
bool isNullOrNullSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
Definition: Utils.cpp:1507
bool isMinSignedConstant(SDValue V)
Returns true if V is a constant min signed integer value.
ConstantFPSDNode * isConstOrConstSplatFP(SDValue N, bool AllowUndefs=false)
Returns the SDNode if it is a constant splat BuildVector or constant float.
ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
APFloat frexp(const APFloat &X, int &Exp, APFloat::roundingMode RM)
Equivalent of C standard library function.
Definition: APFloat.h:1373
static Error getOffset(const SymbolRef &Sym, SectionRef Sec, uint64_t &Result)
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1729
bool getShuffleDemandedElts(int SrcWidth, ArrayRef< int > Mask, const APInt &DemandedElts, APInt &DemandedLHS, APInt &DemandedRHS, bool AllowUndefElts=false)
Transform a shuffle mask's output demanded element mask into demanded element masks for the 2 operand...
LLVM_READONLY APFloat maxnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2019 maximumNumber semantics.
Definition: APFloat.h:1410
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
bool isBitwiseNot(SDValue V, bool AllowUndefs=false)
Returns true if V is a bitwise not operation.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition: MathExtras.h:275
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
void checkForCycles(const SelectionDAG *DAG, bool force=false)
void sort(IteratorTy Start, IteratorTy End)
Definition: STLExtras.h:1647
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
SDValue peekThroughTruncates(SDValue V)
Return the non-truncated source operand of V if it exists.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1736
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:156
ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
SDValue peekThroughOneUseBitcasts(SDValue V)
Return the non-bitcasted and one-use source operand of V if it exists.
CodeGenOptLevel
Code generation optimization level.
Definition: CodeGen.h:54
bool isOneOrOneSplat(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant 1 integer or a splatted vector of a constant 1 integer (with n...
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Other
Any other memory.
LLVM_READONLY APFloat minnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2019 minimumNumber semantics.
Definition: APFloat.h:1396
@ Mul
Product of integers.
void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, unsigned Depth=0, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
DWARFExpression::Operation Op
ConstantSDNode * isConstOrConstSplat(SDValue N, bool AllowUndefs=false, bool AllowTruncation=false)
Returns the SDNode if it is a constant splat BuildVector or constant int.
OutputIt copy(R &&Range, OutputIt Out)
Definition: STLExtras.h:1824
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:191
bool isOneConstant(SDValue V)
Returns true if V is a constant integer one.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition: STLExtras.h:1879
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition: Alignment.h:212
bool isNullFPConstant(SDValue V)
Returns true if V is an FP constant with a value of positive zero.
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
Definition: MathExtras.h:465
unsigned Log2(Align A)
Returns the log2 of the alignment.
Definition: Alignment.h:208
void computeKnownBitsFromRangeMetadata(const MDNode &Ranges, KnownBits &Known)
Compute known bits from the range metadata.
LLVM_READONLY APFloat minimum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimum semantics.
Definition: APFloat.h:1423
bool isNeutralConstant(unsigned Opc, SDNodeFlags Flags, SDValue V, unsigned OperandNo)
Returns true if V is a neutral element of Opc with Flags.
bool isAllOnesConstant(SDValue V)
Returns true if V is an integer constant with all bits set.
constexpr uint64_t NextPowerOf2(uint64_t A)
Returns the next power of two (in 64-bits) that is strictly greater than A.
Definition: MathExtras.h:360
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
MDNode * TBAAStruct
The tag for type-based alias analysis (tbaa struct).
Definition: Metadata.h:780
MDNode * TBAA
The tag for type-based alias analysis.
Definition: Metadata.h:777
static const fltSemantics & IEEEsingle() LLVM_READNONE
Definition: APFloat.cpp:249
cmpResult
IEEE-754R 5.11: Floating Point Comparison Relations.
Definition: APFloat.h:220
static constexpr roundingMode rmTowardNegative
Definition: APFloat.h:233
static constexpr roundingMode rmNearestTiesToEven
Definition: APFloat.h:230
static constexpr roundingMode rmTowardZero
Definition: APFloat.h:234
static const fltSemantics & IEEEquad() LLVM_READNONE
Definition: APFloat.cpp:251
static const fltSemantics & IEEEdouble() LLVM_READNONE
Definition: APFloat.cpp:250
static const fltSemantics & IEEEhalf() LLVM_READNONE
Definition: APFloat.cpp:247
static constexpr roundingMode rmTowardPositive
Definition: APFloat.h:232
static const fltSemantics & BFloat() LLVM_READNONE
Definition: APFloat.cpp:248
opStatus
IEEE-754R 7: Default exception handling.
Definition: APFloat.h:246
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
Align previous() const
Definition: Alignment.h:88
Represents offset+length into a ConstantDataArray.
uint64_t Length
Length of the slice.
uint64_t Offset
Slice starts at this Offset.
void move(uint64_t Delta)
Moves the Offset and adjusts Length accordingly.
const ConstantDataArray * Array
ConstantDataArray pointer.
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
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition: ValueTypes.h:136
intptr_t getRawBits() const
Definition: ValueTypes.h:495
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
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
ElementCount getVectorElementCount() const
Definition: ValueTypes.h:340
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition: ValueTypes.h:358
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition: ValueTypes.h:349
uint64_t getScalarSizeInBits() const
Definition: ValueTypes.h:370
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 isFixedLengthVector() const
Definition: ValueTypes.h:177
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 isExtended() const
Test if the given EVT is extended (as opposed to being simple).
Definition: ValueTypes.h:141
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
EVT getHalfNumVectorElementsVT(LLVMContext &Context) const
Definition: ValueTypes.h:438
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition: ValueTypes.h:151
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition: KnownBits.h:297
KnownBits sextInReg(unsigned SrcBitWidth) const
Return known bits for a in-register sign extension of the value we're tracking.
Definition: KnownBits.cpp:155
static KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from zero-extended multiply-hi.
Definition: KnownBits.cpp:884
unsigned countMinSignBits() const
Returns the number of times the sign bit is replicated into the other bits.
Definition: KnownBits.h:251
static KnownBits smax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smax(LHS, RHS).
Definition: KnownBits.cpp:208
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition: KnownBits.h:104
bool isZero() const
Returns true if value is all zero.
Definition: KnownBits.h:77
void makeNonNegative()
Make this value non-negative.
Definition: KnownBits.h:120
static KnownBits usub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.usub.sat(LHS, RHS)
Definition: KnownBits.cpp:773
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition: KnownBits.h:238
static KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
Definition: KnownBits.cpp:434
static KnownBits urem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for urem(LHS, RHS).
Definition: KnownBits.cpp:1030
bool isUnknown() const
Returns true if we don't know any bits.
Definition: KnownBits.h:63
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition: KnownBits.h:270
static std::optional< bool > ne(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_NE result.
Definition: KnownBits.cpp:502
void makeNegative()
Make this value negative.
Definition: KnownBits.h:115
KnownBits trunc(unsigned BitWidth) const
Return known bits for a truncation of the value we're tracking.
Definition: KnownBits.h:157
KnownBits byteSwap() const
Definition: KnownBits.h:457
bool hasConflict() const
Returns true if there is conflicting information.
Definition: KnownBits.h:47
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition: KnownBits.h:285
void setAllZero()
Make all bits known to be zero and discard any previous information.
Definition: KnownBits.h:89
KnownBits reverseBits() const
Definition: KnownBits.h:461
KnownBits concat(const KnownBits &Lo) const
Concatenate the bits from Lo onto the bottom of *this.
Definition: KnownBits.h:229
unsigned getBitWidth() const
Get the bit width of this value.
Definition: KnownBits.h:40
static KnownBits umax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umax(LHS, RHS).
Definition: KnownBits.cpp:184
KnownBits zext(unsigned BitWidth) const
Return known bits for a zero extension of the value we're tracking.
Definition: KnownBits.h:168
void resetAll()
Resets the known state of all bits.
Definition: KnownBits.h:71
KnownBits unionWith(const KnownBits &RHS) const
Returns KnownBits information that is known to be true for either this or RHS or both.
Definition: KnownBits.h:317
static KnownBits lshr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for lshr(LHS, RHS).
Definition: KnownBits.cpp:376
bool isNonZero() const
Returns true if this value is known to be non-zero.
Definition: KnownBits.h:107
static KnownBits abdu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for abdu(LHS, RHS).
Definition: KnownBits.cpp:234
KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const
Return a subset of the known bits from [bitPosition,bitPosition+numBits).
Definition: KnownBits.h:221
KnownBits intersectWith(const KnownBits &RHS) const
Returns KnownBits information that is known to be true for both this and RHS.
Definition: KnownBits.h:307
KnownBits sext(unsigned BitWidth) const
Return known bits for a sign extension of the value we're tracking.
Definition: KnownBits.h:176
static KnownBits computeForSubBorrow(const KnownBits &LHS, KnownBits RHS, const KnownBits &Borrow)
Compute known bits results from subtracting RHS from LHS with 1-bit Borrow.
Definition: KnownBits.cpp:143
KnownBits zextOrTrunc(unsigned BitWidth) const
Return known bits for a zero extension or truncation of the value we're tracking.
Definition: KnownBits.h:192
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition: KnownBits.h:141
static KnownBits abds(KnownBits LHS, KnownBits RHS)
Compute known bits for abds(LHS, RHS).
Definition: KnownBits.cpp:253
static KnownBits smin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smin(LHS, RHS).
Definition: KnownBits.cpp:221
static KnownBits mulhs(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from sign-extended multiply-hi.
Definition: KnownBits.cpp:875
static KnownBits srem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for srem(LHS, RHS).
Definition: KnownBits.cpp:1049
static KnownBits udiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for udiv(LHS, RHS).
Definition: KnownBits.cpp:988
static KnownBits computeForAddSub(bool Add, bool NSW, bool NUW, const KnownBits &LHS, const KnownBits &RHS)
Compute known bits resulting from adding LHS and RHS.
Definition: KnownBits.cpp:57
bool isStrictlyPositive() const
Returns true if this value is known to be positive.
Definition: KnownBits.h:110
static KnownBits sdiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for sdiv(LHS, RHS).
Definition: KnownBits.cpp:929
static bool haveNoCommonBitsSet(const KnownBits &LHS, const KnownBits &RHS)
Return true if LHS and RHS have no common bits set.
Definition: KnownBits.h:328
bool isNegative() const
Returns true if this value is known to be negative.
Definition: KnownBits.h:101
static KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry)
Compute known bits resulting from adding LHS, RHS and a 1-bit Carry.
Definition: KnownBits.cpp:50
unsigned countMaxLeadingZeros() const
Returns the maximum number of leading zero bits possible.
Definition: KnownBits.h:276
void insertBits(const KnownBits &SubBits, unsigned BitPosition)
Insert the bits from a smaller known bits starting at bitPosition.
Definition: KnownBits.h:215
static KnownBits mul(const KnownBits &LHS, const KnownBits &RHS, bool NoUndefSelfMultiply=false)
Compute known bits resulting from multiplying LHS and RHS.
Definition: KnownBits.cpp:777
KnownBits anyext(unsigned BitWidth) const
Return known bits for an "any" extension of the value we're tracking, where we don't know anything ab...
Definition: KnownBits.h:163
KnownBits abs(bool IntMinIsPoison=false) const
Compute known bits for the absolute value.
Definition: KnownBits.cpp:556
static KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW=false, bool NSW=false, bool ShAmtNonZero=false)
Compute known bits for shl(LHS, RHS).
Definition: KnownBits.cpp:291
static KnownBits umin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umin(LHS, RHS).
Definition: KnownBits.cpp:202
This class contains a discriminated union of information about pointers in memory operands,...
bool isDereferenceable(unsigned Size, LLVMContext &C, const DataLayout &DL) const
Return true if memory region [V, V+Offset+Size) is known to be dereferenceable.
unsigned getAddrSpace() const
Return the LLVM IR address space number that this pointer points into.
PointerUnion< const Value *, const PseudoSourceValue * > V
This is the IR pointer value for the access, or it is null if unknown.
MachinePointerInfo getWithOffset(int64_t O) const
static MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition: Alignment.h:117
static MemOp Set(uint64_t Size, bool DstAlignCanChange, Align DstAlign, bool IsZeroMemset, bool IsVolatile)
static MemOp Copy(uint64_t Size, bool DstAlignCanChange, Align DstAlign, Align SrcAlign, bool IsVolatile, bool MemcpyStrSrc=false)
These are IR-level optimization flags that may be propagated to SDNodes.
void intersectWith(const SDNodeFlags Flags)
Clear any flags in this flag set that aren't also set in Flags.
bool hasNonNeg() const
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
unsigned int NumVTs
Clients of various APIs that cause global effects on the DAG can optionally implement this interface.
Definition: SelectionDAG.h:307
DAGUpdateListener *const Next
Definition: SelectionDAG.h:308
virtual void NodeDeleted(SDNode *N, SDNode *E)
The node N that was deleted and, if E is not null, an equivalent node E that replaced it.
virtual void NodeInserted(SDNode *N)
The node N that was inserted.
virtual void NodeUpdated(SDNode *N)
The node N that was updated.
This structure contains all information that is necessary for lowering calls.
CallLoweringInfo & setLibCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList)
CallLoweringInfo & setDiscardResult(bool Value=true)
CallLoweringInfo & setDebugLoc(const SDLoc &dl)
CallLoweringInfo & setTailCall(bool Value=true)
CallLoweringInfo & setChain(SDValue InChain)