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;
1704 SDVTList VTs = getVTList(EltVT);
1706 AddNodeIDNode(ID, Opc, VTs, std::nullopt);
1707 ID.AddPointer(Elt);
1708 ID.AddBoolean(isO);
1709 void *IP = nullptr;
1710 SDNode *N = nullptr;
1711 if ((N = FindNodeOrInsertPos(ID, DL, IP)))
1712 if (!VT.isVector())
1713 return SDValue(N, 0);
1714
1715 if (!N) {
1716 N = newSDNode<ConstantSDNode>(isT, isO, Elt, VTs);
1717 CSEMap.InsertNode(N, IP);
1718 InsertNode(N);
1719 NewSDValueDbgMsg(SDValue(N, 0), "Creating constant: ", this);
1720 }
1721
1722 SDValue Result(N, 0);
1723 if (VT.isVector())
1724 Result = getSplat(VT, DL, Result);
1725 return Result;
1726}
1727
1729 bool isTarget) {
1730 return getConstant(Val, DL, TLI->getPointerTy(getDataLayout()), isTarget);
1731}
1732
1734 const SDLoc &DL, bool LegalTypes) {
1735 assert(VT.isInteger() && "Shift amount is not an integer type!");
1736 EVT ShiftVT = TLI->getShiftAmountTy(VT, getDataLayout(), LegalTypes);
1737 return getConstant(Val, DL, ShiftVT);
1738}
1739
1741 const SDLoc &DL, bool LegalTypes) {
1742 assert(Val.ult(VT.getScalarSizeInBits()) && "Out of range shift");
1743 return getShiftAmountConstant(Val.getZExtValue(), VT, DL, LegalTypes);
1744}
1745
1747 bool isTarget) {
1748 return getConstant(Val, DL, TLI->getVectorIdxTy(getDataLayout()), isTarget);
1749}
1750
1752 bool isTarget) {
1753 return getConstantFP(*ConstantFP::get(*getContext(), V), DL, VT, isTarget);
1754}
1755
1757 EVT VT, bool isTarget) {
1758 assert(VT.isFloatingPoint() && "Cannot create integer FP constant!");
1759
1760 EVT EltVT = VT.getScalarType();
1761
1762 // Do the map lookup using the actual bit pattern for the floating point
1763 // value, so that we don't have problems with 0.0 comparing equal to -0.0, and
1764 // we don't have issues with SNANs.
1765 unsigned Opc = isTarget ? ISD::TargetConstantFP : ISD::ConstantFP;
1766 SDVTList VTs = getVTList(EltVT);
1768 AddNodeIDNode(ID, Opc, VTs, std::nullopt);
1769 ID.AddPointer(&V);
1770 void *IP = nullptr;
1771 SDNode *N = nullptr;
1772 if ((N = FindNodeOrInsertPos(ID, DL, IP)))
1773 if (!VT.isVector())
1774 return SDValue(N, 0);
1775
1776 if (!N) {
1777 N = newSDNode<ConstantFPSDNode>(isTarget, &V, VTs);
1778 CSEMap.InsertNode(N, IP);
1779 InsertNode(N);
1780 }
1781
1782 SDValue Result(N, 0);
1783 if (VT.isVector())
1784 Result = getSplat(VT, DL, Result);
1785 NewSDValueDbgMsg(Result, "Creating fp constant: ", this);
1786 return Result;
1787}
1788
1790 bool isTarget) {
1791 EVT EltVT = VT.getScalarType();
1792 if (EltVT == MVT::f32)
1793 return getConstantFP(APFloat((float)Val), DL, VT, isTarget);
1794 if (EltVT == MVT::f64)
1795 return getConstantFP(APFloat(Val), DL, VT, isTarget);
1796 if (EltVT == MVT::f80 || EltVT == MVT::f128 || EltVT == MVT::ppcf128 ||
1797 EltVT == MVT::f16 || EltVT == MVT::bf16) {
1798 bool Ignored;
1799 APFloat APF = APFloat(Val);
1801 &Ignored);
1802 return getConstantFP(APF, DL, VT, isTarget);
1803 }
1804 llvm_unreachable("Unsupported type in getConstantFP");
1805}
1806
1808 EVT VT, int64_t Offset, bool isTargetGA,
1809 unsigned TargetFlags) {
1810 assert((TargetFlags == 0 || isTargetGA) &&
1811 "Cannot set target flags on target-independent globals");
1812
1813 // Truncate (with sign-extension) the offset value to the pointer size.
1815 if (BitWidth < 64)
1817
1818 unsigned Opc;
1819 if (GV->isThreadLocal())
1821 else
1822 Opc = isTargetGA ? ISD::TargetGlobalAddress : ISD::GlobalAddress;
1823
1824 SDVTList VTs = getVTList(VT);
1826 AddNodeIDNode(ID, Opc, VTs, std::nullopt);
1827 ID.AddPointer(GV);
1828 ID.AddInteger(Offset);
1829 ID.AddInteger(TargetFlags);
1830 void *IP = nullptr;
1831 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
1832 return SDValue(E, 0);
1833
1834 auto *N = newSDNode<GlobalAddressSDNode>(
1835 Opc, DL.getIROrder(), DL.getDebugLoc(), GV, VTs, Offset, TargetFlags);
1836 CSEMap.InsertNode(N, IP);
1837 InsertNode(N);
1838 return SDValue(N, 0);
1839}
1840
1841SDValue SelectionDAG::getFrameIndex(int FI, EVT VT, bool isTarget) {
1842 unsigned Opc = isTarget ? ISD::TargetFrameIndex : ISD::FrameIndex;
1843 SDVTList VTs = getVTList(VT);
1845 AddNodeIDNode(ID, Opc, VTs, std::nullopt);
1846 ID.AddInteger(FI);
1847 void *IP = nullptr;
1848 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
1849 return SDValue(E, 0);
1850
1851 auto *N = newSDNode<FrameIndexSDNode>(FI, VTs, isTarget);
1852 CSEMap.InsertNode(N, IP);
1853 InsertNode(N);
1854 return SDValue(N, 0);
1855}
1856
1857SDValue SelectionDAG::getJumpTable(int JTI, EVT VT, bool isTarget,
1858 unsigned TargetFlags) {
1859 assert((TargetFlags == 0 || isTarget) &&
1860 "Cannot set target flags on target-independent jump tables");
1861 unsigned Opc = isTarget ? ISD::TargetJumpTable : ISD::JumpTable;
1862 SDVTList VTs = getVTList(VT);
1864 AddNodeIDNode(ID, Opc, VTs, std::nullopt);
1865 ID.AddInteger(JTI);
1866 ID.AddInteger(TargetFlags);
1867 void *IP = nullptr;
1868 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
1869 return SDValue(E, 0);
1870
1871 auto *N = newSDNode<JumpTableSDNode>(JTI, VTs, isTarget, TargetFlags);
1872 CSEMap.InsertNode(N, IP);
1873 InsertNode(N);
1874 return SDValue(N, 0);
1875}
1876
1878 const SDLoc &DL) {
1880 return getNode(ISD::JUMP_TABLE_DEBUG_INFO, DL, MVT::Glue, Chain,
1881 getTargetConstant(static_cast<uint64_t>(JTI), DL, PTy, true));
1882}
1883
1885 MaybeAlign Alignment, int Offset,
1886 bool isTarget, unsigned TargetFlags) {
1887 assert((TargetFlags == 0 || isTarget) &&
1888 "Cannot set target flags on target-independent globals");
1889 if (!Alignment)
1890 Alignment = shouldOptForSize()
1891 ? getDataLayout().getABITypeAlign(C->getType())
1892 : getDataLayout().getPrefTypeAlign(C->getType());
1893 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
1894 SDVTList VTs = getVTList(VT);
1896 AddNodeIDNode(ID, Opc, VTs, std::nullopt);
1897 ID.AddInteger(Alignment->value());
1898 ID.AddInteger(Offset);
1899 ID.AddPointer(C);
1900 ID.AddInteger(TargetFlags);
1901 void *IP = nullptr;
1902 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
1903 return SDValue(E, 0);
1904
1905 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
1906 TargetFlags);
1907 CSEMap.InsertNode(N, IP);
1908 InsertNode(N);
1909 SDValue V = SDValue(N, 0);
1910 NewSDValueDbgMsg(V, "Creating new constant pool: ", this);
1911 return V;
1912}
1913
1915 MaybeAlign Alignment, int Offset,
1916 bool isTarget, unsigned TargetFlags) {
1917 assert((TargetFlags == 0 || isTarget) &&
1918 "Cannot set target flags on target-independent globals");
1919 if (!Alignment)
1920 Alignment = getDataLayout().getPrefTypeAlign(C->getType());
1921 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
1922 SDVTList VTs = getVTList(VT);
1924 AddNodeIDNode(ID, Opc, VTs, std::nullopt);
1925 ID.AddInteger(Alignment->value());
1926 ID.AddInteger(Offset);
1927 C->addSelectionDAGCSEId(ID);
1928 ID.AddInteger(TargetFlags);
1929 void *IP = nullptr;
1930 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
1931 return SDValue(E, 0);
1932
1933 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
1934 TargetFlags);
1935 CSEMap.InsertNode(N, IP);
1936 InsertNode(N);
1937 return SDValue(N, 0);
1938}
1939
1942 AddNodeIDNode(ID, ISD::BasicBlock, getVTList(MVT::Other), std::nullopt);
1943 ID.AddPointer(MBB);
1944 void *IP = nullptr;
1945 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
1946 return SDValue(E, 0);
1947
1948 auto *N = newSDNode<BasicBlockSDNode>(MBB);
1949 CSEMap.InsertNode(N, IP);
1950 InsertNode(N);
1951 return SDValue(N, 0);
1952}
1953
1955 if (VT.isSimple() && (unsigned)VT.getSimpleVT().SimpleTy >=
1956 ValueTypeNodes.size())
1957 ValueTypeNodes.resize(VT.getSimpleVT().SimpleTy+1);
1958
1959 SDNode *&N = VT.isExtended() ?
1960 ExtendedValueTypeNodes[VT] : ValueTypeNodes[VT.getSimpleVT().SimpleTy];
1961
1962 if (N) return SDValue(N, 0);
1963 N = newSDNode<VTSDNode>(VT);
1964 InsertNode(N);
1965 return SDValue(N, 0);
1966}
1967
1969 SDNode *&N = ExternalSymbols[Sym];
1970 if (N) return SDValue(N, 0);
1971 N = newSDNode<ExternalSymbolSDNode>(false, Sym, 0, getVTList(VT));
1972 InsertNode(N);
1973 return SDValue(N, 0);
1974}
1975
1977 SDNode *&N = MCSymbols[Sym];
1978 if (N)
1979 return SDValue(N, 0);
1980 N = newSDNode<MCSymbolSDNode>(Sym, getVTList(VT));
1981 InsertNode(N);
1982 return SDValue(N, 0);
1983}
1984
1986 unsigned TargetFlags) {
1987 SDNode *&N =
1988 TargetExternalSymbols[std::pair<std::string, unsigned>(Sym, TargetFlags)];
1989 if (N) return SDValue(N, 0);
1990 N = newSDNode<ExternalSymbolSDNode>(true, Sym, TargetFlags, getVTList(VT));
1991 InsertNode(N);
1992 return SDValue(N, 0);
1993}
1994
1996 if ((unsigned)Cond >= CondCodeNodes.size())
1997 CondCodeNodes.resize(Cond+1);
1998
1999 if (!CondCodeNodes[Cond]) {
2000 auto *N = newSDNode<CondCodeSDNode>(Cond);
2001 CondCodeNodes[Cond] = N;
2002 InsertNode(N);
2003 }
2004
2005 return SDValue(CondCodeNodes[Cond], 0);
2006}
2007
2009 bool ConstantFold) {
2010 assert(MulImm.getBitWidth() == VT.getSizeInBits() &&
2011 "APInt size does not match type size!");
2012
2013 if (MulImm == 0)
2014 return getConstant(0, DL, VT);
2015
2016 if (ConstantFold) {
2017 const MachineFunction &MF = getMachineFunction();
2018 const Function &F = MF.getFunction();
2019 ConstantRange CR = getVScaleRange(&F, 64);
2020 if (const APInt *C = CR.getSingleElement())
2021 return getConstant(MulImm * C->getZExtValue(), DL, VT);
2022 }
2023
2024 return getNode(ISD::VSCALE, DL, VT, getConstant(MulImm, DL, VT));
2025}
2026
2028 bool ConstantFold) {
2029 if (EC.isScalable())
2030 return getVScale(DL, VT,
2031 APInt(VT.getSizeInBits(), EC.getKnownMinValue()));
2032
2033 return getConstant(EC.getKnownMinValue(), DL, VT);
2034}
2035
2037 APInt One(ResVT.getScalarSizeInBits(), 1);
2038 return getStepVector(DL, ResVT, One);
2039}
2040
2042 const APInt &StepVal) {
2043 assert(ResVT.getScalarSizeInBits() == StepVal.getBitWidth());
2044 if (ResVT.isScalableVector())
2045 return getNode(
2046 ISD::STEP_VECTOR, DL, ResVT,
2047 getTargetConstant(StepVal, DL, ResVT.getVectorElementType()));
2048
2049 SmallVector<SDValue, 16> OpsStepConstants;
2050 for (uint64_t i = 0; i < ResVT.getVectorNumElements(); i++)
2051 OpsStepConstants.push_back(
2052 getConstant(StepVal * i, DL, ResVT.getVectorElementType()));
2053 return getBuildVector(ResVT, DL, OpsStepConstants);
2054}
2055
2056/// Swaps the values of N1 and N2. Swaps all indices in the shuffle mask M that
2057/// point at N1 to point at N2 and indices that point at N2 to point at N1.
2059 std::swap(N1, N2);
2061}
2062
2064 SDValue N2, ArrayRef<int> Mask) {
2065 assert(VT.getVectorNumElements() == Mask.size() &&
2066 "Must have the same number of vector elements as mask elements!");
2067 assert(VT == N1.getValueType() && VT == N2.getValueType() &&
2068 "Invalid VECTOR_SHUFFLE");
2069
2070 // Canonicalize shuffle undef, undef -> undef
2071 if (N1.isUndef() && N2.isUndef())
2072 return getUNDEF(VT);
2073
2074 // Validate that all indices in Mask are within the range of the elements
2075 // input to the shuffle.
2076 int NElts = Mask.size();
2077 assert(llvm::all_of(Mask,
2078 [&](int M) { return M < (NElts * 2) && M >= -1; }) &&
2079 "Index out of range");
2080
2081 // Copy the mask so we can do any needed cleanup.
2082 SmallVector<int, 8> MaskVec(Mask);
2083
2084 // Canonicalize shuffle v, v -> v, undef
2085 if (N1 == N2) {
2086 N2 = getUNDEF(VT);
2087 for (int i = 0; i != NElts; ++i)
2088 if (MaskVec[i] >= NElts) MaskVec[i] -= NElts;
2089 }
2090
2091 // Canonicalize shuffle undef, v -> v, undef. Commute the shuffle mask.
2092 if (N1.isUndef())
2093 commuteShuffle(N1, N2, MaskVec);
2094
2095 if (TLI->hasVectorBlend()) {
2096 // If shuffling a splat, try to blend the splat instead. We do this here so
2097 // that even when this arises during lowering we don't have to re-handle it.
2098 auto BlendSplat = [&](BuildVectorSDNode *BV, int Offset) {
2099 BitVector UndefElements;
2100 SDValue Splat = BV->getSplatValue(&UndefElements);
2101 if (!Splat)
2102 return;
2103
2104 for (int i = 0; i < NElts; ++i) {
2105 if (MaskVec[i] < Offset || MaskVec[i] >= (Offset + NElts))
2106 continue;
2107
2108 // If this input comes from undef, mark it as such.
2109 if (UndefElements[MaskVec[i] - Offset]) {
2110 MaskVec[i] = -1;
2111 continue;
2112 }
2113
2114 // If we can blend a non-undef lane, use that instead.
2115 if (!UndefElements[i])
2116 MaskVec[i] = i + Offset;
2117 }
2118 };
2119 if (auto *N1BV = dyn_cast<BuildVectorSDNode>(N1))
2120 BlendSplat(N1BV, 0);
2121 if (auto *N2BV = dyn_cast<BuildVectorSDNode>(N2))
2122 BlendSplat(N2BV, NElts);
2123 }
2124
2125 // Canonicalize all index into lhs, -> shuffle lhs, undef
2126 // Canonicalize all index into rhs, -> shuffle rhs, undef
2127 bool AllLHS = true, AllRHS = true;
2128 bool N2Undef = N2.isUndef();
2129 for (int i = 0; i != NElts; ++i) {
2130 if (MaskVec[i] >= NElts) {
2131 if (N2Undef)
2132 MaskVec[i] = -1;
2133 else
2134 AllLHS = false;
2135 } else if (MaskVec[i] >= 0) {
2136 AllRHS = false;
2137 }
2138 }
2139 if (AllLHS && AllRHS)
2140 return getUNDEF(VT);
2141 if (AllLHS && !N2Undef)
2142 N2 = getUNDEF(VT);
2143 if (AllRHS) {
2144 N1 = getUNDEF(VT);
2145 commuteShuffle(N1, N2, MaskVec);
2146 }
2147 // Reset our undef status after accounting for the mask.
2148 N2Undef = N2.isUndef();
2149 // Re-check whether both sides ended up undef.
2150 if (N1.isUndef() && N2Undef)
2151 return getUNDEF(VT);
2152
2153 // If Identity shuffle return that node.
2154 bool Identity = true, AllSame = true;
2155 for (int i = 0; i != NElts; ++i) {
2156 if (MaskVec[i] >= 0 && MaskVec[i] != i) Identity = false;
2157 if (MaskVec[i] != MaskVec[0]) AllSame = false;
2158 }
2159 if (Identity && NElts)
2160 return N1;
2161
2162 // Shuffling a constant splat doesn't change the result.
2163 if (N2Undef) {
2164 SDValue V = N1;
2165
2166 // Look through any bitcasts. We check that these don't change the number
2167 // (and size) of elements and just changes their types.
2168 while (V.getOpcode() == ISD::BITCAST)
2169 V = V->getOperand(0);
2170
2171 // A splat should always show up as a build vector node.
2172 if (auto *BV = dyn_cast<BuildVectorSDNode>(V)) {
2173 BitVector UndefElements;
2174 SDValue Splat = BV->getSplatValue(&UndefElements);
2175 // If this is a splat of an undef, shuffling it is also undef.
2176 if (Splat && Splat.isUndef())
2177 return getUNDEF(VT);
2178
2179 bool SameNumElts =
2180 V.getValueType().getVectorNumElements() == VT.getVectorNumElements();
2181
2182 // We only have a splat which can skip shuffles if there is a splatted
2183 // value and no undef lanes rearranged by the shuffle.
2184 if (Splat && UndefElements.none()) {
2185 // Splat of <x, x, ..., x>, return <x, x, ..., x>, provided that the
2186 // number of elements match or the value splatted is a zero constant.
2187 if (SameNumElts || isNullConstant(Splat))
2188 return N1;
2189 }
2190
2191 // If the shuffle itself creates a splat, build the vector directly.
2192 if (AllSame && SameNumElts) {
2193 EVT BuildVT = BV->getValueType(0);
2194 const SDValue &Splatted = BV->getOperand(MaskVec[0]);
2195 SDValue NewBV = getSplatBuildVector(BuildVT, dl, Splatted);
2196
2197 // We may have jumped through bitcasts, so the type of the
2198 // BUILD_VECTOR may not match the type of the shuffle.
2199 if (BuildVT != VT)
2200 NewBV = getNode(ISD::BITCAST, dl, VT, NewBV);
2201 return NewBV;
2202 }
2203 }
2204 }
2205
2206 SDVTList VTs = getVTList(VT);
2208 SDValue Ops[2] = { N1, N2 };
2210 for (int i = 0; i != NElts; ++i)
2211 ID.AddInteger(MaskVec[i]);
2212
2213 void* IP = nullptr;
2214 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
2215 return SDValue(E, 0);
2216
2217 // Allocate the mask array for the node out of the BumpPtrAllocator, since
2218 // SDNode doesn't have access to it. This memory will be "leaked" when
2219 // the node is deallocated, but recovered when the NodeAllocator is released.
2220 int *MaskAlloc = OperandAllocator.Allocate<int>(NElts);
2221 llvm::copy(MaskVec, MaskAlloc);
2222
2223 auto *N = newSDNode<ShuffleVectorSDNode>(VTs, dl.getIROrder(),
2224 dl.getDebugLoc(), MaskAlloc);
2225 createOperands(N, Ops);
2226
2227 CSEMap.InsertNode(N, IP);
2228 InsertNode(N);
2229 SDValue V = SDValue(N, 0);
2230 NewSDValueDbgMsg(V, "Creating new node: ", this);
2231 return V;
2232}
2233
2235 EVT VT = SV.getValueType(0);
2236 SmallVector<int, 8> MaskVec(SV.getMask());
2238
2239 SDValue Op0 = SV.getOperand(0);
2240 SDValue Op1 = SV.getOperand(1);
2241 return getVectorShuffle(VT, SDLoc(&SV), Op1, Op0, MaskVec);
2242}
2243
2245 SDVTList VTs = getVTList(VT);
2247 AddNodeIDNode(ID, ISD::Register, VTs, std::nullopt);
2248 ID.AddInteger(RegNo);
2249 void *IP = nullptr;
2250 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2251 return SDValue(E, 0);
2252
2253 auto *N = newSDNode<RegisterSDNode>(RegNo, VTs);
2254 N->SDNodeBits.IsDivergent = TLI->isSDNodeSourceOfDivergence(N, FLI, UA);
2255 CSEMap.InsertNode(N, IP);
2256 InsertNode(N);
2257 return SDValue(N, 0);
2258}
2259
2262 AddNodeIDNode(ID, ISD::RegisterMask, getVTList(MVT::Untyped), std::nullopt);
2263 ID.AddPointer(RegMask);
2264 void *IP = nullptr;
2265 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2266 return SDValue(E, 0);
2267
2268 auto *N = newSDNode<RegisterMaskSDNode>(RegMask);
2269 CSEMap.InsertNode(N, IP);
2270 InsertNode(N);
2271 return SDValue(N, 0);
2272}
2273
2275 MCSymbol *Label) {
2276 return getLabelNode(ISD::EH_LABEL, dl, Root, Label);
2277}
2278
2279SDValue SelectionDAG::getLabelNode(unsigned Opcode, const SDLoc &dl,
2280 SDValue Root, MCSymbol *Label) {
2282 SDValue Ops[] = { Root };
2283 AddNodeIDNode(ID, Opcode, getVTList(MVT::Other), Ops);
2284 ID.AddPointer(Label);
2285 void *IP = nullptr;
2286 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2287 return SDValue(E, 0);
2288
2289 auto *N =
2290 newSDNode<LabelSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), Label);
2291 createOperands(N, Ops);
2292
2293 CSEMap.InsertNode(N, IP);
2294 InsertNode(N);
2295 return SDValue(N, 0);
2296}
2297
2299 int64_t Offset, bool isTarget,
2300 unsigned TargetFlags) {
2301 unsigned Opc = isTarget ? ISD::TargetBlockAddress : ISD::BlockAddress;
2302 SDVTList VTs = getVTList(VT);
2303
2305 AddNodeIDNode(ID, Opc, VTs, std::nullopt);
2306 ID.AddPointer(BA);
2307 ID.AddInteger(Offset);
2308 ID.AddInteger(TargetFlags);
2309 void *IP = nullptr;
2310 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2311 return SDValue(E, 0);
2312
2313 auto *N = newSDNode<BlockAddressSDNode>(Opc, VTs, BA, Offset, TargetFlags);
2314 CSEMap.InsertNode(N, IP);
2315 InsertNode(N);
2316 return SDValue(N, 0);
2317}
2318
2321 AddNodeIDNode(ID, ISD::SRCVALUE, getVTList(MVT::Other), std::nullopt);
2322 ID.AddPointer(V);
2323
2324 void *IP = nullptr;
2325 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2326 return SDValue(E, 0);
2327
2328 auto *N = newSDNode<SrcValueSDNode>(V);
2329 CSEMap.InsertNode(N, IP);
2330 InsertNode(N);
2331 return SDValue(N, 0);
2332}
2333
2336 AddNodeIDNode(ID, ISD::MDNODE_SDNODE, getVTList(MVT::Other), std::nullopt);
2337 ID.AddPointer(MD);
2338
2339 void *IP = nullptr;
2340 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2341 return SDValue(E, 0);
2342
2343 auto *N = newSDNode<MDNodeSDNode>(MD);
2344 CSEMap.InsertNode(N, IP);
2345 InsertNode(N);
2346 return SDValue(N, 0);
2347}
2348
2350 if (VT == V.getValueType())
2351 return V;
2352
2353 return getNode(ISD::BITCAST, SDLoc(V), VT, V);
2354}
2355
2357 unsigned SrcAS, unsigned DestAS) {
2358 SDVTList VTs = getVTList(VT);
2359 SDValue Ops[] = {Ptr};
2362 ID.AddInteger(SrcAS);
2363 ID.AddInteger(DestAS);
2364
2365 void *IP = nullptr;
2366 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
2367 return SDValue(E, 0);
2368
2369 auto *N = newSDNode<AddrSpaceCastSDNode>(dl.getIROrder(), dl.getDebugLoc(),
2370 VTs, SrcAS, DestAS);
2371 createOperands(N, Ops);
2372
2373 CSEMap.InsertNode(N, IP);
2374 InsertNode(N);
2375 return SDValue(N, 0);
2376}
2377
2379 return getNode(ISD::FREEZE, SDLoc(V), V.getValueType(), V);
2380}
2381
2382/// getShiftAmountOperand - Return the specified value casted to
2383/// the target's desired shift amount type.
2385 EVT OpTy = Op.getValueType();
2386 EVT ShTy = TLI->getShiftAmountTy(LHSTy, getDataLayout());
2387 if (OpTy == ShTy || OpTy.isVector()) return Op;
2388
2389 return getZExtOrTrunc(Op, SDLoc(Op), ShTy);
2390}
2391
2393 SDLoc dl(Node);
2395 const Value *V = cast<SrcValueSDNode>(Node->getOperand(2))->getValue();
2396 EVT VT = Node->getValueType(0);
2397 SDValue Tmp1 = Node->getOperand(0);
2398 SDValue Tmp2 = Node->getOperand(1);
2399 const MaybeAlign MA(Node->getConstantOperandVal(3));
2400
2401 SDValue VAListLoad = getLoad(TLI.getPointerTy(getDataLayout()), dl, Tmp1,
2402 Tmp2, MachinePointerInfo(V));
2403 SDValue VAList = VAListLoad;
2404
2405 if (MA && *MA > TLI.getMinStackArgumentAlignment()) {
2406 VAList = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2407 getConstant(MA->value() - 1, dl, VAList.getValueType()));
2408
2409 VAList =
2410 getNode(ISD::AND, dl, VAList.getValueType(), VAList,
2411 getConstant(-(int64_t)MA->value(), dl, VAList.getValueType()));
2412 }
2413
2414 // Increment the pointer, VAList, to the next vaarg
2415 Tmp1 = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2416 getConstant(getDataLayout().getTypeAllocSize(
2417 VT.getTypeForEVT(*getContext())),
2418 dl, VAList.getValueType()));
2419 // Store the incremented VAList to the legalized pointer
2420 Tmp1 =
2421 getStore(VAListLoad.getValue(1), dl, Tmp1, Tmp2, MachinePointerInfo(V));
2422 // Load the actual argument out of the pointer VAList
2423 return getLoad(VT, dl, Tmp1, VAList, MachinePointerInfo());
2424}
2425
2427 SDLoc dl(Node);
2429 // This defaults to loading a pointer from the input and storing it to the
2430 // output, returning the chain.
2431 const Value *VD = cast<SrcValueSDNode>(Node->getOperand(3))->getValue();
2432 const Value *VS = cast<SrcValueSDNode>(Node->getOperand(4))->getValue();
2433 SDValue Tmp1 =
2434 getLoad(TLI.getPointerTy(getDataLayout()), dl, Node->getOperand(0),
2435 Node->getOperand(2), MachinePointerInfo(VS));
2436 return getStore(Tmp1.getValue(1), dl, Tmp1, Node->getOperand(1),
2437 MachinePointerInfo(VD));
2438}
2439
2441 const DataLayout &DL = getDataLayout();
2442 Type *Ty = VT.getTypeForEVT(*getContext());
2443 Align RedAlign = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2444
2445 if (TLI->isTypeLegal(VT) || !VT.isVector())
2446 return RedAlign;
2447
2449 const Align StackAlign = TFI->getStackAlign();
2450
2451 // See if we can choose a smaller ABI alignment in cases where it's an
2452 // illegal vector type that will get broken down.
2453 if (RedAlign > StackAlign) {
2454 EVT IntermediateVT;
2455 MVT RegisterVT;
2456 unsigned NumIntermediates;
2457 TLI->getVectorTypeBreakdown(*getContext(), VT, IntermediateVT,
2458 NumIntermediates, RegisterVT);
2459 Ty = IntermediateVT.getTypeForEVT(*getContext());
2460 Align RedAlign2 = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2461 if (RedAlign2 < RedAlign)
2462 RedAlign = RedAlign2;
2463 }
2464
2465 return RedAlign;
2466}
2467
2469 MachineFrameInfo &MFI = MF->getFrameInfo();
2471 int StackID = 0;
2472 if (Bytes.isScalable())
2473 StackID = TFI->getStackIDForScalableVectors();
2474 // The stack id gives an indication of whether the object is scalable or
2475 // not, so it's safe to pass in the minimum size here.
2476 int FrameIdx = MFI.CreateStackObject(Bytes.getKnownMinValue(), Alignment,
2477 false, nullptr, StackID);
2478 return getFrameIndex(FrameIdx, TLI->getFrameIndexTy(getDataLayout()));
2479}
2480
2482 Type *Ty = VT.getTypeForEVT(*getContext());
2483 Align StackAlign =
2484 std::max(getDataLayout().getPrefTypeAlign(Ty), Align(minAlign));
2485 return CreateStackTemporary(VT.getStoreSize(), StackAlign);
2486}
2487
2489 TypeSize VT1Size = VT1.getStoreSize();
2490 TypeSize VT2Size = VT2.getStoreSize();
2491 assert(VT1Size.isScalable() == VT2Size.isScalable() &&
2492 "Don't know how to choose the maximum size when creating a stack "
2493 "temporary");
2494 TypeSize Bytes = VT1Size.getKnownMinValue() > VT2Size.getKnownMinValue()
2495 ? VT1Size
2496 : VT2Size;
2497
2498 Type *Ty1 = VT1.getTypeForEVT(*getContext());
2499 Type *Ty2 = VT2.getTypeForEVT(*getContext());
2500 const DataLayout &DL = getDataLayout();
2501 Align Align = std::max(DL.getPrefTypeAlign(Ty1), DL.getPrefTypeAlign(Ty2));
2502 return CreateStackTemporary(Bytes, Align);
2503}
2504
2506 ISD::CondCode Cond, const SDLoc &dl) {
2507 EVT OpVT = N1.getValueType();
2508
2509 auto GetUndefBooleanConstant = [&]() {
2510 if (VT.getScalarType() == MVT::i1 ||
2511 TLI->getBooleanContents(OpVT) ==
2513 return getUNDEF(VT);
2514 // ZeroOrOne / ZeroOrNegative require specific values for the high bits,
2515 // so we cannot use getUNDEF(). Return zero instead.
2516 return getConstant(0, dl, VT);
2517 };
2518
2519 // These setcc operations always fold.
2520 switch (Cond) {
2521 default: break;
2522 case ISD::SETFALSE:
2523 case ISD::SETFALSE2: return getBoolConstant(false, dl, VT, OpVT);
2524 case ISD::SETTRUE:
2525 case ISD::SETTRUE2: return getBoolConstant(true, dl, VT, OpVT);
2526
2527 case ISD::SETOEQ:
2528 case ISD::SETOGT:
2529 case ISD::SETOGE:
2530 case ISD::SETOLT:
2531 case ISD::SETOLE:
2532 case ISD::SETONE:
2533 case ISD::SETO:
2534 case ISD::SETUO:
2535 case ISD::SETUEQ:
2536 case ISD::SETUNE:
2537 assert(!OpVT.isInteger() && "Illegal setcc for integer!");
2538 break;
2539 }
2540
2541 if (OpVT.isInteger()) {
2542 // For EQ and NE, we can always pick a value for the undef to make the
2543 // predicate pass or fail, so we can return undef.
2544 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2545 // icmp eq/ne X, undef -> undef.
2546 if ((N1.isUndef() || N2.isUndef()) &&
2547 (Cond == ISD::SETEQ || Cond == ISD::SETNE))
2548 return GetUndefBooleanConstant();
2549
2550 // If both operands are undef, we can return undef for int comparison.
2551 // icmp undef, undef -> undef.
2552 if (N1.isUndef() && N2.isUndef())
2553 return GetUndefBooleanConstant();
2554
2555 // icmp X, X -> true/false
2556 // icmp X, undef -> true/false because undef could be X.
2557 if (N1.isUndef() || N2.isUndef() || N1 == N2)
2558 return getBoolConstant(ISD::isTrueWhenEqual(Cond), dl, VT, OpVT);
2559 }
2560
2561 if (ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N2)) {
2562 const APInt &C2 = N2C->getAPIntValue();
2563 if (ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1)) {
2564 const APInt &C1 = N1C->getAPIntValue();
2565
2567 dl, VT, OpVT);
2568 }
2569 }
2570
2571 auto *N1CFP = dyn_cast<ConstantFPSDNode>(N1);
2572 auto *N2CFP = dyn_cast<ConstantFPSDNode>(N2);
2573
2574 if (N1CFP && N2CFP) {
2575 APFloat::cmpResult R = N1CFP->getValueAPF().compare(N2CFP->getValueAPF());
2576 switch (Cond) {
2577 default: break;
2578 case ISD::SETEQ: if (R==APFloat::cmpUnordered)
2579 return GetUndefBooleanConstant();
2580 [[fallthrough]];
2581 case ISD::SETOEQ: return getBoolConstant(R==APFloat::cmpEqual, dl, VT,
2582 OpVT);
2583 case ISD::SETNE: if (R==APFloat::cmpUnordered)
2584 return GetUndefBooleanConstant();
2585 [[fallthrough]];
2587 R==APFloat::cmpLessThan, dl, VT,
2588 OpVT);
2589 case ISD::SETLT: if (R==APFloat::cmpUnordered)
2590 return GetUndefBooleanConstant();
2591 [[fallthrough]];
2592 case ISD::SETOLT: return getBoolConstant(R==APFloat::cmpLessThan, dl, VT,
2593 OpVT);
2594 case ISD::SETGT: if (R==APFloat::cmpUnordered)
2595 return GetUndefBooleanConstant();
2596 [[fallthrough]];
2598 VT, OpVT);
2599 case ISD::SETLE: if (R==APFloat::cmpUnordered)
2600 return GetUndefBooleanConstant();
2601 [[fallthrough]];
2603 R==APFloat::cmpEqual, dl, VT,
2604 OpVT);
2605 case ISD::SETGE: if (R==APFloat::cmpUnordered)
2606 return GetUndefBooleanConstant();
2607 [[fallthrough]];
2609 R==APFloat::cmpEqual, dl, VT, OpVT);
2610 case ISD::SETO: return getBoolConstant(R!=APFloat::cmpUnordered, dl, VT,
2611 OpVT);
2612 case ISD::SETUO: return getBoolConstant(R==APFloat::cmpUnordered, dl, VT,
2613 OpVT);
2615 R==APFloat::cmpEqual, dl, VT,
2616 OpVT);
2617 case ISD::SETUNE: return getBoolConstant(R!=APFloat::cmpEqual, dl, VT,
2618 OpVT);
2620 R==APFloat::cmpLessThan, dl, VT,
2621 OpVT);
2623 R==APFloat::cmpUnordered, dl, VT,
2624 OpVT);
2626 VT, OpVT);
2627 case ISD::SETUGE: return getBoolConstant(R!=APFloat::cmpLessThan, dl, VT,
2628 OpVT);
2629 }
2630 } else if (N1CFP && OpVT.isSimple() && !N2.isUndef()) {
2631 // Ensure that the constant occurs on the RHS.
2633 if (!TLI->isCondCodeLegal(SwappedCond, OpVT.getSimpleVT()))
2634 return SDValue();
2635 return getSetCC(dl, VT, N2, N1, SwappedCond);
2636 } else if ((N2CFP && N2CFP->getValueAPF().isNaN()) ||
2637 (OpVT.isFloatingPoint() && (N1.isUndef() || N2.isUndef()))) {
2638 // If an operand is known to be a nan (or undef that could be a nan), we can
2639 // fold it.
2640 // Choosing NaN for the undef will always make unordered comparison succeed
2641 // and ordered comparison fails.
2642 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2643 switch (ISD::getUnorderedFlavor(Cond)) {
2644 default:
2645 llvm_unreachable("Unknown flavor!");
2646 case 0: // Known false.
2647 return getBoolConstant(false, dl, VT, OpVT);
2648 case 1: // Known true.
2649 return getBoolConstant(true, dl, VT, OpVT);
2650 case 2: // Undefined.
2651 return GetUndefBooleanConstant();
2652 }
2653 }
2654
2655 // Could not fold it.
2656 return SDValue();
2657}
2658
2659/// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We
2660/// use this predicate to simplify operations downstream.
2662 unsigned BitWidth = Op.getScalarValueSizeInBits();
2664}
2665
2666/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero. We use
2667/// this predicate to simplify operations downstream. Mask is known to be zero
2668/// for bits that V cannot have.
2670 unsigned Depth) const {
2671 return Mask.isSubsetOf(computeKnownBits(V, Depth).Zero);
2672}
2673
2674/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero in
2675/// DemandedElts. We use this predicate to simplify operations downstream.
2676/// Mask is known to be zero for bits that V cannot have.
2678 const APInt &DemandedElts,
2679 unsigned Depth) const {
2680 return Mask.isSubsetOf(computeKnownBits(V, DemandedElts, Depth).Zero);
2681}
2682
2683/// MaskedVectorIsZero - Return true if 'Op' is known to be zero in
2684/// DemandedElts. We use this predicate to simplify operations downstream.
2686 unsigned Depth /* = 0 */) const {
2687 return computeKnownBits(V, DemandedElts, Depth).isZero();
2688}
2689
2690/// MaskedValueIsAllOnes - Return true if '(Op & Mask) == Mask'.
2692 unsigned Depth) const {
2693 return Mask.isSubsetOf(computeKnownBits(V, Depth).One);
2694}
2695
2697 const APInt &DemandedElts,
2698 unsigned Depth) const {
2699 EVT VT = Op.getValueType();
2700 assert(VT.isVector() && !VT.isScalableVector() && "Only for fixed vectors!");
2701
2702 unsigned NumElts = VT.getVectorNumElements();
2703 assert(DemandedElts.getBitWidth() == NumElts && "Unexpected demanded mask.");
2704
2705 APInt KnownZeroElements = APInt::getZero(NumElts);
2706 for (unsigned EltIdx = 0; EltIdx != NumElts; ++EltIdx) {
2707 if (!DemandedElts[EltIdx])
2708 continue; // Don't query elements that are not demanded.
2709 APInt Mask = APInt::getOneBitSet(NumElts, EltIdx);
2710 if (MaskedVectorIsZero(Op, Mask, Depth))
2711 KnownZeroElements.setBit(EltIdx);
2712 }
2713 return KnownZeroElements;
2714}
2715
2716/// isSplatValue - Return true if the vector V has the same value
2717/// across all DemandedElts. For scalable vectors, we don't know the
2718/// number of lanes at compile time. Instead, we use a 1 bit APInt
2719/// to represent a conservative value for all lanes; that is, that
2720/// one bit value is implicitly splatted across all lanes.
2721bool SelectionDAG::isSplatValue(SDValue V, const APInt &DemandedElts,
2722 APInt &UndefElts, unsigned Depth) const {
2723 unsigned Opcode = V.getOpcode();
2724 EVT VT = V.getValueType();
2725 assert(VT.isVector() && "Vector type expected");
2726 assert((!VT.isScalableVector() || DemandedElts.getBitWidth() == 1) &&
2727 "scalable demanded bits are ignored");
2728
2729 if (!DemandedElts)
2730 return false; // No demanded elts, better to assume we don't know anything.
2731
2732 if (Depth >= MaxRecursionDepth)
2733 return false; // Limit search depth.
2734
2735 // Deal with some common cases here that work for both fixed and scalable
2736 // vector types.
2737 switch (Opcode) {
2738 case ISD::SPLAT_VECTOR:
2739 UndefElts = V.getOperand(0).isUndef()
2740 ? APInt::getAllOnes(DemandedElts.getBitWidth())
2741 : APInt(DemandedElts.getBitWidth(), 0);
2742 return true;
2743 case ISD::ADD:
2744 case ISD::SUB:
2745 case ISD::AND:
2746 case ISD::XOR:
2747 case ISD::OR: {
2748 APInt UndefLHS, UndefRHS;
2749 SDValue LHS = V.getOperand(0);
2750 SDValue RHS = V.getOperand(1);
2751 if (isSplatValue(LHS, DemandedElts, UndefLHS, Depth + 1) &&
2752 isSplatValue(RHS, DemandedElts, UndefRHS, Depth + 1)) {
2753 UndefElts = UndefLHS | UndefRHS;
2754 return true;
2755 }
2756 return false;
2757 }
2758 case ISD::ABS:
2759 case ISD::TRUNCATE:
2760 case ISD::SIGN_EXTEND:
2761 case ISD::ZERO_EXTEND:
2762 return isSplatValue(V.getOperand(0), DemandedElts, UndefElts, Depth + 1);
2763 default:
2764 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
2765 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
2766 return TLI->isSplatValueForTargetNode(V, DemandedElts, UndefElts, *this,
2767 Depth);
2768 break;
2769}
2770
2771 // We don't support other cases than those above for scalable vectors at
2772 // the moment.
2773 if (VT.isScalableVector())
2774 return false;
2775
2776 unsigned NumElts = VT.getVectorNumElements();
2777 assert(NumElts == DemandedElts.getBitWidth() && "Vector size mismatch");
2778 UndefElts = APInt::getZero(NumElts);
2779
2780 switch (Opcode) {
2781 case ISD::BUILD_VECTOR: {
2782 SDValue Scl;
2783 for (unsigned i = 0; i != NumElts; ++i) {
2784 SDValue Op = V.getOperand(i);
2785 if (Op.isUndef()) {
2786 UndefElts.setBit(i);
2787 continue;
2788 }
2789 if (!DemandedElts[i])
2790 continue;
2791 if (Scl && Scl != Op)
2792 return false;
2793 Scl = Op;
2794 }
2795 return true;
2796 }
2797 case ISD::VECTOR_SHUFFLE: {
2798 // Check if this is a shuffle node doing a splat or a shuffle of a splat.
2799 APInt DemandedLHS = APInt::getZero(NumElts);
2800 APInt DemandedRHS = APInt::getZero(NumElts);
2801 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(V)->getMask();
2802 for (int i = 0; i != (int)NumElts; ++i) {
2803 int M = Mask[i];
2804 if (M < 0) {
2805 UndefElts.setBit(i);
2806 continue;
2807 }
2808 if (!DemandedElts[i])
2809 continue;
2810 if (M < (int)NumElts)
2811 DemandedLHS.setBit(M);
2812 else
2813 DemandedRHS.setBit(M - NumElts);
2814 }
2815
2816 // If we aren't demanding either op, assume there's no splat.
2817 // If we are demanding both ops, assume there's no splat.
2818 if ((DemandedLHS.isZero() && DemandedRHS.isZero()) ||
2819 (!DemandedLHS.isZero() && !DemandedRHS.isZero()))
2820 return false;
2821
2822 // See if the demanded elts of the source op is a splat or we only demand
2823 // one element, which should always be a splat.
2824 // TODO: Handle source ops splats with undefs.
2825 auto CheckSplatSrc = [&](SDValue Src, const APInt &SrcElts) {
2826 APInt SrcUndefs;
2827 return (SrcElts.popcount() == 1) ||
2828 (isSplatValue(Src, SrcElts, SrcUndefs, Depth + 1) &&
2829 (SrcElts & SrcUndefs).isZero());
2830 };
2831 if (!DemandedLHS.isZero())
2832 return CheckSplatSrc(V.getOperand(0), DemandedLHS);
2833 return CheckSplatSrc(V.getOperand(1), DemandedRHS);
2834 }
2836 // Offset the demanded elts by the subvector index.
2837 SDValue Src = V.getOperand(0);
2838 // We don't support scalable vectors at the moment.
2839 if (Src.getValueType().isScalableVector())
2840 return false;
2841 uint64_t Idx = V.getConstantOperandVal(1);
2842 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
2843 APInt UndefSrcElts;
2844 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
2845 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
2846 UndefElts = UndefSrcElts.extractBits(NumElts, Idx);
2847 return true;
2848 }
2849 break;
2850 }
2854 // Widen the demanded elts by the src element count.
2855 SDValue Src = V.getOperand(0);
2856 // We don't support scalable vectors at the moment.
2857 if (Src.getValueType().isScalableVector())
2858 return false;
2859 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
2860 APInt UndefSrcElts;
2861 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts);
2862 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
2863 UndefElts = UndefSrcElts.trunc(NumElts);
2864 return true;
2865 }
2866 break;
2867 }
2868 case ISD::BITCAST: {
2869 SDValue Src = V.getOperand(0);
2870 EVT SrcVT = Src.getValueType();
2871 unsigned SrcBitWidth = SrcVT.getScalarSizeInBits();
2872 unsigned BitWidth = VT.getScalarSizeInBits();
2873
2874 // Ignore bitcasts from unsupported types.
2875 // TODO: Add fp support?
2876 if (!SrcVT.isVector() || !SrcVT.isInteger() || !VT.isInteger())
2877 break;
2878
2879 // Bitcast 'small element' vector to 'large element' vector.
2880 if ((BitWidth % SrcBitWidth) == 0) {
2881 // See if each sub element is a splat.
2882 unsigned Scale = BitWidth / SrcBitWidth;
2883 unsigned NumSrcElts = SrcVT.getVectorNumElements();
2884 APInt ScaledDemandedElts =
2885 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
2886 for (unsigned I = 0; I != Scale; ++I) {
2887 APInt SubUndefElts;
2888 APInt SubDemandedElt = APInt::getOneBitSet(Scale, I);
2889 APInt SubDemandedElts = APInt::getSplat(NumSrcElts, SubDemandedElt);
2890 SubDemandedElts &= ScaledDemandedElts;
2891 if (!isSplatValue(Src, SubDemandedElts, SubUndefElts, Depth + 1))
2892 return false;
2893 // TODO: Add support for merging sub undef elements.
2894 if (!SubUndefElts.isZero())
2895 return false;
2896 }
2897 return true;
2898 }
2899 break;
2900 }
2901 }
2902
2903 return false;
2904}
2905
2906/// Helper wrapper to main isSplatValue function.
2907bool SelectionDAG::isSplatValue(SDValue V, bool AllowUndefs) const {
2908 EVT VT = V.getValueType();
2909 assert(VT.isVector() && "Vector type expected");
2910
2911 APInt UndefElts;
2912 // Since the number of lanes in a scalable vector is unknown at compile time,
2913 // we track one bit which is implicitly broadcast to all lanes. This means
2914 // that all lanes in a scalable vector are considered demanded.
2915 APInt DemandedElts
2917 return isSplatValue(V, DemandedElts, UndefElts) &&
2918 (AllowUndefs || !UndefElts);
2919}
2920
2923
2924 EVT VT = V.getValueType();
2925 unsigned Opcode = V.getOpcode();
2926 switch (Opcode) {
2927 default: {
2928 APInt UndefElts;
2929 // Since the number of lanes in a scalable vector is unknown at compile time,
2930 // we track one bit which is implicitly broadcast to all lanes. This means
2931 // that all lanes in a scalable vector are considered demanded.
2932 APInt DemandedElts
2934
2935 if (isSplatValue(V, DemandedElts, UndefElts)) {
2936 if (VT.isScalableVector()) {
2937 // DemandedElts and UndefElts are ignored for scalable vectors, since
2938 // the only supported cases are SPLAT_VECTOR nodes.
2939 SplatIdx = 0;
2940 } else {
2941 // Handle case where all demanded elements are UNDEF.
2942 if (DemandedElts.isSubsetOf(UndefElts)) {
2943 SplatIdx = 0;
2944 return getUNDEF(VT);
2945 }
2946 SplatIdx = (UndefElts & DemandedElts).countr_one();
2947 }
2948 return V;
2949 }
2950 break;
2951 }
2952 case ISD::SPLAT_VECTOR:
2953 SplatIdx = 0;
2954 return V;
2955 case ISD::VECTOR_SHUFFLE: {
2956 assert(!VT.isScalableVector());
2957 // Check if this is a shuffle node doing a splat.
2958 // TODO - remove this and rely purely on SelectionDAG::isSplatValue,
2959 // getTargetVShiftNode currently struggles without the splat source.
2960 auto *SVN = cast<ShuffleVectorSDNode>(V);
2961 if (!SVN->isSplat())
2962 break;
2963 int Idx = SVN->getSplatIndex();
2964 int NumElts = V.getValueType().getVectorNumElements();
2965 SplatIdx = Idx % NumElts;
2966 return V.getOperand(Idx / NumElts);
2967 }
2968 }
2969
2970 return SDValue();
2971}
2972
2974 int SplatIdx;
2975 if (SDValue SrcVector = getSplatSourceVector(V, SplatIdx)) {
2976 EVT SVT = SrcVector.getValueType().getScalarType();
2977 EVT LegalSVT = SVT;
2978 if (LegalTypes && !TLI->isTypeLegal(SVT)) {
2979 if (!SVT.isInteger())
2980 return SDValue();
2981 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
2982 if (LegalSVT.bitsLT(SVT))
2983 return SDValue();
2984 }
2985 return getNode(ISD::EXTRACT_VECTOR_ELT, SDLoc(V), LegalSVT, SrcVector,
2986 getVectorIdxConstant(SplatIdx, SDLoc(V)));
2987 }
2988 return SDValue();
2989}
2990
2991const APInt *
2993 const APInt &DemandedElts) const {
2994 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
2995 V.getOpcode() == ISD::SRA) &&
2996 "Unknown shift node");
2997 unsigned BitWidth = V.getScalarValueSizeInBits();
2998 if (ConstantSDNode *SA = isConstOrConstSplat(V.getOperand(1), DemandedElts)) {
2999 // Shifting more than the bitwidth is not valid.
3000 const APInt &ShAmt = SA->getAPIntValue();
3001 if (ShAmt.ult(BitWidth))
3002 return &ShAmt;
3003 }
3004 return nullptr;
3005}
3006
3008 EVT VT = V.getValueType();
3009 APInt DemandedElts = VT.isFixedLengthVector()
3011 : APInt(1, 1);
3012 return getValidShiftAmountConstant(V, DemandedElts);
3013}
3014
3016 SDValue V, const APInt &DemandedElts) const {
3017 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3018 V.getOpcode() == ISD::SRA) &&
3019 "Unknown shift node");
3020 if (const APInt *ValidAmt = getValidShiftAmountConstant(V, DemandedElts))
3021 return ValidAmt;
3022 unsigned BitWidth = V.getScalarValueSizeInBits();
3023 auto *BV = dyn_cast<BuildVectorSDNode>(V.getOperand(1));
3024 if (!BV)
3025 return nullptr;
3026 const APInt *MinShAmt = nullptr;
3027 for (unsigned i = 0, e = BV->getNumOperands(); i != e; ++i) {
3028 if (!DemandedElts[i])
3029 continue;
3030 auto *SA = dyn_cast<ConstantSDNode>(BV->getOperand(i));
3031 if (!SA)
3032 return nullptr;
3033 // Shifting more than the bitwidth is not valid.
3034 const APInt &ShAmt = SA->getAPIntValue();
3035 if (ShAmt.uge(BitWidth))
3036 return nullptr;
3037 if (MinShAmt && MinShAmt->ule(ShAmt))
3038 continue;
3039 MinShAmt = &ShAmt;
3040 }
3041 return MinShAmt;
3042}
3043
3045 EVT VT = V.getValueType();
3046 APInt DemandedElts = VT.isFixedLengthVector()
3048 : APInt(1, 1);
3049 return getValidMinimumShiftAmountConstant(V, DemandedElts);
3050}
3051
3053 SDValue V, const APInt &DemandedElts) const {
3054 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3055 V.getOpcode() == ISD::SRA) &&
3056 "Unknown shift node");
3057 if (const APInt *ValidAmt = getValidShiftAmountConstant(V, DemandedElts))
3058 return ValidAmt;
3059 unsigned BitWidth = V.getScalarValueSizeInBits();
3060 auto *BV = dyn_cast<BuildVectorSDNode>(V.getOperand(1));
3061 if (!BV)
3062 return nullptr;
3063 const APInt *MaxShAmt = nullptr;
3064 for (unsigned i = 0, e = BV->getNumOperands(); i != e; ++i) {
3065 if (!DemandedElts[i])
3066 continue;
3067 auto *SA = dyn_cast<ConstantSDNode>(BV->getOperand(i));
3068 if (!SA)
3069 return nullptr;
3070 // Shifting more than the bitwidth is not valid.
3071 const APInt &ShAmt = SA->getAPIntValue();
3072 if (ShAmt.uge(BitWidth))
3073 return nullptr;
3074 if (MaxShAmt && MaxShAmt->uge(ShAmt))
3075 continue;
3076 MaxShAmt = &ShAmt;
3077 }
3078 return MaxShAmt;
3079}
3080
3082 EVT VT = V.getValueType();
3083 APInt DemandedElts = VT.isFixedLengthVector()
3085 : APInt(1, 1);
3086 return getValidMaximumShiftAmountConstant(V, DemandedElts);
3087}
3088
3089/// Determine which bits of Op are known to be either zero or one and return
3090/// them in Known. For vectors, the known bits are those that are shared by
3091/// every vector element.
3093 EVT VT = Op.getValueType();
3094
3095 // Since the number of lanes in a scalable vector is unknown at compile time,
3096 // we track one bit which is implicitly broadcast to all lanes. This means
3097 // that all lanes in a scalable vector are considered demanded.
3098 APInt DemandedElts = VT.isFixedLengthVector()
3100 : APInt(1, 1);
3101 return computeKnownBits(Op, DemandedElts, Depth);
3102}
3103
3104/// Determine which bits of Op are known to be either zero or one and return
3105/// them in Known. The DemandedElts argument allows us to only collect the known
3106/// bits that are shared by the requested vector elements.
3108 unsigned Depth) const {
3109 unsigned BitWidth = Op.getScalarValueSizeInBits();
3110
3111 KnownBits Known(BitWidth); // Don't know anything.
3112
3113 if (auto *C = dyn_cast<ConstantSDNode>(Op)) {
3114 // We know all of the bits for a constant!
3115 return KnownBits::makeConstant(C->getAPIntValue());
3116 }
3117 if (auto *C = dyn_cast<ConstantFPSDNode>(Op)) {
3118 // We know all of the bits for a constant fp!
3119 return KnownBits::makeConstant(C->getValueAPF().bitcastToAPInt());
3120 }
3121
3122 if (Depth >= MaxRecursionDepth)
3123 return Known; // Limit search depth.
3124
3125 KnownBits Known2;
3126 unsigned NumElts = DemandedElts.getBitWidth();
3127 assert((!Op.getValueType().isFixedLengthVector() ||
3128 NumElts == Op.getValueType().getVectorNumElements()) &&
3129 "Unexpected vector size");
3130
3131 if (!DemandedElts)
3132 return Known; // No demanded elts, better to assume we don't know anything.
3133
3134 unsigned Opcode = Op.getOpcode();
3135 switch (Opcode) {
3136 case ISD::MERGE_VALUES:
3137 return computeKnownBits(Op.getOperand(Op.getResNo()), DemandedElts,
3138 Depth + 1);
3139 case ISD::SPLAT_VECTOR: {
3140 SDValue SrcOp = Op.getOperand(0);
3141 assert(SrcOp.getValueSizeInBits() >= BitWidth &&
3142 "Expected SPLAT_VECTOR implicit truncation");
3143 // Implicitly truncate the bits to match the official semantics of
3144 // SPLAT_VECTOR.
3145 Known = computeKnownBits(SrcOp, Depth + 1).trunc(BitWidth);
3146 break;
3147 }
3149 unsigned ScalarSize = Op.getOperand(0).getScalarValueSizeInBits();
3150 assert(ScalarSize * Op.getNumOperands() == BitWidth &&
3151 "Expected SPLAT_VECTOR_PARTS scalars to cover element width");
3152 for (auto [I, SrcOp] : enumerate(Op->ops())) {
3153 Known.insertBits(computeKnownBits(SrcOp, Depth + 1), ScalarSize * I);
3154 }
3155 break;
3156 }
3157 case ISD::STEP_VECTOR: {
3158 const APInt &Step = Op.getConstantOperandAPInt(0);
3159
3160 if (Step.isPowerOf2())
3161 Known.Zero.setLowBits(Step.logBase2());
3162
3164
3165 if (!isUIntN(BitWidth, Op.getValueType().getVectorMinNumElements()))
3166 break;
3167 const APInt MinNumElts =
3168 APInt(BitWidth, Op.getValueType().getVectorMinNumElements());
3169
3170 bool Overflow;
3171 const APInt MaxNumElts = getVScaleRange(&F, BitWidth)
3173 .umul_ov(MinNumElts, Overflow);
3174 if (Overflow)
3175 break;
3176
3177 const APInt MaxValue = (MaxNumElts - 1).umul_ov(Step, Overflow);
3178 if (Overflow)
3179 break;
3180
3181 Known.Zero.setHighBits(MaxValue.countl_zero());
3182 break;
3183 }
3184 case ISD::BUILD_VECTOR:
3185 assert(!Op.getValueType().isScalableVector());
3186 // Collect the known bits that are shared by every demanded vector element.
3187 Known.Zero.setAllBits(); Known.One.setAllBits();
3188 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
3189 if (!DemandedElts[i])
3190 continue;
3191
3192 SDValue SrcOp = Op.getOperand(i);
3193 Known2 = computeKnownBits(SrcOp, Depth + 1);
3194
3195 // BUILD_VECTOR can implicitly truncate sources, we must handle this.
3196 if (SrcOp.getValueSizeInBits() != BitWidth) {
3197 assert(SrcOp.getValueSizeInBits() > BitWidth &&
3198 "Expected BUILD_VECTOR implicit truncation");
3199 Known2 = Known2.trunc(BitWidth);
3200 }
3201
3202 // Known bits are the values that are shared by every demanded element.
3203 Known = Known.intersectWith(Known2);
3204
3205 // If we don't know any bits, early out.
3206 if (Known.isUnknown())
3207 break;
3208 }
3209 break;
3210 case ISD::VECTOR_SHUFFLE: {
3211 assert(!Op.getValueType().isScalableVector());
3212 // Collect the known bits that are shared by every vector element referenced
3213 // by the shuffle.
3214 APInt DemandedLHS, DemandedRHS;
3215 const ShuffleVectorSDNode *SVN = cast<ShuffleVectorSDNode>(Op);
3216 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
3217 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
3218 DemandedLHS, DemandedRHS))
3219 break;
3220
3221 // Known bits are the values that are shared by every demanded element.
3222 Known.Zero.setAllBits(); Known.One.setAllBits();
3223 if (!!DemandedLHS) {
3224 SDValue LHS = Op.getOperand(0);
3225 Known2 = computeKnownBits(LHS, DemandedLHS, Depth + 1);
3226 Known = Known.intersectWith(Known2);
3227 }
3228 // If we don't know any bits, early out.
3229 if (Known.isUnknown())
3230 break;
3231 if (!!DemandedRHS) {
3232 SDValue RHS = Op.getOperand(1);
3233 Known2 = computeKnownBits(RHS, DemandedRHS, Depth + 1);
3234 Known = Known.intersectWith(Known2);
3235 }
3236 break;
3237 }
3238 case ISD::VSCALE: {
3240 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
3241 Known = getVScaleRange(&F, BitWidth).multiply(Multiplier).toKnownBits();
3242 break;
3243 }
3244 case ISD::CONCAT_VECTORS: {
3245 if (Op.getValueType().isScalableVector())
3246 break;
3247 // Split DemandedElts and test each of the demanded subvectors.
3248 Known.Zero.setAllBits(); Known.One.setAllBits();
3249 EVT SubVectorVT = Op.getOperand(0).getValueType();
3250 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
3251 unsigned NumSubVectors = Op.getNumOperands();
3252 for (unsigned i = 0; i != NumSubVectors; ++i) {
3253 APInt DemandedSub =
3254 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
3255 if (!!DemandedSub) {
3256 SDValue Sub = Op.getOperand(i);
3257 Known2 = computeKnownBits(Sub, DemandedSub, Depth + 1);
3258 Known = Known.intersectWith(Known2);
3259 }
3260 // If we don't know any bits, early out.
3261 if (Known.isUnknown())
3262 break;
3263 }
3264 break;
3265 }
3266 case ISD::INSERT_SUBVECTOR: {
3267 if (Op.getValueType().isScalableVector())
3268 break;
3269 // Demand any elements from the subvector and the remainder from the src its
3270 // inserted into.
3271 SDValue Src = Op.getOperand(0);
3272 SDValue Sub = Op.getOperand(1);
3273 uint64_t Idx = Op.getConstantOperandVal(2);
3274 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
3275 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
3276 APInt DemandedSrcElts = DemandedElts;
3277 DemandedSrcElts.insertBits(APInt::getZero(NumSubElts), Idx);
3278
3279 Known.One.setAllBits();
3280 Known.Zero.setAllBits();
3281 if (!!DemandedSubElts) {
3282 Known = computeKnownBits(Sub, DemandedSubElts, Depth + 1);
3283 if (Known.isUnknown())
3284 break; // early-out.
3285 }
3286 if (!!DemandedSrcElts) {
3287 Known2 = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3288 Known = Known.intersectWith(Known2);
3289 }
3290 break;
3291 }
3293 // Offset the demanded elts by the subvector index.
3294 SDValue Src = Op.getOperand(0);
3295 // Bail until we can represent demanded elements for scalable vectors.
3296 if (Op.getValueType().isScalableVector() || Src.getValueType().isScalableVector())
3297 break;
3298 uint64_t Idx = Op.getConstantOperandVal(1);
3299 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3300 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3301 Known = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3302 break;
3303 }
3304 case ISD::SCALAR_TO_VECTOR: {
3305 if (Op.getValueType().isScalableVector())
3306 break;
3307 // We know about scalar_to_vector as much as we know about it source,
3308 // which becomes the first element of otherwise unknown vector.
3309 if (DemandedElts != 1)
3310 break;
3311
3312 SDValue N0 = Op.getOperand(0);
3313 Known = computeKnownBits(N0, Depth + 1);
3314 if (N0.getValueSizeInBits() != BitWidth)
3315 Known = Known.trunc(BitWidth);
3316
3317 break;
3318 }
3319 case ISD::BITCAST: {
3320 if (Op.getValueType().isScalableVector())
3321 break;
3322
3323 SDValue N0 = Op.getOperand(0);
3324 EVT SubVT = N0.getValueType();
3325 unsigned SubBitWidth = SubVT.getScalarSizeInBits();
3326
3327 // Ignore bitcasts from unsupported types.
3328 if (!(SubVT.isInteger() || SubVT.isFloatingPoint()))
3329 break;
3330
3331 // Fast handling of 'identity' bitcasts.
3332 if (BitWidth == SubBitWidth) {
3333 Known = computeKnownBits(N0, DemandedElts, Depth + 1);
3334 break;
3335 }
3336
3337 bool IsLE = getDataLayout().isLittleEndian();
3338
3339 // Bitcast 'small element' vector to 'large element' scalar/vector.
3340 if ((BitWidth % SubBitWidth) == 0) {
3341 assert(N0.getValueType().isVector() && "Expected bitcast from vector");
3342
3343 // Collect known bits for the (larger) output by collecting the known
3344 // bits from each set of sub elements and shift these into place.
3345 // We need to separately call computeKnownBits for each set of
3346 // sub elements as the knownbits for each is likely to be different.
3347 unsigned SubScale = BitWidth / SubBitWidth;
3348 APInt SubDemandedElts(NumElts * SubScale, 0);
3349 for (unsigned i = 0; i != NumElts; ++i)
3350 if (DemandedElts[i])
3351 SubDemandedElts.setBit(i * SubScale);
3352
3353 for (unsigned i = 0; i != SubScale; ++i) {
3354 Known2 = computeKnownBits(N0, SubDemandedElts.shl(i),
3355 Depth + 1);
3356 unsigned Shifts = IsLE ? i : SubScale - 1 - i;
3357 Known.insertBits(Known2, SubBitWidth * Shifts);
3358 }
3359 }
3360
3361 // Bitcast 'large element' scalar/vector to 'small element' vector.
3362 if ((SubBitWidth % BitWidth) == 0) {
3363 assert(Op.getValueType().isVector() && "Expected bitcast to vector");
3364
3365 // Collect known bits for the (smaller) output by collecting the known
3366 // bits from the overlapping larger input elements and extracting the
3367 // sub sections we actually care about.
3368 unsigned SubScale = SubBitWidth / BitWidth;
3369 APInt SubDemandedElts =
3370 APIntOps::ScaleBitMask(DemandedElts, NumElts / SubScale);
3371 Known2 = computeKnownBits(N0, SubDemandedElts, Depth + 1);
3372
3373 Known.Zero.setAllBits(); Known.One.setAllBits();
3374 for (unsigned i = 0; i != NumElts; ++i)
3375 if (DemandedElts[i]) {
3376 unsigned Shifts = IsLE ? i : NumElts - 1 - i;
3377 unsigned Offset = (Shifts % SubScale) * BitWidth;
3378 Known = Known.intersectWith(Known2.extractBits(BitWidth, Offset));
3379 // If we don't know any bits, early out.
3380 if (Known.isUnknown())
3381 break;
3382 }
3383 }
3384 break;
3385 }
3386 case ISD::AND:
3387 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3388 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3389
3390 Known &= Known2;
3391 break;
3392 case ISD::OR:
3393 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3394 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3395
3396 Known |= Known2;
3397 break;
3398 case ISD::XOR:
3399 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3400 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3401
3402 Known ^= Known2;
3403 break;
3404 case ISD::MUL: {
3405 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3406 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3407 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3408 // TODO: SelfMultiply can be poison, but not undef.
3409 if (SelfMultiply)
3410 SelfMultiply &= isGuaranteedNotToBeUndefOrPoison(
3411 Op.getOperand(0), DemandedElts, false, Depth + 1);
3412 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3413
3414 // If the multiplication is known not to overflow, the product of a number
3415 // with itself is non-negative. Only do this if we didn't already computed
3416 // the opposite value for the sign bit.
3417 if (Op->getFlags().hasNoSignedWrap() &&
3418 Op.getOperand(0) == Op.getOperand(1) &&
3419 !Known.isNegative())
3420 Known.makeNonNegative();
3421 break;
3422 }
3423 case ISD::MULHU: {
3424 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3425 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3426 Known = KnownBits::mulhu(Known, Known2);
3427 break;
3428 }
3429 case ISD::MULHS: {
3430 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3431 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3432 Known = KnownBits::mulhs(Known, Known2);
3433 break;
3434 }
3435 case ISD::ABDU: {
3436 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3437 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3438 Known = KnownBits::abdu(Known, Known2);
3439 break;
3440 }
3441 case ISD::ABDS: {
3442 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3443 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3444 Known = KnownBits::abds(Known, Known2);
3445 break;
3446 }
3447 case ISD::UMUL_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::mulhu(Known, Known2);
3456 break;
3457 }
3458 case ISD::SMUL_LOHI: {
3459 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3460 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3461 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3462 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3463 if (Op.getResNo() == 0)
3464 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3465 else
3466 Known = KnownBits::mulhs(Known, Known2);
3467 break;
3468 }
3469 case ISD::AVGFLOORU:
3470 case ISD::AVGCEILU:
3471 case ISD::AVGFLOORS:
3472 case ISD::AVGCEILS: {
3473 bool IsCeil = Opcode == ISD::AVGCEILU || Opcode == ISD::AVGCEILS;
3474 bool IsSigned = Opcode == ISD::AVGFLOORS || Opcode == ISD::AVGCEILS;
3475 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3476 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3477 Known = IsSigned ? Known.sext(BitWidth + 1) : Known.zext(BitWidth + 1);
3478 Known2 = IsSigned ? Known2.sext(BitWidth + 1) : Known2.zext(BitWidth + 1);
3479 KnownBits Carry = KnownBits::makeConstant(APInt(1, IsCeil ? 1 : 0));
3480 Known = KnownBits::computeForAddCarry(Known, Known2, Carry);
3481 Known = Known.extractBits(BitWidth, 1);
3482 break;
3483 }
3484 case ISD::SELECT:
3485 case ISD::VSELECT:
3486 Known = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3487 // If we don't know any bits, early out.
3488 if (Known.isUnknown())
3489 break;
3490 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth+1);
3491
3492 // Only known if known in both the LHS and RHS.
3493 Known = Known.intersectWith(Known2);
3494 break;
3495 case ISD::SELECT_CC:
3496 Known = computeKnownBits(Op.getOperand(3), DemandedElts, Depth+1);
3497 // If we don't know any bits, early out.
3498 if (Known.isUnknown())
3499 break;
3500 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3501
3502 // Only known if known in both the LHS and RHS.
3503 Known = Known.intersectWith(Known2);
3504 break;
3505 case ISD::SMULO:
3506 case ISD::UMULO:
3507 if (Op.getResNo() != 1)
3508 break;
3509 // The boolean result conforms to getBooleanContents.
3510 // If we know the result of a setcc has the top bits zero, use this info.
3511 // We know that we have an integer-based boolean since these operations
3512 // are only available for integer.
3513 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
3515 BitWidth > 1)
3516 Known.Zero.setBitsFrom(1);
3517 break;
3518 case ISD::SETCC:
3519 case ISD::SETCCCARRY:
3520 case ISD::STRICT_FSETCC:
3521 case ISD::STRICT_FSETCCS: {
3522 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
3523 // If we know the result of a setcc has the top bits zero, use this info.
3524 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
3526 BitWidth > 1)
3527 Known.Zero.setBitsFrom(1);
3528 break;
3529 }
3530 case ISD::SHL:
3531 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3532 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3533 Known = KnownBits::shl(Known, Known2);
3534
3535 // Minimum shift low bits are known zero.
3536 if (const APInt *ShMinAmt =
3538 Known.Zero.setLowBits(ShMinAmt->getZExtValue());
3539 break;
3540 case ISD::SRL:
3541 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3542 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3543 Known = KnownBits::lshr(Known, Known2, /*ShAmtNonZero=*/false,
3544 Op->getFlags().hasExact());
3545
3546 // Minimum shift high bits are known zero.
3547 if (const APInt *ShMinAmt =
3549 Known.Zero.setHighBits(ShMinAmt->getZExtValue());
3550 break;
3551 case ISD::SRA:
3552 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3553 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3554 Known = KnownBits::ashr(Known, Known2, /*ShAmtNonZero=*/false,
3555 Op->getFlags().hasExact());
3556 break;
3557 case ISD::FSHL:
3558 case ISD::FSHR:
3559 if (ConstantSDNode *C = isConstOrConstSplat(Op.getOperand(2), DemandedElts)) {
3560 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3561
3562 // For fshl, 0-shift returns the 1st arg.
3563 // For fshr, 0-shift returns the 2nd arg.
3564 if (Amt == 0) {
3565 Known = computeKnownBits(Op.getOperand(Opcode == ISD::FSHL ? 0 : 1),
3566 DemandedElts, Depth + 1);
3567 break;
3568 }
3569
3570 // fshl: (X << (Z % BW)) | (Y >> (BW - (Z % BW)))
3571 // fshr: (X << (BW - (Z % BW))) | (Y >> (Z % BW))
3572 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3573 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3574 if (Opcode == ISD::FSHL) {
3575 Known.One <<= Amt;
3576 Known.Zero <<= Amt;
3577 Known2.One.lshrInPlace(BitWidth - Amt);
3578 Known2.Zero.lshrInPlace(BitWidth - Amt);
3579 } else {
3580 Known.One <<= BitWidth - Amt;
3581 Known.Zero <<= BitWidth - Amt;
3582 Known2.One.lshrInPlace(Amt);
3583 Known2.Zero.lshrInPlace(Amt);
3584 }
3585 Known = Known.unionWith(Known2);
3586 }
3587 break;
3588 case ISD::SHL_PARTS:
3589 case ISD::SRA_PARTS:
3590 case ISD::SRL_PARTS: {
3591 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3592
3593 // Collect lo/hi source values and concatenate.
3594 unsigned LoBits = Op.getOperand(0).getScalarValueSizeInBits();
3595 unsigned HiBits = Op.getOperand(1).getScalarValueSizeInBits();
3596 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3597 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3598 Known = Known2.concat(Known);
3599
3600 // Collect shift amount.
3601 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
3602
3603 if (Opcode == ISD::SHL_PARTS)
3604 Known = KnownBits::shl(Known, Known2);
3605 else if (Opcode == ISD::SRA_PARTS)
3606 Known = KnownBits::ashr(Known, Known2);
3607 else // if (Opcode == ISD::SRL_PARTS)
3608 Known = KnownBits::lshr(Known, Known2);
3609
3610 // TODO: Minimum shift low/high bits are known zero.
3611
3612 if (Op.getResNo() == 0)
3613 Known = Known.extractBits(LoBits, 0);
3614 else
3615 Known = Known.extractBits(HiBits, LoBits);
3616 break;
3617 }
3619 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3620 EVT EVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
3621 Known = Known.sextInReg(EVT.getScalarSizeInBits());
3622 break;
3623 }
3624 case ISD::CTTZ:
3625 case ISD::CTTZ_ZERO_UNDEF: {
3626 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3627 // If we have a known 1, its position is our upper bound.
3628 unsigned PossibleTZ = Known2.countMaxTrailingZeros();
3629 unsigned LowBits = llvm::bit_width(PossibleTZ);
3630 Known.Zero.setBitsFrom(LowBits);
3631 break;
3632 }
3633 case ISD::CTLZ:
3634 case ISD::CTLZ_ZERO_UNDEF: {
3635 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3636 // If we have a known 1, its position is our upper bound.
3637 unsigned PossibleLZ = Known2.countMaxLeadingZeros();
3638 unsigned LowBits = llvm::bit_width(PossibleLZ);
3639 Known.Zero.setBitsFrom(LowBits);
3640 break;
3641 }
3642 case ISD::CTPOP: {
3643 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3644 // If we know some of the bits are zero, they can't be one.
3645 unsigned PossibleOnes = Known2.countMaxPopulation();
3646 Known.Zero.setBitsFrom(llvm::bit_width(PossibleOnes));
3647 break;
3648 }
3649 case ISD::PARITY: {
3650 // Parity returns 0 everywhere but the LSB.
3651 Known.Zero.setBitsFrom(1);
3652 break;
3653 }
3654 case ISD::LOAD: {
3655 LoadSDNode *LD = cast<LoadSDNode>(Op);
3656 const Constant *Cst = TLI->getTargetConstantFromLoad(LD);
3657 if (ISD::isNON_EXTLoad(LD) && Cst) {
3658 // Determine any common known bits from the loaded constant pool value.
3659 Type *CstTy = Cst->getType();
3660 if ((NumElts * BitWidth) == CstTy->getPrimitiveSizeInBits() &&
3661 !Op.getValueType().isScalableVector()) {
3662 // If its a vector splat, then we can (quickly) reuse the scalar path.
3663 // NOTE: We assume all elements match and none are UNDEF.
3664 if (CstTy->isVectorTy()) {
3665 if (const Constant *Splat = Cst->getSplatValue()) {
3666 Cst = Splat;
3667 CstTy = Cst->getType();
3668 }
3669 }
3670 // TODO - do we need to handle different bitwidths?
3671 if (CstTy->isVectorTy() && BitWidth == CstTy->getScalarSizeInBits()) {
3672 // Iterate across all vector elements finding common known bits.
3673 Known.One.setAllBits();
3674 Known.Zero.setAllBits();
3675 for (unsigned i = 0; i != NumElts; ++i) {
3676 if (!DemandedElts[i])
3677 continue;
3678 if (Constant *Elt = Cst->getAggregateElement(i)) {
3679 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
3680 const APInt &Value = CInt->getValue();
3681 Known.One &= Value;
3682 Known.Zero &= ~Value;
3683 continue;
3684 }
3685 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
3686 APInt Value = CFP->getValueAPF().bitcastToAPInt();
3687 Known.One &= Value;
3688 Known.Zero &= ~Value;
3689 continue;
3690 }
3691 }
3692 Known.One.clearAllBits();
3693 Known.Zero.clearAllBits();
3694 break;
3695 }
3696 } else if (BitWidth == CstTy->getPrimitiveSizeInBits()) {
3697 if (auto *CInt = dyn_cast<ConstantInt>(Cst)) {
3698 Known = KnownBits::makeConstant(CInt->getValue());
3699 } else if (auto *CFP = dyn_cast<ConstantFP>(Cst)) {
3700 Known =
3701 KnownBits::makeConstant(CFP->getValueAPF().bitcastToAPInt());
3702 }
3703 }
3704 }
3705 } else if (Op.getResNo() == 0) {
3706 KnownBits Known0(!LD->getMemoryVT().isScalableVT()
3707 ? LD->getMemoryVT().getFixedSizeInBits()
3708 : BitWidth);
3709 EVT VT = Op.getValueType();
3710 // Fill in any known bits from range information. There are 3 types being
3711 // used. The results VT (same vector elt size as BitWidth), the loaded
3712 // MemoryVT (which may or may not be vector) and the range VTs original
3713 // type. The range matadata needs the full range (i.e
3714 // MemoryVT().getSizeInBits()), which is truncated to the correct elt size
3715 // if it is know. These are then extended to the original VT sizes below.
3716 if (const MDNode *MD = LD->getRanges()) {
3718 if (VT.isVector()) {
3719 // Handle truncation to the first demanded element.
3720 // TODO: Figure out which demanded elements are covered
3721 if (DemandedElts != 1 || !getDataLayout().isLittleEndian())
3722 break;
3723 Known0 = Known0.trunc(BitWidth);
3724 }
3725 }
3726
3727 if (LD->getMemoryVT().isVector())
3728 Known0 = Known0.trunc(LD->getMemoryVT().getScalarSizeInBits());
3729
3730 // Extend the Known bits from memory to the size of the result.
3731 if (ISD::isZEXTLoad(Op.getNode()))
3732 Known = Known0.zext(BitWidth);
3733 else if (ISD::isSEXTLoad(Op.getNode()))
3734 Known = Known0.sext(BitWidth);
3735 else if (ISD::isEXTLoad(Op.getNode()))
3736 Known = Known0.anyext(BitWidth);
3737 else
3738 Known = Known0;
3739 assert(Known.getBitWidth() == BitWidth);
3740 return Known;
3741 }
3742 break;
3743 }
3745 if (Op.getValueType().isScalableVector())
3746 break;
3747 EVT InVT = Op.getOperand(0).getValueType();
3748 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
3749 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
3750 Known = Known.zext(BitWidth);
3751 break;
3752 }
3753 case ISD::ZERO_EXTEND: {
3754 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3755 Known = Known.zext(BitWidth);
3756 break;
3757 }
3759 if (Op.getValueType().isScalableVector())
3760 break;
3761 EVT InVT = Op.getOperand(0).getValueType();
3762 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
3763 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
3764 // If the sign bit is known to be zero or one, then sext will extend
3765 // it to the top bits, else it will just zext.
3766 Known = Known.sext(BitWidth);
3767 break;
3768 }
3769 case ISD::SIGN_EXTEND: {
3770 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3771 // If the sign bit is known to be zero or one, then sext will extend
3772 // it to the top bits, else it will just zext.
3773 Known = Known.sext(BitWidth);
3774 break;
3775 }
3777 if (Op.getValueType().isScalableVector())
3778 break;
3779 EVT InVT = Op.getOperand(0).getValueType();
3780 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
3781 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
3782 Known = Known.anyext(BitWidth);
3783 break;
3784 }
3785 case ISD::ANY_EXTEND: {
3786 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3787 Known = Known.anyext(BitWidth);
3788 break;
3789 }
3790 case ISD::TRUNCATE: {
3791 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3792 Known = Known.trunc(BitWidth);
3793 break;
3794 }
3795 case ISD::AssertZext: {
3796 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
3798 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3799 Known.Zero |= (~InMask);
3800 Known.One &= (~Known.Zero);
3801 break;
3802 }
3803 case ISD::AssertAlign: {
3804 unsigned LogOfAlign = Log2(cast<AssertAlignSDNode>(Op)->getAlign());
3805 assert(LogOfAlign != 0);
3806
3807 // TODO: Should use maximum with source
3808 // If a node is guaranteed to be aligned, set low zero bits accordingly as
3809 // well as clearing one bits.
3810 Known.Zero.setLowBits(LogOfAlign);
3811 Known.One.clearLowBits(LogOfAlign);
3812 break;
3813 }
3814 case ISD::FGETSIGN:
3815 // All bits are zero except the low bit.
3816 Known.Zero.setBitsFrom(1);
3817 break;
3818 case ISD::ADD:
3819 case ISD::SUB: {
3820 SDNodeFlags Flags = Op.getNode()->getFlags();
3821 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3822 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3824 Op.getOpcode() == ISD::ADD, Flags.hasNoSignedWrap(),
3825 Flags.hasNoUnsignedWrap(), Known, Known2);
3826 break;
3827 }
3828 case ISD::USUBO:
3829 case ISD::SSUBO:
3830 case ISD::USUBO_CARRY:
3831 case ISD::SSUBO_CARRY:
3832 if (Op.getResNo() == 1) {
3833 // If we know the result of a setcc has the top bits zero, use this info.
3834 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
3836 BitWidth > 1)
3837 Known.Zero.setBitsFrom(1);
3838 break;
3839 }
3840 [[fallthrough]];
3841 case ISD::SUBC: {
3842 assert(Op.getResNo() == 0 &&
3843 "We only compute knownbits for the difference here.");
3844
3845 // With USUBO_CARRY and SSUBO_CARRY a borrow bit may be added in.
3846 KnownBits Borrow(1);
3847 if (Opcode == ISD::USUBO_CARRY || Opcode == ISD::SSUBO_CARRY) {
3848 Borrow = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
3849 // Borrow has bit width 1
3850 Borrow = Borrow.trunc(1);
3851 } else {
3852 Borrow.setAllZero();
3853 }
3854
3855 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3856 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3857 Known = KnownBits::computeForSubBorrow(Known, Known2, Borrow);
3858 break;
3859 }
3860 case ISD::UADDO:
3861 case ISD::SADDO:
3862 case ISD::UADDO_CARRY:
3863 case ISD::SADDO_CARRY:
3864 if (Op.getResNo() == 1) {
3865 // If we know the result of a setcc has the top bits zero, use this info.
3866 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
3868 BitWidth > 1)
3869 Known.Zero.setBitsFrom(1);
3870 break;
3871 }
3872 [[fallthrough]];
3873 case ISD::ADDC:
3874 case ISD::ADDE: {
3875 assert(Op.getResNo() == 0 && "We only compute knownbits for the sum here.");
3876
3877 // With ADDE and UADDO_CARRY, a carry bit may be added in.
3878 KnownBits Carry(1);
3879 if (Opcode == ISD::ADDE)
3880 // Can't track carry from glue, set carry to unknown.
3881 Carry.resetAll();
3882 else if (Opcode == ISD::UADDO_CARRY || Opcode == ISD::SADDO_CARRY) {
3883 Carry = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
3884 // Carry has bit width 1
3885 Carry = Carry.trunc(1);
3886 } else {
3887 Carry.setAllZero();
3888 }
3889
3890 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3891 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3892 Known = KnownBits::computeForAddCarry(Known, Known2, Carry);
3893 break;
3894 }
3895 case ISD::UDIV: {
3896 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3897 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3898 Known = KnownBits::udiv(Known, Known2, Op->getFlags().hasExact());
3899 break;
3900 }
3901 case ISD::SDIV: {
3902 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3903 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3904 Known = KnownBits::sdiv(Known, Known2, Op->getFlags().hasExact());
3905 break;
3906 }
3907 case ISD::SREM: {
3908 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3909 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3910 Known = KnownBits::srem(Known, Known2);
3911 break;
3912 }
3913 case ISD::UREM: {
3914 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3915 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3916 Known = KnownBits::urem(Known, Known2);
3917 break;
3918 }
3919 case ISD::EXTRACT_ELEMENT: {
3920 Known = computeKnownBits(Op.getOperand(0), Depth+1);
3921 const unsigned Index = Op.getConstantOperandVal(1);
3922 const unsigned EltBitWidth = Op.getValueSizeInBits();
3923
3924 // Remove low part of known bits mask
3925 Known.Zero = Known.Zero.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
3926 Known.One = Known.One.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
3927
3928 // Remove high part of known bit mask
3929 Known = Known.trunc(EltBitWidth);
3930 break;
3931 }
3933 SDValue InVec = Op.getOperand(0);
3934 SDValue EltNo = Op.getOperand(1);
3935 EVT VecVT = InVec.getValueType();
3936 // computeKnownBits not yet implemented for scalable vectors.
3937 if (VecVT.isScalableVector())
3938 break;
3939 const unsigned EltBitWidth = VecVT.getScalarSizeInBits();
3940 const unsigned NumSrcElts = VecVT.getVectorNumElements();
3941
3942 // If BitWidth > EltBitWidth the value is anyext:ed. So we do not know
3943 // anything about the extended bits.
3944 if (BitWidth > EltBitWidth)
3945 Known = Known.trunc(EltBitWidth);
3946
3947 // If we know the element index, just demand that vector element, else for
3948 // an unknown element index, ignore DemandedElts and demand them all.
3949 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
3950 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
3951 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
3952 DemandedSrcElts =
3953 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
3954
3955 Known = computeKnownBits(InVec, DemandedSrcElts, Depth + 1);
3956 if (BitWidth > EltBitWidth)
3957 Known = Known.anyext(BitWidth);
3958 break;
3959 }
3961 if (Op.getValueType().isScalableVector())
3962 break;
3963
3964 // If we know the element index, split the demand between the
3965 // source vector and the inserted element, otherwise assume we need
3966 // the original demanded vector elements and the value.
3967 SDValue InVec = Op.getOperand(0);
3968 SDValue InVal = Op.getOperand(1);
3969 SDValue EltNo = Op.getOperand(2);
3970 bool DemandedVal = true;
3971 APInt DemandedVecElts = DemandedElts;
3972 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
3973 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
3974 unsigned EltIdx = CEltNo->getZExtValue();
3975 DemandedVal = !!DemandedElts[EltIdx];
3976 DemandedVecElts.clearBit(EltIdx);
3977 }
3978 Known.One.setAllBits();
3979 Known.Zero.setAllBits();
3980 if (DemandedVal) {
3981 Known2 = computeKnownBits(InVal, Depth + 1);
3982 Known = Known.intersectWith(Known2.zextOrTrunc(BitWidth));
3983 }
3984 if (!!DemandedVecElts) {
3985 Known2 = computeKnownBits(InVec, DemandedVecElts, Depth + 1);
3986 Known = Known.intersectWith(Known2);
3987 }
3988 break;
3989 }
3990 case ISD::BITREVERSE: {
3991 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3992 Known = Known2.reverseBits();
3993 break;
3994 }
3995 case ISD::BSWAP: {
3996 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3997 Known = Known2.byteSwap();
3998 break;
3999 }
4000 case ISD::ABS: {
4001 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4002 Known = Known2.abs();
4003 break;
4004 }
4005 case ISD::USUBSAT: {
4006 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4007 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4008 Known = KnownBits::usub_sat(Known, Known2);
4009 break;
4010 }
4011 case ISD::UMIN: {
4012 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4013 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4014 Known = KnownBits::umin(Known, Known2);
4015 break;
4016 }
4017 case ISD::UMAX: {
4018 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4019 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4020 Known = KnownBits::umax(Known, Known2);
4021 break;
4022 }
4023 case ISD::SMIN:
4024 case ISD::SMAX: {
4025 // If we have a clamp pattern, we know that the number of sign bits will be
4026 // the minimum of the clamp min/max range.
4027 bool IsMax = (Opcode == ISD::SMAX);
4028 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
4029 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
4030 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
4031 CstHigh =
4032 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
4033 if (CstLow && CstHigh) {
4034 if (!IsMax)
4035 std::swap(CstLow, CstHigh);
4036
4037 const APInt &ValueLow = CstLow->getAPIntValue();
4038 const APInt &ValueHigh = CstHigh->getAPIntValue();
4039 if (ValueLow.sle(ValueHigh)) {
4040 unsigned LowSignBits = ValueLow.getNumSignBits();
4041 unsigned HighSignBits = ValueHigh.getNumSignBits();
4042 unsigned MinSignBits = std::min(LowSignBits, HighSignBits);
4043 if (ValueLow.isNegative() && ValueHigh.isNegative()) {
4044 Known.One.setHighBits(MinSignBits);
4045 break;
4046 }
4047 if (ValueLow.isNonNegative() && ValueHigh.isNonNegative()) {
4048 Known.Zero.setHighBits(MinSignBits);
4049 break;
4050 }
4051 }
4052 }
4053
4054 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4055 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4056 if (IsMax)
4057 Known = KnownBits::smax(Known, Known2);
4058 else
4059 Known = KnownBits::smin(Known, Known2);
4060
4061 // For SMAX, if CstLow is non-negative we know the result will be
4062 // non-negative and thus all sign bits are 0.
4063 // TODO: There's an equivalent of this for smin with negative constant for
4064 // known ones.
4065 if (IsMax && CstLow) {
4066 const APInt &ValueLow = CstLow->getAPIntValue();
4067 if (ValueLow.isNonNegative()) {
4068 unsigned SignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4069 Known.Zero.setHighBits(std::min(SignBits, ValueLow.getNumSignBits()));
4070 }
4071 }
4072
4073 break;
4074 }
4075 case ISD::UINT_TO_FP: {
4076 Known.makeNonNegative();
4077 break;
4078 }
4079 case ISD::SINT_TO_FP: {
4080 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4081 if (Known2.isNonNegative())
4082 Known.makeNonNegative();
4083 else if (Known2.isNegative())
4084 Known.makeNegative();
4085 break;
4086 }
4087 case ISD::FP_TO_UINT_SAT: {
4088 // FP_TO_UINT_SAT produces an unsigned value that fits in the saturating VT.
4089 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4091 break;
4092 }
4094 if (Op.getResNo() == 1) {
4095 // The boolean result conforms to getBooleanContents.
4096 // If we know the result of a setcc has the top bits zero, use this info.
4097 // We know that we have an integer-based boolean since these operations
4098 // are only available for integer.
4099 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
4101 BitWidth > 1)
4102 Known.Zero.setBitsFrom(1);
4103 break;
4104 }
4105 [[fallthrough]];
4107 case ISD::ATOMIC_SWAP:
4119 case ISD::ATOMIC_LOAD: {
4120 unsigned MemBits =
4121 cast<AtomicSDNode>(Op)->getMemoryVT().getScalarSizeInBits();
4122 // If we are looking at the loaded value.
4123 if (Op.getResNo() == 0) {
4125 Known.Zero.setBitsFrom(MemBits);
4126 else if (Op->getOpcode() == ISD::ATOMIC_LOAD &&
4127 cast<AtomicSDNode>(Op)->getExtensionType() == ISD::ZEXTLOAD)
4128 Known.Zero.setBitsFrom(MemBits);
4129 }
4130 break;
4131 }
4132 case ISD::FrameIndex:
4134 TLI->computeKnownBitsForFrameIndex(cast<FrameIndexSDNode>(Op)->getIndex(),
4135 Known, getMachineFunction());
4136 break;
4137
4138 default:
4139 if (Opcode < ISD::BUILTIN_OP_END)
4140 break;
4141 [[fallthrough]];
4145 // TODO: Probably okay to remove after audit; here to reduce change size
4146 // in initial enablement patch for scalable vectors
4147 if (Op.getValueType().isScalableVector())
4148 break;
4149
4150 // Allow the target to implement this method for its nodes.
4151 TLI->computeKnownBitsForTargetNode(Op, Known, DemandedElts, *this, Depth);
4152 break;
4153 }
4154
4155 assert(!Known.hasConflict() && "Bits known to be one AND zero?");
4156 return Known;
4157}
4158
4159/// Convert ConstantRange OverflowResult into SelectionDAG::OverflowKind.
4161 switch (OR) {
4169 }
4170 llvm_unreachable("Unknown OverflowResult");
4171}
4172
4175 // X + 0 never overflow
4176 if (isNullConstant(N1))
4177 return OFK_Never;
4178
4179 // If both operands each have at least two sign bits, the addition
4180 // cannot overflow.
4181 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4182 return OFK_Never;
4183
4184 // TODO: Add ConstantRange::signedAddMayOverflow handling.
4185 return OFK_Sometime;
4186}
4187
4190 // X + 0 never overflow
4191 if (isNullConstant(N1))
4192 return OFK_Never;
4193
4194 // mulhi + 1 never overflow
4195 KnownBits N1Known = computeKnownBits(N1);
4196 if (N0.getOpcode() == ISD::UMUL_LOHI && N0.getResNo() == 1 &&
4197 N1Known.getMaxValue().ult(2))
4198 return OFK_Never;
4199
4200 KnownBits N0Known = computeKnownBits(N0);
4201 if (N1.getOpcode() == ISD::UMUL_LOHI && N1.getResNo() == 1 &&
4202 N0Known.getMaxValue().ult(2))
4203 return OFK_Never;
4204
4205 // Fallback to ConstantRange::unsignedAddMayOverflow handling.
4206 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4207 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4208 return mapOverflowResult(N0Range.unsignedAddMayOverflow(N1Range));
4209}
4210
4213 // X - 0 never overflow
4214 if (isNullConstant(N1))
4215 return OFK_Never;
4216
4217 // If both operands each have at least two sign bits, the subtraction
4218 // cannot overflow.
4219 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4220 return OFK_Never;
4221
4222 KnownBits N0Known = computeKnownBits(N0);
4223 KnownBits N1Known = computeKnownBits(N1);
4224 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, true);
4225 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, true);
4226 return mapOverflowResult(N0Range.signedSubMayOverflow(N1Range));
4227}
4228
4231 // X - 0 never overflow
4232 if (isNullConstant(N1))
4233 return OFK_Never;
4234
4235 KnownBits N0Known = computeKnownBits(N0);
4236 KnownBits N1Known = computeKnownBits(N1);
4237 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4238 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4239 return mapOverflowResult(N0Range.unsignedSubMayOverflow(N1Range));
4240}
4241
4244 // X * 0 and X * 1 never overflow.
4245 if (isNullConstant(N1) || isOneConstant(N1))
4246 return OFK_Never;
4247
4248 KnownBits N0Known = computeKnownBits(N0);
4249 KnownBits N1Known = computeKnownBits(N1);
4250 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4251 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4252 return mapOverflowResult(N0Range.unsignedMulMayOverflow(N1Range));
4253}
4254
4257 // X * 0 and X * 1 never overflow.
4258 if (isNullConstant(N1) || isOneConstant(N1))
4259 return OFK_Never;
4260
4261 // Get the size of the result.
4262 unsigned BitWidth = N0.getScalarValueSizeInBits();
4263
4264 // Sum of the sign bits.
4265 unsigned SignBits = ComputeNumSignBits(N0) + ComputeNumSignBits(N1);
4266
4267 // If we have enough sign bits, then there's no overflow.
4268 if (SignBits > BitWidth + 1)
4269 return OFK_Never;
4270
4271 if (SignBits == BitWidth + 1) {
4272 // The overflow occurs when the true multiplication of the
4273 // the operands is the minimum negative number.
4274 KnownBits N0Known = computeKnownBits(N0);
4275 KnownBits N1Known = computeKnownBits(N1);
4276 // If one of the operands is non-negative, then there's no
4277 // overflow.
4278 if (N0Known.isNonNegative() || N1Known.isNonNegative())
4279 return OFK_Never;
4280 }
4281
4282 return OFK_Sometime;
4283}
4284
4286 if (Depth >= MaxRecursionDepth)
4287 return false; // Limit search depth.
4288
4289 EVT OpVT = Val.getValueType();
4290 unsigned BitWidth = OpVT.getScalarSizeInBits();
4291
4292 // Is the constant a known power of 2?
4294 return C->getAPIntValue().zextOrTrunc(BitWidth).isPowerOf2();
4295 }))
4296 return true;
4297
4298 // A left-shift of a constant one will have exactly one bit set because
4299 // shifting the bit off the end is undefined.
4300 if (Val.getOpcode() == ISD::SHL) {
4301 auto *C = isConstOrConstSplat(Val.getOperand(0));
4302 if (C && C->getAPIntValue() == 1)
4303 return true;
4304 return isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth + 1) &&
4305 isKnownNeverZero(Val, Depth);
4306 }
4307
4308 // Similarly, a logical right-shift of a constant sign-bit will have exactly
4309 // one bit set.
4310 if (Val.getOpcode() == ISD::SRL) {
4311 auto *C = isConstOrConstSplat(Val.getOperand(0));
4312 if (C && C->getAPIntValue().isSignMask())
4313 return true;
4314 return isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth + 1) &&
4315 isKnownNeverZero(Val, Depth);
4316 }
4317
4318 if (Val.getOpcode() == ISD::ROTL || Val.getOpcode() == ISD::ROTR)
4319 return isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth + 1);
4320
4321 // Are all operands of a build vector constant powers of two?
4322 if (Val.getOpcode() == ISD::BUILD_VECTOR)
4323 if (llvm::all_of(Val->ops(), [BitWidth](SDValue E) {
4324 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(E))
4325 return C->getAPIntValue().zextOrTrunc(BitWidth).isPowerOf2();
4326 return false;
4327 }))
4328 return true;
4329
4330 // Is the operand of a splat vector a constant power of two?
4331 if (Val.getOpcode() == ISD::SPLAT_VECTOR)
4332 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Val->getOperand(0)))
4333 if (C->getAPIntValue().zextOrTrunc(BitWidth).isPowerOf2())
4334 return true;
4335
4336 // vscale(power-of-two) is a power-of-two for some targets
4337 if (Val.getOpcode() == ISD::VSCALE &&
4338 getTargetLoweringInfo().isVScaleKnownToBeAPowerOfTwo() &&
4340 return true;
4341
4342 if (Val.getOpcode() == ISD::SMIN || Val.getOpcode() == ISD::SMAX ||
4343 Val.getOpcode() == ISD::UMIN || Val.getOpcode() == ISD::UMAX)
4344 return isKnownToBeAPowerOfTwo(Val.getOperand(1), Depth + 1) &&
4346
4347 if (Val.getOpcode() == ISD::SELECT || Val.getOpcode() == ISD::VSELECT)
4348 return isKnownToBeAPowerOfTwo(Val.getOperand(2), Depth + 1) &&
4350
4351 // Looking for `x & -x` pattern:
4352 // If x == 0:
4353 // x & -x -> 0
4354 // If x != 0:
4355 // x & -x -> non-zero pow2
4356 // so if we find the pattern return whether we know `x` is non-zero.
4357 SDValue X;
4358 if (sd_match(Val, m_And(m_Value(X), m_Neg(m_Deferred(X)))))
4359 return isKnownNeverZero(X, Depth);
4360
4361 if (Val.getOpcode() == ISD::ZERO_EXTEND)
4362 return isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth + 1);
4363
4364 // More could be done here, though the above checks are enough
4365 // to handle some common cases.
4366 return false;
4367}
4368
4370 EVT VT = Op.getValueType();
4371
4372 // Since the number of lanes in a scalable vector is unknown at compile time,
4373 // we track one bit which is implicitly broadcast to all lanes. This means
4374 // that all lanes in a scalable vector are considered demanded.
4375 APInt DemandedElts = VT.isFixedLengthVector()
4377 : APInt(1, 1);
4378 return ComputeNumSignBits(Op, DemandedElts, Depth);
4379}
4380
4381unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
4382 unsigned Depth) const {
4383 EVT VT = Op.getValueType();
4384 assert((VT.isInteger() || VT.isFloatingPoint()) && "Invalid VT!");
4385 unsigned VTBits = VT.getScalarSizeInBits();
4386 unsigned NumElts = DemandedElts.getBitWidth();
4387 unsigned Tmp, Tmp2;
4388 unsigned FirstAnswer = 1;
4389
4390 if (auto *C = dyn_cast<ConstantSDNode>(Op)) {
4391 const APInt &Val = C->getAPIntValue();
4392 return Val.getNumSignBits();
4393 }
4394
4395 if (Depth >= MaxRecursionDepth)
4396 return 1; // Limit search depth.
4397
4398 if (!DemandedElts)
4399 return 1; // No demanded elts, better to assume we don't know anything.
4400
4401 unsigned Opcode = Op.getOpcode();
4402 switch (Opcode) {
4403 default: break;
4404 case ISD::AssertSext:
4405 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4406 return VTBits-Tmp+1;
4407 case ISD::AssertZext:
4408 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4409 return VTBits-Tmp;
4410 case ISD::MERGE_VALUES:
4411 return ComputeNumSignBits(Op.getOperand(Op.getResNo()), DemandedElts,
4412 Depth + 1);
4413 case ISD::SPLAT_VECTOR: {
4414 // Check if the sign bits of source go down as far as the truncated value.
4415 unsigned NumSrcBits = Op.getOperand(0).getValueSizeInBits();
4416 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4417 if (NumSrcSignBits > (NumSrcBits - VTBits))
4418 return NumSrcSignBits - (NumSrcBits - VTBits);
4419 break;
4420 }
4421 case ISD::BUILD_VECTOR:
4422 assert(!VT.isScalableVector());
4423 Tmp = VTBits;
4424 for (unsigned i = 0, e = Op.getNumOperands(); (i < e) && (Tmp > 1); ++i) {
4425 if (!DemandedElts[i])
4426 continue;
4427
4428 SDValue SrcOp = Op.getOperand(i);
4429 // BUILD_VECTOR can implicitly truncate sources, we handle this specially
4430 // for constant nodes to ensure we only look at the sign bits.
4431 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(SrcOp)) {
4432 APInt T = C->getAPIntValue().trunc(VTBits);
4433 Tmp2 = T.getNumSignBits();
4434 } else {
4435 Tmp2 = ComputeNumSignBits(SrcOp, Depth + 1);
4436
4437 if (SrcOp.getValueSizeInBits() != VTBits) {
4438 assert(SrcOp.getValueSizeInBits() > VTBits &&
4439 "Expected BUILD_VECTOR implicit truncation");
4440 unsigned ExtraBits = SrcOp.getValueSizeInBits() - VTBits;
4441 Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1);
4442 }
4443 }
4444 Tmp = std::min(Tmp, Tmp2);
4445 }
4446 return Tmp;
4447
4448 case ISD::VECTOR_SHUFFLE: {
4449 // Collect the minimum number of sign bits that are shared by every vector
4450 // element referenced by the shuffle.
4451 APInt DemandedLHS, DemandedRHS;
4452 const ShuffleVectorSDNode *SVN = cast<ShuffleVectorSDNode>(Op);
4453 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
4454 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
4455 DemandedLHS, DemandedRHS))
4456 return 1;
4457
4458 Tmp = std::numeric_limits<unsigned>::max();
4459 if (!!DemandedLHS)
4460 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedLHS, Depth + 1);
4461 if (!!DemandedRHS) {
4462 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedRHS, Depth + 1);
4463 Tmp = std::min(Tmp, Tmp2);
4464 }
4465 // If we don't know anything, early out and try computeKnownBits fall-back.
4466 if (Tmp == 1)
4467 break;
4468 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
4469 return Tmp;
4470 }
4471
4472 case ISD::BITCAST: {
4473 if (VT.isScalableVector())
4474 break;
4475 SDValue N0 = Op.getOperand(0);
4476 EVT SrcVT = N0.getValueType();
4477 unsigned SrcBits = SrcVT.getScalarSizeInBits();
4478
4479 // Ignore bitcasts from unsupported types..
4480 if (!(SrcVT.isInteger() || SrcVT.isFloatingPoint()))
4481 break;
4482
4483 // Fast handling of 'identity' bitcasts.
4484 if (VTBits == SrcBits)
4485 return ComputeNumSignBits(N0, DemandedElts, Depth + 1);
4486
4487 bool IsLE = getDataLayout().isLittleEndian();
4488
4489 // Bitcast 'large element' scalar/vector to 'small element' vector.
4490 if ((SrcBits % VTBits) == 0) {
4491 assert(VT.isVector() && "Expected bitcast to vector");
4492
4493 unsigned Scale = SrcBits / VTBits;
4494 APInt SrcDemandedElts =
4495 APIntOps::ScaleBitMask(DemandedElts, NumElts / Scale);
4496
4497 // Fast case - sign splat can be simply split across the small elements.
4498 Tmp = ComputeNumSignBits(N0, SrcDemandedElts, Depth + 1);
4499 if (Tmp == SrcBits)
4500 return VTBits;
4501
4502 // Slow case - determine how far the sign extends into each sub-element.
4503 Tmp2 = VTBits;
4504 for (unsigned i = 0; i != NumElts; ++i)
4505 if (DemandedElts[i]) {
4506 unsigned SubOffset = i % Scale;
4507 SubOffset = (IsLE ? ((Scale - 1) - SubOffset) : SubOffset);
4508 SubOffset = SubOffset * VTBits;
4509 if (Tmp <= SubOffset)
4510 return 1;
4511 Tmp2 = std::min(Tmp2, Tmp - SubOffset);
4512 }
4513 return Tmp2;
4514 }
4515 break;
4516 }
4517
4519 // FP_TO_SINT_SAT produces a signed value that fits in the saturating VT.
4520 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
4521 return VTBits - Tmp + 1;
4522 case ISD::SIGN_EXTEND:
4523 Tmp = VTBits - Op.getOperand(0).getScalarValueSizeInBits();
4524 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1) + Tmp;
4526 // Max of the input and what this extends.
4527 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
4528 Tmp = VTBits-Tmp+1;
4529 Tmp2 = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
4530 return std::max(Tmp, Tmp2);
4532 if (VT.isScalableVector())
4533 break;
4534 SDValue Src = Op.getOperand(0);
4535 EVT SrcVT = Src.getValueType();
4536 APInt DemandedSrcElts = DemandedElts.zext(SrcVT.getVectorNumElements());
4537 Tmp = VTBits - SrcVT.getScalarSizeInBits();
4538 return ComputeNumSignBits(Src, DemandedSrcElts, Depth+1) + Tmp;
4539 }
4540 case ISD::SRA:
4541 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4542 // SRA X, C -> adds C sign bits.
4543 if (const APInt *ShAmt =
4545 Tmp = std::min<uint64_t>(Tmp + ShAmt->getZExtValue(), VTBits);
4546 return Tmp;
4547 case ISD::SHL:
4548 if (const APInt *ShAmt =
4549 getValidMaximumShiftAmountConstant(Op, DemandedElts)) {
4550 // shl destroys sign bits, ensure it doesn't shift out all sign bits.
4551 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4552 if (ShAmt->ult(Tmp))
4553 return Tmp - ShAmt->getZExtValue();
4554 }
4555 break;
4556 case ISD::AND:
4557 case ISD::OR:
4558 case ISD::XOR: // NOT is handled here.
4559 // Logical binary ops preserve the number of sign bits at the worst.
4560 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
4561 if (Tmp != 1) {
4562 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
4563 FirstAnswer = std::min(Tmp, Tmp2);
4564 // We computed what we know about the sign bits as our first
4565 // answer. Now proceed to the generic code that uses
4566 // computeKnownBits, and pick whichever answer is better.
4567 }
4568 break;
4569
4570 case ISD::SELECT:
4571 case ISD::VSELECT:
4572 Tmp = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
4573 if (Tmp == 1) return 1; // Early out.
4574 Tmp2 = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
4575 return std::min(Tmp, Tmp2);
4576 case ISD::SELECT_CC:
4577 Tmp = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
4578 if (Tmp == 1) return 1; // Early out.
4579 Tmp2 = ComputeNumSignBits(Op.getOperand(3), DemandedElts, Depth+1);
4580 return std::min(Tmp, Tmp2);
4581
4582 case ISD::SMIN:
4583 case ISD::SMAX: {
4584 // If we have a clamp pattern, we know that the number of sign bits will be
4585 // the minimum of the clamp min/max range.
4586 bool IsMax = (Opcode == ISD::SMAX);
4587 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
4588 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
4589 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
4590 CstHigh =
4591 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
4592 if (CstLow && CstHigh) {
4593 if (!IsMax)
4594 std::swap(CstLow, CstHigh);
4595 if (CstLow->getAPIntValue().sle(CstHigh->getAPIntValue())) {
4596 Tmp = CstLow->getAPIntValue().getNumSignBits();
4597 Tmp2 = CstHigh->getAPIntValue().getNumSignBits();
4598 return std::min(Tmp, Tmp2);
4599 }
4600 }
4601
4602 // Fallback - just get the minimum number of sign bits of the operands.
4603 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4604 if (Tmp == 1)
4605 return 1; // Early out.
4606 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
4607 return std::min(Tmp, Tmp2);
4608 }
4609 case ISD::UMIN:
4610 case ISD::UMAX:
4611 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4612 if (Tmp == 1)
4613 return 1; // Early out.
4614 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
4615 return std::min(Tmp, Tmp2);
4616 case ISD::SADDO:
4617 case ISD::UADDO:
4618 case ISD::SADDO_CARRY:
4619 case ISD::UADDO_CARRY:
4620 case ISD::SSUBO:
4621 case ISD::USUBO:
4622 case ISD::SSUBO_CARRY:
4623 case ISD::USUBO_CARRY:
4624 case ISD::SMULO:
4625 case ISD::UMULO:
4626 if (Op.getResNo() != 1)
4627 break;
4628 // The boolean result conforms to getBooleanContents. Fall through.
4629 // If setcc returns 0/-1, all bits are sign bits.
4630 // We know that we have an integer-based boolean since these operations
4631 // are only available for integer.
4632 if (TLI->getBooleanContents(VT.isVector(), false) ==
4634 return VTBits;
4635 break;
4636 case ISD::SETCC:
4637 case ISD::SETCCCARRY:
4638 case ISD::STRICT_FSETCC:
4639 case ISD::STRICT_FSETCCS: {
4640 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
4641 // If setcc returns 0/-1, all bits are sign bits.
4642 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
4644 return VTBits;
4645 break;
4646 }
4647 case ISD::ROTL:
4648 case ISD::ROTR:
4649 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4650
4651 // If we're rotating an 0/-1 value, then it stays an 0/-1 value.
4652 if (Tmp == VTBits)
4653 return VTBits;
4654
4655 if (ConstantSDNode *C =
4656 isConstOrConstSplat(Op.getOperand(1), DemandedElts)) {
4657 unsigned RotAmt = C->getAPIntValue().urem(VTBits);
4658
4659 // Handle rotate right by N like a rotate left by 32-N.
4660 if (Opcode == ISD::ROTR)
4661 RotAmt = (VTBits - RotAmt) % VTBits;
4662
4663 // If we aren't rotating out all of the known-in sign bits, return the
4664 // number that are left. This handles rotl(sext(x), 1) for example.
4665 if (Tmp > (RotAmt + 1)) return (Tmp - RotAmt);
4666 }
4667 break;
4668 case ISD::ADD:
4669 case ISD::ADDC:
4670 // Add can have at most one carry bit. Thus we know that the output
4671 // is, at worst, one more bit than the inputs.
4672 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4673 if (Tmp == 1) return 1; // Early out.
4674
4675 // Special case decrementing a value (ADD X, -1):
4676 if (ConstantSDNode *CRHS =
4677 isConstOrConstSplat(Op.getOperand(1), DemandedElts))
4678 if (CRHS->isAllOnes()) {
4679 KnownBits Known =
4680 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4681
4682 // If the input is known to be 0 or 1, the output is 0/-1, which is all
4683 // sign bits set.
4684 if ((Known.Zero | 1).isAllOnes())
4685 return VTBits;
4686
4687 // If we are subtracting one from a positive number, there is no carry
4688 // out of the result.
4689 if (Known.isNonNegative())
4690 return Tmp;
4691 }
4692
4693 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
4694 if (Tmp2 == 1) return 1; // Early out.
4695 return std::min(Tmp, Tmp2) - 1;
4696 case ISD::SUB:
4697 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
4698 if (Tmp2 == 1) return 1; // Early out.
4699
4700 // Handle NEG.
4701 if (ConstantSDNode *CLHS =
4702 isConstOrConstSplat(Op.getOperand(0), DemandedElts))
4703 if (CLHS->isZero()) {
4704 KnownBits Known =
4705 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4706 // If the input is known to be 0 or 1, the output is 0/-1, which is all
4707 // sign bits set.
4708 if ((Known.Zero | 1).isAllOnes())
4709 return VTBits;
4710
4711 // If the input is known to be positive (the sign bit is known clear),
4712 // the output of the NEG has the same number of sign bits as the input.
4713 if (Known.isNonNegative())
4714 return Tmp2;
4715
4716 // Otherwise, we treat this like a SUB.
4717 }
4718
4719 // Sub can have at most one carry bit. Thus we know that the output
4720 // is, at worst, one more bit than the inputs.
4721 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4722 if (Tmp == 1) return 1; // Early out.
4723 return std::min(Tmp, Tmp2) - 1;
4724 case ISD::MUL: {
4725 // The output of the Mul can be at most twice the valid bits in the inputs.
4726 unsigned SignBitsOp0 = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4727 if (SignBitsOp0 == 1)
4728 break;
4729 unsigned SignBitsOp1 = ComputeNumSignBits(Op.getOperand(1), Depth + 1);
4730 if (SignBitsOp1 == 1)
4731 break;
4732 unsigned OutValidBits =
4733 (VTBits - SignBitsOp0 + 1) + (VTBits - SignBitsOp1 + 1);
4734 return OutValidBits > VTBits ? 1 : VTBits - OutValidBits + 1;
4735 }
4736 case ISD::SREM:
4737 // The sign bit is the LHS's sign bit, except when the result of the
4738 // remainder is zero. The magnitude of the result should be less than or
4739 // equal to the magnitude of the LHS. Therefore, the result should have
4740 // at least as many sign bits as the left hand side.
4741 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4742 case ISD::TRUNCATE: {
4743 // Check if the sign bits of source go down as far as the truncated value.
4744 unsigned NumSrcBits = Op.getOperand(0).getScalarValueSizeInBits();
4745 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4746 if (NumSrcSignBits > (NumSrcBits - VTBits))
4747 return NumSrcSignBits - (NumSrcBits - VTBits);
4748 break;
4749 }
4750 case ISD::EXTRACT_ELEMENT: {
4751 if (VT.isScalableVector())
4752 break;
4753 const int KnownSign = ComputeNumSignBits(Op.getOperand(0), Depth+1);
4754 const int BitWidth = Op.getValueSizeInBits();
4755 const int Items = Op.getOperand(0).getValueSizeInBits() / BitWidth;
4756
4757 // Get reverse index (starting from 1), Op1 value indexes elements from
4758 // little end. Sign starts at big end.
4759 const int rIndex = Items - 1 - Op.getConstantOperandVal(1);
4760
4761 // If the sign portion ends in our element the subtraction gives correct
4762 // result. Otherwise it gives either negative or > bitwidth result
4763 return std::clamp(KnownSign - rIndex * BitWidth, 0, BitWidth);
4764 }
4766 if (VT.isScalableVector())
4767 break;
4768 // If we know the element index, split the demand between the
4769 // source vector and the inserted element, otherwise assume we need
4770 // the original demanded vector elements and the value.
4771 SDValue InVec = Op.getOperand(0);
4772 SDValue InVal = Op.getOperand(1);
4773 SDValue EltNo = Op.getOperand(2);
4774 bool DemandedVal = true;
4775 APInt DemandedVecElts = DemandedElts;
4776 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
4777 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
4778 unsigned EltIdx = CEltNo->getZExtValue();
4779 DemandedVal = !!DemandedElts[EltIdx];
4780 DemandedVecElts.clearBit(EltIdx);
4781 }
4782 Tmp = std::numeric_limits<unsigned>::max();
4783 if (DemandedVal) {
4784 // TODO - handle implicit truncation of inserted elements.
4785 if (InVal.getScalarValueSizeInBits() != VTBits)
4786 break;
4787 Tmp2 = ComputeNumSignBits(InVal, Depth + 1);
4788 Tmp = std::min(Tmp, Tmp2);
4789 }
4790 if (!!DemandedVecElts) {
4791 Tmp2 = ComputeNumSignBits(InVec, DemandedVecElts, Depth + 1);
4792 Tmp = std::min(Tmp, Tmp2);
4793 }
4794 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
4795 return Tmp;
4796 }
4798 assert(!VT.isScalableVector());
4799 SDValue InVec = Op.getOperand(0);
4800 SDValue EltNo = Op.getOperand(1);
4801 EVT VecVT = InVec.getValueType();
4802 // ComputeNumSignBits not yet implemented for scalable vectors.
4803 if (VecVT.isScalableVector())
4804 break;
4805 const unsigned BitWidth = Op.getValueSizeInBits();
4806 const unsigned EltBitWidth = Op.getOperand(0).getScalarValueSizeInBits();
4807 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4808
4809 // If BitWidth > EltBitWidth the value is anyext:ed, and we do not know
4810 // anything about sign bits. But if the sizes match we can derive knowledge
4811 // about sign bits from the vector operand.
4812 if (BitWidth != EltBitWidth)
4813 break;
4814
4815 // If we know the element index, just demand that vector element, else for
4816 // an unknown element index, ignore DemandedElts and demand them all.
4817 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
4818 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4819 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
4820 DemandedSrcElts =
4821 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
4822
4823 return ComputeNumSignBits(InVec, DemandedSrcElts, Depth + 1);
4824 }
4826 // Offset the demanded elts by the subvector index.
4827 SDValue Src = Op.getOperand(0);
4828 // Bail until we can represent demanded elements for scalable vectors.
4829 if (Src.getValueType().isScalableVector())
4830 break;
4831 uint64_t Idx = Op.getConstantOperandVal(1);
4832 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
4833 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
4834 return ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
4835 }
4836 case ISD::CONCAT_VECTORS: {
4837 if (VT.isScalableVector())
4838 break;
4839 // Determine the minimum number of sign bits across all demanded
4840 // elts of the input vectors. Early out if the result is already 1.
4841 Tmp = std::numeric_limits<unsigned>::max();
4842 EVT SubVectorVT = Op.getOperand(0).getValueType();
4843 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
4844 unsigned NumSubVectors = Op.getNumOperands();
4845 for (unsigned i = 0; (i < NumSubVectors) && (Tmp > 1); ++i) {
4846 APInt DemandedSub =
4847 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
4848 if (!DemandedSub)
4849 continue;
4850 Tmp2 = ComputeNumSignBits(Op.getOperand(i), DemandedSub, Depth + 1);
4851 Tmp = std::min(Tmp, Tmp2);
4852 }
4853 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
4854 return Tmp;
4855 }
4856 case ISD::INSERT_SUBVECTOR: {
4857 if (VT.isScalableVector())
4858 break;
4859 // Demand any elements from the subvector and the remainder from the src its
4860 // inserted into.
4861 SDValue Src = Op.getOperand(0);
4862 SDValue Sub = Op.getOperand(1);
4863 uint64_t Idx = Op.getConstantOperandVal(2);
4864 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
4865 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
4866 APInt DemandedSrcElts = DemandedElts;
4867 DemandedSrcElts.insertBits(APInt::getZero(NumSubElts), Idx);
4868
4869 Tmp = std::numeric_limits<unsigned>::max();
4870 if (!!DemandedSubElts) {
4871 Tmp = ComputeNumSignBits(Sub, DemandedSubElts, Depth + 1);
4872 if (Tmp == 1)
4873 return 1; // early-out
4874 }
4875 if (!!DemandedSrcElts) {
4876 Tmp2 = ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
4877 Tmp = std::min(Tmp, Tmp2);
4878 }
4879 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
4880 return Tmp;
4881 }
4882 case ISD::LOAD: {
4883 LoadSDNode *LD = cast<LoadSDNode>(Op);
4884 if (const MDNode *Ranges = LD->getRanges()) {
4885 if (DemandedElts != 1)
4886 break;
4887
4889 if (VTBits > CR.getBitWidth()) {
4890 switch (LD->getExtensionType()) {
4891 case ISD::SEXTLOAD:
4892 CR = CR.signExtend(VTBits);
4893 break;
4894 case ISD::ZEXTLOAD:
4895 CR = CR.zeroExtend(VTBits);
4896 break;
4897 default:
4898 break;
4899 }
4900 }
4901
4902 if (VTBits != CR.getBitWidth())
4903 break;
4904 return std::min(CR.getSignedMin().getNumSignBits(),
4906 }
4907
4908 break;
4909 }
4912 case ISD::ATOMIC_SWAP:
4924 case ISD::ATOMIC_LOAD: {
4925 Tmp = cast<AtomicSDNode>(Op)->getMemoryVT().getScalarSizeInBits();
4926 // If we are looking at the loaded value.
4927 if (Op.getResNo() == 0) {
4928 if (Tmp == VTBits)
4929 return 1; // early-out
4931 return VTBits - Tmp + 1;
4933 return VTBits - Tmp;
4934 if (Op->getOpcode() == ISD::ATOMIC_LOAD) {
4935 ISD::LoadExtType ETy = cast<AtomicSDNode>(Op)->getExtensionType();
4936 if (ETy == ISD::SEXTLOAD)
4937 return VTBits - Tmp + 1;
4938 if (ETy == ISD::ZEXTLOAD)
4939 return VTBits - Tmp;
4940 }
4941 }
4942 break;
4943 }
4944 }
4945
4946 // If we are looking at the loaded value of the SDNode.
4947 if (Op.getResNo() == 0) {
4948 // Handle LOADX separately here. EXTLOAD case will fallthrough.
4949 if (LoadSDNode *LD = dyn_cast<LoadSDNode>(Op)) {
4950 unsigned ExtType = LD->getExtensionType();
4951 switch (ExtType) {
4952 default: break;
4953 case ISD::SEXTLOAD: // e.g. i16->i32 = '17' bits known.
4954 Tmp = LD->getMemoryVT().getScalarSizeInBits();
4955 return VTBits - Tmp + 1;
4956 case ISD::ZEXTLOAD: // e.g. i16->i32 = '16' bits known.
4957 Tmp = LD->getMemoryVT().getScalarSizeInBits();
4958 return VTBits - Tmp;
4959 case ISD::NON_EXTLOAD:
4960 if (const Constant *Cst = TLI->getTargetConstantFromLoad(LD)) {
4961 // We only need to handle vectors - computeKnownBits should handle
4962 // scalar cases.
4963 Type *CstTy = Cst->getType();
4964 if (CstTy->isVectorTy() && !VT.isScalableVector() &&
4965 (NumElts * VTBits) == CstTy->getPrimitiveSizeInBits() &&
4966 VTBits == CstTy->getScalarSizeInBits()) {
4967 Tmp = VTBits;
4968 for (unsigned i = 0; i != NumElts; ++i) {
4969 if (!DemandedElts[i])
4970 continue;
4971 if (Constant *Elt = Cst->getAggregateElement(i)) {
4972 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
4973 const APInt &Value = CInt->getValue();
4974 Tmp = std::min(Tmp, Value.getNumSignBits());
4975 continue;
4976 }
4977 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
4978 APInt Value = CFP->getValueAPF().bitcastToAPInt();
4979 Tmp = std::min(Tmp, Value.getNumSignBits());
4980 continue;
4981 }
4982 }
4983 // Unknown type. Conservatively assume no bits match sign bit.
4984 return 1;
4985 }
4986 return Tmp;
4987 }
4988 }
4989 break;
4990 }
4991 }
4992 }
4993
4994 // Allow the target to implement this method for its nodes.
4995 if (Opcode >= ISD::BUILTIN_OP_END ||
4996 Opcode == ISD::INTRINSIC_WO_CHAIN ||
4997 Opcode == ISD::INTRINSIC_W_CHAIN ||
4998 Opcode == ISD::INTRINSIC_VOID) {
4999 // TODO: This can probably be removed once target code is audited. This
5000 // is here purely to reduce patch size and review complexity.
5001 if (!VT.isScalableVector()) {
5002 unsigned NumBits =
5003 TLI->ComputeNumSignBitsForTargetNode(Op, DemandedElts, *this, Depth);
5004 if (NumBits > 1)
5005 FirstAnswer = std::max(FirstAnswer, NumBits);
5006 }
5007 }
5008
5009 // Finally, if we can prove that the top bits of the result are 0's or 1's,
5010 // use this information.
5011 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
5012 return std::max(FirstAnswer, Known.countMinSignBits());
5013}
5014
5016 unsigned Depth) const {
5017 unsigned SignBits = ComputeNumSignBits(Op, Depth);
5018 return Op.getScalarValueSizeInBits() - SignBits + 1;
5019}
5020
5022 const APInt &DemandedElts,
5023 unsigned Depth) const {
5024 unsigned SignBits = ComputeNumSignBits(Op, DemandedElts, Depth);
5025 return Op.getScalarValueSizeInBits() - SignBits + 1;
5026}
5027
5029 unsigned Depth) const {
5030 // Early out for FREEZE.
5031 if (Op.getOpcode() == ISD::FREEZE)
5032 return true;
5033
5034 // TODO: Assume we don't know anything for now.
5035 EVT VT = Op.getValueType();
5036 if (VT.isScalableVector())
5037 return false;
5038
5039 APInt DemandedElts = VT.isVector()
5041 : APInt(1, 1);
5042 return isGuaranteedNotToBeUndefOrPoison(Op, DemandedElts, PoisonOnly, Depth);
5043}
5044
5046 const APInt &DemandedElts,
5047 bool PoisonOnly,
5048 unsigned Depth) const {
5049 unsigned Opcode = Op.getOpcode();
5050
5051 // Early out for FREEZE.
5052 if (Opcode == ISD::FREEZE)
5053 return true;
5054
5055 if (Depth >= MaxRecursionDepth)
5056 return false; // Limit search depth.
5057
5058 if (isIntOrFPConstant(Op))
5059 return true;
5060
5061 switch (Opcode) {
5062 case ISD::CONDCODE:
5063 case ISD::VALUETYPE:
5064 case ISD::FrameIndex:
5066 case ISD::CopyFromReg:
5067 return true;
5068
5069 case ISD::UNDEF:
5070 return PoisonOnly;
5071
5072 case ISD::BUILD_VECTOR:
5073 // NOTE: BUILD_VECTOR has implicit truncation of wider scalar elements -
5074 // this shouldn't affect the result.
5075 for (unsigned i = 0, e = Op.getNumOperands(); i < e; ++i) {
5076 if (!DemandedElts[i])
5077 continue;
5079 Depth + 1))
5080 return false;
5081 }
5082 return true;
5083
5084 // TODO: Search for noundef attributes from library functions.
5085
5086 // TODO: Pointers dereferenced by ISD::LOAD/STORE ops are noundef.
5087
5088 default:
5089 // Allow the target to implement this method for its nodes.
5090 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
5091 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
5093 Op, DemandedElts, *this, PoisonOnly, Depth);
5094 break;
5095 }
5096
5097 // If Op can't create undef/poison and none of its operands are undef/poison
5098 // then Op is never undef/poison.
5099 // NOTE: TargetNodes can handle this in themselves in
5100 // isGuaranteedNotToBeUndefOrPoisonForTargetNode or let
5101 // TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode handle it.
5102 return !canCreateUndefOrPoison(Op, PoisonOnly, /*ConsiderFlags*/ true,
5103 Depth) &&
5104 all_of(Op->ops(), [&](SDValue V) {
5105 return isGuaranteedNotToBeUndefOrPoison(V, PoisonOnly, Depth + 1);
5106 });
5107}
5108
5110 bool ConsiderFlags,
5111 unsigned Depth) const {
5112 // TODO: Assume we don't know anything for now.
5113 EVT VT = Op.getValueType();
5114 if (VT.isScalableVector())
5115 return true;
5116
5117 APInt DemandedElts = VT.isVector()
5119 : APInt(1, 1);
5120 return canCreateUndefOrPoison(Op, DemandedElts, PoisonOnly, ConsiderFlags,
5121 Depth);
5122}
5123
5125 bool PoisonOnly, bool ConsiderFlags,
5126 unsigned Depth) const {
5127 // TODO: Assume we don't know anything for now.
5128 EVT VT = Op.getValueType();
5129 if (VT.isScalableVector())
5130 return true;
5131
5132 if (ConsiderFlags && Op->hasPoisonGeneratingFlags())
5133 return true;
5134
5135 unsigned Opcode = Op.getOpcode();
5136 switch (Opcode) {
5137 case ISD::FREEZE:
5140 case ISD::AND:
5141 case ISD::XOR:
5142 case ISD::ROTL:
5143 case ISD::ROTR:
5144 case ISD::FSHL:
5145 case ISD::FSHR:
5146 case ISD::BSWAP:
5147 case ISD::CTPOP:
5148 case ISD::BITREVERSE:
5149 case ISD::PARITY:
5150 case ISD::SIGN_EXTEND:
5151 case ISD::TRUNCATE:
5155 case ISD::BITCAST:
5156 case ISD::BUILD_VECTOR:
5157 case ISD::BUILD_PAIR:
5158 return false;
5159
5160 case ISD::SETCC: {
5161 // Integer setcc cannot create undef or poison.
5162 if (Op.getOperand(0).getValueType().isInteger())
5163 return false;
5164
5165 // FP compares are more complicated. They can create poison for nan/infinity
5166 // based on options and flags. The options and flags also cause special
5167 // nonan condition codes to be used. Those condition codes may be preserved
5168 // even if the nonan flag is dropped somewhere.
5169 ISD::CondCode CCCode = cast<CondCodeSDNode>(Op.getOperand(2))->get();
5170 if (((unsigned)CCCode & 0x10U))
5171 return true;
5172
5174 return Options.NoNaNsFPMath || Options.NoInfsFPMath;
5175 }
5176
5177 case ISD::OR:
5178 case ISD::ZERO_EXTEND:
5179 case ISD::ADD:
5180 case ISD::SUB:
5181 case ISD::MUL:
5182 // No poison except from flags (which is handled above)
5183 return false;
5184
5185 case ISD::SHL:
5186 // If the max shift amount isn't in range, then the shift can create poison.
5187 return !getValidMaximumShiftAmountConstant(Op, DemandedElts);
5188
5190 // Check if we demand any upper (undef) elements.
5191 return !PoisonOnly && DemandedElts.ugt(1);
5192
5194 // Ensure that the element index is in bounds.
5195 EVT VecVT = Op.getOperand(0).getValueType();
5196 KnownBits KnownIdx = computeKnownBits(Op.getOperand(1), Depth + 1);
5197 return KnownIdx.getMaxValue().uge(VecVT.getVectorMinNumElements());
5198 }
5199
5201 // Ensure that the element index is in bounds.
5202 EVT VecVT = Op.getOperand(0).getValueType();
5203 KnownBits KnownIdx = computeKnownBits(Op.getOperand(2), Depth + 1);
5204 return KnownIdx.getMaxValue().uge(VecVT.getVectorMinNumElements());
5205 }
5206
5207 default:
5208 // Allow the target to implement this method for its nodes.
5209 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
5210 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
5212 Op, DemandedElts, *this, PoisonOnly, ConsiderFlags, Depth);
5213 break;
5214 }
5215
5216 // Be conservative and return true.
5217 return true;
5218}
5219
5221 unsigned Opcode = Op.getOpcode();
5222 if (Opcode == ISD::OR)
5223 return Op->getFlags().hasDisjoint() ||
5224 haveNoCommonBitsSet(Op.getOperand(0), Op.getOperand(1));
5225 if (Opcode == ISD::XOR)
5226 return isMinSignedConstant(Op.getOperand(1));
5227 return false;
5228}
5229
5231 return Op.getNumOperands() == 2 && isa<ConstantSDNode>(Op.getOperand(1)) &&
5232 (Op.getOpcode() == ISD::ADD || isADDLike(Op));
5233}
5234
5235bool SelectionDAG::isKnownNeverNaN(SDValue Op, bool SNaN, unsigned Depth) const {
5236 // If we're told that NaNs won't happen, assume they won't.
5237 if (getTarget().Options.NoNaNsFPMath || Op->getFlags().hasNoNaNs())
5238 return true;
5239
5240 if (Depth >= MaxRecursionDepth)
5241 return false; // Limit search depth.
5242
5243 // If the value is a constant, we can obviously see if it is a NaN or not.
5244 if (const ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Op)) {
5245 return !C->getValueAPF().isNaN() ||
5246 (SNaN && !C->getValueAPF().isSignaling());
5247 }
5248
5249 unsigned Opcode = Op.getOpcode();
5250 switch (Opcode) {
5251 case ISD::FADD:
5252 case ISD::FSUB:
5253 case ISD::FMUL:
5254 case ISD::FDIV:
5255 case ISD::FREM:
5256 case ISD::FSIN:
5257 case ISD::FCOS:
5258 case ISD::FMA:
5259 case ISD::FMAD: {
5260 if (SNaN)
5261 return true;
5262 // TODO: Need isKnownNeverInfinity
5263 return false;
5264 }
5265 case ISD::FCANONICALIZE:
5266 case ISD::FEXP:
5267 case ISD::FEXP2:
5268 case ISD::FEXP10:
5269 case ISD::FTRUNC:
5270 case ISD::FFLOOR:
5271 case ISD::FCEIL:
5272 case ISD::FROUND:
5273 case ISD::FROUNDEVEN:
5274 case ISD::FRINT:
5275 case ISD::LRINT:
5276 case ISD::LLRINT:
5277 case ISD::FNEARBYINT:
5278 case ISD::FLDEXP: {
5279 if (SNaN)
5280 return true;
5281 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
5282 }
5283 case ISD::FABS:
5284 case ISD::FNEG:
5285 case ISD::FCOPYSIGN: {
5286 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
5287 }
5288 case ISD::SELECT:
5289 return isKnownNeverNaN(Op.getOperand(1), SNaN, Depth + 1) &&
5290 isKnownNeverNaN(Op.getOperand(2), SNaN, Depth + 1);
5291 case ISD::FP_EXTEND:
5292 case ISD::FP_ROUND: {
5293 if (SNaN)
5294 return true;
5295 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
5296 }
5297 case ISD::SINT_TO_FP:
5298 case ISD::UINT_TO_FP:
5299 return true;
5300 case ISD::FSQRT: // Need is known positive
5301 case ISD::FLOG:
5302 case ISD::FLOG2:
5303 case ISD::FLOG10:
5304 case ISD::FPOWI:
5305 case ISD::FPOW: {
5306 if (SNaN)
5307 return true;
5308 // TODO: Refine on operand
5309 return false;
5310 }
5311 case ISD::FMINNUM:
5312 case ISD::FMAXNUM: {
5313 // Only one needs to be known not-nan, since it will be returned if the
5314 // other ends up being one.
5315 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1) ||
5316 isKnownNeverNaN(Op.getOperand(1), SNaN, Depth + 1);
5317 }
5318 case ISD::FMINNUM_IEEE:
5319 case ISD::FMAXNUM_IEEE: {
5320 if (SNaN)
5321 return true;
5322 // This can return a NaN if either operand is an sNaN, or if both operands
5323 // are NaN.
5324 return (isKnownNeverNaN(Op.getOperand(0), false, Depth + 1) &&
5325 isKnownNeverSNaN(Op.getOperand(1), Depth + 1)) ||
5326 (isKnownNeverNaN(Op.getOperand(1), false, Depth + 1) &&
5327 isKnownNeverSNaN(Op.getOperand(0), Depth + 1));
5328 }
5329 case ISD::FMINIMUM:
5330 case ISD::FMAXIMUM: {
5331 // TODO: Does this quiet or return the origina NaN as-is?
5332 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1) &&
5333 isKnownNeverNaN(Op.getOperand(1), SNaN, Depth + 1);
5334 }
5336 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
5337 }
5338 case ISD::BUILD_VECTOR: {
5339 for (const SDValue &Opnd : Op->ops())
5340 if (!isKnownNeverNaN(Opnd, SNaN, Depth + 1))
5341 return false;
5342 return true;
5343 }
5344 default:
5345 if (Opcode >= ISD::BUILTIN_OP_END ||
5346 Opcode == ISD::INTRINSIC_WO_CHAIN ||
5347 Opcode == ISD::INTRINSIC_W_CHAIN ||
5348 Opcode == ISD::INTRINSIC_VOID) {
5349 return TLI->isKnownNeverNaNForTargetNode(Op, *this, SNaN, Depth);
5350 }
5351
5352 return false;
5353 }
5354}
5355
5357 assert(Op.getValueType().isFloatingPoint() &&
5358 "Floating point type expected");
5359
5360 // If the value is a constant, we can obviously see if it is a zero or not.
5362 Op, [](ConstantFPSDNode *C) { return !C->isZero(); });
5363}
5364
5366 if (Depth >= MaxRecursionDepth)
5367 return false; // Limit search depth.
5368
5369 assert(!Op.getValueType().isFloatingPoint() &&
5370 "Floating point types unsupported - use isKnownNeverZeroFloat");
5371
5372 // If the value is a constant, we can obviously see if it is a zero or not.
5374 [](ConstantSDNode *C) { return !C->isZero(); }))
5375 return true;
5376
5377 // TODO: Recognize more cases here. Most of the cases are also incomplete to
5378 // some degree.
5379 switch (Op.getOpcode()) {
5380 default:
5381 break;
5382
5383 case ISD::OR:
5384 return isKnownNeverZero(Op.getOperand(1), Depth + 1) ||
5385 isKnownNeverZero(Op.getOperand(0), Depth + 1);
5386
5387 case ISD::VSELECT:
5388 case ISD::SELECT:
5389 return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
5390 isKnownNeverZero(Op.getOperand(2), Depth + 1);
5391
5392 case ISD::SHL: {
5393 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
5394 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
5395 KnownBits ValKnown = computeKnownBits(Op.getOperand(0), Depth + 1);
5396 // 1 << X is never zero.
5397 if (ValKnown.One[0])
5398 return true;
5399 // If max shift cnt of known ones is non-zero, result is non-zero.
5400 APInt MaxCnt = computeKnownBits(Op.getOperand(1), Depth + 1).getMaxValue();
5401 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
5402 !ValKnown.One.shl(MaxCnt).isZero())
5403 return true;
5404 break;
5405 }
5406 case ISD::UADDSAT:
5407 case ISD::UMAX:
5408 return isKnownNeverZero(Op.getOperand(1), Depth + 1) ||
5409 isKnownNeverZero(Op.getOperand(0), Depth + 1);
5410
5411 // For smin/smax: If either operand is known negative/positive
5412 // respectively we don't need the other to be known at all.
5413 case ISD::SMAX: {
5414 KnownBits Op1 = computeKnownBits(Op.getOperand(1), Depth + 1);
5415 if (Op1.isStrictlyPositive())
5416 return true;
5417
5418 KnownBits Op0 = computeKnownBits(Op.getOperand(0), Depth + 1);
5419 if (Op0.isStrictlyPositive())
5420 return true;
5421
5422 if (Op1.isNonZero() && Op0.isNonZero())
5423 return true;
5424
5425 return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
5426 isKnownNeverZero(Op.getOperand(0), Depth + 1);
5427 }
5428 case ISD::SMIN: {
5429 KnownBits Op1 = computeKnownBits(Op.getOperand(1), Depth + 1);
5430 if (Op1.isNegative())
5431 return true;
5432
5433 KnownBits Op0 = computeKnownBits(Op.getOperand(0), Depth + 1);
5434 if (Op0.isNegative())
5435 return true;
5436
5437 if (Op1.isNonZero() && Op0.isNonZero())
5438 return true;
5439
5440 return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
5441 isKnownNeverZero(Op.getOperand(0), Depth + 1);
5442 }
5443 case ISD::UMIN:
5444 return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
5445 isKnownNeverZero(Op.getOperand(0), Depth + 1);
5446
5447 case ISD::ROTL:
5448 case ISD::ROTR:
5449 case ISD::BITREVERSE:
5450 case ISD::BSWAP:
5451 case ISD::CTPOP:
5452 case ISD::ABS:
5453 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
5454
5455 case ISD::SRA:
5456 case ISD::SRL: {
5457 if (Op->getFlags().hasExact())
5458 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
5459 KnownBits ValKnown = computeKnownBits(Op.getOperand(0), Depth + 1);
5460 if (ValKnown.isNegative())
5461 return true;
5462 // If max shift cnt of known ones is non-zero, result is non-zero.
5463 APInt MaxCnt = computeKnownBits(Op.getOperand(1), Depth + 1).getMaxValue();
5464 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
5465 !ValKnown.One.lshr(MaxCnt).isZero())
5466 return true;
5467 break;
5468 }
5469 case ISD::UDIV:
5470 case ISD::SDIV:
5471 // div exact can only produce a zero if the dividend is zero.
5472 // TODO: For udiv this is also true if Op1 u<= Op0
5473 if (Op->getFlags().hasExact())
5474 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
5475 break;
5476
5477 case ISD::ADD:
5478 if (Op->getFlags().hasNoUnsignedWrap())
5479 if (isKnownNeverZero(Op.getOperand(1), Depth + 1) ||
5480 isKnownNeverZero(Op.getOperand(0), Depth + 1))
5481 return true;
5482 // TODO: There are a lot more cases we can prove for add.
5483 break;
5484
5485 case ISD::SUB: {
5486 if (isNullConstant(Op.getOperand(0)))
5487 return isKnownNeverZero(Op.getOperand(1), Depth + 1);
5488
5489 std::optional<bool> ne =
5490 KnownBits::ne(computeKnownBits(Op.getOperand(0), Depth + 1),
5491 computeKnownBits(Op.getOperand(1), Depth + 1));
5492 return ne && *ne;
5493 }
5494
5495 case ISD::MUL:
5496 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
5497 if (isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
5498 isKnownNeverZero(Op.getOperand(0), Depth + 1))
5499 return true;
5500 break;
5501
5502 case ISD::ZERO_EXTEND:
5503 case ISD::SIGN_EXTEND:
5504 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
5505 }
5506
5508}
5509
5511 // Check the obvious case.
5512 if (A == B) return true;
5513
5514 // For negative and positive zero.
5515 if (const ConstantFPSDNode *CA = dyn_cast<ConstantFPSDNode>(A))
5516 if (const ConstantFPSDNode *CB = dyn_cast<ConstantFPSDNode>(B))
5517 if (CA->isZero() && CB->isZero()) return true;
5518
5519 // Otherwise they may not be equal.
5520 return false;
5521}
5522
5523// Only bits set in Mask must be negated, other bits may be arbitrary.
5525 if (isBitwiseNot(V, AllowUndefs))
5526 return V.getOperand(0);
5527
5528 // Handle any_extend (not (truncate X)) pattern, where Mask only sets
5529 // bits in the non-extended part.
5530 ConstantSDNode *MaskC = isConstOrConstSplat(Mask);
5531 if (!MaskC || V.getOpcode() != ISD::ANY_EXTEND)
5532 return SDValue();
5533 SDValue ExtArg = V.getOperand(0);
5534 if (ExtArg.getScalarValueSizeInBits() >=
5535 MaskC->getAPIntValue().getActiveBits() &&
5536 isBitwiseNot(ExtArg, AllowUndefs) &&
5537 ExtArg.getOperand(0).getOpcode() == ISD::TRUNCATE &&
5538 ExtArg.getOperand(0).getOperand(0).getValueType() == V.getValueType())
5539 return ExtArg.getOperand(0).getOperand(0);
5540 return SDValue();
5541}
5542
5544 // Match masked merge pattern (X & ~M) op (Y & M)
5545 // Including degenerate case (X & ~M) op M
5546 auto MatchNoCommonBitsPattern = [&](SDValue Not, SDValue Mask,
5547 SDValue Other) {
5548 if (SDValue NotOperand =
5549 getBitwiseNotOperand(Not, Mask, /* AllowUndefs */ true)) {
5550 if (NotOperand->getOpcode() == ISD::ZERO_EXTEND ||
5551 NotOperand->getOpcode() == ISD::TRUNCATE)
5552 NotOperand = NotOperand->getOperand(0);
5553
5554 if (Other == NotOperand)
5555 return true;
5556 if (Other->getOpcode() == ISD::AND)
5557 return NotOperand == Other->getOperand(0) ||
5558 NotOperand == Other->getOperand(1);
5559 }
5560 return false;
5561 };
5562
5563 if (A->getOpcode() == ISD::ZERO_EXTEND || A->getOpcode() == ISD::TRUNCATE)
5564 A = A->getOperand(0);
5565
5566 if (B->getOpcode() == ISD::ZERO_EXTEND || B->getOpcode() == ISD::TRUNCATE)
5567 B = B->getOperand(0);
5568
5569 if (A->getOpcode() == ISD::AND)
5570 return MatchNoCommonBitsPattern(A->getOperand(0), A->getOperand(1), B) ||
5571 MatchNoCommonBitsPattern(A->getOperand(1), A->getOperand(0), B);
5572 return false;
5573}
5574
5575// FIXME: unify with llvm::haveNoCommonBitsSet.
5577 assert(A.getValueType() == B.getValueType() &&
5578 "Values must have the same type");
5581 return true;
5584}
5585
5586static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step,
5587 SelectionDAG &DAG) {
5588 if (cast<ConstantSDNode>(Step)->isZero())
5589 return DAG.getConstant(0, DL, VT);
5590
5591 return SDValue();
5592}
5593
5596 SelectionDAG &DAG) {
5597 int NumOps = Ops.size();
5598 assert(NumOps != 0 && "Can't build an empty vector!");
5599 assert(!VT.isScalableVector() &&
5600 "BUILD_VECTOR cannot be used with scalable types");
5601 assert(VT.getVectorNumElements() == (unsigned)NumOps &&
5602 "Incorrect element count in BUILD_VECTOR!");
5603
5604 // BUILD_VECTOR of UNDEFs is UNDEF.
5605 if (llvm::all_of(Ops, [](SDValue Op) { return Op.isUndef(); }))
5606 return DAG.getUNDEF(VT);
5607
5608 // BUILD_VECTOR of seq extract/insert from the same vector + type is Identity.
5609 SDValue IdentitySrc;
5610 bool IsIdentity = true;
5611 for (int i = 0; i != NumOps; ++i) {
5612 if (Ops[i].getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
5613 Ops[i].getOperand(0).getValueType() != VT ||
5614 (IdentitySrc && Ops[i].getOperand(0) != IdentitySrc) ||
5615 !isa<ConstantSDNode>(Ops[i].getOperand(1)) ||
5616 Ops[i].getConstantOperandAPInt(1) != i) {
5617 IsIdentity = false;
5618 break;
5619 }
5620 IdentitySrc = Ops[i].getOperand(0);
5621 }
5622 if (IsIdentity)
5623 return IdentitySrc;
5624
5625 return SDValue();
5626}
5627
5628/// Try to simplify vector concatenation to an input value, undef, or build
5629/// vector.
5632 SelectionDAG &DAG) {
5633 assert(!Ops.empty() && "Can't concatenate an empty list of vectors!");
5634 assert(llvm::all_of(Ops,
5635 [Ops](SDValue Op) {
5636 return Ops[0].getValueType() == Op.getValueType();
5637 }) &&
5638 "Concatenation of vectors with inconsistent value types!");
5639 assert((Ops[0].getValueType().getVectorElementCount() * Ops.size()) ==
5640 VT.getVectorElementCount() &&
5641 "Incorrect element count in vector concatenation!");
5642
5643 if (Ops.size() == 1)
5644 return Ops[0];
5645
5646 // Concat of UNDEFs is UNDEF.
5647 if (llvm::all_of(Ops, [](SDValue Op) { return Op.isUndef(); }))
5648 return DAG.getUNDEF(VT);
5649
5650 // Scan the operands and look for extract operations from a single source
5651 // that correspond to insertion at the same location via this concatenation:
5652 // concat (extract X, 0*subvec_elts), (extract X, 1*subvec_elts), ...
5653 SDValue IdentitySrc;
5654 bool IsIdentity = true;
5655 for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
5656 SDValue Op = Ops[i];
5657 unsigned IdentityIndex = i * Op.getValueType().getVectorMinNumElements();
5658 if (Op.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
5659 Op.getOperand(0).getValueType() != VT ||
5660 (IdentitySrc && Op.getOperand(0) != IdentitySrc) ||
5661 Op.getConstantOperandVal(1) != IdentityIndex) {
5662 IsIdentity = false;
5663 break;
5664 }
5665 assert((!IdentitySrc || IdentitySrc == Op.getOperand(0)) &&
5666 "Unexpected identity source vector for concat of extracts");
5667 IdentitySrc = Op.getOperand(0);
5668 }
5669 if (IsIdentity) {
5670 assert(IdentitySrc && "Failed to set source vector of extracts");
5671 return IdentitySrc;
5672 }
5673
5674 // The code below this point is only designed to work for fixed width
5675 // vectors, so we bail out for now.
5676 if (VT.isScalableVector())
5677 return SDValue();
5678
5679 // A CONCAT_VECTOR with all UNDEF/BUILD_VECTOR operands can be
5680 // simplified to one big BUILD_VECTOR.
5681 // FIXME: Add support for SCALAR_TO_VECTOR as well.
5682 EVT SVT = VT.getScalarType();
5684 for (SDValue Op : Ops) {
5685 EVT OpVT = Op.getValueType();
5686 if (Op.isUndef())
5687 Elts.append(OpVT.getVectorNumElements(), DAG.getUNDEF(SVT));
5688 else if (Op.getOpcode() == ISD::BUILD_VECTOR)
5689 Elts.append(Op->op_begin(), Op->op_end());
5690 else
5691 return SDValue();
5692 }
5693
5694 // BUILD_VECTOR requires all inputs to be of the same type, find the
5695 // maximum type and extend them all.
5696 for (SDValue Op : Elts)
5697 SVT = (SVT.bitsLT(Op.getValueType()) ? Op.getValueType() : SVT);
5698
5699 if (SVT.bitsGT(VT.getScalarType())) {
5700 for (SDValue &Op : Elts) {
5701 if (Op.isUndef())
5702 Op = DAG.getUNDEF(SVT);
5703 else
5704 Op = DAG.getTargetLoweringInfo().isZExtFree(Op.getValueType(), SVT)
5705 ? DAG.getZExtOrTrunc(Op, DL, SVT)
5706 : DAG.getSExtOrTrunc(Op, DL, SVT);
5707 }
5708 }
5709
5710 SDValue V = DAG.getBuildVector(VT, DL, Elts);
5711 NewSDValueDbgMsg(V, "New node fold concat vectors: ", &DAG);
5712 return V;
5713}
5714
5715/// Gets or creates the specified node.
5716SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT) {
5717 SDVTList VTs = getVTList(VT);
5719 AddNodeIDNode(ID, Opcode, VTs, std::nullopt);
5720 void *IP = nullptr;
5721 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
5722 return SDValue(E, 0);
5723
5724 auto *N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
5725 CSEMap.InsertNode(N, IP);
5726
5727 InsertNode(N);
5728 SDValue V = SDValue(N, 0);
5729 NewSDValueDbgMsg(V, "Creating new node: ", this);
5730 return V;
5731}
5732
5733SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
5734 SDValue N1) {
5735 SDNodeFlags Flags;
5736 if (Inserter)
5737 Flags = Inserter->getFlags();
5738 return getNode(Opcode, DL, VT, N1, Flags);
5739}
5740
5741SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
5742 SDValue N1, const SDNodeFlags Flags) {
5743 assert(N1.getOpcode() != ISD::DELETED_NODE && "Operand is DELETED_NODE!");
5744
5745 // Constant fold unary operations with a vector integer or float operand.
5746 switch (Opcode) {
5747 default:
5748 // FIXME: Entirely reasonable to perform folding of other unary
5749 // operations here as the need arises.
5750 break;
5751 case ISD::FNEG:
5752 case ISD::FABS:
5753 case ISD::FCEIL:
5754 case ISD::FTRUNC:
5755 case ISD::FFLOOR:
5756 case ISD::FP_EXTEND:
5757 case ISD::FP_TO_SINT:
5758 case ISD::FP_TO_UINT:
5759 case ISD::FP_TO_FP16:
5760 case ISD::FP_TO_BF16:
5761 case ISD::TRUNCATE:
5762 case ISD::ANY_EXTEND:
5763 case ISD::ZERO_EXTEND:
5764 case ISD::SIGN_EXTEND:
5765 case ISD::UINT_TO_FP:
5766 case ISD::SINT_TO_FP:
5767 case ISD::FP16_TO_FP:
5768 case ISD::BF16_TO_FP:
5769 case ISD::BITCAST:
5770 case ISD::ABS:
5771 case ISD::BITREVERSE:
5772 case ISD::BSWAP:
5773 case ISD::CTLZ:
5775 case ISD::CTTZ:
5777 case ISD::CTPOP:
5778 case ISD::STEP_VECTOR: {
5779 SDValue Ops = {N1};
5780 if (SDValue Fold = FoldConstantArithmetic(Opcode, DL, VT, Ops))
5781 return Fold;
5782 }
5783 }
5784
5785 unsigned OpOpcode = N1.getNode()->getOpcode();
5786 switch (Opcode) {
5787 case ISD::STEP_VECTOR:
5788 assert(VT.isScalableVector() &&
5789 "STEP_VECTOR can only be used with scalable types");
5790 assert(OpOpcode == ISD::TargetConstant &&
5791 VT.getVectorElementType() == N1.getValueType() &&
5792 "Unexpected step operand");
5793 break;
5794 case ISD::FREEZE:
5795 assert(VT == N1.getValueType() && "Unexpected VT!");
5796 if (isGuaranteedNotToBeUndefOrPoison(N1, /*PoisonOnly*/ false,
5797 /*Depth*/ 1))
5798 return N1;
5799 break;
5800 case ISD::TokenFactor:
5801 case ISD::MERGE_VALUES:
5803 return N1; // Factor, merge or concat of one node? No need.
5804 case ISD::BUILD_VECTOR: {
5805 // Attempt to simplify BUILD_VECTOR.
5806 SDValue Ops[] = {N1};
5807 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
5808 return V;
5809 break;
5810 }
5811 case ISD::FP_ROUND: llvm_unreachable("Invalid method to make FP_ROUND node");
5812 case ISD::FP_EXTEND:
5814 "Invalid FP cast!");
5815 if (N1.getValueType() == VT) return N1; // noop conversion.
5816 assert((!VT.isVector() || VT.getVectorElementCount() ==
5818 "Vector element count mismatch!");
5819 assert(N1.getValueType().bitsLT(VT) && "Invalid fpext node, dst < src!");
5820 if (N1.isUndef())
5821 return getUNDEF(VT);
5822 break;
5823 case ISD::FP_TO_SINT:
5824 case ISD::FP_TO_UINT:
5825 if (N1.isUndef())
5826 return getUNDEF(VT);
5827 break;
5828 case ISD::SINT_TO_FP:
5829 case ISD::UINT_TO_FP:
5830 // [us]itofp(undef) = 0, because the result value is bounded.
5831 if (N1.isUndef())
5832 return getConstantFP(0.0, DL, VT);
5833 break;
5834 case ISD::SIGN_EXTEND:
5835 assert(VT.isInteger() && N1.getValueType().isInteger() &&
5836 "Invalid SIGN_EXTEND!");
5837 assert(VT.isVector() == N1.getValueType().isVector() &&
5838 "SIGN_EXTEND result type type should be vector iff the operand "
5839 "type is vector!");
5840 if (N1.getValueType() == VT) return N1; // noop extension
5841 assert((!VT.isVector() || VT.getVectorElementCount() ==
5843 "Vector element count mismatch!");
5844 assert(N1.getValueType().bitsLT(VT) && "Invalid sext node, dst < src!");
5845 if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND) {
5846 SDNodeFlags Flags;
5847 if (OpOpcode == ISD::ZERO_EXTEND)
5848 Flags.setNonNeg(N1->getFlags().hasNonNeg());
5849 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
5850 }
5851 if (OpOpcode == ISD::UNDEF)
5852 // sext(undef) = 0, because the top bits will all be the same.
5853 return getConstant(0, DL, VT);
5854 break;
5855 case ISD::ZERO_EXTEND:
5856 assert(VT.isInteger() && N1.getValueType().isInteger() &&
5857 "Invalid ZERO_EXTEND!");
5858 assert(VT.isVector() == N1.getValueType().isVector() &&
5859 "ZERO_EXTEND result type type should be vector iff the operand "
5860 "type is vector!");
5861 if (N1.getValueType() == VT) return N1; // noop extension
5862 assert((!VT.isVector() || VT.getVectorElementCount() ==
5864 "Vector element count mismatch!");
5865 assert(N1.getValueType().bitsLT(VT) && "Invalid zext node, dst < src!");
5866 if (OpOpcode == ISD::ZERO_EXTEND) { // (zext (zext x)) -> (zext x)
5867 SDNodeFlags Flags;
5868 Flags.setNonNeg(N1->getFlags().hasNonNeg());
5869 return getNode(ISD::ZERO_EXTEND, DL, VT, N1.getOperand(0), Flags);
5870 }
5871 if (OpOpcode == ISD::UNDEF)
5872 // zext(undef) = 0, because the top bits will be zero.
5873 return getConstant(0, DL, VT);
5874
5875 // Skip unnecessary zext_inreg pattern:
5876 // (zext (trunc x)) -> x iff the upper bits are known zero.
5877 // TODO: Remove (zext (trunc (and x, c))) exception which some targets
5878 // use to recognise zext_inreg patterns.
5879 if (OpOpcode == ISD::TRUNCATE) {
5880 SDValue OpOp = N1.getOperand(0);
5881 if (OpOp.getValueType() == VT) {
5882 if (OpOp.getOpcode() != ISD::AND) {
5885 if (MaskedValueIsZero(OpOp, HiBits)) {
5886 transferDbgValues(N1, OpOp);
5887 return OpOp;
5888 }
5889 }
5890 }
5891 }
5892 break;
5893 case ISD::ANY_EXTEND:
5894 assert(VT.isInteger() && N1.getValueType().isInteger() &&
5895 "Invalid ANY_EXTEND!");
5896 assert(VT.isVector() == N1.getValueType().isVector() &&
5897 "ANY_EXTEND result type type should be vector iff the operand "
5898 "type is vector!");
5899 if (N1.getValueType() == VT) return N1; // noop extension
5900 assert((!VT.isVector() || VT.getVectorElementCount() ==
5902 "Vector element count mismatch!");
5903 assert(N1.getValueType().bitsLT(VT) && "Invalid anyext node, dst < src!");
5904
5905 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
5906 OpOpcode == ISD::ANY_EXTEND) {
5907 SDNodeFlags Flags;
5908 if (OpOpcode == ISD::ZERO_EXTEND)
5909 Flags.setNonNeg(N1->getFlags().hasNonNeg());
5910 // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x)
5911 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
5912 }
5913 if (OpOpcode == ISD::UNDEF)
5914 return getUNDEF(VT);
5915
5916 // (ext (trunc x)) -> x
5917 if (OpOpcode == ISD::TRUNCATE) {
5918 SDValue OpOp = N1.getOperand(0);
5919 if (OpOp.getValueType() == VT) {
5920 transferDbgValues(N1, OpOp);
5921 return OpOp;
5922 }
5923 }
5924 break;
5925 case ISD::TRUNCATE:
5926 assert(VT.isInteger() && N1.getValueType().isInteger() &&
5927 "Invalid TRUNCATE!");
5928 assert(VT.isVector() == N1.getValueType().isVector() &&
5929 "TRUNCATE result type type should be vector iff the operand "
5930 "type is vector!");
5931 if (N1.getValueType() == VT) return N1; // noop truncate
5932 assert((!VT.isVector() || VT.getVectorElementCount() ==
5934 "Vector element count mismatch!");
5935 assert(N1.getValueType().bitsGT(VT) && "Invalid truncate node, src < dst!");
5936 if (OpOpcode == ISD::TRUNCATE)
5937 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
5938 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
5939 OpOpcode == ISD::ANY_EXTEND) {
5940 // If the source is smaller than the dest, we still need an extend.
5942 VT.getScalarType()))
5943 return getNode(OpOpcode, DL, VT, N1.getOperand(0));
5944 if (N1.getOperand(0).getValueType().bitsGT(VT))
5945 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
5946 return N1.getOperand(0);
5947 }
5948 if (OpOpcode == ISD::UNDEF)
5949 return getUNDEF(VT);
5950 if (OpOpcode == ISD::VSCALE && !NewNodesMustHaveLegalTypes)
5951 return getVScale(DL, VT,
5953 break;
5957 assert(VT.isVector() && "This DAG node is restricted to vector types.");
5958 assert(N1.getValueType().bitsLE(VT) &&
5959 "The input must be the same size or smaller than the result.");
5962 "The destination vector type must have fewer lanes than the input.");
5963 break;
5964 case ISD::ABS:
5965 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid ABS!");
5966 if (OpOpcode == ISD::UNDEF)
5967 return getConstant(0, DL, VT);
5968 break;
5969 case ISD::BSWAP:
5970 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BSWAP!");
5971 assert((VT.getScalarSizeInBits() % 16 == 0) &&
5972 "BSWAP types must be a multiple of 16 bits!");
5973 if (OpOpcode == ISD::UNDEF)
5974 return getUNDEF(VT);
5975 // bswap(bswap(X)) -> X.
5976 if (OpOpcode == ISD::BSWAP)
5977 return N1.getOperand(0);
5978 break;
5979 case ISD::BITREVERSE:
5980 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BITREVERSE!");
5981 if (OpOpcode == ISD::UNDEF)
5982 return getUNDEF(VT);
5983 break;
5984 case ISD::BITCAST:
5986 "Cannot BITCAST between types of different sizes!");
5987 if (VT == N1.getValueType()) return N1; // noop conversion.
5988 if (OpOpcode == ISD::BITCAST) // bitconv(bitconv(x)) -> bitconv(x)
5989 return getNode(ISD::BITCAST, DL, VT, N1.getOperand(0));
5990 if (OpOpcode == ISD::UNDEF)
5991 return getUNDEF(VT);
5992 break;
5994 assert(VT.isVector() && !N1.getValueType().isVector() &&
5995 (VT.getVectorElementType() == N1.getValueType() ||
5997 N1.getValueType().isInteger() &&
5999 "Illegal SCALAR_TO_VECTOR node!");
6000 if (OpOpcode == ISD::UNDEF)
6001 return getUNDEF(VT);
6002 // scalar_to_vector(extract_vector_elt V, 0) -> V, top bits are undefined.
6003 if (OpOpcode == ISD::EXTRACT_VECTOR_ELT &&
6004 isa<ConstantSDNode>(N1.getOperand(1)) &&
6005 N1.getConstantOperandVal(1) == 0 &&
6006 N1.getOperand(0).getValueType() == VT)
6007 return N1.getOperand(0);
6008 break;
6009 case ISD::FNEG:
6010 // Negation of an unknown bag of bits is still completely undefined.
6011 if (OpOpcode == ISD::UNDEF)
6012 return getUNDEF(VT);
6013
6014 if (OpOpcode == ISD::FNEG) // --X -> X
6015 return N1.getOperand(0);
6016 break;
6017 case ISD::FABS:
6018 if (OpOpcode == ISD::FNEG) // abs(-X) -> abs(X)
6019 return getNode(ISD::FABS, DL, VT, N1.getOperand(0));
6020 break;
6021 case ISD::VSCALE:
6022 assert(VT == N1.getValueType() && "Unexpected VT!");
6023 break;
6024 case ISD::CTPOP:
6025 if (N1.getValueType().getScalarType() == MVT::i1)
6026 return N1;
6027 break;
6028 case ISD::CTLZ:
6029 case ISD::CTTZ:
6030 if (N1.getValueType().getScalarType() == MVT::i1)
6031 return getNOT(DL, N1, N1.getValueType());
6032 break;
6033 case ISD::VECREDUCE_ADD:
6034 if (N1.getValueType().getScalarType() == MVT::i1)
6035 return getNode(ISD::VECREDUCE_XOR, DL, VT, N1);
6036 break;
6039 if (N1.getValueType().getScalarType() == MVT::i1)
6040 return getNode(ISD::VECREDUCE_OR, DL, VT, N1);
6041 break;
6044 if (N1.getValueType().getScalarType() == MVT::i1)
6045 return getNode(ISD::VECREDUCE_AND, DL, VT, N1);
6046 break;
6047 case ISD::SPLAT_VECTOR:
6048 assert(VT.isVector() && "Wrong return type!");
6049 // FIXME: Hexagon uses i32 scalar for a floating point zero vector so allow
6050 // that for now.
6052 (VT.isFloatingPoint() && N1.getValueType() == MVT::i32) ||
6054 N1.getValueType().isInteger() &&
6056 "Wrong operand type!");
6057 break;
6058 }
6059
6060 SDNode *N;
6061 SDVTList VTs = getVTList(VT);
6062 SDValue Ops[] = {N1};
6063 if (VT != MVT::Glue) { // Don't CSE glue producing nodes
6065 AddNodeIDNode(ID, Opcode, VTs, Ops);
6066 void *IP = nullptr;
6067 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
6068 E->intersectFlagsWith(Flags);
6069 return SDValue(E, 0);
6070 }
6071
6072 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6073 N->setFlags(Flags);
6074 createOperands(N, Ops);
6075 CSEMap.InsertNode(N, IP);
6076 } else {
6077 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6078 createOperands(N, Ops);
6079 }
6080
6081 InsertNode(N);
6082 SDValue V = SDValue(N, 0);
6083 NewSDValueDbgMsg(V, "Creating new node: ", this);
6084 return V;
6085}
6086
6087static std::optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
6088 const APInt &C2) {
6089 switch (Opcode) {
6090 case ISD::ADD: return C1 + C2;
6091 case ISD::SUB: return C1 - C2;
6092 case ISD::MUL: return C1 * C2;
6093 case ISD::AND: return C1 & C2;
6094 case ISD::OR: return C1 | C2;
6095 case ISD::XOR: return C1 ^ C2;
6096 case ISD::SHL: return C1 << C2;
6097 case ISD::SRL: return C1.lshr(C2);
6098 case ISD::SRA: return C1.ashr(C2);
6099 case ISD::ROTL: return C1.rotl(C2);
6100 case ISD::ROTR: return C1.rotr(C2);
6101 case ISD::SMIN: return C1.sle(C2) ? C1 : C2;
6102 case ISD::SMAX: return C1.sge(C2) ? C1 : C2;
6103 case ISD::UMIN: return C1.ule(C2) ? C1 : C2;
6104 case ISD::UMAX: return C1.uge(C2) ? C1 : C2;
6105 case ISD::SADDSAT: return C1.sadd_sat(C2);
6106 case ISD::UADDSAT: return C1.uadd_sat(C2);
6107 case ISD::SSUBSAT: return C1.ssub_sat(C2);
6108 case ISD::USUBSAT: return C1.usub_sat(C2);
6109 case ISD::SSHLSAT: return C1.sshl_sat(C2);
6110 case ISD::USHLSAT: return C1.ushl_sat(C2);
6111 case ISD::UDIV:
6112 if (!C2.getBoolValue())
6113 break;
6114 return C1.udiv(C2);
6115 case ISD::UREM:
6116 if (!C2.getBoolValue())
6117 break;
6118 return C1.urem(C2);
6119 case ISD::SDIV:
6120 if (!C2.getBoolValue())
6121 break;
6122 return C1.sdiv(C2);
6123 case ISD::SREM:
6124 if (!C2.getBoolValue())
6125 break;
6126 return C1.srem(C2);
6127 case ISD::AVGFLOORS:
6128 return APIntOps::avgFloorS(C1, C2);
6129 case ISD::AVGFLOORU:
6130 return APIntOps::avgFloorU(C1, C2);
6131 case ISD::AVGCEILS:
6132 return APIntOps::avgCeilS(C1, C2);
6133 case ISD::AVGCEILU:
6134 return APIntOps::avgCeilU(C1, C2);
6135 case ISD::ABDS:
6136 return APIntOps::abds(C1, C2);
6137 case ISD::ABDU:
6138 return APIntOps::abdu(C1, C2);
6139 case ISD::MULHS:
6140 return APIntOps::mulhs(C1, C2);
6141 case ISD::MULHU:
6142 return APIntOps::mulhu(C1, C2);
6143 }
6144 return std::nullopt;
6145}
6146// Handle constant folding with UNDEF.
6147// TODO: Handle more cases.
6148static std::optional<APInt> FoldValueWithUndef(unsigned Opcode, const APInt &C1,
6149 bool IsUndef1, const APInt &C2,
6150 bool IsUndef2) {
6151 if (!(IsUndef1 || IsUndef2))
6152 return FoldValue(Opcode, C1, C2);
6153
6154 // Fold and(x, undef) -> 0
6155 // Fold mul(x, undef) -> 0
6156 if (Opcode == ISD::AND || Opcode == ISD::MUL)
6157 return APInt::getZero(C1.getBitWidth());
6158
6159 return std::nullopt;
6160}
6161
6163 const GlobalAddressSDNode *GA,
6164 const SDNode *N2) {
6165 if (GA->getOpcode() != ISD::GlobalAddress)
6166 return SDValue();
6167 if (!TLI->isOffsetFoldingLegal(GA))
6168 return SDValue();
6169 auto *C2 = dyn_cast<ConstantSDNode>(N2);
6170 if (!C2)
6171 return SDValue();
6172 int64_t Offset = C2->getSExtValue();
6173 switch (Opcode) {
6174 case ISD::ADD: break;
6175 case ISD::SUB: Offset = -uint64_t(Offset); break;
6176 default: return SDValue();
6177 }
6178 return getGlobalAddress(GA->getGlobal(), SDLoc(C2), VT,
6179 GA->getOffset() + uint64_t(Offset));
6180}
6181
6182bool SelectionDAG::isUndef(unsigned Opcode, ArrayRef<SDValue> Ops) {
6183 switch (Opcode) {
6184 case ISD::SDIV:
6185 case ISD::UDIV:
6186 case ISD::SREM:
6187 case ISD::UREM: {
6188 // If a divisor is zero/undef or any element of a divisor vector is
6189 // zero/undef, the whole op is undef.
6190 assert(Ops.size() == 2 && "Div/rem should have 2 operands");
6191 SDValue Divisor = Ops[1];
6192 if (Divisor.isUndef() || isNullConstant(Divisor))
6193 return true;
6194
6195 return ISD::isBuildVectorOfConstantSDNodes(Divisor.getNode()) &&
6196 llvm::any_of(Divisor->op_values(),
6197 [](SDValue V) { return V.isUndef() ||
6198 isNullConstant(V); });
6199 // TODO: Handle signed overflow.
6200 }
6201 // TODO: Handle oversized shifts.
6202 default:
6203 return false;
6204 }
6205}
6206
6208 EVT VT, ArrayRef<SDValue> Ops) {
6209 // If the opcode is a target-specific ISD node, there's nothing we can
6210 // do here and the operand rules may not line up with the below, so
6211 // bail early.
6212 // We can't create a scalar CONCAT_VECTORS so skip it. It will break
6213 // for concats involving SPLAT_VECTOR. Concats of BUILD_VECTORS are handled by
6214 // foldCONCAT_VECTORS in getNode before this is called.
6215 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::CONCAT_VECTORS)
6216 return SDValue();
6217
6218 unsigned NumOps = Ops.size();
6219 if (NumOps == 0)
6220 return SDValue();
6221
6222 if (isUndef(Opcode, Ops))
6223 return getUNDEF(VT);
6224
6225 // Handle unary special cases.
6226 if (NumOps == 1) {
6227 SDValue N1 = Ops[0];
6228
6229 // Constant fold unary operations with an integer constant operand. Even
6230 // opaque constant will be folded, because the folding of unary operations
6231 // doesn't create new constants with different values. Nevertheless, the
6232 // opaque flag is preserved during folding to prevent future folding with
6233 // other constants.
6234 if (auto *C = dyn_cast<ConstantSDNode>(N1)) {
6235 const APInt &Val = C->getAPIntValue();
6236 switch (Opcode) {
6237 case ISD::SIGN_EXTEND:
6238 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
6239 C->isTargetOpcode(), C->isOpaque());
6240 case ISD::TRUNCATE:
6241 if (C->isOpaque())
6242 break;
6243 [[fallthrough]];
6244 case ISD::ZERO_EXTEND:
6245 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
6246 C->isTargetOpcode(), C->isOpaque());
6247 case ISD::ANY_EXTEND:
6248 // Some targets like RISCV prefer to sign extend some types.
6249 if (TLI->isSExtCheaperThanZExt(N1.getValueType(), VT))
6250 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
6251 C->isTargetOpcode(), C->isOpaque());
6252 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
6253 C->isTargetOpcode(), C->isOpaque());
6254 case ISD::ABS:
6255 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
6256 C->isOpaque());
6257 case ISD::BITREVERSE:
6258 return getConstant(Val.reverseBits(), DL, VT, C->isTargetOpcode(),
6259 C->isOpaque());
6260 case ISD::BSWAP:
6261 return getConstant(Val.byteSwap(), DL, VT, C->isTargetOpcode(),
6262 C->isOpaque());
6263 case ISD::CTPOP:
6264 return getConstant(Val.popcount(), DL, VT, C->isTargetOpcode(),
6265 C->isOpaque());
6266 case ISD::CTLZ:
6268 return getConstant(Val.countl_zero(), DL, VT, C->isTargetOpcode(),
6269 C->isOpaque());
6270 case ISD::CTTZ:
6272 return getConstant(Val.countr_zero(), DL, VT, C->isTargetOpcode(),
6273 C->isOpaque());
6274 case ISD::UINT_TO_FP:
6275 case ISD::SINT_TO_FP: {
6278 (void)apf.convertFromAPInt(Val, Opcode == ISD::SINT_TO_FP,
6280 return getConstantFP(apf, DL, VT);
6281 }
6282 case ISD::FP16_TO_FP:
6283 case ISD::BF16_TO_FP: {
6284 bool Ignored;
6285 APFloat FPV(Opcode == ISD::FP16_TO_FP ? APFloat::IEEEhalf()
6286 : APFloat::BFloat(),
6287 (Val.getBitWidth() == 16) ? Val : Val.trunc(16));
6288
6289 // This can return overflow, underflow, or inexact; we don't care.
6290 // FIXME need to be more flexible about rounding mode.
6291 (void)FPV.convert(EVTToAPFloatSemantics(VT),
6293 return getConstantFP(FPV, DL, VT);
6294 }
6295 case ISD::STEP_VECTOR:
6296 if (SDValue V = FoldSTEP_VECTOR(DL, VT, N1, *this))
6297 return V;
6298 break;
6299 case ISD::BITCAST:
6300 if (VT == MVT::f16 && C->getValueType(0) == MVT::i16)
6301 return getConstantFP(APFloat(APFloat::IEEEhalf(), Val), DL, VT);
6302 if (VT == MVT::f32 && C->getValueType(0) == MVT::i32)
6303 return getConstantFP(APFloat(APFloat::IEEEsingle(), Val), DL, VT);
6304 if (VT == MVT::f64 && C->getValueType(0) == MVT::i64)
6305 return getConstantFP(APFloat(APFloat::IEEEdouble(), Val), DL, VT);
6306 if (VT == MVT::f128 && C->getValueType(0) == MVT::i128)
6307 return getConstantFP(APFloat(APFloat::IEEEquad(), Val), DL, VT);
6308 break;
6309 }
6310 }
6311
6312 // Constant fold unary operations with a floating point constant operand.
6313 if (auto *C = dyn_cast<ConstantFPSDNode>(N1)) {
6314 APFloat V = C->getValueAPF(); // make copy
6315 switch (Opcode) {
6316 case ISD::FNEG:
6317 V.changeSign();
6318 return getConstantFP(V, DL, VT);
6319 case ISD::FABS:
6320 V.clearSign();
6321 return getConstantFP(V, DL, VT);
6322 case ISD::FCEIL: {
6323 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardPositive);
6324 if (fs == APFloat::opOK || fs == APFloat::opInexact)
6325 return getConstantFP(V, DL, VT);
6326 return SDValue();
6327 }
6328 case ISD::FTRUNC: {
6329 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardZero);
6330 if (fs == APFloat::opOK || fs == APFloat::opInexact)
6331 return getConstantFP(V, DL, VT);
6332 return SDValue();
6333 }
6334 case ISD::FFLOOR: {
6335 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardNegative);
6336 if (fs == APFloat::opOK || fs == APFloat::opInexact)
6337 return getConstantFP(V, DL, VT);
6338 return SDValue();
6339 }
6340 case ISD::FP_EXTEND: {
6341 bool ignored;
6342 // This can return overflow, underflow, or inexact; we don't care.
6343 // FIXME need to be more flexible about rounding mode.
6345 &ignored);
6346 return getConstantFP(V, DL, VT);
6347 }
6348 case ISD::FP_TO_SINT:
6349 case ISD::FP_TO_UINT: {
6350 bool ignored;
6351 APSInt IntVal(VT.getSizeInBits(), Opcode == ISD::FP_TO_UINT);
6352 // FIXME need to be more flexible about rounding mode.
6354 V.convertToInteger(IntVal, APFloat::rmTowardZero, &ignored);
6355 if (s == APFloat::opInvalidOp) // inexact is OK, in fact usual
6356 break;
6357 return getConstant(IntVal, DL, VT);
6358 }
6359 case ISD::FP_TO_FP16:
6360 case ISD::FP_TO_BF16: {
6361 bool Ignored;
6362 // This can return overflow, underflow, or inexact; we don't care.
6363 // FIXME need to be more flexible about rounding mode.
6364 (void)V.convert(Opcode == ISD::FP_TO_FP16 ? APFloat::IEEEhalf()
6365 : APFloat::BFloat(),
6367 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
6368 }
6369 case ISD::BITCAST:
6370 if (VT == MVT::i16 && C->getValueType(0) == MVT::f16)
6371 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
6372 VT);
6373 if (VT == MVT::i16 && C->getValueType(0) == MVT::bf16)
6374 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
6375 VT);
6376 if (VT == MVT::i32 && C->getValueType(0) == MVT::f32)
6377 return getConstant((uint32_t)V.bitcastToAPInt().getZExtValue(), DL,
6378 VT);
6379 if (VT == MVT::i64 && C->getValueType(0) == MVT::f64)
6380 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
6381 break;
6382 }
6383 }
6384
6385 // Early-out if we failed to constant fold a bitcast.
6386 if (Opcode == ISD::BITCAST)
6387 return SDValue();
6388 }
6389
6390 // Handle binops special cases.
6391 if (NumOps == 2) {
6392 if (SDValue CFP = foldConstantFPMath(Opcode, DL, VT, Ops))
6393 return CFP;
6394
6395 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
6396 if (auto *C2 = dyn_cast<ConstantSDNode>(Ops[1])) {
6397 if (C1->isOpaque() || C2->isOpaque())
6398 return SDValue();
6399
6400 std::optional<APInt> FoldAttempt =
6401 FoldValue(Opcode, C1->getAPIntValue(), C2->getAPIntValue());
6402 if (!FoldAttempt)
6403 return SDValue();
6404
6405 SDValue Folded = getConstant(*FoldAttempt, DL, VT);
6406 assert((!Folded || !VT.isVector()) &&
6407 "Can't fold vectors ops with scalar operands");
6408 return Folded;
6409 }
6410 }
6411
6412 // fold (add Sym, c) -> Sym+c
6413 if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(Ops[0]))
6414 return FoldSymbolOffset(Opcode, VT, GA, Ops[1].getNode());
6415 if (TLI->isCommutativeBinOp(Opcode))
6416 if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(Ops[1]))
6417 return FoldSymbolOffset(Opcode, VT, GA, Ops[0].getNode());
6418 }
6419
6420 // This is for vector folding only from here on.
6421 if (!VT.isVector())
6422 return SDValue();
6423
6424 ElementCount NumElts = VT.getVectorElementCount();
6425
6426 // See if we can fold through bitcasted integer ops.
6427 if (NumOps == 2 && VT.isFixedLengthVector() && VT.isInteger() &&
6428 Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
6429 Ops[0].getOpcode() == ISD::BITCAST &&
6430 Ops[1].getOpcode() == ISD::BITCAST) {
6431 SDValue N1 = peekThroughBitcasts(Ops[0]);
6432 SDValue N2 = peekThroughBitcasts(Ops[1]);
6433 auto *BV1 = dyn_cast<BuildVectorSDNode>(N1);
6434 auto *BV2 = dyn_cast<BuildVectorSDNode>(N2);
6435 EVT BVVT = N1.getValueType();
6436 if (BV1 && BV2 && BVVT.isInteger() && BVVT == N2.getValueType()) {
6437 bool IsLE = getDataLayout().isLittleEndian();
6438 unsigned EltBits = VT.getScalarSizeInBits();
6439 SmallVector<APInt> RawBits1, RawBits2;
6440 BitVector UndefElts1, UndefElts2;
6441 if (BV1->getConstantRawBits(IsLE, EltBits, RawBits1, UndefElts1) &&
6442 BV2->getConstantRawBits(IsLE, EltBits, RawBits2, UndefElts2)) {
6443 SmallVector<APInt> RawBits;
6444 for (unsigned I = 0, E = NumElts.getFixedValue(); I != E; ++I) {
6445 std::optional<APInt> Fold = FoldValueWithUndef(
6446 Opcode, RawBits1[I], UndefElts1[I], RawBits2[I], UndefElts2[I]);
6447 if (!Fold)
6448 break;
6449 RawBits.push_back(*Fold);
6450 }
6451 if (RawBits.size() == NumElts.getFixedValue()) {
6452 // We have constant folded, but we need to cast this again back to
6453 // the original (possibly legalized) type.
6454 SmallVector<APInt> DstBits;
6455 BitVector DstUndefs;
6457 DstBits, RawBits, DstUndefs,
6458 BitVector(RawBits.size(), false));
6459 EVT BVEltVT = BV1->getOperand(0).getValueType();
6460 unsigned BVEltBits = BVEltVT.getSizeInBits();
6461 SmallVector<SDValue> Ops(DstBits.size(), getUNDEF(BVEltVT));
6462 for (unsigned I = 0, E = DstBits.size(); I != E; ++I) {
6463 if (DstUndefs[I])
6464 continue;
6465 Ops[I] = getConstant(DstBits[I].sext(BVEltBits), DL, BVEltVT);
6466 }
6467 return getBitcast(VT, getBuildVector(BVVT, DL, Ops));
6468 }
6469 }
6470 }
6471 }
6472
6473 // Fold (mul step_vector(C0), C1) to (step_vector(C0 * C1)).
6474 // (shl step_vector(C0), C1) -> (step_vector(C0 << C1))
6475 if ((Opcode == ISD::MUL || Opcode == ISD::SHL) &&
6476 Ops[0].getOpcode() == ISD::STEP_VECTOR) {
6477 APInt RHSVal;
6478 if (ISD::isConstantSplatVector(Ops[1].getNode(), RHSVal)) {
6479 APInt NewStep = Opcode == ISD::MUL
6480 ? Ops[0].getConstantOperandAPInt(0) * RHSVal
6481 : Ops[0].getConstantOperandAPInt(0) << RHSVal;
6482 return getStepVector(DL, VT, NewStep);
6483 }
6484 }
6485
6486 auto IsScalarOrSameVectorSize = [NumElts](const SDValue &Op) {
6487 return !Op.getValueType().isVector() ||
6488 Op.getValueType().getVectorElementCount() == NumElts;
6489 };
6490
6491 auto IsBuildVectorSplatVectorOrUndef = [](const SDValue &Op) {
6492 return Op.isUndef() || Op.getOpcode() == ISD::CONDCODE ||
6493 Op.getOpcode() == ISD::BUILD_VECTOR ||
6494 Op.getOpcode() == ISD::SPLAT_VECTOR;
6495 };
6496
6497 // All operands must be vector types with the same number of elements as
6498 // the result type and must be either UNDEF or a build/splat vector
6499 // or UNDEF scalars.
6500 if (!llvm::all_of(Ops, IsBuildVectorSplatVectorOrUndef) ||
6501 !llvm::all_of(Ops, IsScalarOrSameVectorSize))
6502 return SDValue();
6503
6504 // If we are comparing vectors, then the result needs to be a i1 boolean that
6505 // is then extended back to the legal result type depending on how booleans
6506 // are represented.
6507 EVT SVT = (Opcode == ISD::SETCC ? MVT::i1 : VT.getScalarType());
6508 ISD::NodeType ExtendCode =
6509 (Opcode == ISD::SETCC && SVT != VT.getScalarType())
6512
6513 // Find legal integer scalar type for constant promotion and
6514 // ensure that its scalar size is at least as large as source.
6515 EVT LegalSVT = VT.getScalarType();
6516 if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
6517 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
6518 if (LegalSVT.bitsLT(VT.getScalarType()))
6519 return SDValue();
6520 }
6521
6522 // For scalable vector types we know we're dealing with SPLAT_VECTORs. We
6523 // only have one operand to check. For fixed-length vector types we may have
6524 // a combination of BUILD_VECTOR and SPLAT_VECTOR.
6525 unsigned NumVectorElts = NumElts.isScalable() ? 1 : NumElts.getFixedValue();
6526
6527 // Constant fold each scalar lane separately.
6528 SmallVector<SDValue, 4> ScalarResults;
6529 for (unsigned I = 0; I != NumVectorElts; I++) {
6530 SmallVector<SDValue, 4> ScalarOps;
6531 for (SDValue Op : Ops) {
6532 EVT InSVT = Op.getValueType().getScalarType();
6533 if (Op.getOpcode() != ISD::BUILD_VECTOR &&
6534 Op.getOpcode() != ISD::SPLAT_VECTOR) {
6535 if (Op.isUndef())
6536 ScalarOps.push_back(getUNDEF(InSVT));
6537 else
6538 ScalarOps.push_back(Op);
6539 continue;
6540 }
6541
6542 SDValue ScalarOp =
6543 Op.getOperand(Op.getOpcode() == ISD::SPLAT_VECTOR ? 0 : I);
6544 EVT ScalarVT = ScalarOp.getValueType();
6545
6546 // Build vector (integer) scalar operands may need implicit
6547 // truncation - do this before constant folding.
6548 if (ScalarVT.isInteger() && ScalarVT.bitsGT(InSVT)) {
6549 // Don't create illegally-typed nodes unless they're constants or undef
6550 // - if we fail to constant fold we can't guarantee the (dead) nodes
6551 // we're creating will be cleaned up before being visited for
6552 // legalization.
6553 if (NewNodesMustHaveLegalTypes && !ScalarOp.isUndef() &&
6554 !isa<ConstantSDNode>(ScalarOp) &&
6555 TLI->getTypeAction(*getContext(), InSVT) !=
6557 return SDValue();
6558 ScalarOp = getNode(ISD::TRUNCATE, DL, InSVT, ScalarOp);
6559 }
6560
6561 ScalarOps.push_back(ScalarOp);
6562 }
6563
6564 // Constant fold the scalar operands.
6565 SDValue ScalarResult = getNode(Opcode, DL, SVT, ScalarOps);
6566
6567 // Legalize the (integer) scalar constant if necessary.
6568 if (LegalSVT != SVT)
6569 ScalarResult = getNode(ExtendCode, DL, LegalSVT, ScalarResult);
6570
6571 // Scalar folding only succeeded if the result is a constant or UNDEF.
6572 if (!ScalarResult.isUndef() && ScalarResult.getOpcode() != ISD::Constant &&
6573 ScalarResult.getOpcode() != ISD::ConstantFP)
6574 return SDValue();
6575 ScalarResults.push_back(ScalarResult);
6576 }
6577
6578 SDValue V = NumElts.isScalable() ? getSplatVector(VT, DL, ScalarResults[0])
6579 : getBuildVector(VT, DL, ScalarResults);
6580 NewSDValueDbgMsg(V, "New node fold constant vector: ", this);
6581 return V;
6582}
6583
6585 EVT VT, ArrayRef<SDValue> Ops) {
6586 // TODO: Add support for unary/ternary fp opcodes.
6587 if (Ops.size() != 2)
6588 return SDValue();
6589
6590 // TODO: We don't do any constant folding for strict FP opcodes here, but we
6591 // should. That will require dealing with a potentially non-default
6592 // rounding mode, checking the "opStatus" return value from the APFloat
6593 // math calculations, and possibly other variations.
6594 SDValue N1 = Ops[0];
6595 SDValue N2 = Ops[1];
6596 ConstantFPSDNode *N1CFP = isConstOrConstSplatFP(N1, /*AllowUndefs*/ false);
6597 ConstantFPSDNode *N2CFP = isConstOrConstSplatFP(N2, /*AllowUndefs*/ false);
6598 if (N1CFP && N2CFP) {
6599 APFloat C1 = N1CFP->getValueAPF(); // make copy
6600 const APFloat &C2 = N2CFP->getValueAPF();
6601 switch (Opcode) {
6602 case ISD::FADD:
6604 return getConstantFP(C1, DL, VT);
6605 case ISD::FSUB:
6607 return getConstantFP(C1, DL, VT);
6608 case ISD::FMUL:
6610 return getConstantFP(C1, DL, VT);
6611 case ISD::FDIV:
6613 return getConstantFP(C1, DL, VT);
6614 case ISD::FREM:
6615 C1.mod(C2);
6616 return getConstantFP(C1, DL, VT);
6617 case ISD::FCOPYSIGN:
6618 C1.copySign(C2);
6619 return getConstantFP(C1, DL, VT);
6620 case ISD::FMINNUM:
6621 return getConstantFP(minnum(C1, C2), DL, VT);
6622 case ISD::FMAXNUM:
6623 return getConstantFP(maxnum(C1, C2), DL, VT);
6624 case ISD::FMINIMUM:
6625 return getConstantFP(minimum(C1, C2), DL, VT);
6626 case ISD::FMAXIMUM:
6627 return getConstantFP(maximum(C1, C2), DL, VT);
6628 default: break;
6629 }
6630 }
6631 if (N1CFP && Opcode == ISD::FP_ROUND) {
6632 APFloat C1 = N1CFP->getValueAPF(); // make copy
6633 bool Unused;
6634 // This can return overflow, underflow, or inexact; we don't care.
6635 // FIXME need to be more flexible about rounding mode.
6637 &Unused);
6638 return getConstantFP(C1, DL, VT);
6639 }
6640
6641 switch (Opcode) {
6642 case ISD::FSUB:
6643 // -0.0 - undef --> undef (consistent with "fneg undef")
6644 if (ConstantFPSDNode *N1C = isConstOrConstSplatFP(N1, /*AllowUndefs*/ true))
6645 if (N1C && N1C->getValueAPF().isNegZero() && N2.isUndef())
6646 return getUNDEF(VT);
6647 [[fallthrough]];
6648
6649 case ISD::FADD:
6650 case ISD::FMUL:
6651 case ISD::FDIV:
6652 case ISD::FREM:
6653 // If both operands are undef, the result is undef. If 1 operand is undef,
6654 // the result is NaN. This should match the behavior of the IR optimizer.
6655 if (N1.isUndef() && N2.isUndef())
6656 return getUNDEF(VT);
6657 if (N1.isUndef() || N2.isUndef())
6659 }
6660 return SDValue();
6661}
6662
6664 assert(Val.getValueType().isInteger() && "Invalid AssertAlign!");
6665
6666 // There's no need to assert on a byte-aligned pointer. All pointers are at
6667 // least byte aligned.
6668 if (A == Align(1))
6669 return Val;
6670
6671 SDVTList VTs = getVTList(Val.getValueType());
6673 AddNodeIDNode(ID, ISD::AssertAlign, VTs, {Val});
6674 ID.AddInteger(A.value());
6675
6676 void *IP = nullptr;
6677 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
6678 return SDValue(E, 0);
6679
6680 auto *N =
6681 newSDNode<AssertAlignSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, A);
6682 createOperands(N, {Val});
6683
6684 CSEMap.InsertNode(N, IP);
6685 InsertNode(N);
6686
6687 SDValue V(N, 0);
6688 NewSDValueDbgMsg(V, "Creating new node: ", this);
6689 return V;
6690}
6691
6692SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
6693 SDValue N1, SDValue N2) {
6694 SDNodeFlags Flags;
6695 if (Inserter)
6696 Flags = Inserter->getFlags();
6697 return getNode(Opcode, DL, VT, N1, N2, Flags);
6698}
6699
6701 SDValue &N2) const {
6702 if (!TLI->isCommutativeBinOp(Opcode))
6703 return;
6704
6705 // Canonicalize:
6706 // binop(const, nonconst) -> binop(nonconst, const)
6711 if ((N1C && !N2C) || (N1CFP && !N2CFP))
6712 std::swap(N1, N2);
6713
6714 // Canonicalize:
6715 // binop(splat(x), step_vector) -> binop(step_vector, splat(x))
6716 else if (N1.getOpcode() == ISD::SPLAT_VECTOR &&
6718 std::swap(N1, N2);
6719}
6720
6721SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
6722 SDValue N1, SDValue N2, const SDNodeFlags Flags) {
6724 N2.getOpcode() != ISD::DELETED_NODE &&
6725 "Operand is DELETED_NODE!");
6726
6727 canonicalizeCommutativeBinop(Opcode, N1, N2);
6728
6729 auto *N1C = dyn_cast<ConstantSDNode>(N1);
6730 auto *N2C = dyn_cast<ConstantSDNode>(N2);
6731
6732 // Don't allow undefs in vector splats - we might be returning N2 when folding
6733 // to zero etc.
6734 ConstantSDNode *N2CV =
6735 isConstOrConstSplat(N2, /*AllowUndefs*/ false, /*AllowTruncation*/ true);
6736
6737 switch (Opcode) {
6738 default: break;
6739 case ISD::TokenFactor:
6740 assert(VT == MVT::Other && N1.getValueType() == MVT::Other &&
6741 N2.getValueType() == MVT::Other && "Invalid token factor!");
6742 // Fold trivial token factors.
6743 if (N1.getOpcode() == ISD::EntryToken) return N2;
6744 if (N2.getOpcode() == ISD::EntryToken) return N1;
6745 if (N1 == N2) return N1;
6746 break;
6747 case ISD::BUILD_VECTOR: {
6748 // Attempt to simplify BUILD_VECTOR.
6749 SDValue Ops[] = {N1, N2};
6750 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
6751 return V;
6752 break;
6753 }
6754 case ISD::CONCAT_VECTORS: {
6755 SDValue Ops[] = {N1, N2};
6756 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
6757 return V;
6758 break;
6759 }
6760 case ISD::AND:
6761 assert(VT.isInteger() && "This operator does not apply to FP types!");
6762 assert(N1.getValueType() == N2.getValueType() &&
6763 N1.getValueType() == VT && "Binary operator types must match!");
6764 // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's
6765 // worth handling here.
6766 if (N2CV && N2CV->isZero())
6767 return N2;
6768 if (N2CV && N2CV->isAllOnes()) // X & -1 -> X
6769 return N1;
6770 break;
6771 case ISD::OR:
6772 case ISD::XOR:
6773 case ISD::ADD:
6774 case ISD::SUB:
6775 assert(VT.isInteger() && "This operator does not apply to FP types!");
6776 assert(N1.getValueType() == N2.getValueType() &&
6777 N1.getValueType() == VT && "Binary operator types must match!");
6778 // (X ^|+- 0) -> X. This commonly occurs when legalizing i64 values, so
6779 // it's worth handling here.
6780 if (N2CV && N2CV->isZero())
6781 return N1;
6782 if ((Opcode == ISD::ADD || Opcode == ISD::SUB) && VT.isVector() &&
6783 VT.getVectorElementType() == MVT::i1)
6784 return getNode(ISD::XOR, DL, VT, N1, N2);
6785 break;
6786 case ISD::MUL:
6787 assert(VT.isInteger() && "This operator does not apply to FP types!");
6788 assert(N1.getValueType() == N2.getValueType() &&
6789 N1.getValueType() == VT && "Binary operator types must match!");
6790 if (VT.isVector() && VT.getVectorElementType() == MVT::i1)
6791 return getNode(ISD::AND, DL, VT, N1, N2);
6792 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
6793 const APInt &MulImm = N1->getConstantOperandAPInt(0);
6794 const APInt &N2CImm = N2C->getAPIntValue();
6795 return getVScale(DL, VT, MulImm * N2CImm);
6796 }
6797 break;
6798 case ISD::UDIV:
6799 case ISD::UREM:
6800 case ISD::MULHU:
6801 case ISD::MULHS:
6802 case ISD::SDIV:
6803 case ISD::SREM:
6804 case ISD::SADDSAT:
6805 case ISD::SSUBSAT:
6806 case ISD::UADDSAT:
6807 case ISD::USUBSAT:
6808 assert(VT.isInteger() && "This operator does not apply to FP types!");
6809 assert(N1.getValueType() == N2.getValueType() &&
6810 N1.getValueType() == VT && "Binary operator types must match!");
6811 if (VT.isVector() && VT.getVectorElementType() == MVT::i1) {
6812 // fold (add_sat x, y) -> (or x, y) for bool types.
6813 if (Opcode == ISD::SADDSAT || Opcode == ISD::UADDSAT)
6814 return getNode(ISD::OR, DL, VT, N1, N2);
6815 // fold (sub_sat x, y) -> (and x, ~y) for bool types.
6816 if (Opcode == ISD::SSUBSAT || Opcode == ISD::USUBSAT)
6817 return getNode(ISD::AND, DL, VT, N1, getNOT(DL, N2, VT));
6818 }
6819 break;
6820 case ISD::ABDS:
6821 case ISD::ABDU:
6822 assert(VT.isInteger() && "This operator does not apply to FP types!");
6823 assert(N1.getValueType() == N2.getValueType() &&
6824 N1.getValueType() == VT && "Binary operator types must match!");
6825 break;
6826 case ISD::SMIN:
6827 case ISD::UMAX:
6828 assert(VT.isInteger() && "This operator does not apply to FP types!");
6829 assert(N1.getValueType() == N2.getValueType() &&
6830 N1.getValueType() == VT && "Binary operator types must match!");
6831 if (VT.isVector() && VT.getVectorElementType() == MVT::i1)
6832 return getNode(ISD::OR, DL, VT, N1, N2);
6833 break;
6834 case ISD::SMAX:
6835 case ISD::UMIN:
6836 assert(VT.isInteger() && "This operator does not apply to FP types!");
6837 assert(N1.getValueType() == N2.getValueType() &&
6838 N1.getValueType() == VT && "Binary operator types must match!");
6839 if (VT.isVector() && VT.getVectorElementType() == MVT::i1)
6840 return getNode(ISD::AND, DL, VT, N1, N2);
6841 break;
6842 case ISD::FADD:
6843 case ISD::FSUB:
6844 case ISD::FMUL:
6845 case ISD::FDIV:
6846 case ISD::FREM:
6847 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
6848 assert(N1.getValueType() == N2.getValueType() &&
6849 N1.getValueType() == VT && "Binary operator types must match!");
6850 if (SDValue V = simplifyFPBinop(Opcode, N1, N2, Flags))
6851 return V;
6852 break;
6853 case ISD::FCOPYSIGN: // N1 and result must match. N1/N2 need not match.
6854 assert(N1.getValueType() == VT &&
6857 "Invalid FCOPYSIGN!");
6858 break;
6859 case ISD::SHL:
6860 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
6861 const APInt &MulImm = N1->getConstantOperandAPInt(0);
6862 const APInt &ShiftImm = N2C->getAPIntValue();
6863 return getVScale(DL, VT, MulImm << ShiftImm);
6864 }
6865 [[fallthrough]];
6866 case ISD::SRA:
6867 case ISD::SRL:
6868 if (SDValue V = simplifyShift(N1, N2))
6869 return V;
6870 [[fallthrough]];
6871 case ISD::ROTL:
6872 case ISD::ROTR:
6873 assert(VT == N1.getValueType() &&
6874 "Shift operators return type must be the same as their first arg");
6875 assert(VT.isInteger() && N2.getValueType().isInteger() &&
6876 "Shifts only work on integers");
6877 assert((!VT.isVector() || VT == N2.getValueType()) &&
6878 "Vector shift amounts must be in the same as their first arg");
6879 // Verify that the shift amount VT is big enough to hold valid shift
6880 // amounts. This catches things like trying to shift an i1024 value by an
6881 // i8, which is easy to fall into in generic code that uses
6882 // TLI.getShiftAmount().
6885 "Invalid use of small shift amount with oversized value!");
6886
6887 // Always fold shifts of i1 values so the code generator doesn't need to
6888 // handle them. Since we know the size of the shift has to be less than the
6889 // size of the value, the shift/rotate count is guaranteed to be zero.
6890 if (VT == MVT::i1)
6891 return N1;
6892 if (N2CV && N2CV->isZero())
6893 return N1;
6894 break;
6895 case ISD::FP_ROUND:
6896 assert(VT.isFloatingPoint() &&
6898 VT.bitsLE(N1.getValueType()) &&
6899 N2C && (N2C->getZExtValue() == 0 || N2C->getZExtValue() == 1) &&
6900 "Invalid FP_ROUND!");
6901 if (N1.getValueType() == VT) return N1; // noop conversion.
6902 break;
6903 case ISD::AssertSext:
6904 case ISD::AssertZext: {
6905 EVT EVT = cast<VTSDNode>(N2)->getVT();
6906 assert(VT == N1.getValueType() && "Not an inreg extend!");
6907 assert(VT.isInteger() && EVT.isInteger() &&
6908 "Cannot *_EXTEND_INREG FP types");
6909 assert(!EVT.isVector() &&
6910 "AssertSExt/AssertZExt type should be the vector element type "
6911 "rather than the vector type!");
6912 assert(EVT.bitsLE(VT.getScalarType()) && "Not extending!");
6913 if (VT.getScalarType() == EVT) return N1; // noop assertion.
6914 break;
6915 }
6917 EVT EVT = cast<VTSDNode>(N2)->getVT();
6918 assert(VT == N1.getValueType() && "Not an inreg extend!");
6919 assert(VT.isInteger() && EVT.isInteger() &&
6920 "Cannot *_EXTEND_INREG FP types");
6921 assert(EVT.isVector() == VT.isVector() &&
6922 "SIGN_EXTEND_INREG type should be vector iff the operand "
6923 "type is vector!");
6924 assert((!EVT.isVector() ||
6926 "Vector element counts must match in SIGN_EXTEND_INREG");
6927 assert(EVT.bitsLE(VT) && "Not extending!");
6928 if (EVT == VT) return N1; // Not actually extending
6929
6930 auto SignExtendInReg = [&](APInt Val, llvm::EVT ConstantVT) {
6931 unsigned FromBits = EVT.getScalarSizeInBits();
6932 Val <<= Val.getBitWidth() - FromBits;
6933 Val.ashrInPlace(Val.getBitWidth() - FromBits);
6934 return getConstant(Val, DL, ConstantVT);
6935 };
6936
6937 if (N1C) {
6938 const APInt &Val = N1C->getAPIntValue();
6939 return SignExtendInReg(Val, VT);
6940 }
6941
6944 llvm::EVT OpVT = N1.getOperand(0).getValueType();
6945 for (int i = 0, e = VT.getVectorNumElements(); i != e; ++i) {
6946 SDValue Op = N1.getOperand(i);
6947 if (Op.isUndef()) {
6948 Ops.push_back(getUNDEF(OpVT));
6949 continue;
6950 }
6951 ConstantSDNode *C = cast<ConstantSDNode>(Op);
6952 APInt Val = C->getAPIntValue();
6953 Ops.push_back(SignExtendInReg(Val, OpVT));
6954 }
6955 return getBuildVector(VT, DL, Ops);
6956 }
6957
6958 if (N1.getOpcode() == ISD::SPLAT_VECTOR &&
6959 isa<ConstantSDNode>(N1.getOperand(0)))
6960 return getNode(
6961 ISD::SPLAT_VECTOR, DL, VT,
6962 SignExtendInReg(N1.getConstantOperandAPInt(0),
6963 N1.getOperand(0).getValueType()));
6964 break;
6965 }
6967 case ISD::FP_TO_UINT_SAT: {
6968 assert(VT.isInteger() && cast<VTSDNode>(N2)->getVT().isInteger() &&
6969 N1.getValueType().isFloatingPoint() && "Invalid FP_TO_*INT_SAT");
6970 assert(N1.getValueType().isVector() == VT.isVector() &&
6971 "FP_TO_*INT_SAT type should be vector iff the operand type is "
6972 "vector!");
6973 assert((!VT.isVector() || VT.getVectorElementCount() ==
6975 "Vector element counts must match in FP_TO_*INT_SAT");
6976 assert(!cast<VTSDNode>(N2)->getVT().isVector() &&
6977 "Type to saturate to must be a scalar.");
6978 assert(cast<VTSDNode>(N2)->getVT().bitsLE(VT.getScalarType()) &&
6979 "Not extending!");
6980 break;
6981 }
6984 "The result of EXTRACT_VECTOR_ELT must be at least as wide as the \
6985 element type of the vector.");
6986
6987 // Extract from an undefined value or using an undefined index is undefined.
6988 if (N1.isUndef() || N2.isUndef())
6989 return getUNDEF(VT);
6990
6991 // EXTRACT_VECTOR_ELT of out-of-bounds element is an UNDEF for fixed length
6992 // vectors. For scalable vectors we will provide appropriate support for
6993 // dealing with arbitrary indices.
6994 if (N2C && N1.getValueType().isFixedLengthVector() &&
6995 N2C->getAPIntValue().uge(N1.getValueType().getVectorNumElements()))
6996 return getUNDEF(VT);
6997
6998 // EXTRACT_VECTOR_ELT of CONCAT_VECTORS is often formed while lowering is
6999 // expanding copies of large vectors from registers. This only works for
7000 // fixed length vectors, since we need to know the exact number of
7001 // elements.
7002 if (N2C && N1.getOpcode() == ISD::CONCAT_VECTORS &&
7004 unsigned Factor =
7007 N1.getOperand(N2C->getZExtValue() / Factor),
7008 getVectorIdxConstant(N2C->getZExtValue() % Factor, DL));
7009 }
7010
7011 // EXTRACT_VECTOR_ELT of BUILD_VECTOR or SPLAT_VECTOR is often formed while
7012 // lowering is expanding large vector constants.
7013 if (N2C && (N1.getOpcode() == ISD::BUILD_VECTOR ||
7014 N1.getOpcode() == ISD::SPLAT_VECTOR)) {
7017 "BUILD_VECTOR used for scalable vectors");
7018 unsigned Index =
7019 N1.getOpcode() == ISD::BUILD_VECTOR ? N2C->getZExtValue() : 0;
7020 SDValue Elt = N1.getOperand(Index);
7021
7022 if (VT != Elt.getValueType())
7023 // If the vector element type is not legal, the BUILD_VECTOR operands
7024 // are promoted and implicitly truncated, and the result implicitly
7025 // extended. Make that explicit here.
7026 Elt = getAnyExtOrTrunc(Elt, DL, VT);
7027
7028 return Elt;
7029 }
7030
7031 // EXTRACT_VECTOR_ELT of INSERT_VECTOR_ELT is often formed when vector
7032 // operations are lowered to scalars.
7033 if (N1.getOpcode() == ISD::INSERT_VECTOR_ELT) {
7034 // If the indices are the same, return the inserted element else
7035 // if the indices are known different, extract the element from
7036 // the original vector.
7037 SDValue N1Op2 = N1.getOperand(2);
7038 ConstantSDNode *N1Op2C = dyn_cast<ConstantSDNode>(N1Op2);
7039
7040 if (N1Op2C && N2C) {
7041 if (N1Op2C->getZExtValue() == N2C->getZExtValue()) {
7042 if (VT == N1.getOperand(1).getValueType())
7043 return N1.getOperand(1);
7044 if (VT.isFloatingPoint()) {
7046 return getFPExtendOrRound(N1.getOperand(1), DL, VT);
7047 }
7048 return getSExtOrTrunc(N1.getOperand(1), DL, VT);
7049 }
7050 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0), N2);
7051 }
7052 }
7053
7054 // EXTRACT_VECTOR_ELT of v1iX EXTRACT_SUBVECTOR could be formed
7055 // when vector types are scalarized and v1iX is legal.
7056 // vextract (v1iX extract_subvector(vNiX, Idx)) -> vextract(vNiX,Idx).
7057 // Here we are completely ignoring the extract element index (N2),
7058 // which is fine for fixed width vectors, since any index other than 0
7059 // is undefined anyway. However, this cannot be ignored for scalable
7060 // vectors - in theory we could support this, but we don't want to do this
7061 // without a profitability check.
7062 if (N1.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
7064 N1.getValueType().getVectorNumElements() == 1) {
7065 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0),
7066 N1.getOperand(1));
7067 }
7068 break;
7070 assert(N2C && (unsigned)N2C->getZExtValue() < 2 && "Bad EXTRACT_ELEMENT!");
7071 assert(!N1.getValueType().isVector() && !VT.isVector() &&
7072 (N1.getValueType().isInteger() == VT.isInteger()) &&
7073 N1.getValueType() != VT &&
7074 "Wrong types for EXTRACT_ELEMENT!");
7075
7076 // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding
7077 // 64-bit integers into 32-bit parts. Instead of building the extract of
7078 // the BUILD_PAIR, only to have legalize rip it apart, just do it now.
7079 if (N1.getOpcode() == ISD::BUILD_PAIR)
7080 return N1.getOperand(N2C->getZExtValue());
7081
7082 // EXTRACT_ELEMENT of a constant int is also very common.
7083 if (N1C) {
7084 unsigned ElementSize = VT.getSizeInBits();
7085 unsigned Shift = ElementSize * N2C->getZExtValue();
7086 const APInt &Val = N1C->getAPIntValue();
7087 return getConstant(Val.extractBits(ElementSize, Shift), DL, VT);
7088 }
7089 break;
7091 EVT N1VT = N1.getValueType();
7092 assert(VT.isVector() && N1VT.isVector() &&
7093 "Extract subvector VTs must be vectors!");
7095 "Extract subvector VTs must have the same element type!");
7096 assert((VT.isFixedLengthVector() || N1VT.isScalableVector()) &&
7097 "Cannot extract a scalable vector from a fixed length vector!");
7098 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
7100 "Extract subvector must be from larger vector to smaller vector!");
7101 assert(N2C && "Extract subvector index must be a constant");
7102 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
7103 (VT.getVectorMinNumElements() + N2C->getZExtValue()) <=
7104 N1VT.getVectorMinNumElements()) &&
7105 "Extract subvector overflow!");
7106 assert(N2C->getAPIntValue().getBitWidth() ==
7107 TLI->getVectorIdxTy(getDataLayout()).getFixedSizeInBits() &&
7108 "Constant index for EXTRACT_SUBVECTOR has an invalid size");
7109
7110 // Trivial extraction.
7111 if (VT == N1VT)
7112 return N1;
7113
7114 // EXTRACT_SUBVECTOR of an UNDEF is an UNDEF.
7115 if (N1.isUndef())
7116 return getUNDEF(VT);
7117
7118 // EXTRACT_SUBVECTOR of CONCAT_VECTOR can be simplified if the pieces of
7119 // the concat have the same type as the extract.
7120 if (N1.getOpcode() == ISD::CONCAT_VECTORS &&
7121 VT == N1.getOperand(0).getValueType()) {
7122 unsigned Factor = VT.getVectorMinNumElements();
7123 return N1.getOperand(N2C->getZExtValue() / Factor);
7124 }
7125
7126 // EXTRACT_SUBVECTOR of INSERT_SUBVECTOR is often created
7127 // during shuffle legalization.
7128 if (N1.getOpcode() == ISD::INSERT_SUBVECTOR && N2 == N1.getOperand(2) &&
7129 VT == N1.getOperand(1).getValueType())
7130 return N1.getOperand(1);
7131 break;
7132 }
7133 }
7134
7135 // Perform trivial constant folding.
7136 if (SDValue SV = FoldConstantArithmetic(Opcode, DL, VT, {N1, N2}))
7137 return SV;
7138
7139 // Canonicalize an UNDEF to the RHS, even over a constant.
7140 if (N1.isUndef()) {
7141 if (TLI->isCommutativeBinOp(Opcode)) {
7142 std::swap(N1, N2);
7143 } else {
7144 switch (Opcode) {
7145 case ISD::SUB:
7146 return getUNDEF(VT); // fold op(undef, arg2) -> undef
7148 case ISD::UDIV:
7149 case ISD::SDIV:
7150 case ISD::UREM:
7151 case ISD::SREM:
7152 case ISD::SSUBSAT:
7153 case ISD::USUBSAT:
7154 return getConstant(0, DL, VT); // fold op(undef, arg2) -> 0
7155 }
7156 }
7157 }
7158
7159 // Fold a bunch of operators when the RHS is undef.
7160 if (N2.isUndef()) {
7161 switch (Opcode) {
7162 case ISD::XOR:
7163 if (N1.isUndef())
7164 // Handle undef ^ undef -> 0 special case. This is a common
7165 // idiom (misuse).
7166 return getConstant(0, DL, VT);
7167 [[fallthrough]];
7168 case ISD::ADD:
7169 case ISD::SUB:
7170 case ISD::UDIV:
7171 case ISD::SDIV:
7172 case ISD::UREM:
7173 case ISD::SREM:
7174 return getUNDEF(VT); // fold op(arg1, undef) -> undef
7175 case ISD::MUL:
7176 case ISD::AND:
7177 case ISD::SSUBSAT:
7178 case ISD::USUBSAT:
7179 return getConstant(0, DL, VT); // fold op(arg1, undef) -> 0
7180 case ISD::OR:
7181 case ISD::SADDSAT:
7182 case ISD::UADDSAT:
7183 return getAllOnesConstant(DL, VT);
7184 }
7185 }
7186
7187 // Memoize this node if possible.
7188 SDNode *N;
7189 SDVTList VTs = getVTList(VT);
7190 SDValue Ops[] = {N1, N2};
7191 if (VT != MVT::Glue) {
7193 AddNodeIDNode(ID, Opcode, VTs, Ops);
7194 void *IP = nullptr;
7195 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
7196 E->intersectFlagsWith(Flags);
7197 return SDValue(E, 0);
7198 }
7199
7200 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7201 N->setFlags(Flags);
7202 createOperands(N, Ops);
7203 CSEMap.InsertNode(N, IP);
7204 } else {
7205 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7206 createOperands(N, Ops);
7207 }
7208
7209 InsertNode(N);
7210 SDValue V = SDValue(N, 0);
7211 NewSDValueDbgMsg(V, "Creating new node: ", this);
7212 return V;
7213}
7214
7215SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7216 SDValue N1, SDValue N2, SDValue N3) {
7217 SDNodeFlags Flags;
7218 if (Inserter)
7219 Flags = Inserter->getFlags();
7220 return getNode(Opcode, DL, VT, N1, N2, N3, Flags);
7221}
7222
7223SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7224 SDValue N1, SDValue N2, SDValue N3,
7225 const SDNodeFlags Flags) {
7227 N2.getOpcode() != ISD::DELETED_NODE &&
7228 N3.getOpcode() != ISD::DELETED_NODE &&
7229 "Operand is DELETED_NODE!");
7230 // Perform various simplifications.
7231 switch (Opcode) {
7232 case ISD::FMA:
7233 case ISD::FMAD: {
7234 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
7235 assert(N1.getValueType() == VT && N2.getValueType() == VT &&
7236 N3.getValueType() == VT && "FMA types must match!");
7237 ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1);
7238 ConstantFPSDNode *N2CFP = dyn_cast<ConstantFPSDNode>(N2);
7239 ConstantFPSDNode *N3CFP = dyn_cast<ConstantFPSDNode>(N3);
7240 if (N1CFP && N2CFP && N3CFP) {
7241 APFloat V1 = N1CFP->getValueAPF();
7242 const APFloat &V2 = N2CFP->getValueAPF();
7243 const APFloat &V3 = N3CFP->getValueAPF();
7244 if (Opcode == ISD::FMAD) {
7247 } else
7249 return getConstantFP(V1, DL, VT);
7250 }
7251 break;
7252 }
7253 case ISD::BUILD_VECTOR: {
7254 // Attempt to simplify BUILD_VECTOR.
7255 SDValue Ops[] = {N1, N2, N3};
7256 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
7257 return V;
7258 break;
7259 }
7260 case ISD::CONCAT_VECTORS: {
7261 SDValue Ops[] = {N1, N2, N3};
7262 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
7263 return V;
7264 break;
7265 }
7266 case ISD::SETCC: {
7267 assert(VT.isInteger() && "SETCC result type must be an integer!");
7268 assert(N1.getValueType() == N2.getValueType() &&
7269 "SETCC operands must have the same type!");
7270 assert(VT.isVector() == N1.getValueType().isVector() &&
7271 "SETCC type should be vector iff the operand type is vector!");
7272 assert((!VT.isVector() || VT.getVectorElementCount() ==
7274 "SETCC vector element counts must match!");
7275 // Use FoldSetCC to simplify SETCC's.
7276 if (SDValue V = FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get(), DL))
7277 return V;
7278 // Vector constant folding.
7279 SDValue Ops[] = {N1, N2, N3};
7280 if (SDValue V = FoldConstantArithmetic(Opcode, DL, VT, Ops)) {
7281 NewSDValueDbgMsg(V, "New node vector constant folding: ", this);
7282 return V;
7283 }
7284 break;
7285 }
7286 case ISD::SELECT:
7287 case ISD::VSELECT:
7288 if (SDValue V = simplifySelect(N1, N2, N3))
7289 return V;
7290 break;
7292 llvm_unreachable("should use getVectorShuffle constructor!");
7293 case ISD::VECTOR_SPLICE: {
7294 if (cast<ConstantSDNode>(N3)->isZero())
7295 return N1;
7296 break;
7297 }
7299 ConstantSDNode *N3C = dyn_cast<ConstantSDNode>(N3);
7300 // INSERT_VECTOR_ELT into out-of-bounds element is an UNDEF, except
7301 // for scalable vectors where we will generate appropriate code to
7302 // deal with out-of-bounds cases correctly.
7303 if (N3C && N1.getValueType().isFixedLengthVector() &&
7305 return getUNDEF(VT);
7306
7307 // Undefined index can be assumed out-of-bounds, so that's UNDEF too.
7308 if (N3.isUndef())
7309 return getUNDEF(VT);
7310
7311 // If the inserted element is an UNDEF, just use the input vector.
7312 if (N2.isUndef())
7313 return N1;
7314
7315 break;
7316 }
7317 case ISD::INSERT_SUBVECTOR: {
7318 // Inserting undef into undef is still undef.
7319 if (N1.isUndef() && N2.isUndef())
7320 return getUNDEF(VT);
7321
7322 EVT N2VT = N2.getValueType();
7323 assert(VT == N1.getValueType() &&
7324 "Dest and insert subvector source types must match!");
7325 assert(VT.isVector() && N2VT.isVector() &&
7326 "Insert subvector VTs must be vectors!");
7328 "Insert subvector VTs must have the same element type!");
7329 assert((VT.isScalableVector() || N2VT.isFixedLengthVector()) &&
7330 "Cannot insert a scalable vector into a fixed length vector!");
7331 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
7333 "Insert subvector must be from smaller vector to larger vector!");
7334 assert(isa<ConstantSDNode>(N3) &&
7335 "Insert subvector index must be constant");
7336 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
7337 (N2VT.getVectorMinNumElements() + N3->getAsZExtVal()) <=
7339 "Insert subvector overflow!");
7341 TLI->getVectorIdxTy(getDataLayout()).getFixedSizeInBits() &&
7342 "Constant index for INSERT_SUBVECTOR has an invalid size");
7343
7344 // Trivial insertion.
7345 if (VT == N2VT)
7346 return N2;
7347
7348 // If this is an insert of an extracted vector into an undef vector, we
7349 // can just use the input to the extract.
7350 if (N1.isUndef() && N2.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
7351 N2.getOperand(1) == N3 && N2.getOperand(0).getValueType() == VT)
7352 return N2.getOperand(0);
7353 break;
7354 }
7355 case ISD::BITCAST:
7356 // Fold bit_convert nodes from a type to themselves.
7357 if (N1.getValueType() == VT)
7358 return N1;
7359 break;
7360 case ISD::VP_TRUNCATE:
7361 case ISD::VP_SIGN_EXTEND:
7362 case ISD::VP_ZERO_EXTEND:
7363 // Don't create noop casts.
7364 if (N1.getValueType() == VT)
7365 return N1;
7366 break;
7367 }
7368
7369 // Memoize node if it doesn't produce a glue result.
7370 SDNode *N;
7371 SDVTList VTs = getVTList(VT);
7372 SDValue Ops[] = {N1, N2, N3};
7373 if (VT != MVT::Glue) {
7375 AddNodeIDNode(ID, Opcode, VTs, Ops);
7376 void *IP = nullptr;
7377 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
7378 E->intersectFlagsWith(Flags);
7379 return SDValue(E, 0);
7380 }
7381
7382 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7383 N->setFlags(Flags);
7384 createOperands(N, Ops);
7385 CSEMap.InsertNode(N, IP);
7386 } else {
7387 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7388 createOperands(N, Ops);
7389 }
7390
7391 InsertNode(N);
7392 SDValue V = SDValue(N, 0);
7393 NewSDValueDbgMsg(V, "Creating new node: ", this);
7394 return V;
7395}
7396
7397SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7398 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
7399 SDValue Ops[] = { N1, N2, N3, N4 };
7400 return getNode(Opcode, DL, VT, Ops);
7401}
7402
7403SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7404 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
7405 SDValue N5) {
7406 SDValue Ops[] = { N1, N2, N3, N4, N5 };
7407 return getNode(Opcode, DL, VT, Ops);
7408}
7409
7410/// getStackArgumentTokenFactor - Compute a TokenFactor to force all
7411/// the incoming stack arguments to be loaded from the stack.
7413 SmallVector<SDValue, 8> ArgChains;
7414
7415 // Include the original chain at the beginning of the list. When this is
7416 // used by target LowerCall hooks, this helps legalize find the
7417 // CALLSEQ_BEGIN node.
7418 ArgChains.push_back(Chain);
7419
7420 // Add a chain value for each stack argument.
7421 for (SDNode *U : getEntryNode().getNode()->uses())
7422 if (LoadSDNode *L = dyn_cast<LoadSDNode>(U))
7423 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(L->getBasePtr()))
7424 if (FI->getIndex() < 0)
7425 ArgChains.push_back(SDValue(L, 1));
7426
7427 // Build a tokenfactor for all the chains.
7428 return getNode(ISD::TokenFactor, SDLoc(Chain), MVT::Other, ArgChains);
7429}
7430
7431/// getMemsetValue - Vectorized representation of the memset value
7432/// operand.
7434 const SDLoc &dl) {
7435 assert(!Value.isUndef());
7436
7437 unsigned NumBits = VT.getScalarSizeInBits();
7438 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Value)) {
7439 assert(C->getAPIntValue().getBitWidth() == 8);
7440 APInt Val = APInt::getSplat(NumBits, C->getAPIntValue());
7441 if (VT.isInteger()) {
7442 bool IsOpaque = VT.getSizeInBits() > 64 ||
7443 !DAG.getTargetLoweringInfo().isLegalStoreImmediate(C->getSExtValue());
7444 return DAG.getConstant(Val, dl, VT, false, IsOpaque);
7445 }
7446 return DAG.getConstantFP(APFloat(DAG.EVTToAPFloatSemantics(VT), Val), dl,
7447 VT);
7448 }
7449
7450 assert(Value.getValueType() == MVT::i8 && "memset with non-byte fill value?");
7451 EVT IntVT = VT.getScalarType();
7452 if (!IntVT.isInteger())
7453 IntVT = EVT::getIntegerVT(*DAG.getContext(), IntVT.getSizeInBits());
7454
7455 Value = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, Value);
7456 if (NumBits > 8) {
7457 // Use a multiplication with 0x010101... to extend the input to the
7458 // required length.
7459 APInt Magic = APInt::getSplat(NumBits, APInt(8, 0x01));
7460 Value = DAG.getNode(ISD::MUL, dl, IntVT, Value,
7461 DAG.getConstant(Magic, dl, IntVT));
7462 }
7463
7464 if (VT != Value.getValueType() && !VT.isInteger())
7465 Value = DAG.getBitcast(VT.getScalarType(), Value);
7466 if (VT != Value.getValueType())
7467 Value = DAG.getSplatBuildVector(VT, dl, Value);
7468
7469 return Value;
7470}
7471
7472/// getMemsetStringVal - Similar to getMemsetValue. Except this is only
7473/// used when a memcpy is turned into a memset when the source is a constant
7474/// string ptr.
7476 const TargetLowering &TLI,
7477 const ConstantDataArraySlice &Slice) {
7478 // Handle vector with all elements zero.
7479 if (Slice.Array == nullptr) {
7480 if (VT.isInteger())
7481 return DAG.getConstant(0, dl, VT);
7482 if (VT == MVT::f32 || VT == MVT::f64 || VT == MVT::f128)
7483 return DAG.getConstantFP(0.0, dl, VT);
7484 if (VT.isVector()) {
7485 unsigned NumElts = VT.getVectorNumElements();
7486 MVT EltVT = (VT.getVectorElementType() == MVT::f32) ? MVT::i32 : MVT::i64;
7487 return DAG.getNode(ISD::BITCAST, dl, VT,
7488 DAG.getConstant(0, dl,
7490 EltVT, NumElts)));
7491 }
7492 llvm_unreachable("Expected type!");
7493 }
7494
7495 assert(!VT.isVector() && "Can't handle vector type here!");
7496 unsigned NumVTBits = VT.getSizeInBits();
7497 unsigned NumVTBytes = NumVTBits / 8;
7498 unsigned NumBytes = std::min(NumVTBytes, unsigned(Slice.Length));
7499
7500 APInt Val(NumVTBits, 0);
7501 if (DAG.getDataLayout().isLittleEndian()) {
7502 for (unsigned i = 0; i != NumBytes; ++i)
7503 Val |= (uint64_t)(unsigned char)Slice[i] << i*8;
7504 } else {
7505 for (unsigned i = 0; i != NumBytes; ++i)
7506 Val |= (uint64_t)(unsigned char)Slice[i] << (NumVTBytes-i-1)*8;
7507 }
7508
7509 // If the "cost" of materializing the integer immediate is less than the cost
7510 // of a load, then it is cost effective to turn the load into the immediate.
7511 Type *Ty = VT.getTypeForEVT(*DAG.getContext());
7512 if (TLI.shouldConvertConstantLoadToIntImm(Val, Ty))
7513 return DAG.getConstant(Val, dl, VT);
7514 return SDValue();
7515}
7516
7518 const SDLoc &DL,
7519 const SDNodeFlags Flags) {
7520 EVT VT = Base.getValueType();
7521 SDValue Index;
7522
7523 if (Offset.isScalable())
7524 Index = getVScale(DL, Base.getValueType(),
7525 APInt(Base.getValueSizeInBits().getFixedValue(),
7526 Offset.getKnownMinValue()));
7527 else
7528 Index = getConstant(Offset.getFixedValue(), DL, VT);
7529
7530 return getMemBasePlusOffset(Base, Index, DL, Flags);
7531}
7532
7534 const SDLoc &DL,
7535 const SDNodeFlags Flags) {
7536 assert(Offset.getValueType().isInteger());
7537 EVT BasePtrVT = Ptr.getValueType();
7538 return getNode(ISD::ADD, DL, BasePtrVT, Ptr, Offset, Flags);
7539}
7540
7541/// Returns true if memcpy source is constant data.
7543 uint64_t SrcDelta = 0;
7544 GlobalAddressSDNode *G = nullptr;
7545 if (Src.getOpcode() == ISD::GlobalAddress)
7546 G = cast<GlobalAddressSDNode>(Src);
7547 else if (Src.getOpcode() == ISD::ADD &&
7548 Src.getOperand(0).getOpcode() == ISD::GlobalAddress &&
7549 Src.getOperand(1).getOpcode() == ISD::Constant) {
7550 G = cast<GlobalAddressSDNode>(Src.getOperand(0));
7551 SrcDelta = Src.getConstantOperandVal(1);
7552 }
7553 if (!G)
7554 return false;
7555
7556 return getConstantDataArrayInfo(G->getGlobal(), Slice, 8,
7557 SrcDelta + G->getOffset());
7558}
7559
7561 SelectionDAG &DAG) {
7562 // On Darwin, -Os means optimize for size without hurting performance, so
7563 // only really optimize for size when -Oz (MinSize) is used.
7565 return MF.getFunction().hasMinSize();
7566 return DAG.shouldOptForSize();
7567}
7568
7570 SmallVector<SDValue, 32> &OutChains, unsigned From,
7571 unsigned To, SmallVector<SDValue, 16> &OutLoadChains,
7572 SmallVector<SDValue, 16> &OutStoreChains) {
7573 assert(OutLoadChains.size() && "Missing loads in memcpy inlining");
7574 assert(OutStoreChains.size() && "Missing stores in memcpy inlining");
7575 SmallVector<SDValue, 16> GluedLoadChains;
7576 for (unsigned i = From; i < To; ++i) {
7577 OutChains.push_back(OutLoadChains[i]);
7578 GluedLoadChains.push_back(OutLoadChains[i]);
7579 }
7580
7581 // Chain for all loads.
7582 SDValue LoadToken = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
7583 GluedLoadChains);
7584
7585 for (unsigned i = From; i < To; ++i) {
7586 StoreSDNode *ST = dyn_cast<StoreSDNode>(OutStoreChains[i]);
7587 SDValue NewStore = DAG.getTruncStore(LoadToken, dl, ST->getValue(),
7588 ST->getBasePtr(), ST->getMemoryVT(),
7589 ST->getMemOperand());
7590 OutChains.push_back(NewStore);
7591 }
7592}
7593
7595 SDValue Chain, SDValue Dst, SDValue Src,
7596 uint64_t Size, Align Alignment,
7597 bool isVol, bool AlwaysInline,
7598 MachinePointerInfo DstPtrInfo,
7599 MachinePointerInfo SrcPtrInfo,
7600 const AAMDNodes &AAInfo, AAResults *AA) {
7601 // Turn a memcpy of undef to nop.
7602 // FIXME: We need to honor volatile even is Src is undef.
7603 if (Src.isUndef())
7604 return Chain;
7605
7606 // Expand memcpy to a series of load and store ops if the size operand falls
7607 // below a certain threshold.
7608 // TODO: In the AlwaysInline case, if the size is big then generate a loop
7609 // rather than maybe a humongous number of loads and stores.
7610 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
7611 const DataLayout &DL = DAG.getDataLayout();
7612 LLVMContext &C = *DAG.getContext();
7613 std::vector<EVT> MemOps;
7614 bool DstAlignCanChange = false;
7616 MachineFrameInfo &MFI = MF.getFrameInfo();
7617 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
7618 FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Dst);
7619 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
7620 DstAlignCanChange = true;
7621 MaybeAlign SrcAlign = DAG.InferPtrAlign(Src);
7622 if (!SrcAlign || Alignment > *SrcAlign)
7623 SrcAlign = Alignment;
7624 assert(SrcAlign && "SrcAlign must be set");
7626 // If marked as volatile, perform a copy even when marked as constant.
7627 bool CopyFromConstant = !isVol && isMemSrcFromConstant(Src, Slice);
7628 bool isZeroConstant = CopyFromConstant && Slice.Array == nullptr;
7629 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemcpy(OptSize);
7630 const MemOp Op = isZeroConstant
7631 ? MemOp::Set(Size, DstAlignCanChange, Alignment,
7632 /*IsZeroMemset*/ true, isVol)
7633 : MemOp::Copy(Size, DstAlignCanChange, Alignment,
7634 *SrcAlign, isVol, CopyFromConstant);
7635 if (!TLI.findOptimalMemOpLowering(
7636 MemOps, Limit, Op, DstPtrInfo.getAddrSpace(),
7637 SrcPtrInfo.getAddrSpace(), MF.getFunction().getAttributes()))
7638 return SDValue();
7639
7640 if (DstAlignCanChange) {
7641 Type *Ty = MemOps[0].getTypeForEVT(C);
7642 Align NewAlign = DL.getABITypeAlign(Ty);
7643
7644 // Don't promote to an alignment that would require dynamic stack
7645 // realignment which may conflict with optimizations such as tail call
7646 // optimization.
7648 if (!TRI->hasStackRealignment(MF))
7649 while (NewAlign > Alignment && DL.exceedsNaturalStackAlignment(NewAlign))
7650 NewAlign = NewAlign.previous();
7651
7652 if (NewAlign > Alignment) {
7653 // Give the stack frame object a larger alignment if needed.
7654 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
7655 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
7656 Alignment = NewAlign;
7657 }
7658 }
7659
7660 // Prepare AAInfo for loads/stores after lowering this memcpy.
7661 AAMDNodes NewAAInfo = AAInfo;
7662 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
7663
7664 const Value *SrcVal = dyn_cast_if_present<const Value *>(SrcPtrInfo.V);
7665 bool isConstant =
7666 AA && SrcVal &&
7667 AA->pointsToConstantMemory(MemoryLocation(SrcVal, Size, AAInfo));
7668
7669 MachineMemOperand::Flags MMOFlags =
7671 SmallVector<SDValue, 16> OutLoadChains;
7672 SmallVector<SDValue, 16> OutStoreChains;
7673 SmallVector<SDValue, 32> OutChains;
7674 unsigned NumMemOps = MemOps.size();
7675 uint64_t SrcOff = 0, DstOff = 0;
7676 for (unsigned i = 0; i != NumMemOps; ++i) {
7677 EVT VT = MemOps[i];
7678 unsigned VTSize = VT.getSizeInBits() / 8;
7679 SDValue Value, Store;
7680
7681 if (VTSize > Size) {
7682 // Issuing an unaligned load / store pair that overlaps with the previous
7683 // pair. Adjust the offset accordingly.
7684 assert(i == NumMemOps-1 && i != 0);
7685 SrcOff -= VTSize - Size;
7686 DstOff -= VTSize - Size;
7687 }
7688
7689 if (CopyFromConstant &&
7690 (isZeroConstant || (VT.isInteger() && !VT.isVector()))) {
7691 // It's unlikely a store of a vector immediate can be done in a single
7692 // instruction. It would require a load from a constantpool first.
7693 // We only handle zero vectors here.
7694 // FIXME: Handle other cases where store of vector immediate is done in
7695 // a single instruction.
7696 ConstantDataArraySlice SubSlice;
7697 if (SrcOff < Slice.Length) {
7698 SubSlice = Slice;
7699 SubSlice.move(SrcOff);
7700 } else {
7701 // This is an out-of-bounds access and hence UB. Pretend we read zero.
7702 SubSlice.Array = nullptr;
7703 SubSlice.Offset = 0;
7704 SubSlice.Length = VTSize;
7705 }
7706 Value = getMemsetStringVal(VT, dl, DAG, TLI, SubSlice);
7707 if (Value.getNode()) {
7708 Store = DAG.getStore(
7709 Chain, dl, Value,
7710 DAG.getMemBasePlusOffset(Dst, TypeSize::getFixed(DstOff), dl),
7711 DstPtrInfo.getWithOffset(DstOff), Alignment, MMOFlags, NewAAInfo);
7712 OutChains.push_back(Store);
7713 }
7714 }
7715
7716 if (!Store.getNode()) {
7717 // The type might not be legal for the target. This should only happen
7718 // if the type is smaller than a legal type, as on PPC, so the right
7719 // thing to do is generate a LoadExt/StoreTrunc pair. These simplify
7720 // to Load/Store if NVT==VT.
7721 // FIXME does the case above also need this?
7722 EVT NVT = TLI.getTypeToTransformTo(C, VT);
7723 assert(NVT.bitsGE(VT));
7724
7725 bool isDereferenceable =
7726 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
7727 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
7728 if (isDereferenceable)
7730 if (isConstant)
7731 SrcMMOFlags |= MachineMemOperand::MOInvariant;
7732
7733 Value = DAG.getExtLoad(
7734 ISD::EXTLOAD, dl, NVT, Chain,
7735 DAG.getMemBasePlusOffset(Src, TypeSize::getFixed(SrcOff), dl),
7736 SrcPtrInfo.getWithOffset(SrcOff), VT,
7737 commonAlignment(*SrcAlign, SrcOff), SrcMMOFlags, NewAAInfo);
7738 OutLoadChains.push_back(Value.getValue(1));
7739
7740 Store = DAG.getTruncStore(
7741 Chain, dl, Value,
7742 DAG.getMemBasePlusOffset(Dst, TypeSize::getFixed(DstOff), dl),
7743 DstPtrInfo.getWithOffset(DstOff), VT, Alignment, MMOFlags, NewAAInfo);
7744 OutStoreChains.push_back(Store);
7745 }
7746 SrcOff += VTSize;
7747 DstOff += VTSize;
7748 Size -= VTSize;
7749 }
7750
7751 unsigned GluedLdStLimit = MaxLdStGlue == 0 ?
7753 unsigned NumLdStInMemcpy = OutStoreChains.size();
7754
7755 if (NumLdStInMemcpy) {
7756 // It may be that memcpy might be converted to memset if it's memcpy
7757 // of constants. In such a case, we won't have loads and stores, but
7758 // just stores. In the absence of loads, there is nothing to gang up.
7759 if ((GluedLdStLimit <= 1) || !EnableMemCpyDAGOpt) {
7760 // If target does not care, just leave as it.
7761 for (unsigned i = 0; i < NumLdStInMemcpy; ++i) {
7762 OutChains.push_back(OutLoadChains[i]);
7763 OutChains.push_back(OutStoreChains[i]);
7764 }
7765 } else {
7766 // Ld/St less than/equal limit set by target.
7767 if (NumLdStInMemcpy <= GluedLdStLimit) {
7768 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, 0,
7769 NumLdStInMemcpy, OutLoadChains,
7770 OutStoreChains);
7771 } else {
7772 unsigned NumberLdChain = NumLdStInMemcpy / GluedLdStLimit;
7773 unsigned RemainingLdStInMemcpy = NumLdStInMemcpy % GluedLdStLimit;
7774 unsigned GlueIter = 0;
7775
7776 for (unsigned cnt = 0; cnt < NumberLdChain; ++cnt) {
7777 unsigned IndexFrom = NumLdStInMemcpy - GlueIter - GluedLdStLimit;
7778 unsigned IndexTo = NumLdStInMemcpy - GlueIter;
7779
7780 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, IndexFrom, IndexTo,
7781 OutLoadChains, OutStoreChains);
7782 GlueIter += GluedLdStLimit;
7783 }
7784
7785 // Residual ld/st.
7786 if (RemainingLdStInMemcpy) {
7787 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, 0,
7788 RemainingLdStInMemcpy, OutLoadChains,
7789 OutStoreChains);
7790 }
7791 }
7792 }
7793 }
7794 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
7795}
7796
7798 SDValue Chain, SDValue Dst, SDValue Src,
7799 uint64_t Size, Align Alignment,
7800 bool isVol, bool AlwaysInline,
7801 MachinePointerInfo DstPtrInfo,
7802 MachinePointerInfo SrcPtrInfo,
7803 const AAMDNodes &AAInfo) {
7804 // Turn a memmove of undef to nop.
7805 // FIXME: We need to honor volatile even is Src is undef.
7806 if (Src.isUndef())
7807 return Chain;
7808
7809 // Expand memmove to a series of load and store ops if the size operand falls
7810 // below a certain threshold.
7811 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
7812 const DataLayout &DL = DAG.getDataLayout();
7813 LLVMContext &C = *DAG.getContext();
7814 std::vector<EVT> MemOps;
7815 bool DstAlignCanChange = false;
7817 MachineFrameInfo &MFI = MF.getFrameInfo();
7818 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
7819 FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Dst);
7820 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
7821 DstAlignCanChange = true;
7822 MaybeAlign SrcAlign = DAG.InferPtrAlign(Src);
7823 if (!SrcAlign || Alignment > *SrcAlign)
7824 SrcAlign = Alignment;
7825 assert(SrcAlign && "SrcAlign must be set");
7826 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemmove(OptSize);
7827 if (!TLI.findOptimalMemOpLowering(
7828 MemOps, Limit,
7829 MemOp::Copy(Size, DstAlignCanChange, Alignment, *SrcAlign,
7830 /*IsVolatile*/ true),
7831 DstPtrInfo.getAddrSpace(), SrcPtrInfo.getAddrSpace(),
7832 MF.getFunction().getAttributes()))
7833 return SDValue();
7834
7835 if (DstAlignCanChange) {
7836 Type *Ty = MemOps[0].getTypeForEVT(C);
7837 Align NewAlign = DL.getABITypeAlign(Ty);
7838
7839 // Don't promote to an alignment that would require dynamic stack
7840 // realignment which may conflict with optimizations such as tail call
7841 // optimization.
7843 if (!TRI->hasStackRealignment(MF))
7844 while (NewAlign > Alignment && DL.exceedsNaturalStackAlignment(NewAlign))
7845 NewAlign = NewAlign.previous();
7846
7847 if (NewAlign > Alignment) {
7848 // Give the stack frame object a larger alignment if needed.
7849 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
7850 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
7851 Alignment = NewAlign;
7852 }
7853 }
7854
7855 // Prepare AAInfo for loads/stores after lowering this memmove.
7856 AAMDNodes NewAAInfo = AAInfo;
7857 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
7858
7859 MachineMemOperand::Flags MMOFlags =
7861 uint64_t SrcOff = 0, DstOff = 0;
7862 SmallVector<SDValue, 8> LoadValues;
7863 SmallVector<SDValue, 8> LoadChains;
7864 SmallVector<SDValue, 8> OutChains;
7865 unsigned NumMemOps = MemOps.size();
7866 for (unsigned i = 0; i < NumMemOps; i++) {
7867 EVT VT = MemOps[i];
7868 unsigned VTSize = VT.getSizeInBits() / 8;
7869 SDValue Value;
7870
7871 bool isDereferenceable =
7872 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
7873 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
7874 if (isDereferenceable)
7876
7877 Value = DAG.getLoad(
7878 VT, dl, Chain,
7879 DAG.getMemBasePlusOffset(Src, TypeSize::getFixed(SrcOff), dl),
7880 SrcPtrInfo.getWithOffset(SrcOff), *SrcAlign, SrcMMOFlags, NewAAInfo);
7881 LoadValues.push_back(Value);
7882 LoadChains.push_back(Value.getValue(1));
7883 SrcOff += VTSize;
7884 }
7885 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, LoadChains);
7886 OutChains.clear();
7887 for (unsigned i = 0; i < NumMemOps; i++) {
7888 EVT VT = MemOps[i];
7889 unsigned VTSize = VT.getSizeInBits() / 8;
7890 SDValue Store;
7891
7892 Store = DAG.getStore(
7893 Chain, dl, LoadValues[i],
7894 DAG.getMemBasePlusOffset(Dst, TypeSize::getFixed(DstOff), dl),
7895 DstPtrInfo.getWithOffset(DstOff), Alignment, MMOFlags, NewAAInfo);
7896 OutChains.push_back(Store);
7897 DstOff += VTSize;
7898 }
7899
7900 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
7901}
7902
7903/// Lower the call to 'memset' intrinsic function into a series of store
7904/// operations.
7905///
7906/// \param DAG Selection DAG where lowered code is placed.
7907/// \param dl Link to corresponding IR location.
7908/// \param Chain Control flow dependency.
7909/// \param Dst Pointer to destination memory location.
7910/// \param Src Value of byte to write into the memory.
7911/// \param Size Number of bytes to write.
7912/// \param Alignment Alignment of the destination in bytes.
7913/// \param isVol True if destination is volatile.
7914/// \param AlwaysInline Makes sure no function call is generated.
7915/// \param DstPtrInfo IR information on the memory pointer.
7916/// \returns New head in the control flow, if lowering was successful, empty
7917/// SDValue otherwise.
7918///
7919/// The function tries to replace 'llvm.memset' intrinsic with several store
7920/// operations and value calculation code. This is usually profitable for small
7921/// memory size or when the semantic requires inlining.
7923 SDValue Chain, SDValue Dst, SDValue Src,
7924 uint64_t Size, Align Alignment, bool isVol,
7925 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
7926 const AAMDNodes &AAInfo) {
7927 // Turn a memset of undef to nop.
7928 // FIXME: We need to honor volatile even is Src is undef.
7929 if (Src.isUndef())
7930 return Chain;
7931
7932 // Expand memset to a series of load/store ops if the size operand
7933 // falls below a certain threshold.
7934 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
7935 std::vector<EVT> MemOps;
7936 bool DstAlignCanChange = false;
7938 MachineFrameInfo &MFI = MF.getFrameInfo();
7939 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
7940 FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Dst);
7941 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
7942 DstAlignCanChange = true;
7943 bool IsZeroVal = isNullConstant(Src);
7944 unsigned Limit = AlwaysInline ? ~0 : TLI.getMaxStoresPerMemset(OptSize);
7945
7946 if (!TLI.findOptimalMemOpLowering(
7947 MemOps, Limit,
7948 MemOp::Set(Size, DstAlignCanChange, Alignment, IsZeroVal, isVol),
7949 DstPtrInfo.getAddrSpace(), ~0u, MF.getFunction().getAttributes()))
7950 return SDValue();
7951
7952 if (DstAlignCanChange) {
7953 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext());
7954 const DataLayout &DL = DAG.getDataLayout();
7955 Align NewAlign = DL.getABITypeAlign(Ty);
7956
7957 // Don't promote to an alignment that would require dynamic stack
7958 // realignment which may conflict with optimizations such as tail call
7959 // optimization.
7961 if (!TRI->hasStackRealignment(MF))
7962 while (NewAlign > Alignment && DL.exceedsNaturalStackAlignment(NewAlign))
7963 NewAlign = NewAlign.previous();
7964
7965 if (NewAlign > Alignment) {
7966 // Give the stack frame object a larger alignment if needed.
7967 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
7968 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
7969 Alignment = NewAlign;
7970 }
7971 }
7972
7973 SmallVector<SDValue, 8> OutChains;
7974 uint64_t DstOff = 0;
7975 unsigned NumMemOps = MemOps.size();
7976
7977 // Find the largest store and generate the bit pattern for it.
7978 EVT LargestVT = MemOps[0];
7979 for (unsigned i = 1; i < NumMemOps; i++)
7980 if (MemOps[i].bitsGT(LargestVT))
7981 LargestVT = MemOps[i];
7982 SDValue MemSetValue = getMemsetValue(Src, LargestVT, DAG, dl);
7983
7984 // Prepare AAInfo for loads/stores after lowering this memset.
7985 AAMDNodes NewAAInfo = AAInfo;
7986 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
7987
7988 for (unsigned i = 0; i < NumMemOps; i++) {
7989 EVT VT = MemOps[i];
7990 unsigned VTSize = VT.getSizeInBits() / 8;
7991 if (VTSize > Size) {
7992 // Issuing an unaligned load / store pair that overlaps with the previous
7993 // pair. Adjust the offset accordingly.
7994 assert(i == NumMemOps-1 && i != 0);
7995 DstOff -= VTSize - Size;
7996 }
7997
7998 // If this store is smaller than the largest store see whether we can get
7999 // the smaller value for free with a truncate or extract vector element and
8000 // then store.
8001 SDValue Value = MemSetValue;
8002 if (VT.bitsLT(LargestVT)) {
8003 unsigned Index;
8004 unsigned NElts = LargestVT.getSizeInBits() / VT.getSizeInBits();
8005 EVT SVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(), NElts);
8006 if (!LargestVT.isVector() && !VT.isVector() &&
8007 TLI.isTruncateFree(LargestVT, VT))
8008 Value = DAG.getNode(ISD::TRUNCATE, dl, VT, MemSetValue);
8009 else if (LargestVT.isVector() && !VT.isVector() &&
8011 LargestVT.getTypeForEVT(*DAG.getContext()),
8012 VT.getSizeInBits(), Index) &&
8013 TLI.isTypeLegal(SVT) &&
8014 LargestVT.getSizeInBits() == SVT.getSizeInBits()) {
8015 // Target which can combine store(extractelement VectorTy, Idx) can get
8016 // the smaller value for free.
8017 SDValue TailValue = DAG.getNode(ISD::BITCAST, dl, SVT, MemSetValue);
8018 Value = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, VT, TailValue,
8019 DAG.getVectorIdxConstant(Index, dl));
8020 } else
8021 Value = getMemsetValue(Src, VT, DAG, dl);
8022 }
8023 assert(Value.getValueType() == VT && "Value with wrong type.");
8024 SDValue Store = DAG.getStore(
8025 Chain, dl, Value,
8026 DAG.getMemBasePlusOffset(Dst, TypeSize::getFixed(DstOff), dl),
8027 DstPtrInfo.getWithOffset(DstOff), Alignment,
8029 NewAAInfo);
8030 OutChains.push_back(Store);
8031 DstOff += VT.getSizeInBits() / 8;
8032 Size -= VTSize;
8033 }
8034
8035 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
8036}
8037
8039 unsigned AS) {
8040 // Lowering memcpy / memset / memmove intrinsics to calls is only valid if all
8041 // pointer operands can be losslessly bitcasted to pointers of address space 0
8042 if (AS != 0 && !TLI->getTargetMachine().isNoopAddrSpaceCast(AS, 0)) {
8043 report_fatal_error("cannot lower memory intrinsic in address space " +
8044 Twine(AS));
8045 }
8046}
8047
8049 SDValue Src, SDValue Size, Align Alignment,
8050 bool isVol, bool AlwaysInline, bool isTailCall,
8051 MachinePointerInfo DstPtrInfo,
8052 MachinePointerInfo SrcPtrInfo,
8053 const AAMDNodes &AAInfo, AAResults *AA) {
8054 // Check to see if we should lower the memcpy to loads and stores first.
8055 // For cases within the target-specified limits, this is the best choice.
8056 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
8057 if (ConstantSize) {
8058 // Memcpy with size zero? Just return the original chain.
8059 if (ConstantSize->isZero())
8060 return Chain;
8061
8063 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
8064 isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo, AA);
8065 if (Result.getNode())
8066 return Result;
8067 }
8068
8069 // Then check to see if we should lower the memcpy with target-specific
8070 // code. If the target chooses to do this, this is the next best.
8071 if (TSI) {
8072 SDValue Result = TSI->EmitTargetCodeForMemcpy(
8073 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline,
8074 DstPtrInfo, SrcPtrInfo);
8075 if (Result.getNode())
8076 return Result;
8077 }
8078
8079 // If we really need inline code and the target declined to provide it,
8080 // use a (potentially long) sequence of loads and stores.
8081 if (AlwaysInline) {
8082 assert(ConstantSize && "AlwaysInline requires a constant size!");
8084 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
8085 isVol, true, DstPtrInfo, SrcPtrInfo, AAInfo, AA);
8086 }
8087
8090
8091 // FIXME: If the memcpy is volatile (isVol), lowering it to a plain libc
8092 // memcpy is not guaranteed to be safe. libc memcpys aren't required to
8093 // respect volatile, so they may do things like read or write memory
8094 // beyond the given memory regions. But fixing this isn't easy, and most
8095 // people don't care.
8096
8097 // Emit a library call.
8100 Entry.Ty = PointerType::getUnqual(*getContext());
8101 Entry.Node = Dst; Args.push_back(Entry);
8102 Entry.Node = Src; Args.push_back(Entry);
8103
8104 Entry.Ty = getDataLayout().getIntPtrType(*getContext());
8105 Entry.Node = Size; Args.push_back(Entry);
8106 // FIXME: pass in SDLoc
8108 CLI.setDebugLoc(dl)
8109 .setChain(Chain)
8110 .setLibCallee(TLI->getLibcallCallingConv(RTLIB::MEMCPY),
8111 Dst.getValueType().getTypeForEVT(*getContext()),
8112 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMCPY),
8113 TLI->getPointerTy(getDataLayout())),
8114 std::move(Args))
8116 .setTailCall(isTailCall);
8117
8118 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
8119 return CallResult.second;
8120}
8121
8123 SDValue Dst, SDValue Src, SDValue Size,
8124 Type *SizeTy, unsigned ElemSz,
8125 bool isTailCall,
8126 MachinePointerInfo DstPtrInfo,
8127 MachinePointerInfo SrcPtrInfo) {
8128 // Emit a library call.
8131 Entry.Ty = getDataLayout().getIntPtrType(*getContext());
8132 Entry.Node = Dst;
8133 Args.push_back(Entry);
8134
8135 Entry.Node = Src;
8136 Args.push_back(Entry);
8137
8138 Entry.Ty = SizeTy;
8139 Entry.Node = Size;
8140 Args.push_back(Entry);
8141
8142 RTLIB::Libcall LibraryCall =
8144 if (LibraryCall == RTLIB::UNKNOWN_LIBCALL)
8145 report_fatal_error("Unsupported element size");
8146
8148 CLI.setDebugLoc(dl)
8149 .setChain(Chain)
8150 .setLibCallee(TLI->getLibcallCallingConv(LibraryCall),
8152 getExternalSymbol(TLI->getLibcallName(LibraryCall),
8153 TLI->getPointerTy(getDataLayout())),
8154 std::move(Args))
8156 .setTailCall(isTailCall);
8157
8158 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
8159 return CallResult.second;
8160}
8161
8163 SDValue Src, SDValue Size, Align Alignment,
8164 bool isVol, bool isTailCall,
8165 MachinePointerInfo DstPtrInfo,
8166 MachinePointerInfo SrcPtrInfo,
8167 const AAMDNodes &AAInfo, AAResults *AA) {
8168 // Check to see if we should lower the memmove to loads and stores first.
8169 // For cases within the target-specified limits, this is the best choice.
8170 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
8171 if (ConstantSize) {
8172 // Memmove with size zero? Just return the original chain.
8173 if (ConstantSize->isZero())
8174 return Chain;
8175
8177 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
8178 isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo);
8179 if (Result.getNode())
8180 return Result;
8181 }
8182
8183 // Then check to see if we should lower the memmove with target-specific
8184 // code. If the target chooses to do this, this is the next best.
8185 if (TSI) {
8186 SDValue Result =
8187 TSI->EmitTargetCodeForMemmove(*this, dl, Chain, Dst, Src, Size,
8188 Alignment, isVol, DstPtrInfo, SrcPtrInfo);
8189 if (Result.getNode())
8190 return Result;
8191 }
8192
8195
8196 // FIXME: If the memmove is volatile, lowering it to plain libc memmove may
8197 // not be safe. See memcpy above for more details.
8198
8199 // Emit a library call.
8202 Entry.Ty = PointerType::getUnqual(*getContext());
8203 Entry.Node = Dst; Args.push_back(Entry);
8204 Entry.Node = Src; Args.push_back(Entry);
8205
8206 Entry.Ty = getDataLayout().getIntPtrType(*getContext());
8207 Entry.Node = Size; Args.push_back(Entry);
8208 // FIXME: pass in SDLoc
8210 CLI.setDebugLoc(dl)
8211 .setChain(Chain)
8212 .setLibCallee(TLI->getLibcallCallingConv(RTLIB::MEMMOVE),
8213 Dst.getValueType().getTypeForEVT(*getContext()),
8214 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMMOVE),
8215 TLI->getPointerTy(getDataLayout())),
8216 std::move(Args))
8218 .setTailCall(isTailCall);
8219
8220 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
8221 return CallResult.second;
8222}
8223
8225 SDValue Dst, SDValue Src, SDValue Size,
8226 Type *SizeTy, unsigned ElemSz,
8227 bool isTailCall,
8228 MachinePointerInfo DstPtrInfo,
8229 MachinePointerInfo SrcPtrInfo) {
8230 // Emit a library call.
8233 Entry.Ty = getDataLayout().getIntPtrType(*getContext());
8234 Entry.Node = Dst;
8235 Args.push_back(Entry);
8236
8237 Entry.Node = Src;
8238 Args.push_back(Entry);
8239
8240 Entry.Ty = SizeTy;
8241 Entry.Node = Size;
8242 Args.push_back(Entry);
8243
8244 RTLIB::Libcall LibraryCall =
8246 if (LibraryCall == RTLIB::UNKNOWN_LIBCALL)
8247 report_fatal_error("Unsupported element size");
8248
8250 CLI.setDebugLoc(dl)
8251 .setChain(Chain)
8252 .setLibCallee(TLI->getLibcallCallingConv(LibraryCall),
8254 getExternalSymbol(TLI->getLibcallName(LibraryCall),
8255 TLI->getPointerTy(getDataLayout())),
8256 std::move(Args))
8258 .setTailCall(isTailCall);
8259
8260 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
8261 return CallResult.second;
8262}
8263
8265 SDValue Src, SDValue Size, Align Alignment,
8266 bool isVol, bool AlwaysInline, bool isTailCall,
8267 MachinePointerInfo DstPtrInfo,
8268 const AAMDNodes &AAInfo) {
8269 // Check to see if we should lower the memset to stores first.
8270 // For cases within the target-specified limits, this is the best choice.
8271 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
8272 if (ConstantSize) {
8273 // Memset with size zero? Just return the original chain.
8274 if (ConstantSize->isZero())
8275 return Chain;
8276
8277 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
8278 ConstantSize->getZExtValue(), Alignment,
8279 isVol, false, DstPtrInfo, AAInfo);
8280
8281 if (Result.getNode())
8282 return Result;
8283 }
8284
8285 // Then check to see if we should lower the memset with target-specific
8286 // code. If the target chooses to do this, this is the next best.
8287 if (TSI) {
8288 SDValue Result = TSI->EmitTargetCodeForMemset(
8289 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline, DstPtrInfo);
8290 if (Result.getNode())
8291 return Result;
8292 }
8293
8294 // If we really need inline code and the target declined to provide it,
8295 // use a (potentially long) sequence of loads and stores.
8296 if (AlwaysInline) {
8297 assert(ConstantSize && "AlwaysInline requires a constant size!");
8298 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
8299 ConstantSize->getZExtValue(), Alignment,
8300 isVol, true, DstPtrInfo, AAInfo);
8301 assert(Result &&
8302 "getMemsetStores must return a valid sequence when AlwaysInline");
8303 return Result;
8304 }
8305
8307
8308 // Emit a library call.
8309 auto &Ctx = *getContext();
8310 const auto& DL = getDataLayout();
8311
8313 // FIXME: pass in SDLoc
8314 CLI.setDebugLoc(dl).setChain(Chain);
8315
8316 const char *BzeroName = getTargetLoweringInfo().getLibcallName(RTLIB::BZERO);
8317
8318 // Helper function to create an Entry from Node and Type.
8319 const auto CreateEntry = [](SDValue Node, Type *Ty) {
8321 Entry.Node = Node;
8322 Entry.Ty = Ty;
8323 return Entry;
8324 };
8325
8326 // If zeroing out and bzero is present, use it.
8327 if (isNullConstant(Src) && BzeroName) {
8329 Args.push_back(CreateEntry(Dst, PointerType::getUnqual(Ctx)));
8330 Args.push_back(CreateEntry(Size, DL.getIntPtrType(Ctx)));
8331 CLI.setLibCallee(
8332 TLI->getLibcallCallingConv(RTLIB::BZERO), Type::getVoidTy(Ctx),
8333 getExternalSymbol(BzeroName, TLI->getPointerTy(DL)), std::move(Args));
8334 } else {
8336 Args.push_back(CreateEntry(Dst, PointerType::getUnqual(Ctx)));
8337 Args.push_back(CreateEntry(Src, Src.getValueType().getTypeForEVT(Ctx)));
8338 Args.push_back(CreateEntry(Size, DL.getIntPtrType(Ctx)));
8339 CLI.setLibCallee(TLI->getLibcallCallingConv(RTLIB::MEMSET),
8340 Dst.getValueType().getTypeForEVT(Ctx),
8341 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMSET),
8342 TLI->getPointerTy(DL)),
8343 std::move(Args));
8344 }
8345
8346 CLI.setDiscardResult().setTailCall(isTailCall);
8347
8348 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
8349 return CallResult.second;
8350}
8351
8354 Type *SizeTy, unsigned ElemSz,
8355 bool isTailCall,
8356 MachinePointerInfo DstPtrInfo) {
8357 // Emit a library call.
8360 Entry.Ty = getDataLayout().getIntPtrType(*getContext());
8361 Entry.Node = Dst;
8362 Args.push_back(Entry);
8363
8364 Entry.Ty = Type::getInt8Ty(*getContext());
8365 Entry.Node = Value;
8366 Args.push_back(Entry);
8367
8368 Entry.Ty = SizeTy;
8369 Entry.Node = Size;
8370 Args.push_back(Entry);
8371
8372 RTLIB::Libcall LibraryCall =
8374 if (LibraryCall == RTLIB::UNKNOWN_LIBCALL)
8375 report_fatal_error("Unsupported element size");
8376
8378 CLI.setDebugLoc(dl)
8379 .setChain(Chain)
8380 .setLibCallee(TLI->getLibcallCallingConv(LibraryCall),
8382 getExternalSymbol(TLI->getLibcallName(LibraryCall),
8383 TLI->getPointerTy(getDataLayout())),
8384 std::move(Args))
8386 .setTailCall(isTailCall);
8387
8388 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
8389 return CallResult.second;
8390}
8391
8392SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
8393 SDVTList VTList, ArrayRef<SDValue> Ops,
8394 MachineMemOperand *MMO) {
8396 ID.AddInteger(MemVT.getRawBits());
8397 AddNodeIDNode(ID, Opcode, VTList, Ops);
8398 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
8399 ID.AddInteger(MMO->getFlags());
8400 void* IP = nullptr;
8401 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
8402 cast<AtomicSDNode>(E)->refineAlignment(MMO);
8403 return SDValue(E, 0);
8404 }
8405
8406 auto *N = newSDNode<AtomicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
8407 VTList, MemVT, MMO);
8408 createOperands(N, Ops);
8409
8410 CSEMap.InsertNode(N, IP);
8411 InsertNode(N);
8412 return SDValue(N, 0);
8413}
8414
8416 EVT MemVT, SDVTList VTs, SDValue Chain,
8417 SDValue Ptr, SDValue Cmp, SDValue Swp,
8418 MachineMemOperand *MMO) {
8419 assert(Opcode == ISD::ATOMIC_CMP_SWAP ||
8421 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types");
8422
8423 SDValue Ops[] = {Chain, Ptr, Cmp, Swp};
8424 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
8425}
8426
8427SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
8428 SDValue Chain, SDValue Ptr, SDValue Val,
8429 MachineMemOperand *MMO) {
8430 assert((Opcode == ISD::ATOMIC_LOAD_ADD ||
8431 Opcode == ISD::ATOMIC_LOAD_SUB ||
8432 Opcode == ISD::ATOMIC_LOAD_AND ||
8433 Opcode == ISD::ATOMIC_LOAD_CLR ||
8434 Opcode == ISD::ATOMIC_LOAD_OR ||
8435 Opcode == ISD::ATOMIC_LOAD_XOR ||
8436 Opcode == ISD::ATOMIC_LOAD_NAND ||
8437 Opcode == ISD::ATOMIC_LOAD_MIN ||
8438 Opcode == ISD::ATOMIC_LOAD_MAX ||
8439 Opcode == ISD::ATOMIC_LOAD_UMIN ||
8440 Opcode == ISD::ATOMIC_LOAD_UMAX ||
8441 Opcode == ISD::ATOMIC_LOAD_FADD ||
8442 Opcode == ISD::ATOMIC_LOAD_FSUB ||
8443 Opcode == ISD::ATOMIC_LOAD_FMAX ||
8444 Opcode == ISD::ATOMIC_LOAD_FMIN ||
8445 Opcode == ISD::ATOMIC_LOAD_UINC_WRAP ||
8446 Opcode == ISD::ATOMIC_LOAD_UDEC_WRAP ||
8447 Opcode == ISD::ATOMIC_SWAP ||
8448 Opcode == ISD::ATOMIC_STORE) &&
8449 "Invalid Atomic Op");
8450
8451 EVT VT = Val.getValueType();
8452
8453 SDVTList VTs = Opcode == ISD::ATOMIC_STORE ? getVTList(MVT::Other) :
8454 getVTList(VT, MVT::Other);
8455 SDValue Ops[] = {Chain, Ptr, Val};
8456 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
8457}
8458
8459SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
8460 EVT VT, SDValue Chain, SDValue Ptr,
8461 MachineMemOperand *MMO) {
8462 assert(Opcode == ISD::ATOMIC_LOAD && "Invalid Atomic Op");
8463
8464 SDVTList VTs = getVTList(VT, MVT::Other);
8465 SDValue Ops[] = {Chain, Ptr};
8466 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
8467}
8468
8469/// getMergeValues - Create a MERGE_VALUES node from the given operands.
8471 if (Ops.size() == 1)
8472 return Ops[0];
8473
8475 VTs.reserve(Ops.size());
8476 for (const SDValue &Op : Ops)
8477 VTs.push_back(Op.getValueType());
8478 return getNode(ISD::MERGE_VALUES, dl, getVTList(VTs), Ops);
8479}
8480
8482 unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef<SDValue> Ops,
8483 EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment,
8485 const AAMDNodes &AAInfo) {
8486 if (Size.hasValue() && !Size.getValue())
8488
8490 MachineMemOperand *MMO =
8491 MF.getMachineMemOperand(PtrInfo, Flags, Size, Alignment, AAInfo);
8492
8493 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, MMO);
8494}
8495
8497 SDVTList VTList,
8498 ArrayRef<SDValue> Ops, EVT MemVT,
8499 MachineMemOperand *MMO) {
8500 assert((Opcode == ISD::INTRINSIC_VOID ||
8501 Opcode == ISD::INTRINSIC_W_CHAIN ||
8502 Opcode == ISD::PREFETCH ||
8503 (Opcode <= (unsigned)std::numeric_limits<int>::max() &&
8504 (int)Opcode >= ISD::FIRST_TARGET_MEMORY_OPCODE)) &&
8505 "Opcode is not a memory-accessing opcode!");
8506
8507 // Memoize the node unless it returns a glue result.
8509 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
8511 AddNodeIDNode(ID, Opcode, VTList, Ops);
8512 ID.AddInteger(getSyntheticNodeSubclassData<MemIntrinsicSDNode>(
8513 Opcode, dl.getIROrder(), VTList, MemVT, MMO));
8514 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
8515 ID.AddInteger(MMO->getFlags());
8516 ID.AddInteger(MemVT.getRawBits());
8517 void *IP = nullptr;
8518 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
8519 cast<MemIntrinsicSDNode>(E)->refineAlignment(MMO);
8520 return SDValue(E, 0);
8521 }
8522
8523 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
8524 VTList, MemVT, MMO);
8525 createOperands(N, Ops);
8526
8527 CSEMap.InsertNode(N, IP);
8528 } else {
8529 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
8530 VTList, MemVT, MMO);
8531 createOperands(N, Ops);
8532 }
8533 InsertNode(N);
8534 SDValue V(N, 0);
8535 NewSDValueDbgMsg(V, "Creating new node: ", this);
8536 return V;
8537}
8538
8540 SDValue Chain, int FrameIndex,
8541 int64_t Size, int64_t Offset) {
8542 const unsigned Opcode = IsStart ? ISD::LIFETIME_START : ISD::LIFETIME_END;
8543 const auto VTs = getVTList(MVT::Other);
8544 SDValue Ops[2] = {
8545 Chain,
8546 getFrameIndex(FrameIndex,
8547 getTargetLoweringInfo().getFrameIndexTy(getDataLayout()),
8548 true)};
8549
8551 AddNodeIDNode(ID, Opcode, VTs, Ops);
8552 ID.AddInteger(FrameIndex);
8553 ID.AddInteger(Size);
8554 ID.AddInteger(Offset);
8555 void *IP = nullptr;
8556 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
8557 return SDValue(E, 0);
8558
8559 LifetimeSDNode *N = newSDNode<LifetimeSDNode>(
8560 Opcode, dl.getIROrder(), dl.getDebugLoc(), VTs, Size, Offset);
8561 createOperands(N, Ops);
8562 CSEMap.InsertNode(N, IP);
8563 InsertNode(N);
8564 SDValue V(N, 0);
8565 NewSDValueDbgMsg(V, "Creating new node: ", this);
8566 return V;
8567}
8568
8570 uint64_t Guid, uint64_t Index,
8571 uint32_t Attr) {
8572 const unsigned Opcode = ISD::PSEUDO_PROBE;
8573 const auto VTs = getVTList(MVT::Other);
8574 SDValue Ops[] = {Chain};
8576 AddNodeIDNode(ID, Opcode, VTs, Ops);
8577 ID.AddInteger(Guid);
8578 ID.AddInteger(Index);
8579 void *IP = nullptr;
8580 if (SDNode *E = FindNodeOrInsertPos(ID, Dl, IP))
8581 return SDValue(E, 0);
8582
8583 auto *N = newSDNode<PseudoProbeSDNode>(
8584 Opcode, Dl.getIROrder(), Dl.getDebugLoc(), VTs, Guid, Index, Attr);
8585 createOperands(N, Ops);
8586 CSEMap.InsertNode(N, IP);
8587 InsertNode(N);
8588 SDValue V(N, 0);
8589 NewSDValueDbgMsg(V, "Creating new node: ", this);
8590 return V;
8591}
8592
8593/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
8594/// MachinePointerInfo record from it. This is particularly useful because the
8595/// code generator has many cases where it doesn't bother passing in a
8596/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
8598 SelectionDAG &DAG, SDValue Ptr,
8599 int64_t Offset = 0) {
8600 // If this is FI+Offset, we can model it.
8601 if (const FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr))
8603 FI->getIndex(), Offset);
8604
8605 // If this is (FI+Offset1)+Offset2, we can model it.
8606 if (Ptr.getOpcode() != ISD::ADD ||
8607 !isa<ConstantSDNode>(Ptr.getOperand(1)) ||
8608 !isa<FrameIndexSDNode>(Ptr.getOperand(0)))
8609 return Info;
8610
8611 int FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
8613 DAG.getMachineFunction(), FI,
8614 Offset + cast<ConstantSDNode>(Ptr.getOperand(1))->getSExtValue());
8615}
8616
8617/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
8618/// MachinePointerInfo record from it. This is particularly useful because the
8619/// code generator has many cases where it doesn't bother passing in a
8620/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
8622 SelectionDAG &DAG, SDValue Ptr,
8623 SDValue OffsetOp) {
8624 // If the 'Offset' value isn't a constant, we can't handle this.
8625 if (ConstantSDNode *OffsetNode = dyn_cast<ConstantSDNode>(OffsetOp))
8626 return InferPointerInfo(Info, DAG, Ptr, OffsetNode->getSExtValue());
8627 if (OffsetOp.isUndef())
8628 return InferPointerInfo(Info, DAG, Ptr);
8629 return Info;
8630}
8631
8633 EVT VT, const SDLoc &dl, SDValue Chain,
8635 MachinePointerInfo PtrInfo, EVT MemVT,
8636 Align Alignment,
8637 MachineMemOperand::Flags MMOFlags,
8638 const AAMDNodes &AAInfo, const MDNode *Ranges) {
8639 assert(Chain.getValueType() == MVT::Other &&
8640 "Invalid chain type");
8641
8642 MMOFlags |= MachineMemOperand::MOLoad;
8643 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
8644 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
8645 // clients.
8646 if (PtrInfo.V.isNull())
8647 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
8648
8651 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
8652 Alignment, AAInfo, Ranges);
8653 return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO);
8654}
8655
8657 EVT VT, const SDLoc &dl, SDValue Chain,
8658 SDValue Ptr, SDValue Offset, EVT MemVT,
8659 MachineMemOperand *MMO) {
8660 if (VT == MemVT) {
8661 ExtType = ISD::NON_EXTLOAD;
8662 } else if (ExtType == ISD::NON_EXTLOAD) {
8663 assert(VT == MemVT && "Non-extending load from different memory type!");
8664 } else {
8665 // Extending load.
8666 assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) &&
8667 "Should only be an extending load, not truncating!");
8668 assert(VT.isInteger() == MemVT.isInteger() &&
8669 "Cannot convert from FP to Int or Int -> FP!");
8670 assert(VT.isVector() == MemVT.isVector() &&
8671 "Cannot use an ext load to convert to or from a vector!");
8672 assert((!VT.isVector() ||
8674 "Cannot use an ext load to change the number of vector elements!");
8675 }
8676
8677 bool Indexed = AM != ISD::UNINDEXED;
8678 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
8679
8680 SDVTList VTs = Indexed ?
8681 getVTList(VT, Ptr.getValueType(), MVT::Other) : getVTList(VT, MVT::Other);
8682 SDValue Ops[] = { Chain, Ptr, Offset };
8684 AddNodeIDNode(ID, ISD::LOAD, VTs, Ops);
8685 ID.AddInteger(MemVT.getRawBits());
8686 ID.AddInteger(getSyntheticNodeSubclassData<LoadSDNode>(
8687 dl.getIROrder(), VTs, AM, ExtType, MemVT, MMO));
8688 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
8689 ID.AddInteger(MMO->getFlags());
8690 void *IP = nullptr;
8691 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
8692 cast<LoadSDNode>(E)->refineAlignment(MMO);
8693 return SDValue(E, 0);
8694 }
8695 auto *N = newSDNode<LoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
8696 ExtType, MemVT, MMO);
8697 createOperands(N, Ops);
8698
8699 CSEMap.InsertNode(N, IP);
8700 InsertNode(N);
8701 SDValue V(N, 0);
8702 NewSDValueDbgMsg(V, "Creating new node: ", this);
8703 return V;
8704}
8705
8708 MaybeAlign Alignment,
8709 MachineMemOperand::Flags MMOFlags,
8710 const AAMDNodes &AAInfo, const MDNode *Ranges) {
8711 SDValue Undef = getUNDEF(Ptr.getValueType());
8712 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
8713 PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges);
8714}
8715
8718 SDValue Undef = getUNDEF(Ptr.getValueType());
8719 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
8720 VT, MMO);
8721}
8722
8724 EVT VT, SDValue Chain, SDValue Ptr,
8725 MachinePointerInfo PtrInfo, EVT MemVT,
8726 MaybeAlign Alignment,
8727 MachineMemOperand::Flags MMOFlags,
8728 const AAMDNodes &AAInfo) {
8729 SDValue Undef = getUNDEF(Ptr.getValueType());
8730 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, PtrInfo,
8731 MemVT, Alignment, MMOFlags, AAInfo);
8732}
8733
8735 EVT VT, SDValue Chain, SDValue Ptr, EVT MemVT,
8736 MachineMemOperand *MMO) {
8737 SDValue Undef = getUNDEF(Ptr.getValueType());
8738 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef,
8739 MemVT, MMO);
8740}
8741
8745 LoadSDNode *LD = cast<LoadSDNode>(OrigLoad);
8746 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
8747 // Don't propagate the invariant or dereferenceable flags.
8748 auto MMOFlags =
8749 LD->getMemOperand()->getFlags() &
8751 return getLoad(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
8752 LD->getChain(), Base, Offset, LD->getPointerInfo(),
8753 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo());
8754}
8755
8758 Align Alignment,
8759 MachineMemOperand::Flags MMOFlags,
8760 const AAMDNodes &AAInfo) {
8761 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
8762
8763 MMOFlags |= MachineMemOperand::MOStore;
8764 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
8765
8766 if (PtrInfo.V.isNull())
8767 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
8768
8771 MachineMemOperand *MMO =
8772 MF.getMachineMemOperand(PtrInfo, MMOFlags, Size, Alignment, AAInfo);
8773 return getStore(Chain, dl, Val, Ptr, MMO);
8774}
8775
8778 assert(Chain.getValueType() == MVT::Other &&
8779 "Invalid chain type");
8780 EVT VT = Val.getValueType();
8781 SDVTList VTs = getVTList(MVT::Other);
8782 SDValue Undef = getUNDEF(Ptr.getValueType());
8783 SDValue Ops[] = { Chain, Val, Ptr, Undef };
8785 AddNodeIDNode(ID, ISD::STORE, VTs, Ops);
8786 ID.AddInteger(VT.getRawBits());
8787 ID.AddInteger(getSyntheticNodeSubclassData<StoreSDNode>(
8788 dl.getIROrder(), VTs, ISD::UNINDEXED, false, VT, MMO));
8789 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
8790 ID.AddInteger(MMO->getFlags());
8791 void *IP = nullptr;
8792 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
8793 cast<StoreSDNode>(E)->refineAlignment(MMO);
8794 return SDValue(E, 0);
8795 }
8796 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
8797 ISD::UNINDEXED, false, VT, MMO);
8798 createOperands(N, Ops);
8799
8800 CSEMap.InsertNode(N, IP);
8801 InsertNode(N);
8802 SDValue V(N, 0);
8803 NewSDValueDbgMsg(V, "Creating new node: ", this);
8804 return V;
8805}
8806
8809 EVT SVT, Align Alignment,
8810 MachineMemOperand::Flags MMOFlags,
8811 const AAMDNodes &AAInfo) {
8812 assert(Chain.getValueType() == MVT::Other &&
8813 "Invalid chain type");
8814
8815 MMOFlags |= MachineMemOperand::MOStore;
8816 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
8817
8818 if (PtrInfo.V.isNull())
8819 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
8820
8823 PtrInfo, MMOFlags, LocationSize::precise(SVT.getStoreSize()), Alignment,
8824 AAInfo);
8825 return getTruncStore(Chain, dl, Val, Ptr, SVT, MMO);
8826}
8827
8829 SDValue Ptr, EVT SVT,
8830 MachineMemOperand *MMO) {
8831 EVT VT = Val.getValueType();
8832
8833 assert(Chain.getValueType() == MVT::Other &&
8834 "Invalid chain type");
8835 if (VT == SVT)
8836 return getStore(Chain, dl, Val, Ptr, MMO);
8837
8839 "Should only be a truncating store, not extending!");
8840 assert(VT.isInteger() == SVT.isInteger() &&
8841 "Can't do FP-INT conversion!");
8842 assert(VT.isVector() == SVT.isVector() &&
8843 "Cannot use trunc store to convert to or from a vector!");
8844 assert((!VT.isVector() ||
8846 "Cannot use trunc store to change the number of vector elements!");
8847
8848 SDVTList VTs = getVTList(MVT::Other);
8849 SDValue Undef = getUNDEF(Ptr.getValueType());
8850 SDValue Ops[] = { Chain, Val, Ptr, Undef };
8852 AddNodeIDNode(ID, ISD::STORE, VTs, Ops);
8853 ID.AddInteger(SVT.getRawBits());
8854 ID.AddInteger(getSyntheticNodeSubclassData<StoreSDNode>(
8855 dl.getIROrder(), VTs, ISD::UNINDEXED, true, SVT, MMO));
8856 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
8857 ID.AddInteger(MMO->getFlags());
8858 void *IP = nullptr;
8859 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
8860 cast<StoreSDNode>(E)->refineAlignment(MMO);
8861 return SDValue(E, 0);
8862 }
8863 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
8864 ISD::UNINDEXED, true, SVT, MMO);
8865 createOperands(N, Ops);
8866
8867 CSEMap.InsertNode(N, IP);
8868 InsertNode(N);
8869 SDValue V(N, 0);
8870 NewSDValueDbgMsg(V, "Creating new node: ", this);
8871 return V;
8872}
8873
8877 StoreSDNode *ST = cast<StoreSDNode>(OrigStore);
8878 assert(ST->getOffset().isUndef() && "Store is already a indexed store!");
8879 SDVTList VTs = getVTList(Base.getValueType(), MVT::Other);
8880 SDValue Ops[] = { ST->getChain(), ST->getValue(), Base, Offset };
8882 AddNodeIDNode(ID, ISD::STORE, VTs, Ops);
8883 ID.AddInteger(ST->getMemoryVT().getRawBits());
8884 ID.AddInteger(ST->getRawSubclassData());
8885 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
8886 ID.AddInteger(ST->getMemOperand()->getFlags());
8887 void *IP = nullptr;
8888 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
8889 return SDValue(E, 0);
8890
8891 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
8892 ST->isTruncatingStore(), ST->getMemoryVT(),
8893 ST->getMemOperand());
8894 createOperands(N, Ops);
8895
8896 CSEMap.InsertNode(N, IP);
8897 InsertNode(N);
8898 SDValue V(N, 0);
8899 NewSDValueDbgMsg(V, "Creating new node: ", this);
8900 return V;
8901}
8902
8904 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl,
8905 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL,
8906 MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment,
8907 MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo,
8908 const MDNode *Ranges, bool IsExpanding) {
8909 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
8910
8911 MMOFlags |= MachineMemOperand::MOLoad;
8912 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
8913 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
8914 // clients.
8915 if (PtrInfo.V.isNull())
8916 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
8917
8920 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
8921 Alignment, AAInfo, Ranges);
8922 return getLoadVP(AM, ExtType, VT, dl, Chain, Ptr, Offset, Mask, EVL, MemVT,
8923 MMO, IsExpanding);
8924}
8925
8927 ISD::LoadExtType ExtType, EVT VT,
8928 const SDLoc &dl, SDValue Chain, SDValue Ptr,
8929 SDValue Offset, SDValue Mask, SDValue EVL,
8930 EVT MemVT, MachineMemOperand *MMO,
8931 bool IsExpanding) {
8932 bool Indexed = AM != ISD::UNINDEXED;
8933 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
8934
8935 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
8936 : getVTList(VT, MVT::Other);
8937 SDValue Ops[] = {Chain, Ptr, Offset, Mask, EVL};
8939 AddNodeIDNode(ID, ISD::VP_LOAD, VTs, Ops);
8940 ID.AddInteger(MemVT.getRawBits());
8941 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadSDNode>(
8942 dl.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
8943 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
8944 ID.AddInteger(MMO->getFlags());
8945 void *IP = nullptr;
8946 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
8947 cast<VPLoadSDNode>(E)->refineAlignment(MMO);
8948 return SDValue(E, 0);
8949 }
8950 auto *N = newSDNode<VPLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
8951 ExtType, IsExpanding, MemVT, MMO);
8952 createOperands(N, Ops);
8953
8954 CSEMap.InsertNode(N, IP);
8955 InsertNode(N);
8956 SDValue V(N, 0);
8957 NewSDValueDbgMsg(V, "Creating new node: ", this);
8958 return V;
8959}
8960
8962 SDValue Ptr, SDValue Mask, SDValue EVL,
8963 MachinePointerInfo PtrInfo,
8964 MaybeAlign Alignment,
8965 MachineMemOperand::Flags MMOFlags,
8966 const AAMDNodes &AAInfo, const MDNode *Ranges,
8967 bool IsExpanding) {
8968 SDValue Undef = getUNDEF(Ptr.getValueType());
8969 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
8970 Mask, EVL, PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges,
8971 IsExpanding);
8972}
8973
8975 SDValue Ptr, SDValue Mask, SDValue EVL,
8976 MachineMemOperand *MMO, bool IsExpanding) {
8977 SDValue Undef = getUNDEF(Ptr.getValueType());
8978 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
8979 Mask, EVL, VT, MMO, IsExpanding);
8980}
8981
8983 EVT VT, SDValue Chain, SDValue Ptr,
8984 SDValue Mask, SDValue EVL,
8985 MachinePointerInfo PtrInfo, EVT MemVT,
8986 MaybeAlign Alignment,
8987 MachineMemOperand::Flags MMOFlags,
8988 const AAMDNodes &AAInfo, bool IsExpanding) {
8989 SDValue Undef = getUNDEF(Ptr.getValueType());
8990 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
8991 EVL, PtrInfo, MemVT, Alignment, MMOFlags, AAInfo, nullptr,
8992 IsExpanding);
8993}
8994
8996 EVT VT, SDValue Chain, SDValue Ptr,
8997 SDValue Mask, SDValue EVL, EVT MemVT,
8998 MachineMemOperand *MMO, bool IsExpanding) {
8999 SDValue Undef = getUNDEF(Ptr.getValueType());
9000 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
9001 EVL, MemVT, MMO, IsExpanding);
9002}
9003
9007 auto *LD = cast<VPLoadSDNode>(OrigLoad);
9008 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
9009 // Don't propagate the invariant or dereferenceable flags.
9010 auto MMOFlags =
9011 LD->getMemOperand()->getFlags() &
9013 return getLoadVP(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
9014 LD->getChain(), Base, Offset, LD->getMask(),
9015 LD->getVectorLength(), LD->getPointerInfo(),
9016 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo(),
9017 nullptr, LD->isExpandingLoad());
9018}
9019
9022 SDValue EVL, EVT MemVT, MachineMemOperand *MMO,
9023 ISD::MemIndexedMode AM, bool IsTruncating,
9024 bool IsCompressing) {
9025 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9026 bool Indexed = AM != ISD::UNINDEXED;
9027 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
9028 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
9029 : getVTList(MVT::Other);
9030 SDValue Ops[] = {Chain, Val, Ptr, Offset, Mask, EVL};
9032 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
9033 ID.AddInteger(MemVT.getRawBits());
9034 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
9035 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
9036 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9037 ID.AddInteger(MMO->getFlags());
9038 void *IP = nullptr;
9039 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9040 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
9041 return SDValue(E, 0);
9042 }
9043 auto *N = newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
9044 IsTruncating, IsCompressing, MemVT, MMO);
9045 createOperands(N, Ops);
9046
9047 CSEMap.InsertNode(N, IP);
9048 InsertNode(N);
9049 SDValue V(N, 0);
9050 NewSDValueDbgMsg(V, "Creating new node: ", this);
9051 return V;
9052}
9053
9055 SDValue Val, SDValue Ptr, SDValue Mask,
9056 SDValue EVL, MachinePointerInfo PtrInfo,
9057 EVT SVT, Align Alignment,
9058 MachineMemOperand::Flags MMOFlags,
9059 const AAMDNodes &AAInfo,
9060 bool IsCompressing) {
9061 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9062
9063 MMOFlags |= MachineMemOperand::MOStore;
9064 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
9065
9066 if (PtrInfo.V.isNull())
9067 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
9068
9071 PtrInfo, MMOFlags, LocationSize::precise(SVT.getStoreSize()), Alignment,
9072 AAInfo);
9073 return getTruncStoreVP(Chain, dl, Val, Ptr, Mask, EVL, SVT, MMO,
9074 IsCompressing);
9075}
9076
9078 SDValue Val, SDValue Ptr, SDValue Mask,
9079 SDValue EVL, EVT SVT,
9080 MachineMemOperand *MMO,
9081 bool IsCompressing) {
9082 EVT VT = Val.getValueType();
9083
9084 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9085 if (VT == SVT)
9086 return getStoreVP(Chain, dl, Val, Ptr, getUNDEF(Ptr.getValueType()), Mask,
9087 EVL, VT, MMO, ISD::UNINDEXED,
9088 /*IsTruncating*/ false, IsCompressing);
9089
9091 "Should only be a truncating store, not extending!");
9092 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
9093 assert(VT.isVector() == SVT.isVector() &&
9094 "Cannot use trunc store to convert to or from a vector!");
9095 assert((!VT.isVector() ||
9097 "Cannot use trunc store to change the number of vector elements!");
9098
9099 SDVTList VTs = getVTList(MVT::Other);
9100 SDValue Undef = getUNDEF(Ptr.getValueType());
9101 SDValue Ops[] = {Chain, Val, Ptr, Undef, Mask, EVL};
9103 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
9104 ID.AddInteger(SVT.getRawBits());
9105 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
9106 dl.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
9107 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9108 ID.AddInteger(MMO->getFlags());
9109 void *IP = nullptr;
9110 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9111 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
9112 return SDValue(E, 0);
9113 }
9114 auto *N =
9115 newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
9116 ISD::UNINDEXED, true, IsCompressing, SVT, MMO);
9117 createOperands(N, Ops);
9118
9119 CSEMap.InsertNode(N, IP);
9120 InsertNode(N);
9121 SDValue V(N, 0);
9122 NewSDValueDbgMsg(V, "Creating new node: ", this);
9123 return V;
9124}
9125
9129 auto *ST = cast<VPStoreSDNode>(OrigStore);
9130 assert(ST->getOffset().isUndef() && "Store is already an indexed store!");
9131 SDVTList VTs = getVTList(Base.getValueType(), MVT::Other);
9132 SDValue Ops[] = {ST->getChain(), ST->getValue(), Base,
9133 Offset, ST->getMask(), ST->getVectorLength()};
9135 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
9136 ID.AddInteger(ST->getMemoryVT().getRawBits());
9137 ID.AddInteger(ST->getRawSubclassData());
9138 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
9139 ID.AddInteger(ST->getMemOperand()->getFlags());
9140 void *IP = nullptr;
9141 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
9142 return SDValue(E, 0);
9143
9144 auto *N = newSDNode<VPStoreSDNode>(
9145 dl.getIROrder(), dl.getDebugLoc(), VTs, AM, ST->isTruncatingStore(),
9146 ST->isCompressingStore(), ST->getMemoryVT(), ST->getMemOperand());
9147 createOperands(N, Ops);
9148
9149 CSEMap.InsertNode(N, IP);
9150 InsertNode(N);
9151 SDValue V(N, 0);
9152 NewSDValueDbgMsg(V, "Creating new node: ", this);
9153 return V;
9154}
9155
9157 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL,
9158 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask,
9159 SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding) {
9160 bool Indexed = AM != ISD::UNINDEXED;
9161 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
9162
9163 SDValue Ops[] = {Chain, Ptr, Offset, Stride, Mask, EVL};
9164 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
9165 : getVTList(VT, MVT::Other);
9167 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_LOAD, VTs, Ops);
9168 ID.AddInteger(VT.getRawBits());
9169 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedLoadSDNode>(
9170 DL.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
9171 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9172
9173 void *IP = nullptr;
9174 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
9175 cast<VPStridedLoadSDNode>(E)->refineAlignment(MMO);
9176 return SDValue(E, 0);
9177 }
9178
9179 auto *N =
9180 newSDNode<VPStridedLoadSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, AM,
9181 ExtType, IsExpanding, MemVT, MMO);
9182 createOperands(N, Ops);
9183 CSEMap.InsertNode(N, IP);
9184 InsertNode(N);
9185 SDValue V(N, 0);
9186 NewSDValueDbgMsg(V, "Creating new node: ", this);
9187 return V;
9188}
9189
9191 SDValue Ptr, SDValue Stride,
9192 SDValue Mask, SDValue EVL,
9193 MachineMemOperand *MMO,
9194 bool IsExpanding) {
9195 SDValue Undef = getUNDEF(Ptr.getValueType());
9197 Undef, Stride, Mask, EVL, VT, MMO, IsExpanding);
9198}
9199
9201 ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain,
9202 SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT,
9203 MachineMemOperand *MMO, bool IsExpanding) {
9204 SDValue Undef = getUNDEF(Ptr.getValueType());
9205 return getStridedLoadVP(ISD::UNINDEXED, ExtType, VT, DL, Chain, Ptr, Undef,
9206 Stride, Mask, EVL, MemVT, MMO, IsExpanding);
9207}
9208
9210 SDValue Val, SDValue Ptr,
9211 SDValue Offset, SDValue Stride,
9212 SDValue Mask, SDValue EVL, EVT MemVT,
9213 MachineMemOperand *MMO,
9215 bool IsTruncating, bool IsCompressing) {
9216 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9217 bool Indexed = AM != ISD::UNINDEXED;
9218 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
9219 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
9220 : getVTList(MVT::Other);
9221 SDValue Ops[] = {Chain, Val, Ptr, Offset, Stride, Mask, EVL};
9223 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
9224 ID.AddInteger(MemVT.getRawBits());
9225 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
9226 DL.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
9227 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9228 void *IP = nullptr;
9229 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
9230 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
9231 return SDValue(E, 0);
9232 }
9233 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
9234 VTs, AM, IsTruncating,
9235 IsCompressing, MemVT, MMO);
9236 createOperands(N, Ops);
9237
9238 CSEMap.InsertNode(N, IP);
9239 InsertNode(N);
9240 SDValue V(N, 0);
9241 NewSDValueDbgMsg(V, "Creating new node: ", this);
9242 return V;
9243}
9244
9246 SDValue Val, SDValue Ptr,
9247 SDValue Stride, SDValue Mask,
9248 SDValue EVL, EVT SVT,
9249 MachineMemOperand *MMO,
9250 bool IsCompressing) {
9251 EVT VT = Val.getValueType();
9252
9253 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9254 if (VT == SVT)
9255 return getStridedStoreVP(Chain, DL, Val, Ptr, getUNDEF(Ptr.getValueType()),
9256 Stride, Mask, EVL, VT, MMO, ISD::UNINDEXED,
9257 /*IsTruncating*/ false, IsCompressing);
9258
9260 "Should only be a truncating store, not extending!");
9261 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
9262 assert(VT.isVector() == SVT.isVector() &&
9263 "Cannot use trunc store to convert to or from a vector!");
9264 assert((!VT.isVector() ||
9266 "Cannot use trunc store to change the number of vector elements!");
9267
9268 SDVTList VTs = getVTList(MVT::Other);
9269 SDValue Undef = getUNDEF(Ptr.getValueType());
9270 SDValue Ops[] = {Chain, Val, Ptr, Undef, Stride, Mask, EVL};
9272 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
9273 ID.AddInteger(SVT.getRawBits());
9274 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
9275 DL.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
9276 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9277 void *IP = nullptr;
9278 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
9279 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
9280 return SDValue(E, 0);
9281 }
9282 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
9283 VTs, ISD::UNINDEXED, true,
9284 IsCompressing, SVT, MMO);
9285 createOperands(N, Ops);
9286
9287 CSEMap.InsertNode(N, IP);
9288 InsertNode(N);
9289 SDValue V(N, 0);
9290 NewSDValueDbgMsg(V, "Creating new node: ", this);
9291 return V;
9292}
9293
9296 ISD::MemIndexType IndexType) {
9297 assert(Ops.size() == 6 && "Incompatible number of operands");
9298
9300 AddNodeIDNode(ID, ISD::VP_GATHER, VTs, Ops);
9301 ID.AddInteger(VT.getRawBits());
9302 ID.AddInteger(getSyntheticNodeSubclassData<VPGatherSDNode>(
9303 dl.getIROrder(), VTs, VT, MMO, IndexType));
9304 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9305 ID.AddInteger(MMO->getFlags());
9306 void *IP = nullptr;
9307 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9308 cast<VPGatherSDNode>(E)->refineAlignment(MMO);
9309 return SDValue(E, 0);
9310 }
9311
9312 auto *N = newSDNode<VPGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
9313 VT, MMO, IndexType);
9314 createOperands(N, Ops);
9315
9316 assert(N->getMask().getValueType().getVectorElementCount() ==
9317 N->getValueType(0).getVectorElementCount() &&
9318 "Vector width mismatch between mask and data");
9319 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
9320 N->getValueType(0).getVectorElementCount().isScalable() &&
9321 "Scalable flags of index and data do not match");
9323 N->getIndex().getValueType().getVectorElementCount(),
9324 N->getValueType(0).getVectorElementCount()) &&
9325 "Vector width mismatch between index and data");
9326 assert(isa<ConstantSDNode>(N->getScale()) &&
9327 N->getScale()->getAsAPIntVal().isPowerOf2() &&
9328 "Scale should be a constant power of 2");
9329
9330 CSEMap.InsertNode(N, IP);
9331 InsertNode(N);
9332 SDValue V(N, 0);
9333 NewSDValueDbgMsg(V, "Creating new node: ", this);
9334 return V;
9335}
9336
9339 MachineMemOperand *MMO,
9340 ISD::MemIndexType IndexType) {
9341 assert(Ops.size() == 7 && "Incompatible number of operands");
9342
9344 AddNodeIDNode(ID, ISD::VP_SCATTER, VTs, Ops);
9345 ID.AddInteger(VT.getRawBits());
9346 ID.AddInteger(getSyntheticNodeSubclassData<VPScatterSDNode>(
9347 dl.getIROrder(), VTs, VT, MMO, IndexType));
9348 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9349 ID.AddInteger(MMO->getFlags());
9350 void *IP = nullptr;
9351 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9352 cast<VPScatterSDNode>(E)->refineAlignment(MMO);
9353 return SDValue(E, 0);
9354 }
9355 auto *N = newSDNode<VPScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
9356 VT, MMO, IndexType);
9357 createOperands(N, Ops);
9358
9359 assert(N->getMask().getValueType().getVectorElementCount() ==
9360 N->getValue().getValueType().getVectorElementCount() &&
9361 "Vector width mismatch between mask and data");
9362 assert(
9363 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
9364 N->getValue().getValueType().getVectorElementCount().isScalable() &&
9365 "Scalable flags of index and data do not match");
9367 N->getIndex().getValueType().getVectorElementCount(),
9368 N->getValue().getValueType().getVectorElementCount()) &&
9369 "Vector width mismatch between index and data");
9370 assert(isa<ConstantSDNode>(N->getScale()) &&
9371 N->getScale()->getAsAPIntVal().isPowerOf2() &&
9372 "Scale should be a constant power of 2");
9373
9374 CSEMap.InsertNode(N, IP);
9375 InsertNode(N);
9376 SDValue V(N, 0);
9377 NewSDValueDbgMsg(V, "Creating new node: ", this);
9378 return V;
9379}
9380
9383 SDValue PassThru, EVT MemVT,
9384 MachineMemOperand *MMO,
9386 ISD::LoadExtType ExtTy, bool isExpanding) {
9387 bool Indexed = AM != ISD::UNINDEXED;
9388 assert((Indexed || Offset.isUndef()) &&
9389 "Unindexed masked load with an offset!");
9390 SDVTList VTs = Indexed ? getVTList(VT, Base.getValueType(), MVT::Other)
9391 : getVTList(VT, MVT::Other);
9392 SDValue Ops[] = {Chain, Base, Offset, Mask, PassThru};
9394 AddNodeIDNode(ID, ISD::MLOAD, VTs, Ops);
9395 ID.AddInteger(MemVT.getRawBits());
9396 ID.AddInteger(getSyntheticNodeSubclassData<MaskedLoadSDNode>(
9397 dl.getIROrder(), VTs, AM, ExtTy, isExpanding, MemVT, MMO));
9398 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9399 ID.AddInteger(MMO->getFlags());
9400 void *IP = nullptr;
9401 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9402 cast<MaskedLoadSDNode>(E)->refineAlignment(MMO);
9403 return SDValue(E, 0);
9404 }
9405 auto *N = newSDNode<MaskedLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
9406 AM, ExtTy, isExpanding, MemVT, MMO);
9407 createOperands(N, Ops);
9408
9409 CSEMap.InsertNode(N, IP);
9410 InsertNode(N);
9411 SDValue V(N, 0);
9412 NewSDValueDbgMsg(V, "Creating new node: ", this);
9413 return V;
9414}
9415
9419 MaskedLoadSDNode *LD = cast<MaskedLoadSDNode>(OrigLoad);
9420 assert(LD->getOffset().isUndef() && "Masked load is already a indexed load!");
9421 return getMaskedLoad(OrigLoad.getValueType(), dl, LD->getChain(), Base,
9422 Offset, LD->getMask(), LD->getPassThru(),
9423 LD->getMemoryVT(), LD->getMemOperand(), AM,
9424 LD->getExtensionType(), LD->isExpandingLoad());
9425}
9426
9429 SDValue Mask, EVT MemVT,
9430 MachineMemOperand *MMO,
9431 ISD::MemIndexedMode AM, bool IsTruncating,
9432 bool IsCompressing) {
9433 assert(Chain.getValueType() == MVT::Other &&
9434 "Invalid chain type");
9435 bool Indexed = AM != ISD::UNINDEXED;
9436 assert((Indexed || Offset.isUndef()) &&
9437 "Unindexed masked store with an offset!");
9438 SDVTList VTs = Indexed ? getVTList(Base.getValueType(), MVT::Other)
9439 : getVTList(MVT::Other);
9440 SDValue Ops[] = {Chain, Val, Base, Offset, Mask};
9442 AddNodeIDNode(ID, ISD::MSTORE, VTs, Ops);
9443 ID.AddInteger(MemVT.getRawBits());
9444 ID.AddInteger(getSyntheticNodeSubclassData<MaskedStoreSDNode>(
9445 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
9446 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9447 ID.AddInteger(MMO->getFlags());
9448 void *IP = nullptr;
9449 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9450 cast<MaskedStoreSDNode>(E)->refineAlignment(MMO);
9451 return SDValue(E, 0);
9452 }
9453 auto *N =
9454 newSDNode<MaskedStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
9455 IsTruncating, IsCompressing, MemVT, MMO);
9456 createOperands(N, Ops);
9457
9458 CSEMap.InsertNode(N, IP);
9459 InsertNode(N);
9460 SDValue V(N, 0);
9461 NewSDValueDbgMsg(V, "Creating new node: ", this);
9462 return V;
9463}
9464
9468 MaskedStoreSDNode *ST = cast<MaskedStoreSDNode>(OrigStore);
9469 assert(ST->getOffset().isUndef() &&
9470 "Masked store is already a indexed store!");
9471 return getMaskedStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
9472 ST->getMask(), ST->getMemoryVT(), ST->getMemOperand(),
9473 AM, ST->isTruncatingStore(), ST->isCompressingStore());
9474}
9475
9478 MachineMemOperand *MMO,
9479 ISD::MemIndexType IndexType,
9480 ISD::LoadExtType ExtTy) {
9481 assert(Ops.size() == 6 && "Incompatible number of operands");
9482
9484 AddNodeIDNode(ID, ISD::MGATHER, VTs, Ops);
9485 ID.AddInteger(MemVT.getRawBits());
9486 ID.AddInteger(getSyntheticNodeSubclassData<MaskedGatherSDNode>(
9487 dl.getIROrder(), VTs, MemVT, MMO, IndexType, ExtTy));
9488 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9489 ID.AddInteger(MMO->getFlags());
9490 void *IP = nullptr;
9491 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9492 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
9493 return SDValue(E, 0);
9494 }
9495
9496 auto *N = newSDNode<MaskedGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(),
9497 VTs, MemVT, MMO, IndexType, ExtTy);
9498 createOperands(N, Ops);
9499
9500 assert(N->getPassThru().getValueType() == N->getValueType(0) &&
9501 "Incompatible type of the PassThru value in MaskedGatherSDNode");
9502 assert(N->getMask().getValueType().getVectorElementCount() ==
9503 N->getValueType(0).getVectorElementCount() &&
9504 "Vector width mismatch between mask and data");
9505 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
9506 N->getValueType(0).getVectorElementCount().isScalable() &&
9507 "Scalable flags of index and data do not match");
9509 N->getIndex().getValueType().getVectorElementCount(),
9510 N->getValueType(0).getVectorElementCount()) &&
9511 "Vector width mismatch between index and data");
9512 assert(isa<ConstantSDNode>(N->getScale()) &&
9513 N->getScale()->getAsAPIntVal().isPowerOf2() &&
9514 "Scale should be a constant power of 2");
9515
9516 CSEMap.InsertNode(N, IP);
9517 InsertNode(N);
9518 SDValue V(N, 0);
9519 NewSDValueDbgMsg(V, "Creating new node: ", this);
9520 return V;
9521}
9522
9525 MachineMemOperand *MMO,
9526 ISD::MemIndexType IndexType,
9527 bool IsTrunc) {
9528 assert(Ops.size() == 6 && "Incompatible number of operands");
9529
9531 AddNodeIDNode(ID, ISD::MSCATTER, VTs, Ops);
9532 ID.AddInteger(MemVT.getRawBits());
9533 ID.AddInteger(getSyntheticNodeSubclassData<MaskedScatterSDNode>(
9534 dl.getIROrder(), VTs, MemVT, MMO, IndexType, IsTrunc));
9535 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9536 ID.AddInteger(MMO->getFlags());
9537 void *IP = nullptr;
9538 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9539 cast<MaskedScatterSDNode>(E)->refineAlignment(MMO);
9540 return SDValue(E, 0);
9541 }
9542
9543 auto *N = newSDNode<MaskedScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(),
9544 VTs, MemVT, MMO, IndexType, IsTrunc);
9545 createOperands(N, Ops);
9546
9547 assert(N->getMask().getValueType().getVectorElementCount() ==
9548 N->getValue().getValueType().getVectorElementCount() &&
9549 "Vector width mismatch between mask and data");
9550 assert(
9551 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
9552 N->getValue().getValueType().getVectorElementCount().isScalable() &&
9553 "Scalable flags of index and data do not match");
9555 N->getIndex().getValueType().getVectorElementCount(),
9556 N->getValue().getValueType().getVectorElementCount()) &&
9557 "Vector width mismatch between index and data");
9558 assert(isa<ConstantSDNode>(N->getScale()) &&
9559 N->getScale()->getAsAPIntVal().isPowerOf2() &&
9560 "Scale should be a constant power of 2");
9561
9562 CSEMap.InsertNode(N, IP);
9563 InsertNode(N);
9564 SDValue V(N, 0);
9565 NewSDValueDbgMsg(V, "Creating new node: ", this);
9566 return V;
9567}
9568
9570 EVT MemVT, MachineMemOperand *MMO) {
9571 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9572 SDVTList VTs = getVTList(MVT::Other);
9573 SDValue Ops[] = {Chain, Ptr};
9576 ID.AddInteger(MemVT.getRawBits());
9577 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
9578 ISD::GET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
9579 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9580 ID.AddInteger(MMO->getFlags());
9581 void *IP = nullptr;
9582 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
9583 return SDValue(E, 0);
9584
9585 auto *N = newSDNode<FPStateAccessSDNode>(ISD::GET_FPENV_MEM, dl.getIROrder(),
9586 dl.getDebugLoc(), VTs, MemVT, MMO);
9587 createOperands(N, Ops);
9588
9589 CSEMap.InsertNode(N, IP);
9590 InsertNode(N);
9591 SDValue V(N, 0);
9592 NewSDValueDbgMsg(V, "Creating new node: ", this);
9593 return V;
9594}
9595
9597 EVT MemVT, MachineMemOperand *MMO) {
9598 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9599 SDVTList VTs = getVTList(MVT::Other);
9600 SDValue Ops[] = {Chain, Ptr};
9603 ID.AddInteger(MemVT.getRawBits());
9604 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
9605 ISD::SET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
9606 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9607 ID.AddInteger(MMO->getFlags());
9608 void *IP = nullptr;
9609 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
9610 return SDValue(E, 0);
9611
9612 auto *N = newSDNode<FPStateAccessSDNode>(ISD::SET_FPENV_MEM, dl.getIROrder(),
9613 dl.getDebugLoc(), VTs, MemVT, MMO);
9614 createOperands(N, Ops);
9615
9616 CSEMap.InsertNode(N, IP);
9617 InsertNode(N);
9618 SDValue V(N, 0);
9619 NewSDValueDbgMsg(V, "Creating new node: ", this);
9620 return V;
9621}
9622
9624 // select undef, T, F --> T (if T is a constant), otherwise F
9625 // select, ?, undef, F --> F
9626 // select, ?, T, undef --> T
9627 if (Cond.isUndef())
9628 return isConstantValueOfAnyType(T) ? T : F;
9629 if (T.isUndef())
9630 return F;
9631 if (F.isUndef())
9632 return T;
9633
9634 // select true, T, F --> T
9635 // select false, T, F --> F
9636 if (auto *CondC = dyn_cast<ConstantSDNode>(Cond))
9637 return CondC->isZero() ? F : T;
9638
9639 // TODO: This should simplify VSELECT with non-zero constant condition using
9640 // something like this (but check boolean contents to be complete?):
9641 if (ConstantSDNode *CondC = isConstOrConstSplat(Cond, /*AllowUndefs*/ false,
9642 /*AllowTruncation*/ true))
9643 if (CondC->isZero())
9644 return F;
9645
9646 // select ?, T, T --> T
9647 if (T == F)
9648 return T;
9649
9650 return SDValue();
9651}
9652
9654 // shift undef, Y --> 0 (can always assume that the undef value is 0)
9655 if (X.isUndef())
9656 return getConstant(0, SDLoc(X.getNode()), X.getValueType());
9657 // shift X, undef --> undef (because it may shift by the bitwidth)
9658 if (Y.isUndef())
9659 return getUNDEF(X.getValueType());
9660
9661 // shift 0, Y --> 0
9662 // shift X, 0 --> X
9664 return X;
9665
9666 // shift X, C >= bitwidth(X) --> undef
9667 // All vector elements must be too big (or undef) to avoid partial undefs.
9668 auto isShiftTooBig = [X](ConstantSDNode *Val) {
9669 return !Val || Val->getAPIntValue().uge(X.getScalarValueSizeInBits());
9670 };
9671 if (ISD::matchUnaryPredicate(Y, isShiftTooBig, true))
9672 return getUNDEF(X.getValueType());
9673
9674 // shift i1/vXi1 X, Y --> X (any non-zero shift amount is undefined).
9675 if (X.getValueType().getScalarType() == MVT::i1)
9676 return X;
9677
9678 return SDValue();
9679}
9680
9682 SDNodeFlags Flags) {
9683 // If this operation has 'nnan' or 'ninf' and at least 1 disallowed operand
9684 // (an undef operand can be chosen to be Nan/Inf), then the result of this
9685 // operation is poison. That result can be relaxed to undef.
9686 ConstantFPSDNode *XC = isConstOrConstSplatFP(X, /* AllowUndefs */ true);
9687 ConstantFPSDNode *YC = isConstOrConstSplatFP(Y, /* AllowUndefs */ true);
9688 bool HasNan = (XC && XC->getValueAPF().isNaN()) ||
9689 (YC && YC->getValueAPF().isNaN());
9690 bool HasInf = (XC && XC->getValueAPF().isInfinity()) ||
9691 (YC && YC->getValueAPF().isInfinity());
9692
9693 if (Flags.hasNoNaNs() && (HasNan || X.isUndef() || Y.isUndef()))
9694 return getUNDEF(X.getValueType());
9695
9696 if (Flags.hasNoInfs() && (HasInf || X.isUndef() || Y.isUndef()))
9697 return getUNDEF(X.getValueType());
9698
9699 if (!YC)
9700 return SDValue();
9701
9702 // X + -0.0 --> X
9703 if (Opcode == ISD::FADD)
9704 if (YC->getValueAPF().isNegZero())
9705 return X;
9706
9707 // X - +0.0 --> X
9708 if (Opcode == ISD::FSUB)
9709 if (YC->getValueAPF().isPosZero())
9710 return X;
9711
9712 // X * 1.0 --> X
9713 // X / 1.0 --> X
9714 if (Opcode == ISD::FMUL || Opcode == ISD::FDIV)
9715 if (YC->getValueAPF().isExactlyValue(1.0))
9716 return X;
9717
9718 // X * 0.0 --> 0.0
9719 if (Opcode == ISD::FMUL && Flags.hasNoNaNs() && Flags.hasNoSignedZeros())
9720 if (YC->getValueAPF().isZero())
9721 return getConstantFP(0.0, SDLoc(Y), Y.getValueType());
9722
9723 return SDValue();
9724}
9725
9727 SDValue Ptr, SDValue SV, unsigned Align) {
9728 SDValue Ops[] = { Chain, Ptr, SV, getTargetConstant(Align, dl, MVT::i32) };
9729 return getNode(ISD::VAARG, dl, getVTList(VT, MVT::Other), Ops);
9730}
9731
9732SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9733 ArrayRef<SDUse> Ops) {
9734 switch (Ops.size()) {
9735 case 0: return getNode(Opcode, DL, VT);
9736 case 1: return getNode(Opcode, DL, VT, static_cast<const SDValue>(Ops[0]));
9737 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]);
9738 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]);
9739 default: break;
9740 }
9741
9742 // Copy from an SDUse array into an SDValue array for use with
9743 // the regular getNode logic.
9744 SmallVector<SDValue, 8> NewOps(Ops.begin(), Ops.end());
9745 return getNode(Opcode, DL, VT, NewOps);
9746}
9747
9748SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9749 ArrayRef<SDValue> Ops) {
9750 SDNodeFlags Flags;
9751 if (Inserter)
9752 Flags = Inserter->getFlags();
9753 return getNode(Opcode, DL, VT, Ops, Flags);
9754}
9755
9756SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9757 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
9758 unsigned NumOps = Ops.size();
9759 switch (NumOps) {
9760 case 0: return getNode(Opcode, DL, VT);
9761 case 1: return getNode(Opcode, DL, VT, Ops[0], Flags);
9762 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Flags);
9763 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2], Flags);
9764 default: break;
9765 }
9766
9767#ifndef NDEBUG
9768 for (const auto &Op : Ops)
9769 assert(Op.getOpcode() != ISD::DELETED_NODE &&
9770 "Operand is DELETED_NODE!");
9771#endif
9772
9773 switch (Opcode) {
9774 default: break;
9775 case ISD::BUILD_VECTOR:
9776 // Attempt to simplify BUILD_VECTOR.
9777 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
9778 return V;
9779 break;
9781 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
9782 return V;
9783 break;
9784 case ISD::SELECT_CC:
9785 assert(NumOps == 5 && "SELECT_CC takes 5 operands!");
9786 assert(Ops[0].getValueType() == Ops[1].getValueType() &&
9787 "LHS and RHS of condition must have same type!");
9788 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
9789 "True and False arms of SelectCC must have same type!");
9790 assert(Ops[2].getValueType() == VT &&
9791 "select_cc node must be of same type as true and false value!");
9792 assert((!Ops[0].getValueType().isVector() ||
9793 Ops[0].getValueType().getVectorElementCount() ==
9794 VT.getVectorElementCount()) &&
9795 "Expected select_cc with vector result to have the same sized "
9796 "comparison type!");
9797 break;
9798 case ISD::BR_CC:
9799 assert(NumOps == 5 && "BR_CC takes 5 operands!");
9800 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
9801 "LHS/RHS of comparison should match types!");
9802 break;
9803 case ISD::VP_ADD:
9804 case ISD::VP_SUB:
9805 // If it is VP_ADD/VP_SUB mask operation then turn it to VP_XOR
9806 if (VT.isVector() && VT.getVectorElementType() == MVT::i1)
9807 Opcode = ISD::VP_XOR;
9808 break;
9809 case ISD::VP_MUL:
9810 // If it is VP_MUL mask operation then turn it to VP_AND
9811 if (VT.isVector() && VT.getVectorElementType() == MVT::i1)
9812 Opcode = ISD::VP_AND;
9813 break;
9814 case ISD::VP_REDUCE_MUL:
9815 // If it is VP_REDUCE_MUL mask operation then turn it to VP_REDUCE_AND
9816 if (VT == MVT::i1)
9817 Opcode = ISD::VP_REDUCE_AND;
9818 break;
9819 case ISD::VP_REDUCE_ADD:
9820 // If it is VP_REDUCE_ADD mask operation then turn it to VP_REDUCE_XOR
9821 if (VT == MVT::i1)
9822 Opcode = ISD::VP_REDUCE_XOR;
9823 break;
9824 case ISD::VP_REDUCE_SMAX:
9825 case ISD::VP_REDUCE_UMIN:
9826 // If it is VP_REDUCE_SMAX/VP_REDUCE_UMIN mask operation then turn it to
9827 // VP_REDUCE_AND.
9828 if (VT == MVT::i1)
9829 Opcode = ISD::VP_REDUCE_AND;
9830 break;
9831 case ISD::VP_REDUCE_SMIN:
9832 case ISD::VP_REDUCE_UMAX:
9833 // If it is VP_REDUCE_SMIN/VP_REDUCE_UMAX mask operation then turn it to
9834 // VP_REDUCE_OR.
9835 if (VT == MVT::i1)
9836 Opcode = ISD::VP_REDUCE_OR;
9837 break;
9838 }
9839
9840 // Memoize nodes.
9841 SDNode *N;
9842 SDVTList VTs = getVTList(VT);
9843
9844 if (VT != MVT::Glue) {
9846 AddNodeIDNode(ID, Opcode, VTs, Ops);
9847 void *IP = nullptr;
9848
9849 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
9850 return SDValue(E, 0);
9851
9852 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9853 createOperands(N, Ops);
9854
9855 CSEMap.InsertNode(N, IP);
9856 } else {
9857 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9858 createOperands(N, Ops);
9859 }
9860
9861 N->setFlags(Flags);
9862 InsertNode(N);
9863 SDValue V(N, 0);
9864 NewSDValueDbgMsg(V, "Creating new node: ", this);
9865 return V;
9866}
9867
9868SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
9869 ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops) {
9870 return getNode(Opcode, DL, getVTList(ResultTys), Ops);
9871}
9872
9873SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
9874 ArrayRef<SDValue> Ops) {
9875 SDNodeFlags Flags;
9876 if (Inserter)
9877 Flags = Inserter->getFlags();
9878 return getNode(Opcode, DL, VTList, Ops, Flags);
9879}
9880
9881SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
9882 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
9883 if (VTList.NumVTs == 1)
9884 return getNode(Opcode, DL, VTList.VTs[0], Ops, Flags);
9885
9886#ifndef NDEBUG
9887 for (const auto &Op : Ops)
9888 assert(Op.getOpcode() != ISD::DELETED_NODE &&
9889 "Operand is DELETED_NODE!");
9890#endif
9891
9892 switch (Opcode) {
9893 case ISD::SADDO:
9894 case ISD::UADDO:
9895 case ISD::SSUBO:
9896 case ISD::USUBO: {
9897 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
9898 "Invalid add/sub overflow op!");
9899 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
9900 Ops[0].getValueType() == Ops[1].getValueType() &&
9901 Ops[0].getValueType() == VTList.VTs[0] &&
9902 "Binary operator types must match!");
9903 SDValue N1 = Ops[0], N2 = Ops[1];
9904 canonicalizeCommutativeBinop(Opcode, N1, N2);
9905
9906 // (X +- 0) -> X with zero-overflow.
9907 ConstantSDNode *N2CV = isConstOrConstSplat(N2, /*AllowUndefs*/ false,
9908 /*AllowTruncation*/ true);
9909 if (N2CV && N2CV->isZero()) {
9910 SDValue ZeroOverFlow = getConstant(0, DL, VTList.VTs[1]);
9911 return getNode(ISD::MERGE_VALUES, DL, VTList, {N1, ZeroOverFlow}, Flags);
9912 }
9913
9914 if (VTList.VTs[0].isVector() &&
9915 VTList.VTs[0].getVectorElementType() == MVT::i1 &&
9916 VTList.VTs[1].getVectorElementType() == MVT::i1) {
9917 SDValue F1 = getFreeze(N1);
9918 SDValue F2 = getFreeze(N2);
9919 // {vXi1,vXi1} (u/s)addo(vXi1 x, vXi1y) -> {xor(x,y),and(x,y)}
9920 if (Opcode == ISD::UADDO || Opcode == ISD::SADDO)
9921 return getNode(ISD::MERGE_VALUES, DL, VTList,
9922 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
9923 getNode(ISD::AND, DL, VTList.VTs[1], F1, F2)},
9924 Flags);
9925 // {vXi1,vXi1} (u/s)subo(vXi1 x, vXi1y) -> {xor(x,y),and(~x,y)}
9926 if (Opcode == ISD::USUBO || Opcode == ISD::SSUBO) {
9927 SDValue NotF1 = getNOT(DL, F1, VTList.VTs[0]);
9928 return getNode(ISD::MERGE_VALUES, DL, VTList,
9929 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
9930 getNode(ISD::AND, DL, VTList.VTs[1], NotF1, F2)},
9931 Flags);
9932 }
9933 }
9934 break;
9935 }
9936 case ISD::SADDO_CARRY:
9937 case ISD::UADDO_CARRY:
9938 case ISD::SSUBO_CARRY:
9939 case ISD::USUBO_CARRY:
9940 assert(VTList.NumVTs == 2 && Ops.size() == 3 &&
9941 "Invalid add/sub overflow op!");
9942 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
9943 Ops[0].getValueType() == Ops[1].getValueType() &&
9944 Ops[0].getValueType() == VTList.VTs[0] &&
9945 Ops[2].getValueType() == VTList.VTs[1] &&
9946 "Binary operator types must match!");
9947 break;
9948 case ISD::SMUL_LOHI:
9949 case ISD::UMUL_LOHI: {
9950 assert(VTList.NumVTs == 2 && Ops.size() == 2 && "Invalid mul lo/hi op!");
9951 assert(VTList.VTs[0].isInteger() && VTList.VTs[0] == VTList.VTs[1] &&
9952 VTList.VTs[0] == Ops[0].getValueType() &&
9953 VTList.VTs[0] == Ops[1].getValueType() &&
9954 "Binary operator types must match!");
9955 // Constant fold.
9956 ConstantSDNode *LHS = dyn_cast<ConstantSDNode>(Ops[0]);
9957 ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(Ops[1]);
9958 if (LHS && RHS) {
9959 unsigned Width = VTList.VTs[0].getScalarSizeInBits();
9960 unsigned OutWidth = Width * 2;
9961 APInt Val = LHS->getAPIntValue();
9962 APInt Mul = RHS->getAPIntValue();
9963 if (Opcode == ISD::SMUL_LOHI) {
9964 Val = Val.sext(OutWidth);
9965 Mul = Mul.sext(OutWidth);
9966 } else {
9967 Val = Val.zext(OutWidth);
9968 Mul = Mul.zext(OutWidth);
9969 }
9970 Val *= Mul;
9971
9972 SDValue Hi =
9973 getConstant(Val.extractBits(Width, Width), DL, VTList.VTs[0]);
9974 SDValue Lo = getConstant(Val.trunc(Width), DL, VTList.VTs[0]);
9975 return getNode(ISD::MERGE_VALUES, DL, VTList, {Lo, Hi}, Flags);
9976 }
9977 break;
9978 }
9979 case ISD::FFREXP: {
9980 assert(VTList.NumVTs == 2 && Ops.size() == 1 && "Invalid ffrexp op!");
9981 assert(VTList.VTs[0].isFloatingPoint() && VTList.VTs[1].isInteger() &&
9982 VTList.VTs[0] == Ops[0].getValueType() && "frexp type mismatch");
9983
9984 if (const ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Ops[0])) {
9985 int FrexpExp;
9986 APFloat FrexpMant =
9987 frexp(C->getValueAPF(), FrexpExp, APFloat::rmNearestTiesToEven);
9988 SDValue Result0 = getConstantFP(FrexpMant, DL, VTList.VTs[0]);
9989 SDValue Result1 =
9990 getConstant(FrexpMant.isFinite() ? FrexpExp : 0, DL, VTList.VTs[1]);
9991 return getNode(ISD::MERGE_VALUES, DL, VTList, {Result0, Result1}, Flags);
9992 }
9993
9994 break;
9995 }
9997 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
9998 "Invalid STRICT_FP_EXTEND!");
9999 assert(VTList.VTs[0].isFloatingPoint() &&
10000 Ops[1].getValueType().isFloatingPoint() && "Invalid FP cast!");
10001 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
10002 "STRICT_FP_EXTEND result type should be vector iff the operand "
10003 "type is vector!");
10004 assert((!VTList.VTs[0].isVector() ||
10005 VTList.VTs[0].getVectorElementCount() ==
10006 Ops[1].getValueType().getVectorElementCount()) &&
10007 "Vector element count mismatch!");
10008 assert(Ops[1].getValueType().bitsLT(VTList.VTs[0]) &&
10009 "Invalid fpext node, dst <= src!");
10010 break;
10012 assert(VTList.NumVTs == 2 && Ops.size() == 3 && "Invalid STRICT_FP_ROUND!");
10013 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
10014 "STRICT_FP_ROUND result type should be vector iff the operand "
10015 "type is vector!");
10016 assert((!VTList.VTs[0].isVector() ||
10017 VTList.VTs[0].getVectorElementCount() ==
10018 Ops[1].getValueType().getVectorElementCount()) &&
10019 "Vector element count mismatch!");
10020 assert(VTList.VTs[0].isFloatingPoint() &&
10021 Ops[1].getValueType().isFloatingPoint() &&
10022 VTList.VTs[0].bitsLT(Ops[1].getValueType()) &&
10023 isa<ConstantSDNode>(Ops[2]) &&
10024 (Ops[2]->getAsZExtVal() == 0 || Ops[2]->getAsZExtVal() == 1) &&
10025 "Invalid STRICT_FP_ROUND!");
10026 break;
10027#if 0
10028 // FIXME: figure out how to safely handle things like
10029 // int foo(int x) { return 1 << (x & 255); }
10030 // int bar() { return foo(256); }
10031 case ISD::SRA_PARTS:
10032 case ISD::SRL_PARTS:
10033 case ISD::SHL_PARTS:
10034 if (N3.getOpcode() == ISD::SIGN_EXTEND_INREG &&
10035 cast<VTSDNode>(N3.getOperand(1))->getVT() != MVT::i1)
10036 return getNode(Opcode, DL, VT, N1, N2, N3.getOperand(0));
10037 else if (N3.getOpcode() == ISD::AND)
10038 if (ConstantSDNode *AndRHS = dyn_cast<ConstantSDNode>(N3.getOperand(1))) {
10039 // If the and is only masking out bits that cannot effect the shift,
10040 // eliminate the and.
10041 unsigned NumBits = VT.getScalarSizeInBits()*2;
10042 if ((AndRHS->getValue() & (NumBits-1)) == NumBits-1)
10043 return getNode(Opcode, DL, VT, N1, N2, N3.getOperand(0));
10044 }
10045 break;
10046#endif
10047 }
10048
10049 // Memoize the node unless it returns a glue result.
10050 SDNode *N;
10051 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
10053 AddNodeIDNode(ID, Opcode, VTList, Ops);
10054 void *IP = nullptr;
10055 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
10056 return SDValue(E, 0);
10057
10058 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
10059 createOperands(N, Ops);
10060 CSEMap.InsertNode(N, IP);
10061 } else {
10062 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
10063 createOperands(N, Ops);
10064 }
10065
10066 N->setFlags(Flags);
10067 InsertNode(N);
10068 SDValue V(N, 0);
10069 NewSDValueDbgMsg(V, "Creating new node: ", this);
10070 return V;
10071}
10072
10073SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
10074 SDVTList VTList) {
10075 return getNode(Opcode, DL, VTList, std::nullopt);
10076}
10077
10078SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
10079 SDValue N1) {
10080 SDValue Ops[] = { N1 };
10081 return getNode(Opcode, DL, VTList, Ops);
10082}
10083
10084SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
10085 SDValue N1, SDValue N2) {
10086 SDValue Ops[] = { N1, N2 };
10087 return getNode(Opcode, DL, VTList, Ops);
10088}
10089
10090SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
10091 SDValue N1, SDValue N2, SDValue N3) {
10092 SDValue Ops[] = { N1, N2, N3 };
10093 return getNode(Opcode, DL, VTList, Ops);
10094}
10095
10096SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
10097 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
10098 SDValue Ops[] = { N1, N2, N3, N4 };
10099 return getNode(Opcode, DL, VTList, Ops);
10100}
10101
10102SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
10103 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
10104 SDValue N5) {
10105 SDValue Ops[] = { N1, N2, N3, N4, N5 };
10106 return getNode(Opcode, DL, VTList, Ops);
10107}
10108
10110 return makeVTList(SDNode::getValueTypeList(VT), 1);
10111}
10112
10115 ID.AddInteger(2U);
10116 ID.AddInteger(VT1.getRawBits());
10117 ID.AddInteger(VT2.getRawBits());
10118
10119 void *IP = nullptr;
10120 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
10121 if (!Result) {
10122 EVT *Array = Allocator.Allocate<EVT>(2);
10123 Array[0] = VT1;
10124 Array[1] = VT2;
10125 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 2);
10126 VTListMap.InsertNode(Result, IP);
10127 }
10128 return Result->getSDVTList();
10129}
10130
10133 ID.AddInteger(3U);
10134 ID.AddInteger(VT1.getRawBits());
10135 ID.AddInteger(VT2.getRawBits());
10136 ID.AddInteger(VT3.getRawBits());
10137
10138 void *IP = nullptr;
10139 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
10140 if (!Result) {
10141 EVT *Array = Allocator.Allocate<EVT>(3);
10142 Array[0] = VT1;
10143 Array[1] = VT2;
10144 Array[2] = VT3;
10145 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 3);
10146 VTListMap.InsertNode(Result, IP);
10147 }
10148 return Result->getSDVTList();
10149}
10150
10153 ID.AddInteger(4U);
10154 ID.AddInteger(VT1.getRawBits());
10155 ID.AddInteger(VT2.getRawBits());
10156 ID.AddInteger(VT3.getRawBits());
10157 ID.AddInteger(VT4.getRawBits());
10158
10159 void *IP = nullptr;
10160 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
10161 if (!Result) {
10162 EVT *Array = Allocator.Allocate<EVT>(4);
10163 Array[0] = VT1;
10164 Array[1] = VT2;
10165 Array[2] = VT3;
10166 Array[3] = VT4;
10167 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 4);
10168 VTListMap.InsertNode(Result, IP);
10169 }
10170 return Result->getSDVTList();
10171}
10172
10174 unsigned NumVTs = VTs.size();
10176 ID.AddInteger(NumVTs);
10177 for (unsigned index = 0; index < NumVTs; index++) {
10178 ID.AddInteger(VTs[index].getRawBits());
10179 }
10180
10181 void *IP = nullptr;
10182 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
10183 if (!Result) {
10184 EVT *Array = Allocator.Allocate<EVT>(NumVTs);
10185 llvm::copy(VTs, Array);
10186 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, NumVTs);
10187 VTListMap.InsertNode(Result, IP);
10188 }
10189 return Result->getSDVTList();
10190}
10191
10192
10193/// UpdateNodeOperands - *Mutate* the specified node in-place to have the
10194/// specified operands. If the resultant node already exists in the DAG,
10195/// this does not modify the specified node, instead it returns the node that
10196/// already exists. If the resultant node does not exist in the DAG, the
10197/// input node is returned. As a degenerate case, if you specify the same
10198/// input operands as the node already has, the input node is returned.
10200 assert(N->getNumOperands() == 1 && "Update with wrong number of operands");
10201
10202 // Check to see if there is no change.
10203 if (Op == N->getOperand(0)) return N;
10204
10205 // See if the modified node already exists.
10206 void *InsertPos = nullptr;
10207 if (SDNode *Existing = FindModifiedNodeSlot(N, Op, InsertPos))
10208 return Existing;
10209
10210 // Nope it doesn't. Remove the node from its current place in the maps.
10211 if (InsertPos)
10212 if (!RemoveNodeFromCSEMaps(N))
10213 InsertPos = nullptr;
10214
10215 // Now we update the operands.
10216 N->OperandList[0].set(Op);
10217
10219 // If this gets put into a CSE map, add it.
10220 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
10221 return N;
10222}
10223
10225 assert(N->getNumOperands() == 2 && "Update with wrong number of operands");
10226
10227 // Check to see if there is no change.
10228 if (Op1 == N->getOperand(0) && Op2 == N->getOperand(1))
10229 return N; // No operands changed, just return the input node.
10230
10231 // See if the modified node already exists.
10232 void *InsertPos = nullptr;
10233 if (SDNode *Existing = FindModifiedNodeSlot(N, Op1, Op2, InsertPos))
10234 return Existing;
10235
10236 // Nope it doesn't. Remove the node from its current place in the maps.
10237 if (InsertPos)
10238 if (!RemoveNodeFromCSEMaps(N))
10239 InsertPos = nullptr;
10240
10241 // Now we update the operands.
10242 if (N->OperandList[0] != Op1)
10243 N->OperandList[0].set(Op1);
10244 if (N->OperandList[1] != Op2)
10245 N->OperandList[1].set(Op2);
10246
10248 // If this gets put into a CSE map, add it.
10249 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
10250 return N;
10251}
10252
10255 SDValue Ops[] = { Op1, Op2, Op3 };
10256 return UpdateNodeOperands(N, Ops);
10257}
10258
10261 SDValue Op3, SDValue Op4) {
10262 SDValue Ops[] = { Op1, Op2, Op3, Op4 };
10263 return UpdateNodeOperands(N, Ops);
10264}
10265
10268 SDValue Op3, SDValue Op4, SDValue Op5) {
10269 SDValue Ops[] = { Op1, Op2, Op3, Op4, Op5 };
10270 return UpdateNodeOperands(N, Ops);
10271}
10272
10275 unsigned NumOps = Ops.size();
10276 assert(N->getNumOperands() == NumOps &&
10277 "Update with wrong number of operands");
10278
10279 // If no operands changed just return the input node.
10280 if (std::equal(Ops.begin(), Ops.end(), N->op_begin()))
10281 return N;
10282
10283 // See if the modified node already exists.
10284 void *InsertPos = nullptr;
10285 if (SDNode *Existing = FindModifiedNodeSlot(N, Ops, InsertPos))
10286 return Existing;
10287
10288 // Nope it doesn't. Remove the node from its current place in the maps.
10289 if (InsertPos)
10290 if (!RemoveNodeFromCSEMaps(N))
10291 InsertPos = nullptr;
10292
10293 // Now we update the operands.
10294 for (unsigned i = 0; i != NumOps; ++i)
10295 if (N->OperandList[i] != Ops[i])
10296 N->OperandList[i].set(Ops[i]);
10297
10299 // If this gets put into a CSE map, add it.
10300 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
10301 return N;
10302}
10303
10304/// DropOperands - Release the operands and set this node to have
10305/// zero operands.
10307 // Unlike the code in MorphNodeTo that does this, we don't need to
10308 // watch for dead nodes here.
10309 for (op_iterator I = op_begin(), E = op_end(); I != E; ) {
10310 SDUse &Use = *I++;
10311 Use.set(SDValue());
10312 }
10313}
10314
10316 ArrayRef<MachineMemOperand *> NewMemRefs) {
10317 if (NewMemRefs.empty()) {
10318 N->clearMemRefs();
10319 return;
10320 }
10321
10322 // Check if we can avoid allocating by storing a single reference directly.
10323 if (NewMemRefs.size() == 1) {
10324 N->MemRefs = NewMemRefs[0];
10325 N->NumMemRefs = 1;
10326 return;
10327 }
10328
10329 MachineMemOperand **MemRefsBuffer =
10330 Allocator.template Allocate<MachineMemOperand *>(NewMemRefs.size());
10331 llvm::copy(NewMemRefs, MemRefsBuffer);
10332 N->MemRefs = MemRefsBuffer;
10333 N->NumMemRefs = static_cast<int>(NewMemRefs.size());
10334}
10335
10336/// SelectNodeTo - These are wrappers around MorphNodeTo that accept a
10337/// machine opcode.
10338///
10340 EVT VT) {
10341 SDVTList VTs = getVTList(VT);
10342 return SelectNodeTo(N, MachineOpc, VTs, std::nullopt);
10343}
10344
10346 EVT VT, SDValue Op1) {
10347 SDVTList VTs = getVTList(VT);
10348 SDValue Ops[] = { Op1 };
10349 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10350}
10351
10353 EVT VT, SDValue Op1,
10354 SDValue Op2) {
10355 SDVTList VTs = getVTList(VT);
10356 SDValue Ops[] = { Op1, Op2 };
10357 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10358}
10359
10361 EVT VT, SDValue Op1,
10362 SDValue Op2, SDValue Op3) {
10363 SDVTList VTs = getVTList(VT);
10364 SDValue Ops[] = { Op1, Op2, Op3 };
10365 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10366}
10367
10369 EVT VT, ArrayRef<SDValue> Ops) {
10370 SDVTList VTs = getVTList(VT);
10371 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10372}
10373
10375 EVT VT1, EVT VT2, ArrayRef<SDValue> Ops) {
10376 SDVTList VTs = getVTList(VT1, VT2);
10377 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10378}
10379
10381 EVT VT1, EVT VT2) {
10382 SDVTList VTs = getVTList(VT1, VT2);
10383 return SelectNodeTo(N, MachineOpc, VTs, std::nullopt);
10384}
10385
10387 EVT VT1, EVT VT2, EVT VT3,
10388 ArrayRef<SDValue> Ops) {
10389 SDVTList VTs = getVTList(VT1, VT2, VT3);
10390 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10391}
10392
10394 EVT VT1, EVT VT2,
10395 SDValue Op1, SDValue Op2) {
10396 SDVTList VTs = getVTList(VT1, VT2);
10397 SDValue Ops[] = { Op1, Op2 };
10398 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10399}
10400
10402 SDVTList VTs,ArrayRef<SDValue> Ops) {
10403 SDNode *New = MorphNodeTo(N, ~MachineOpc, VTs, Ops);
10404 // Reset the NodeID to -1.
10405 New->setNodeId(-1);
10406 if (New != N) {
10407 ReplaceAllUsesWith(N, New);
10409 }
10410 return New;
10411}
10412
10413/// UpdateSDLocOnMergeSDNode - If the opt level is -O0 then it throws away
10414/// the line number information on the merged node since it is not possible to
10415/// preserve the information that operation is associated with multiple lines.
10416/// This will make the debugger working better at -O0, were there is a higher
10417/// probability having other instructions associated with that line.
10418///
10419/// For IROrder, we keep the smaller of the two
10420SDNode *SelectionDAG::UpdateSDLocOnMergeSDNode(SDNode *N, const SDLoc &OLoc) {
10421 DebugLoc NLoc = N->getDebugLoc();
10422 if (NLoc && OptLevel == CodeGenOptLevel::None && OLoc.getDebugLoc() != NLoc) {
10423 N->setDebugLoc(DebugLoc());
10424 }
10425 unsigned Order = std::min(N->getIROrder(), OLoc.getIROrder());
10426 N->setIROrder(Order);
10427 return N;
10428}
10429
10430/// MorphNodeTo - This *mutates* the specified node to have the specified
10431/// return type, opcode, and operands.
10432///
10433/// Note that MorphNodeTo returns the resultant node. If there is already a
10434/// node of the specified opcode and operands, it returns that node instead of
10435/// the current one. Note that the SDLoc need not be the same.
10436///
10437/// Using MorphNodeTo is faster than creating a new node and swapping it in
10438/// with ReplaceAllUsesWith both because it often avoids allocating a new
10439/// node, and because it doesn't require CSE recalculation for any of
10440/// the node's users.
10441///
10442/// However, note that MorphNodeTo recursively deletes dead nodes from the DAG.
10443/// As a consequence it isn't appropriate to use from within the DAG combiner or
10444/// the legalizer which maintain worklists that would need to be updated when
10445/// deleting things.
10447 SDVTList VTs, ArrayRef<SDValue> Ops) {
10448 // If an identical node already exists, use it.
10449 void *IP = nullptr;
10450 if (VTs.VTs[VTs.NumVTs-1] != MVT::Glue) {
10452 AddNodeIDNode(ID, Opc, VTs, Ops);
10453 if (SDNode *ON = FindNodeOrInsertPos(ID, SDLoc(N), IP))
10454 return UpdateSDLocOnMergeSDNode(ON, SDLoc(N));
10455 }
10456
10457 if (!RemoveNodeFromCSEMaps(N))
10458 IP = nullptr;
10459
10460 // Start the morphing.
10461 N->NodeType = Opc;
10462 N->ValueList = VTs.VTs;
10463 N->NumValues = VTs.NumVTs;
10464
10465 // Clear the operands list, updating used nodes to remove this from their
10466 // use list. Keep track of any operands that become dead as a result.
10467 SmallPtrSet<SDNode*, 16> DeadNodeSet;
10468 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
10469 SDUse &Use = *I++;
10470 SDNode *Used = Use.getNode();
10471 Use.set(SDValue());
10472 if (Used->use_empty())
10473 DeadNodeSet.insert(Used);
10474 }
10475
10476 // For MachineNode, initialize the memory references information.
10477 if (MachineSDNode *MN = dyn_cast<MachineSDNode>(N))
10478 MN->clearMemRefs();
10479
10480 // Swap for an appropriately sized array from the recycler.
10481 removeOperands(N);
10482 createOperands(N, Ops);
10483
10484 // Delete any nodes that are still dead after adding the uses for the
10485 // new operands.
10486 if (!DeadNodeSet.empty()) {
10487 SmallVector<SDNode *, 16> DeadNodes;
10488 for (SDNode *N : DeadNodeSet)
10489 if (N->use_empty())
10490 DeadNodes.push_back(N);
10491 RemoveDeadNodes(DeadNodes);
10492 }
10493
10494 if (IP)
10495 CSEMap.InsertNode(N, IP); // Memoize the new node.
10496 return N;
10497}
10498
10500 unsigned OrigOpc = Node->getOpcode();
10501 unsigned NewOpc;
10502 switch (OrigOpc) {
10503 default:
10504 llvm_unreachable("mutateStrictFPToFP called with unexpected opcode!");
10505#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
10506 case ISD::STRICT_##DAGN: NewOpc = ISD::DAGN; break;
10507#define CMP_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
10508 case ISD::STRICT_##DAGN: NewOpc = ISD::SETCC; break;
10509#include "llvm/IR/ConstrainedOps.def"
10510 }
10511
10512 assert(Node->getNumValues() == 2 && "Unexpected number of results!");
10513
10514 // We're taking this node out of the chain, so we need to re-link things.
10515 SDValue InputChain = Node->getOperand(0);
10516 SDValue OutputChain = SDValue(Node, 1);
10517 ReplaceAllUsesOfValueWith(OutputChain, InputChain);
10518
10520 for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
10521 Ops.push_back(Node->getOperand(i));
10522
10523 SDVTList VTs = getVTList(Node->getValueType(0));
10524 SDNode *Res = MorphNodeTo(Node, NewOpc, VTs, Ops);
10525
10526 // MorphNodeTo can operate in two ways: if an existing node with the
10527 // specified operands exists, it can just return it. Otherwise, it
10528 // updates the node in place to have the requested operands.
10529 if (Res == Node) {
10530 // If we updated the node in place, reset the node ID. To the isel,
10531 // this should be just like a newly allocated machine node.
10532 Res->setNodeId(-1);
10533 } else {
10534 ReplaceAllUsesWith(Node, Res);
10535 RemoveDeadNode(Node);
10536 }
10537
10538 return Res;
10539}
10540
10541/// getMachineNode - These are used for target selectors to create a new node
10542/// with specified return type(s), MachineInstr opcode, and operands.
10543///
10544/// Note that getMachineNode returns the resultant node. If there is already a
10545/// node of the specified opcode and operands, it returns that node instead of
10546/// the current one.
10548 EVT VT) {
10549 SDVTList VTs = getVTList(VT);
10550 return getMachineNode(Opcode, dl, VTs, std::nullopt);
10551}
10552
10554 EVT VT, SDValue Op1) {
10555 SDVTList VTs = getVTList(VT);
10556 SDValue Ops[] = { Op1 };
10557 return getMachineNode(Opcode, dl, VTs, Ops);
10558}
10559
10561 EVT VT, SDValue Op1, SDValue Op2) {
10562 SDVTList VTs = getVTList(VT);
10563 SDValue Ops[] = { Op1, Op2 };
10564 return getMachineNode(Opcode, dl, VTs, Ops);
10565}
10566
10568 EVT VT, SDValue Op1, SDValue Op2,
10569 SDValue Op3) {
10570 SDVTList VTs = getVTList(VT);
10571 SDValue Ops[] = { Op1, Op2, Op3 };
10572 return getMachineNode(Opcode, dl, VTs, Ops);
10573}
10574
10576 EVT VT, ArrayRef<SDValue> Ops) {
10577 SDVTList VTs = getVTList(VT);
10578 return getMachineNode(Opcode, dl, VTs, Ops);
10579}
10580
10582 EVT VT1, EVT VT2, SDValue Op1,
10583 SDValue Op2) {
10584 SDVTList VTs = getVTList(VT1, VT2);
10585 SDValue Ops[] = { Op1, Op2 };
10586 return getMachineNode(Opcode, dl, VTs, Ops);
10587}
10588
10590 EVT VT1, EVT VT2, SDValue Op1,
10591 SDValue Op2, SDValue Op3) {
10592 SDVTList VTs = getVTList(VT1, VT2);
10593 SDValue Ops[] = { Op1, Op2, Op3 };
10594 return getMachineNode(Opcode, dl, VTs, Ops);
10595}
10596
10598 EVT VT1, EVT VT2,
10599 ArrayRef<SDValue> Ops) {
10600 SDVTList VTs = getVTList(VT1, VT2);
10601 return getMachineNode(Opcode, dl, VTs, Ops);
10602}
10603
10605 EVT VT1, EVT VT2, EVT VT3,
10606 SDValue Op1, SDValue Op2) {
10607 SDVTList VTs = getVTList(VT1, VT2, VT3);
10608 SDValue Ops[] = { Op1, Op2 };
10609 return getMachineNode(Opcode, dl, VTs, Ops);
10610}
10611
10613 EVT VT1, EVT VT2, EVT VT3,
10614 SDValue Op1, SDValue Op2,
10615 SDValue Op3) {
10616 SDVTList VTs = getVTList(VT1, VT2, VT3);
10617 SDValue Ops[] = { Op1, Op2, Op3 };
10618 return getMachineNode(Opcode, dl, VTs, Ops);
10619}
10620
10622 EVT VT1, EVT VT2, EVT VT3,
10623 ArrayRef<SDValue> Ops) {
10624 SDVTList VTs = getVTList(VT1, VT2, VT3);
10625 return getMachineNode(Opcode, dl, VTs, Ops);
10626}
10627
10629 ArrayRef<EVT> ResultTys,
10630 ArrayRef<SDValue> Ops) {
10631 SDVTList VTs = getVTList(ResultTys);
10632 return getMachineNode(Opcode, dl, VTs, Ops);
10633}
10634
10636 SDVTList VTs,
10637 ArrayRef<SDValue> Ops) {
10638 bool DoCSE = VTs.VTs[VTs.NumVTs-1] != MVT::Glue;
10640 void *IP = nullptr;
10641
10642 if (DoCSE) {
10644 AddNodeIDNode(ID, ~Opcode, VTs, Ops);
10645 IP = nullptr;
10646 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
10647 return cast<MachineSDNode>(UpdateSDLocOnMergeSDNode(E, DL));
10648 }
10649 }
10650
10651 // Allocate a new MachineSDNode.
10652 N = newSDNode<MachineSDNode>(~Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
10653 createOperands(N, Ops);
10654
10655 if (DoCSE)
10656 CSEMap.InsertNode(N, IP);
10657
10658 InsertNode(N);
10659 NewSDValueDbgMsg(SDValue(N, 0), "Creating new machine node: ", this);
10660 return N;
10661}
10662
10663/// getTargetExtractSubreg - A convenience function for creating
10664/// TargetOpcode::EXTRACT_SUBREG nodes.
10666 SDValue Operand) {
10667 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
10668 SDNode *Subreg = getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL,
10669 VT, Operand, SRIdxVal);
10670 return SDValue(Subreg, 0);
10671}
10672
10673/// getTargetInsertSubreg - A convenience function for creating
10674/// TargetOpcode::INSERT_SUBREG nodes.
10676 SDValue Operand, SDValue Subreg) {
10677 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
10678 SDNode *Result = getMachineNode(TargetOpcode::INSERT_SUBREG, DL,
10679 VT, Operand, Subreg, SRIdxVal);
10680 return SDValue(Result, 0);
10681}
10682
10683/// getNodeIfExists - Get the specified node if it's already available, or
10684/// else return NULL.
10686 ArrayRef<SDValue> Ops) {
10687 SDNodeFlags Flags;
10688 if (Inserter)
10689 Flags = Inserter->getFlags();
10690 return getNodeIfExists(Opcode, VTList, Ops, Flags);
10691}
10692
10695 const SDNodeFlags Flags) {
10696 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {
10698 AddNodeIDNode(ID, Opcode, VTList, Ops);
10699 void *IP = nullptr;
10700 if (SDNode *E = FindNodeOrInsertPos(ID, SDLoc(), IP)) {
10701 E->intersectFlagsWith(Flags);
10702 return E;
10703 }
10704 }
10705 return nullptr;
10706}
10707
10708/// doesNodeExist - Check if a node exists without modifying its flags.
10709bool SelectionDAG::doesNodeExist(unsigned Opcode, SDVTList VTList,
10710 ArrayRef<SDValue> Ops) {
10711 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {
10713 AddNodeIDNode(ID, Opcode, VTList, Ops);
10714 void *IP = nullptr;
10715 if (FindNodeOrInsertPos(ID, SDLoc(), IP))
10716 return true;
10717 }
10718 return false;
10719}
10720
10721/// getDbgValue - Creates a SDDbgValue node.
10722///
10723/// SDNode
10725 SDNode *N, unsigned R, bool IsIndirect,
10726 const DebugLoc &DL, unsigned O) {
10727 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
10728 "Expected inlined-at fields to agree");
10729 return new (DbgInfo->getAlloc())
10730 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromNode(N, R),
10731 {}, IsIndirect, DL, O,
10732 /*IsVariadic=*/false);
10733}
10734
10735/// Constant
10737 DIExpression *Expr,
10738 const Value *C,
10739 const DebugLoc &DL, unsigned O) {
10740 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
10741 "Expected inlined-at fields to agree");
10742 return new (DbgInfo->getAlloc())
10743 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromConst(C), {},
10744 /*IsIndirect=*/false, DL, O,
10745 /*IsVariadic=*/false);
10746}
10747
10748/// FrameIndex
10750 DIExpression *Expr, unsigned FI,
10751 bool IsIndirect,
10752 const DebugLoc &DL,
10753 unsigned O) {
10754 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
10755 "Expected inlined-at fields to agree");
10756 return getFrameIndexDbgValue(Var, Expr, FI, {}, IsIndirect, DL, O);
10757}
10758
10759/// FrameIndex with dependencies
10761 DIExpression *Expr, unsigned FI,
10762 ArrayRef<SDNode *> Dependencies,
10763 bool IsIndirect,
10764 const DebugLoc &DL,
10765 unsigned O) {
10766 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
10767 "Expected inlined-at fields to agree");
10768 return new (DbgInfo->getAlloc())
10769 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromFrameIdx(FI),
10770 Dependencies, IsIndirect, DL, O,
10771 /*IsVariadic=*/false);
10772}
10773
10774/// VReg
10776 unsigned VReg, bool IsIndirect,
10777 const DebugLoc &DL, unsigned O) {
10778 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
10779 "Expected inlined-at fields to agree");
10780 return new (DbgInfo->getAlloc())
10781 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromVReg(VReg),
10782 {}, IsIndirect, DL, O,
10783 /*IsVariadic=*/false);
10784}
10785
10788 ArrayRef<SDNode *> Dependencies,
10789 bool IsIndirect, const DebugLoc &DL,
10790 unsigned O, bool IsVariadic) {
10791 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
10792 "Expected inlined-at fields to agree");
10793 return new (DbgInfo->getAlloc())
10794 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, Locs, Dependencies, IsIndirect,
10795 DL, O, IsVariadic);
10796}
10797
10799 unsigned OffsetInBits, unsigned SizeInBits,
10800 bool InvalidateDbg) {
10801 SDNode *FromNode = From.getNode();
10802 SDNode *ToNode = To.getNode();
10803 assert(FromNode && ToNode && "Can't modify dbg values");
10804
10805 // PR35338
10806 // TODO: assert(From != To && "Redundant dbg value transfer");
10807 // TODO: assert(FromNode != ToNode && "Intranode dbg value transfer");
10808 if (From == To || FromNode == ToNode)
10809 return;
10810
10811 if (!FromNode->getHasDebugValue())
10812 return;
10813
10814 SDDbgOperand FromLocOp =
10815 SDDbgOperand::fromNode(From.getNode(), From.getResNo());
10817
10819 for (SDDbgValue *Dbg : GetDbgValues(FromNode)) {
10820 if (Dbg->isInvalidated())
10821 continue;
10822
10823 // TODO: assert(!Dbg->isInvalidated() && "Transfer of invalid dbg value");
10824
10825 // Create a new location ops vector that is equal to the old vector, but
10826 // with each instance of FromLocOp replaced with ToLocOp.
10827 bool Changed = false;
10828 auto NewLocOps = Dbg->copyLocationOps();
10829 std::replace_if(
10830 NewLocOps.begin(), NewLocOps.end(),
10831 [&Changed, FromLocOp](const SDDbgOperand &Op) {
10832 bool Match = Op == FromLocOp;
10833 Changed |= Match;
10834 return Match;
10835 },
10836 ToLocOp);
10837 // Ignore this SDDbgValue if we didn't find a matching location.
10838 if (!Changed)
10839 continue;
10840
10841 DIVariable *Var = Dbg->getVariable();
10842 auto *Expr = Dbg->getExpression();
10843 // If a fragment is requested, update the expression.
10844 if (SizeInBits) {
10845 // When splitting a larger (e.g., sign-extended) value whose
10846 // lower bits are described with an SDDbgValue, do not attempt
10847 // to transfer the SDDbgValue to the upper bits.
10848 if (auto FI = Expr->getFragmentInfo())
10849 if (OffsetInBits + SizeInBits > FI->SizeInBits)
10850 continue;
10851 auto Fragment = DIExpression::createFragmentExpression(Expr, OffsetInBits,
10852 SizeInBits);
10853 if (!Fragment)
10854 continue;
10855 Expr = *Fragment;
10856 }
10857
10858 auto AdditionalDependencies = Dbg->getAdditionalDependencies();
10859 // Clone the SDDbgValue and move it to To.
10860 SDDbgValue *Clone = getDbgValueList(
10861 Var, Expr, NewLocOps, AdditionalDependencies, Dbg->isIndirect(),
10862 Dbg->getDebugLoc(), std::max(ToNode->getIROrder(), Dbg->getOrder()),
10863 Dbg->isVariadic());
10864 ClonedDVs.push_back(Clone);
10865
10866 if (InvalidateDbg) {
10867 // Invalidate value and indicate the SDDbgValue should not be emitted.
10868 Dbg->setIsInvalidated();
10869 Dbg->setIsEmitted();
10870 }
10871 }
10872
10873 for (SDDbgValue *Dbg : ClonedDVs) {
10874 assert(is_contained(Dbg->getSDNodes(), ToNode) &&
10875 "Transferred DbgValues should depend on the new SDNode");
10876 AddDbgValue(Dbg, false);
10877 }
10878}
10879
10881 if (!N.getHasDebugValue())
10882 return;
10883
10885 for (auto *DV : GetDbgValues(&N)) {
10886 if (DV->isInvalidated())
10887 continue;
10888 switch (N.getOpcode()) {
10889 default:
10890 break;
10891 case ISD::ADD: {
10892 SDValue N0 = N.getOperand(0);
10893 SDValue N1 = N.getOperand(1);
10894 if (!isa<ConstantSDNode>(N0)) {
10895 bool RHSConstant = isa<ConstantSDNode>(N1);
10897 if (RHSConstant)
10898 Offset = N.getConstantOperandVal(1);
10899 // We are not allowed to turn indirect debug values variadic, so
10900 // don't salvage those.
10901 if (!RHSConstant && DV->isIndirect())
10902 continue;
10903
10904 // Rewrite an ADD constant node into a DIExpression. Since we are
10905 // performing arithmetic to compute the variable's *value* in the
10906 // DIExpression, we need to mark the expression with a
10907 // DW_OP_stack_value.
10908 auto *DIExpr = DV->getExpression();
10909 auto NewLocOps = DV->copyLocationOps();
10910 bool Changed = false;
10911 size_t OrigLocOpsSize = NewLocOps.size();
10912 for (size_t i = 0; i < OrigLocOpsSize; ++i) {
10913 // We're not given a ResNo to compare against because the whole
10914 // node is going away. We know that any ISD::ADD only has one
10915 // result, so we can assume any node match is using the result.
10916 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
10917 NewLocOps[i].getSDNode() != &N)
10918 continue;
10919 NewLocOps[i] = SDDbgOperand::fromNode(N0.getNode(), N0.getResNo());
10920 if (RHSConstant) {
10923 DIExpr = DIExpression::appendOpsToArg(DIExpr, ExprOps, i, true);
10924 } else {
10925 // Convert to a variadic expression (if not already).
10926 // convertToVariadicExpression() returns a const pointer, so we use
10927 // a temporary const variable here.
10928 const auto *TmpDIExpr =
10932 ExprOps.push_back(NewLocOps.size());
10933 ExprOps.push_back(dwarf::DW_OP_plus);
10936 NewLocOps.push_back(RHS);
10937 DIExpr = DIExpression::appendOpsToArg(TmpDIExpr, ExprOps, i, true);
10938 }
10939 Changed = true;
10940 }
10941 (void)Changed;
10942 assert(Changed && "Salvage target doesn't use N");
10943
10944 bool IsVariadic =
10945 DV->isVariadic() || OrigLocOpsSize != NewLocOps.size();
10946
10947 auto AdditionalDependencies = DV->getAdditionalDependencies();
10948 SDDbgValue *Clone = getDbgValueList(
10949 DV->getVariable(), DIExpr, NewLocOps, AdditionalDependencies,
10950 DV->isIndirect(), DV->getDebugLoc(), DV->getOrder(), IsVariadic);
10951 ClonedDVs.push_back(Clone);
10952 DV->setIsInvalidated();
10953 DV->setIsEmitted();
10954 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting";
10955 N0.getNode()->dumprFull(this);
10956 dbgs() << " into " << *DIExpr << '\n');
10957 }
10958 break;
10959 }
10960 case ISD::TRUNCATE: {
10961 SDValue N0 = N.getOperand(0);
10962 TypeSize FromSize = N0.getValueSizeInBits();
10963 TypeSize ToSize = N.getValueSizeInBits(0);
10964
10965 DIExpression *DbgExpression = DV->getExpression();
10966 auto ExtOps = DIExpression::getExtOps(FromSize, ToSize, false);
10967 auto NewLocOps = DV->copyLocationOps();
10968 bool Changed = false;
10969 for (size_t i = 0; i < NewLocOps.size(); ++i) {
10970 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
10971 NewLocOps[i].getSDNode() != &N)
10972 continue;
10973
10974 NewLocOps[i] = SDDbgOperand::fromNode(N0.getNode(), N0.getResNo());
10975 DbgExpression = DIExpression::appendOpsToArg(DbgExpression, ExtOps, i);
10976 Changed = true;
10977 }
10978 assert(Changed && "Salvage target doesn't use N");
10979 (void)Changed;
10980
10981 SDDbgValue *Clone =
10982 getDbgValueList(DV->getVariable(), DbgExpression, NewLocOps,
10983 DV->getAdditionalDependencies(), DV->isIndirect(),
10984 DV->getDebugLoc(), DV->getOrder(), DV->isVariadic());
10985
10986 ClonedDVs.push_back(Clone);
10987 DV->setIsInvalidated();
10988 DV->setIsEmitted();
10989 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting"; N0.getNode()->dumprFull(this);
10990 dbgs() << " into " << *DbgExpression << '\n');
10991 break;
10992 }
10993 }
10994 }
10995
10996 for (SDDbgValue *Dbg : ClonedDVs) {
10997 assert(!Dbg->getSDNodes().empty() &&
10998 "Salvaged DbgValue should depend on a new SDNode");
10999 AddDbgValue(Dbg, false);
11000 }
11001}
11002
11003/// Creates a SDDbgLabel node.
11005 const DebugLoc &DL, unsigned O) {
11006 assert(cast<DILabel>(Label)->isValidLocationForIntrinsic(DL) &&
11007 "Expected inlined-at fields to agree");
11008 return new (DbgInfo->getAlloc()) SDDbgLabel(Label, DL, O);
11009}
11010
11011namespace {
11012
11013/// RAUWUpdateListener - Helper for ReplaceAllUsesWith - When the node
11014/// pointed to by a use iterator is deleted, increment the use iterator
11015/// so that it doesn't dangle.
11016///
11017class RAUWUpdateListener : public SelectionDAG::DAGUpdateListener {
11020
11021 void NodeDeleted(SDNode *N, SDNode *E) override {
11022 // Increment the iterator as needed.
11023 while (UI != UE && N == *UI)
11024 ++UI;
11025 }
11026
11027public:
11028 RAUWUpdateListener(SelectionDAG &d,
11031 : SelectionDAG::DAGUpdateListener(d), UI(ui), UE(ue) {}
11032};
11033
11034} // end anonymous namespace
11035
11036/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
11037/// This can cause recursive merging of nodes in the DAG.
11038///
11039/// This version assumes From has a single result value.
11040///
11042 SDNode *From = FromN.getNode();
11043 assert(From->getNumValues() == 1 && FromN.getResNo() == 0 &&
11044 "Cannot replace with this method!");
11045 assert(From != To.getNode() && "Cannot replace uses of with self");
11046
11047 // Preserve Debug Values
11048 transferDbgValues(FromN, To);
11049 // Preserve extra info.
11050 copyExtraInfo(From, To.getNode());
11051
11052 // Iterate over all the existing uses of From. New uses will be added
11053 // to the beginning of the use list, which we avoid visiting.
11054 // This specifically avoids visiting uses of From that arise while the
11055 // replacement is happening, because any such uses would be the result
11056 // of CSE: If an existing node looks like From after one of its operands
11057 // is replaced by To, we don't want to replace of all its users with To
11058 // too. See PR3018 for more info.
11059 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
11060 RAUWUpdateListener Listener(*this, UI, UE);
11061 while (UI != UE) {
11062 SDNode *User = *UI;
11063
11064 // This node is about to morph, remove its old self from the CSE maps.
11065 RemoveNodeFromCSEMaps(User);
11066
11067 // A user can appear in a use list multiple times, and when this
11068 // happens the uses are usually next to each other in the list.
11069 // To help reduce the number of CSE recomputations, process all
11070 // the uses of this user that we can find this way.
11071 do {
11072 SDUse &Use = UI.getUse();
11073 ++UI;
11074 Use.set(To);
11075 if (To->isDivergent() != From->isDivergent())
11077 } while (UI != UE && *UI == User);
11078 // Now that we have modified User, add it back to the CSE maps. If it
11079 // already exists there, recursively merge the results together.
11080 AddModifiedNodeToCSEMaps(User);
11081 }
11082
11083 // If we just RAUW'd the root, take note.
11084 if (FromN == getRoot())
11085 setRoot(To);
11086}
11087
11088/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
11089/// This can cause recursive merging of nodes in the DAG.
11090///
11091/// This version assumes that for each value of From, there is a
11092/// corresponding value in To in the same position with the same type.
11093///
11095#ifndef NDEBUG
11096 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
11097 assert((!From->hasAnyUseOfValue(i) ||
11098 From->getValueType(i) == To->getValueType(i)) &&
11099 "Cannot use this version of ReplaceAllUsesWith!");
11100#endif
11101
11102 // Handle the trivial case.
11103 if (From == To)
11104 return;
11105
11106 // Preserve Debug Info. Only do this if there's a use.
11107 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
11108 if (From->hasAnyUseOfValue(i)) {
11109 assert((i < To->getNumValues()) && "Invalid To location");
11111 }
11112 // Preserve extra info.
11113 copyExtraInfo(From, To);
11114
11115 // Iterate over just the existing users of From. See the comments in
11116 // the ReplaceAllUsesWith above.
11117 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
11118 RAUWUpdateListener Listener(*this, UI, UE);
11119 while (UI != UE) {
11120 SDNode *User = *UI;
11121
11122 // This node is about to morph, remove its old self from the CSE maps.
11123 RemoveNodeFromCSEMaps(User);
11124
11125 // A user can appear in a use list multiple times, and when this
11126 // happens the uses are usually next to each other in the list.
11127 // To help reduce the number of CSE recomputations, process all
11128 // the uses of this user that we can find this way.
11129 do {
11130 SDUse &Use = UI.getUse();
11131 ++UI;
11132 Use.setNode(To);
11133 if (To->isDivergent() != From->isDivergent())
11135 } while (UI != UE && *UI == User);
11136
11137 // Now that we have modified User, add it back to the CSE maps. If it
11138 // already exists there, recursively merge the results together.
11139 AddModifiedNodeToCSEMaps(User);
11140 }
11141
11142 // If we just RAUW'd the root, take note.
11143 if (From == getRoot().getNode())
11144 setRoot(SDValue(To, getRoot().getResNo()));
11145}
11146
11147/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
11148/// This can cause recursive merging of nodes in the DAG.
11149///
11150/// This version can replace From with any result values. To must match the
11151/// number and types of values returned by From.
11153 if (From->getNumValues() == 1) // Handle the simple case efficiently.
11154 return ReplaceAllUsesWith(SDValue(From, 0), To[0]);
11155
11156 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) {
11157 // Preserve Debug Info.
11158 transferDbgValues(SDValue(From, i), To[i]);
11159 // Preserve extra info.
11160 copyExtraInfo(From, To[i].getNode());
11161 }
11162
11163 // Iterate over just the existing users of From. See the comments in
11164 // the ReplaceAllUsesWith above.
11165 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
11166 RAUWUpdateListener Listener(*this, UI, UE);
11167 while (UI != UE) {
11168 SDNode *User = *UI;
11169
11170 // This node is about to morph, remove its old self from the CSE maps.
11171 RemoveNodeFromCSEMaps(User);
11172
11173 // A user can appear in a use list multiple times, and when this happens the
11174 // uses are usually next to each other in the list. To help reduce the
11175 // number of CSE and divergence recomputations, process all the uses of this
11176 // user that we can find this way.
11177 bool To_IsDivergent = false;
11178 do {
11179 SDUse &Use = UI.getUse();
11180 const SDValue &ToOp = To[Use.getResNo()];
11181 ++UI;
11182 Use.set(ToOp);
11183 To_IsDivergent |= ToOp->isDivergent();
11184 } while (UI != UE && *UI == User);
11185
11186 if (To_IsDivergent != From->isDivergent())
11188
11189 // Now that we have modified User, add it back to the CSE maps. If it
11190 // already exists there, recursively merge the results together.
11191 AddModifiedNodeToCSEMaps(User);
11192 }
11193
11194 // If we just RAUW'd the root, take note.
11195 if (From == getRoot().getNode())
11196 setRoot(SDValue(To[getRoot().getResNo()]));
11197}
11198
11199/// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
11200/// uses of other values produced by From.getNode() alone. The Deleted
11201/// vector is handled the same way as for ReplaceAllUsesWith.
11203 // Handle the really simple, really trivial case efficiently.
11204 if (From == To) return;
11205
11206 // Handle the simple, trivial, case efficiently.
11207 if (From.getNode()->getNumValues() == 1) {
11209 return;
11210 }
11211
11212 // Preserve Debug Info.
11214 copyExtraInfo(From.getNode(), To.getNode());
11215
11216 // Iterate over just the existing users of From. See the comments in
11217 // the ReplaceAllUsesWith above.
11218 SDNode::use_iterator UI = From.getNode()->use_begin(),
11219 UE = From.getNode()->use_end();
11220 RAUWUpdateListener Listener(*this, UI, UE);
11221 while (UI != UE) {
11222 SDNode *User = *UI;
11223 bool UserRemovedFromCSEMaps = false;
11224
11225 // A user can appear in a use list multiple times, and when this
11226 // happens the uses are usually next to each other in the list.
11227 // To help reduce the number of CSE recomputations, process all
11228 // the uses of this user that we can find this way.
11229 do {
11230 SDUse &Use = UI.getUse();
11231
11232 // Skip uses of different values from the same node.
11233 if (Use.getResNo() != From.getResNo()) {
11234 ++UI;
11235 continue;
11236 }
11237
11238 // If this node hasn't been modified yet, it's still in the CSE maps,
11239 // so remove its old self from the CSE maps.
11240 if (!UserRemovedFromCSEMaps) {
11241 RemoveNodeFromCSEMaps(User);
11242 UserRemovedFromCSEMaps = true;
11243 }
11244
11245 ++UI;
11246 Use.set(To);
11247 if (To->isDivergent() != From->isDivergent())
11249 } while (UI != UE && *UI == User);
11250 // We are iterating over all uses of the From node, so if a use
11251 // doesn't use the specific value, no changes are made.
11252 if (!UserRemovedFromCSEMaps)
11253 continue;
11254
11255 // Now that we have modified User, add it back to the CSE maps. If it
11256 // already exists there, recursively merge the results together.
11257 AddModifiedNodeToCSEMaps(User);
11258 }
11259
11260 // If we just RAUW'd the root, take note.
11261 if (From == getRoot())
11262 setRoot(To);
11263}
11264
11265namespace {
11266
11267/// UseMemo - This class is used by SelectionDAG::ReplaceAllUsesOfValuesWith
11268/// to record information about a use.
11269struct UseMemo {
11270 SDNode *User;
11271 unsigned Index;
11272 SDUse *Use;
11273};
11274
11275/// operator< - Sort Memos by User.
11276bool operator<(const UseMemo &L, const UseMemo &R) {
11277 return (intptr_t)L.User < (intptr_t)R.User;
11278}
11279
11280/// RAUOVWUpdateListener - Helper for ReplaceAllUsesOfValuesWith - When the node
11281/// pointed to by a UseMemo is deleted, set the User to nullptr to indicate that
11282/// the node already has been taken care of recursively.
11283class RAUOVWUpdateListener : public SelectionDAG::DAGUpdateListener {
11285
11286 void NodeDeleted(SDNode *N, SDNode *E) override {
11287 for (UseMemo &Memo : Uses)
11288 if (Memo.User == N)
11289 Memo.User = nullptr;
11290 }
11291
11292public:
11293 RAUOVWUpdateListener(SelectionDAG &d, SmallVector<UseMemo, 4> &uses)
11294 : SelectionDAG::DAGUpdateListener(d), Uses(uses) {}
11295};
11296
11297} // end anonymous namespace
11298
11300 if (TLI->isSDNodeAlwaysUniform(N)) {
11301 assert(!TLI->isSDNodeSourceOfDivergence(N, FLI, UA) &&
11302 "Conflicting divergence information!");
11303 return false;
11304 }
11305 if (TLI->isSDNodeSourceOfDivergence(N, FLI, UA))
11306 return true;
11307 for (const auto &Op : N->ops()) {
11308 if (Op.Val.getValueType() != MVT::Other && Op.getNode()->isDivergent())
11309 return true;
11310 }
11311 return false;
11312}
11313
11315 SmallVector<SDNode *, 16> Worklist(1, N);
11316 do {
11317 N = Worklist.pop_back_val();
11318 bool IsDivergent = calculateDivergence(N);
11319 if (N->SDNodeBits.IsDivergent != IsDivergent) {
11320 N->SDNodeBits.IsDivergent = IsDivergent;
11321 llvm::append_range(Worklist, N->uses());
11322 }
11323 } while (!Worklist.empty());
11324}
11325
11326void SelectionDAG::CreateTopologicalOrder(std::vector<SDNode *> &Order) {
11328 Order.reserve(AllNodes.size());
11329 for (auto &N : allnodes()) {
11330 unsigned NOps = N.getNumOperands();
11331 Degree[&N] = NOps;
11332 if (0 == NOps)
11333 Order.push_back(&N);
11334 }
11335 for (size_t I = 0; I != Order.size(); ++I) {
11336 SDNode *N = Order[I];
11337 for (auto *U : N->uses()) {
11338 unsigned &UnsortedOps = Degree[U];
11339 if (0 == --UnsortedOps)
11340 Order.push_back(U);
11341 }
11342 }
11343}
11344
11345#ifndef NDEBUG
11347 std::vector<SDNode *> TopoOrder;
11348 CreateTopologicalOrder(TopoOrder);
11349 for (auto *N : TopoOrder) {
11350 assert(calculateDivergence(N) == N->isDivergent() &&
11351 "Divergence bit inconsistency detected");
11352 }
11353}
11354#endif
11355
11356/// ReplaceAllUsesOfValuesWith - Replace any uses of From with To, leaving
11357/// uses of other values produced by From.getNode() alone. The same value
11358/// may appear in both the From and To list. The Deleted vector is
11359/// handled the same way as for ReplaceAllUsesWith.
11361 const SDValue *To,
11362 unsigned Num){
11363 // Handle the simple, trivial case efficiently.
11364 if (Num == 1)
11365 return ReplaceAllUsesOfValueWith(*From, *To);
11366
11367 transferDbgValues(*From, *To);
11368 copyExtraInfo(From->getNode(), To->getNode());
11369
11370 // Read up all the uses and make records of them. This helps
11371 // processing new uses that are introduced during the
11372 // replacement process.
11374 for (unsigned i = 0; i != Num; ++i) {
11375 unsigned FromResNo = From[i].getResNo();
11376 SDNode *FromNode = From[i].getNode();
11377 for (SDNode::use_iterator UI = FromNode->use_begin(),
11378 E = FromNode->use_end(); UI != E; ++UI) {
11379 SDUse &Use = UI.getUse();
11380 if (Use.getResNo() == FromResNo) {
11381 UseMemo Memo = { *UI, i, &Use };
11382 Uses.push_back(Memo);
11383 }
11384 }
11385 }
11386
11387 // Sort the uses, so that all the uses from a given User are together.
11389 RAUOVWUpdateListener Listener(*this, Uses);
11390
11391 for (unsigned UseIndex = 0, UseIndexEnd = Uses.size();
11392 UseIndex != UseIndexEnd; ) {
11393 // We know that this user uses some value of From. If it is the right
11394 // value, update it.
11395 SDNode *User = Uses[UseIndex].User;
11396 // If the node has been deleted by recursive CSE updates when updating
11397 // another node, then just skip this entry.
11398 if (User == nullptr) {
11399 ++UseIndex;
11400 continue;
11401 }
11402
11403 // This node is about to morph, remove its old self from the CSE maps.
11404 RemoveNodeFromCSEMaps(User);
11405
11406 // The Uses array is sorted, so all the uses for a given User
11407 // are next to each other in the list.
11408 // To help reduce the number of CSE recomputations, process all
11409 // the uses of this user that we can find this way.
11410 do {
11411 unsigned i = Uses[UseIndex].Index;
11412 SDUse &Use = *Uses[UseIndex].Use;
11413 ++UseIndex;
11414
11415 Use.set(To[i]);
11416 } while (UseIndex != UseIndexEnd && Uses[UseIndex].User == User);
11417
11418 // Now that we have modified User, add it back to the CSE maps. If it
11419 // already exists there, recursively merge the results together.
11420 AddModifiedNodeToCSEMaps(User);
11421 }
11422}
11423
11424/// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
11425/// based on their topological order. It returns the maximum id and a vector
11426/// of the SDNodes* in assigned order by reference.
11428 unsigned DAGSize = 0;
11429
11430 // SortedPos tracks the progress of the algorithm. Nodes before it are
11431 // sorted, nodes after it are unsorted. When the algorithm completes
11432 // it is at the end of the list.
11433 allnodes_iterator SortedPos = allnodes_begin();
11434
11435 // Visit all the nodes. Move nodes with no operands to the front of
11436 // the list immediately. Annotate nodes that do have operands with their
11437 // operand count. Before we do this, the Node Id fields of the nodes
11438 // may contain arbitrary values. After, the Node Id fields for nodes
11439 // before SortedPos will contain the topological sort index, and the
11440 // Node Id fields for nodes At SortedPos and after will contain the
11441 // count of outstanding operands.
11443 checkForCycles(&N, this);
11444 unsigned Degree = N.getNumOperands();
11445 if (Degree == 0) {
11446 // A node with no uses, add it to the result array immediately.
11447 N.setNodeId(DAGSize++);
11448 allnodes_iterator Q(&N);
11449 if (Q != SortedPos)
11450 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(Q));
11451 assert(SortedPos != AllNodes.end() && "Overran node list");
11452 ++SortedPos;
11453 } else {
11454 // Temporarily use the Node Id as scratch space for the degree count.
11455 N.setNodeId(Degree);
11456 }
11457 }
11458
11459 // Visit all the nodes. As we iterate, move nodes into sorted order,
11460 // such that by the time the end is reached all nodes will be sorted.
11461 for (SDNode &Node : allnodes()) {
11462 SDNode *N = &Node;
11463 checkForCycles(N, this);
11464 // N is in sorted position, so all its uses have one less operand
11465 // that needs to be sorted.
11466 for (SDNode *P : N->uses()) {
11467 unsigned Degree = P->getNodeId();
11468 assert(Degree != 0 && "Invalid node degree");
11469 --Degree;
11470 if (Degree == 0) {
11471 // All of P's operands are sorted, so P may sorted now.
11472 P->setNodeId(DAGSize++);
11473 if (P->getIterator() != SortedPos)
11474 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(P));
11475 assert(SortedPos != AllNodes.end() && "Overran node list");
11476 ++SortedPos;
11477 } else {
11478 // Update P's outstanding operand count.
11479 P->setNodeId(Degree);
11480 }
11481 }
11482 if (Node.getIterator() == SortedPos) {
11483#ifndef NDEBUG
11485 SDNode *S = &*++I;
11486 dbgs() << "Overran sorted position:\n";
11487 S->dumprFull(this); dbgs() << "\n";
11488 dbgs() << "Checking if this is due to cycles\n";
11489 checkForCycles(this, true);
11490#endif
11491 llvm_unreachable(nullptr);
11492 }
11493 }
11494
11495 assert(SortedPos == AllNodes.end() &&
11496 "Topological sort incomplete!");
11497 assert(AllNodes.front().getOpcode() == ISD::EntryToken &&
11498 "First node in topological sort is not the entry token!");
11499 assert(AllNodes.front().getNodeId() == 0 &&
11500 "First node in topological sort has non-zero id!");
11501 assert(AllNodes.front().getNumOperands() == 0 &&
11502 "First node in topological sort has operands!");
11503 assert(AllNodes.back().getNodeId() == (int)DAGSize-1 &&
11504 "Last node in topologic sort has unexpected id!");
11505 assert(AllNodes.back().use_empty() &&
11506 "Last node in topologic sort has users!");
11507 assert(DAGSize == allnodes_size() && "Node count mismatch!");
11508 return DAGSize;
11509}
11510
11511/// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the
11512/// value is produced by SD.
11513void SelectionDAG::AddDbgValue(SDDbgValue *DB, bool isParameter) {
11514 for (SDNode *SD : DB->getSDNodes()) {
11515 if (!SD)
11516 continue;
11517 assert(DbgInfo->getSDDbgValues(SD).empty() || SD->getHasDebugValue());
11518 SD->setHasDebugValue(true);
11519 }
11520 DbgInfo->add(DB, isParameter);
11521}
11522
11523void SelectionDAG::AddDbgLabel(SDDbgLabel *DB) { DbgInfo->add(DB); }
11524
11526 SDValue NewMemOpChain) {
11527 assert(isa<MemSDNode>(NewMemOpChain) && "Expected a memop node");
11528 assert(NewMemOpChain.getValueType() == MVT::Other && "Expected a token VT");
11529 // The new memory operation must have the same position as the old load in
11530 // terms of memory dependency. Create a TokenFactor for the old load and new
11531 // memory operation and update uses of the old load's output chain to use that
11532 // TokenFactor.
11533 if (OldChain == NewMemOpChain || OldChain.use_empty())
11534 return NewMemOpChain;
11535
11536 SDValue TokenFactor = getNode(ISD::TokenFactor, SDLoc(OldChain), MVT::Other,
11537 OldChain, NewMemOpChain);
11538 ReplaceAllUsesOfValueWith(OldChain, TokenFactor);
11539 UpdateNodeOperands(TokenFactor.getNode(), OldChain, NewMemOpChain);
11540 return TokenFactor;
11541}
11542
11544 SDValue NewMemOp) {
11545 assert(isa<MemSDNode>(NewMemOp.getNode()) && "Expected a memop node");
11546 SDValue OldChain = SDValue(OldLoad, 1);
11547 SDValue NewMemOpChain = NewMemOp.getValue(1);
11548 return makeEquivalentMemoryOrdering(OldChain, NewMemOpChain);
11549}
11550
11552 Function **OutFunction) {
11553 assert(isa<ExternalSymbolSDNode>(Op) && "Node should be an ExternalSymbol");
11554
11555 auto *Symbol = cast<ExternalSymbolSDNode>(Op)->getSymbol();
11556 auto *Module = MF->getFunction().getParent();
11557 auto *Function = Module->getFunction(Symbol);
11558
11559 if (OutFunction != nullptr)
11560 *OutFunction = Function;
11561
11562 if (Function != nullptr) {
11563 auto PtrTy = TLI->getPointerTy(getDataLayout(), Function->getAddressSpace());
11564 return getGlobalAddress(Function, SDLoc(Op), PtrTy);
11565 }
11566
11567 std::string ErrorStr;
11568 raw_string_ostream ErrorFormatter(ErrorStr);
11569 ErrorFormatter << "Undefined external symbol ";
11570 ErrorFormatter << '"' << Symbol << '"';
11571 report_fatal_error(Twine(ErrorFormatter.str()));
11572}
11573
11574//===----------------------------------------------------------------------===//
11575// SDNode Class
11576//===----------------------------------------------------------------------===//
11577
11579 ConstantSDNode *Const = dyn_cast<ConstantSDNode>(V);
11580 return Const != nullptr && Const->isZero();
11581}
11582
11584 ConstantFPSDNode *Const = dyn_cast<ConstantFPSDNode>(V);
11585 return Const != nullptr && Const->isZero() && !Const->isNegative();
11586}
11587
11589 ConstantSDNode *Const = dyn_cast<ConstantSDNode>(V);
11590 return Const != nullptr && Const->isAllOnes();
11591}
11592
11594 ConstantSDNode *Const = dyn_cast<ConstantSDNode>(V);
11595 return Const != nullptr && Const->isOne();
11596}
11597
11599 ConstantSDNode *Const = dyn_cast<ConstantSDNode>(V);
11600 return Const != nullptr && Const->isMinSignedValue();
11601}
11602
11603bool llvm::isNeutralConstant(unsigned Opcode, SDNodeFlags Flags, SDValue V,
11604 unsigned OperandNo) {
11605 // NOTE: The cases should match with IR's ConstantExpr::getBinOpIdentity().
11606 // TODO: Target-specific opcodes could be added.
11607 if (auto *ConstV = isConstOrConstSplat(V, /*AllowUndefs*/ false,
11608 /*AllowTruncation*/ true)) {
11609 APInt Const = ConstV->getAPIntValue().trunc(V.getScalarValueSizeInBits());
11610 switch (Opcode) {
11611 case ISD::ADD:
11612 case ISD::OR:
11613 case ISD::XOR:
11614 case ISD::UMAX:
11615 return Const.isZero();
11616 case ISD::MUL:
11617 return Const.isOne();
11618 case ISD::AND:
11619 case ISD::UMIN:
11620 return Const.isAllOnes();
11621 case ISD::SMAX:
11622 return Const.isMinSignedValue();
11623 case ISD::SMIN:
11624 return Const.isMaxSignedValue();
11625 case ISD::SUB:
11626 case ISD::SHL:
11627 case ISD::SRA:
11628 case ISD::SRL:
11629 return OperandNo == 1 && Const.isZero();
11630 case ISD::UDIV:
11631 case ISD::SDIV:
11632 return OperandNo == 1 && Const.isOne();
11633 }
11634 } else if (auto *ConstFP = isConstOrConstSplatFP(V)) {
11635 switch (Opcode) {
11636 case ISD::FADD:
11637 return ConstFP->isZero() &&
11638 (Flags.hasNoSignedZeros() || ConstFP->isNegative());
11639 case ISD::FSUB:
11640 return OperandNo == 1 && ConstFP->isZero() &&
11641 (Flags.hasNoSignedZeros() || !ConstFP->isNegative());
11642 case ISD::FMUL:
11643 return ConstFP->isExactlyValue(1.0);
11644 case ISD::FDIV:
11645 return OperandNo == 1 && ConstFP->isExactlyValue(1.0);
11646 case ISD::FMINNUM:
11647 case ISD::FMAXNUM: {
11648 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
11649 EVT VT = V.getValueType();
11651 APFloat NeutralAF = !Flags.hasNoNaNs()
11652 ? APFloat::getQNaN(Semantics)
11653 : !Flags.hasNoInfs()
11654 ? APFloat::getInf(Semantics)
11655 : APFloat::getLargest(Semantics);
11656 if (Opcode == ISD::FMAXNUM)
11657 NeutralAF.changeSign();
11658
11659 return ConstFP->isExactlyValue(NeutralAF);
11660 }
11661 }
11662 }
11663 return false;
11664}
11665
11667 while (V.getOpcode() == ISD::BITCAST)
11668 V = V.getOperand(0);
11669 return V;
11670}
11671
11673 while (V.getOpcode() == ISD::BITCAST && V.getOperand(0).hasOneUse())
11674 V = V.getOperand(0);
11675 return V;
11676}
11677
11679 while (V.getOpcode() == ISD::EXTRACT_SUBVECTOR)
11680 V = V.getOperand(0);
11681 return V;
11682}
11683
11685 while (V.getOpcode() == ISD::TRUNCATE)
11686 V = V.getOperand(0);
11687 return V;
11688}
11689
11690bool llvm::isBitwiseNot(SDValue V, bool AllowUndefs) {
11691 if (V.getOpcode() != ISD::XOR)
11692 return false;
11693 V = peekThroughBitcasts(V.getOperand(1));
11694 unsigned NumBits = V.getScalarValueSizeInBits();
11695 ConstantSDNode *C =
11696 isConstOrConstSplat(V, AllowUndefs, /*AllowTruncation*/ true);
11697 return C && (C->getAPIntValue().countr_one() >= NumBits);
11698}
11699
11701 bool AllowTruncation) {
11702 EVT VT = N.getValueType();
11703 APInt DemandedElts = VT.isFixedLengthVector()
11705 : APInt(1, 1);
11706 return isConstOrConstSplat(N, DemandedElts, AllowUndefs, AllowTruncation);
11707}
11708
11710 bool AllowUndefs,
11711 bool AllowTruncation) {
11712 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N))
11713 return CN;
11714
11715 // SplatVectors can truncate their operands. Ignore that case here unless
11716 // AllowTruncation is set.
11717 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
11718 EVT VecEltVT = N->getValueType(0).getVectorElementType();
11719 if (auto *CN = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
11720 EVT CVT = CN->getValueType(0);
11721 assert(CVT.bitsGE(VecEltVT) && "Illegal splat_vector element extension");
11722 if (AllowTruncation || CVT == VecEltVT)
11723 return CN;
11724 }
11725 }
11726
11727 if (BuildVectorSDNode *BV = dyn_cast<BuildVectorSDNode>(N)) {
11728 BitVector UndefElements;
11729 ConstantSDNode *CN = BV->getConstantSplatNode(DemandedElts, &UndefElements);
11730
11731 // BuildVectors can truncate their operands. Ignore that case here unless
11732 // AllowTruncation is set.
11733 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
11734 if (CN && (UndefElements.none() || AllowUndefs)) {
11735 EVT CVT = CN->getValueType(0);
11736 EVT NSVT = N.getValueType().getScalarType();
11737 assert(CVT.bitsGE(NSVT) && "Illegal build vector element extension");
11738 if (AllowTruncation || (CVT == NSVT))
11739 return CN;
11740 }
11741 }
11742
11743 return nullptr;
11744}
11745
11747 EVT VT = N.getValueType();
11748 APInt DemandedElts = VT.isFixedLengthVector()
11750 : APInt(1, 1);
11751 return isConstOrConstSplatFP(N, DemandedElts, AllowUndefs);
11752}
11753
11755 const APInt &DemandedElts,
11756 bool AllowUndefs) {
11757 if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N))
11758 return CN;
11759
11760 if (BuildVectorSDNode *BV = dyn_cast<BuildVectorSDNode>(N)) {
11761 BitVector UndefElements;
11762 ConstantFPSDNode *CN =
11763 BV->getConstantFPSplatNode(DemandedElts, &UndefElements);
11764 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
11765 if (CN && (UndefElements.none() || AllowUndefs))
11766 return CN;
11767 }
11768
11769 if (N.getOpcode() == ISD::SPLAT_VECTOR)
11770 if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N.getOperand(0)))
11771 return CN;
11772
11773 return nullptr;
11774}
11775
11776bool llvm::isNullOrNullSplat(SDValue N, bool AllowUndefs) {
11777 // TODO: may want to use peekThroughBitcast() here.
11778 ConstantSDNode *C =
11779 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
11780 return C && C->isZero();
11781}
11782
11783bool llvm::isOneOrOneSplat(SDValue N, bool AllowUndefs) {
11784 ConstantSDNode *C =
11785 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation*/ true);
11786 return C && C->isOne();
11787}
11788
11789bool llvm::isAllOnesOrAllOnesSplat(SDValue N, bool AllowUndefs) {
11791 unsigned BitWidth = N.getScalarValueSizeInBits();
11792 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs);
11793 return C && C->isAllOnes() && C->getValueSizeInBits(0) == BitWidth;
11794}
11795
11797 DropOperands();
11798}
11799
11800MemSDNode::MemSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl,
11801 SDVTList VTs, EVT memvt, MachineMemOperand *mmo)
11802 : SDNode(Opc, Order, dl, VTs), MemoryVT(memvt), MMO(mmo) {
11803 MemSDNodeBits.IsVolatile = MMO->isVolatile();
11804 MemSDNodeBits.IsNonTemporal = MMO->isNonTemporal();
11805 MemSDNodeBits.IsDereferenceable = MMO->isDereferenceable();
11806 MemSDNodeBits.IsInvariant = MMO->isInvariant();
11807
11808 // We check here that the size of the memory operand fits within the size of
11809 // the MMO. This is because the MMO might indicate only a possible address
11810 // range instead of specifying the affected memory addresses precisely.
11811 assert(
11812 (!MMO->getType().isValid() ||
11814 "Size mismatch!");
11815}
11816
11817/// Profile - Gather unique data for the node.
11818///
11820 AddNodeIDNode(ID, this);
11821}
11822
11823namespace {
11824
11825 struct EVTArray {
11826 std::vector<EVT> VTs;
11827
11828 EVTArray() {
11829 VTs.reserve(MVT::VALUETYPE_SIZE);
11830 for (unsigned i = 0; i < MVT::VALUETYPE_SIZE; ++i)
11831 VTs.push_back(MVT((MVT::SimpleValueType)i));
11832 }
11833 };
11834
11835} // end anonymous namespace
11836
11837/// getValueTypeList - Return a pointer to the specified value type.
11838///
11839const EVT *SDNode::getValueTypeList(EVT VT) {
11840 static std::set<EVT, EVT::compareRawBits> EVTs;
11841 static EVTArray SimpleVTArray;
11842 static sys::SmartMutex<true> VTMutex;
11843
11844 if (VT.isExtended()) {
11845 sys::SmartScopedLock<true> Lock(VTMutex);
11846 return &(*EVTs.insert(VT).first);
11847 }
11848 assert(VT.getSimpleVT() < MVT::VALUETYPE_SIZE && "Value type out of range!");
11849 return &SimpleVTArray.VTs[VT.getSimpleVT().SimpleTy];
11850}
11851
11852/// hasNUsesOfValue - Return true if there are exactly NUSES uses of the
11853/// indicated value. This method ignores uses of other values defined by this
11854/// operation.
11855bool SDNode::hasNUsesOfValue(unsigned NUses, unsigned Value) const {
11856 assert(Value < getNumValues() && "Bad value!");
11857
11858 // TODO: Only iterate over uses of a given value of the node
11859 for (SDNode::use_iterator UI = use_begin(), E = use_end(); UI != E; ++UI) {
11860 if (UI.getUse().getResNo() == Value) {
11861 if (NUses == 0)
11862 return false;
11863 --NUses;
11864 }
11865 }
11866
11867 // Found exactly the right number of uses?
11868 return NUses == 0;
11869}
11870
11871/// hasAnyUseOfValue - Return true if there are any use of the indicated
11872/// value. This method ignores uses of other values defined by this operation.
11873bool SDNode::hasAnyUseOfValue(unsigned Value) const {
11874 assert(Value < getNumValues() && "Bad value!");
11875
11876 for (SDNode::use_iterator UI = use_begin(), E = use_end(); UI != E; ++UI)
11877 if (UI.getUse().getResNo() == Value)
11878 return true;
11879
11880 return false;
11881}
11882
11883/// isOnlyUserOf - Return true if this node is the only use of N.
11884bool SDNode::isOnlyUserOf(const SDNode *N) const {
11885 bool Seen = false;
11886 for (const SDNode *User : N->uses()) {
11887 if (User == this)
11888 Seen = true;
11889 else
11890 return false;
11891 }
11892
11893 return Seen;
11894}
11895
11896/// Return true if the only users of N are contained in Nodes.
11898 bool Seen = false;
11899 for (const SDNode *User : N->uses()) {
11900 if (llvm::is_contained(Nodes, User))
11901 Seen = true;
11902 else
11903 return false;
11904 }
11905
11906 return Seen;
11907}
11908
11909/// isOperand - Return true if this node is an operand of N.
11910bool SDValue::isOperandOf(const SDNode *N) const {
11911 return is_contained(N->op_values(), *this);
11912}
11913
11914bool SDNode::isOperandOf(const SDNode *N) const {
11915 return any_of(N->op_values(),
11916 [this](SDValue Op) { return this == Op.getNode(); });
11917}
11918
11919/// reachesChainWithoutSideEffects - Return true if this operand (which must
11920/// be a chain) reaches the specified operand without crossing any
11921/// side-effecting instructions on any chain path. In practice, this looks
11922/// through token factors and non-volatile loads. In order to remain efficient,
11923/// this only looks a couple of nodes in, it does not do an exhaustive search.
11924///
11925/// Note that we only need to examine chains when we're searching for
11926/// side-effects; SelectionDAG requires that all side-effects are represented
11927/// by chains, even if another operand would force a specific ordering. This
11928/// constraint is necessary to allow transformations like splitting loads.
11930 unsigned Depth) const {
11931 if (*this == Dest) return true;
11932
11933 // Don't search too deeply, we just want to be able to see through
11934 // TokenFactor's etc.
11935 if (Depth == 0) return false;
11936
11937 // If this is a token factor, all inputs to the TF happen in parallel.
11938 if (getOpcode() == ISD::TokenFactor) {
11939 // First, try a shallow search.
11940 if (is_contained((*this)->ops(), Dest)) {
11941 // We found the chain we want as an operand of this TokenFactor.
11942 // Essentially, we reach the chain without side-effects if we could
11943 // serialize the TokenFactor into a simple chain of operations with
11944 // Dest as the last operation. This is automatically true if the
11945 // chain has one use: there are no other ordering constraints.
11946 // If the chain has more than one use, we give up: some other
11947 // use of Dest might force a side-effect between Dest and the current
11948 // node.
11949 if (Dest.hasOneUse())
11950 return true;
11951 }
11952 // Next, try a deep search: check whether every operand of the TokenFactor
11953 // reaches Dest.
11954 return llvm::all_of((*this)->ops(), [=](SDValue Op) {
11955 return Op.reachesChainWithoutSideEffects(Dest, Depth - 1);
11956 });
11957 }
11958
11959 // Loads don't have side effects, look through them.
11960 if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(*this)) {
11961 if (Ld->isUnordered())
11962 return Ld->getChain().reachesChainWithoutSideEffects(Dest, Depth-1);
11963 }
11964 return false;
11965}
11966
11967bool SDNode::hasPredecessor(const SDNode *N) const {
11970 Worklist.push_back(this);
11971 return hasPredecessorHelper(N, Visited, Worklist);
11972}
11973
11975 this->Flags.intersectWith(Flags);
11976}
11977
11978SDValue
11980 ArrayRef<ISD::NodeType> CandidateBinOps,
11981 bool AllowPartials) {
11982 // The pattern must end in an extract from index 0.
11983 if (Extract->getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
11984 !isNullConstant(Extract->getOperand(1)))
11985 return SDValue();
11986
11987 // Match against one of the candidate binary ops.
11988 SDValue Op = Extract->getOperand(0);
11989 if (llvm::none_of(CandidateBinOps, [Op](ISD::NodeType BinOp) {
11990 return Op.getOpcode() == unsigned(BinOp);
11991 }))
11992 return SDValue();
11993
11994 // Floating-point reductions may require relaxed constraints on the final step
11995 // of the reduction because they may reorder intermediate operations.
11996 unsigned CandidateBinOp = Op.getOpcode();
11997 if (Op.getValueType().isFloatingPoint()) {
11998 SDNodeFlags Flags = Op->getFlags();
11999 switch (CandidateBinOp) {
12000 case ISD::FADD:
12001 if (!Flags.hasNoSignedZeros() || !Flags.hasAllowReassociation())
12002 return SDValue();
12003 break;
12004 default:
12005 llvm_unreachable("Unhandled FP opcode for binop reduction");
12006 }
12007 }
12008
12009 // Matching failed - attempt to see if we did enough stages that a partial
12010 // reduction from a subvector is possible.
12011 auto PartialReduction = [&](SDValue Op, unsigned NumSubElts) {
12012 if (!AllowPartials || !Op)
12013 return SDValue();
12014 EVT OpVT = Op.getValueType();
12015 EVT OpSVT = OpVT.getScalarType();
12016 EVT SubVT = EVT::getVectorVT(*getContext(), OpSVT, NumSubElts);
12017 if (!TLI->isExtractSubvectorCheap(SubVT, OpVT, 0))
12018 return SDValue();
12019 BinOp = (ISD::NodeType)CandidateBinOp;
12020 return getNode(ISD::EXTRACT_SUBVECTOR, SDLoc(Op), SubVT, Op,
12022 };
12023
12024 // At each stage, we're looking for something that looks like:
12025 // %s = shufflevector <8 x i32> %op, <8 x i32> undef,
12026 // <8 x i32> <i32 2, i32 3, i32 undef, i32 undef,
12027 // i32 undef, i32 undef, i32 undef, i32 undef>
12028 // %a = binop <8 x i32> %op, %s
12029 // Where the mask changes according to the stage. E.g. for a 3-stage pyramid,
12030 // we expect something like:
12031 // <4,5,6,7,u,u,u,u>
12032 // <2,3,u,u,u,u,u,u>
12033 // <1,u,u,u,u,u,u,u>
12034 // While a partial reduction match would be:
12035 // <2,3,u,u,u,u,u,u>
12036 // <1,u,u,u,u,u,u,u>
12037 unsigned Stages = Log2_32(Op.getValueType().getVectorNumElements());
12038 SDValue PrevOp;
12039 for (unsigned i = 0; i < Stages; ++i) {
12040 unsigned MaskEnd = (1 << i);
12041
12042 if (Op.getOpcode() != CandidateBinOp)
12043 return PartialReduction(PrevOp, MaskEnd);
12044
12045 SDValue Op0 = Op.getOperand(0);
12046 SDValue Op1 = Op.getOperand(1);
12047
12048 ShuffleVectorSDNode *Shuffle = dyn_cast<ShuffleVectorSDNode>(Op0);
12049 if (Shuffle) {
12050 Op = Op1;
12051 } else {
12052 Shuffle = dyn_cast<ShuffleVectorSDNode>(Op1);
12053 Op = Op0;
12054 }
12055
12056 // The first operand of the shuffle should be the same as the other operand
12057 // of the binop.
12058 if (!Shuffle || Shuffle->getOperand(0) != Op)
12059 return PartialReduction(PrevOp, MaskEnd);
12060
12061 // Verify the shuffle has the expected (at this stage of the pyramid) mask.
12062 for (int Index = 0; Index < (int)MaskEnd; ++Index)
12063 if (Shuffle->getMaskElt(Index) != (int)(MaskEnd + Index))
12064 return PartialReduction(PrevOp, MaskEnd);
12065
12066 PrevOp = Op;
12067 }
12068
12069 // Handle subvector reductions, which tend to appear after the shuffle
12070 // reduction stages.
12071 while (Op.getOpcode() == CandidateBinOp) {
12072 unsigned NumElts = Op.getValueType().getVectorNumElements();
12073 SDValue Op0 = Op.getOperand(0);
12074 SDValue Op1 = Op.getOperand(1);
12075 if (Op0.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
12077 Op0.getOperand(0) != Op1.getOperand(0))
12078 break;
12079 SDValue Src = Op0.getOperand(0);
12080 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
12081 if (NumSrcElts != (2 * NumElts))
12082 break;
12083 if (!(Op0.getConstantOperandAPInt(1) == 0 &&
12084 Op1.getConstantOperandAPInt(1) == NumElts) &&
12085 !(Op1.getConstantOperandAPInt(1) == 0 &&
12086 Op0.getConstantOperandAPInt(1) == NumElts))
12087 break;
12088 Op = Src;
12089 }
12090
12091 BinOp = (ISD::NodeType)CandidateBinOp;
12092 return Op;
12093}
12094
12096 EVT VT = N->getValueType(0);
12097 EVT EltVT = VT.getVectorElementType();
12098 unsigned NE = VT.getVectorNumElements();
12099
12100 SDLoc dl(N);
12101
12102 // If ResNE is 0, fully unroll the vector op.
12103 if (ResNE == 0)
12104 ResNE = NE;
12105 else if (NE > ResNE)
12106 NE = ResNE;
12107
12108 if (N->getNumValues() == 2) {
12109 SmallVector<SDValue, 8> Scalars0, Scalars1;
12110 SmallVector<SDValue, 4> Operands(N->getNumOperands());
12111 EVT VT1 = N->getValueType(1);
12112 EVT EltVT1 = VT1.getVectorElementType();
12113
12114 unsigned i;
12115 for (i = 0; i != NE; ++i) {
12116 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
12117 SDValue Operand = N->getOperand(j);
12118 EVT OperandVT = Operand.getValueType();
12119
12120 // A vector operand; extract a single element.
12121 EVT OperandEltVT = OperandVT.getVectorElementType();
12122 Operands[j] = getNode(ISD::EXTRACT_VECTOR_ELT, dl, OperandEltVT,
12123 Operand, getVectorIdxConstant(i, dl));
12124 }
12125
12126 SDValue EltOp = getNode(N->getOpcode(), dl, {EltVT, EltVT1}, Operands);
12127 Scalars0.push_back(EltOp);
12128 Scalars1.push_back(EltOp.getValue(1));
12129 }
12130
12131 SDValue Vec0 = getBuildVector(VT, dl, Scalars0);
12132 SDValue Vec1 = getBuildVector(VT1, dl, Scalars1);
12133 return getMergeValues({Vec0, Vec1}, dl);
12134 }
12135
12136 assert(N->getNumValues() == 1 &&
12137 "Can't unroll a vector with multiple results!");
12138
12140 SmallVector<SDValue, 4> Operands(N->getNumOperands());
12141
12142 unsigned i;
12143 for (i= 0; i != NE; ++i) {
12144 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
12145 SDValue Operand = N->getOperand(j);
12146 EVT OperandVT = Operand.getValueType();
12147 if (OperandVT.isVector()) {
12148 // A vector operand; extract a single element.
12149 EVT OperandEltVT = OperandVT.getVectorElementType();
12150 Operands[j] = getNode(ISD::EXTRACT_VECTOR_ELT, dl, OperandEltVT,
12151 Operand, getVectorIdxConstant(i, dl));
12152 } else {
12153 // A scalar operand; just use it as is.
12154 Operands[j] = Operand;
12155 }
12156 }
12157
12158 switch (N->getOpcode()) {
12159 default: {
12160 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands,
12161 N->getFlags()));
12162 break;
12163 }
12164 case ISD::VSELECT:
12165 Scalars.push_back(getNode(ISD::SELECT, dl, EltVT, Operands));
12166 break;
12167 case ISD::SHL:
12168 case ISD::SRA:
12169 case ISD::SRL:
12170 case ISD::ROTL:
12171 case ISD::ROTR:
12172 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands[0],
12174 Operands[1])));
12175 break;
12177 EVT ExtVT = cast<VTSDNode>(Operands[1])->getVT().getVectorElementType();
12178 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT,
12179 Operands[0],
12180 getValueType(ExtVT)));
12181 }
12182 }
12183 }
12184
12185 for (; i < ResNE; ++i)
12186 Scalars.push_back(getUNDEF(EltVT));
12187
12188 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResNE);
12189 return getBuildVector(VecVT, dl, Scalars);
12190}
12191
12192std::pair<SDValue, SDValue> SelectionDAG::UnrollVectorOverflowOp(
12193 SDNode *N, unsigned ResNE) {
12194 unsigned Opcode = N->getOpcode();
12195 assert((Opcode == ISD::UADDO || Opcode == ISD::SADDO ||
12196 Opcode == ISD::USUBO || Opcode == ISD::SSUBO ||
12197 Opcode == ISD::UMULO || Opcode == ISD::SMULO) &&
12198 "Expected an overflow opcode");
12199
12200 EVT ResVT = N->getValueType(0);
12201 EVT OvVT = N->getValueType(1);
12202 EVT ResEltVT = ResVT.getVectorElementType();
12203 EVT OvEltVT = OvVT.getVectorElementType();
12204 SDLoc dl(N);
12205
12206 // If ResNE is 0, fully unroll the vector op.
12207 unsigned NE = ResVT.getVectorNumElements();
12208 if (ResNE == 0)
12209 ResNE = NE;
12210 else if (NE > ResNE)
12211 NE = ResNE;
12212
12213 SmallVector<SDValue, 8> LHSScalars;
12214 SmallVector<SDValue, 8> RHSScalars;
12215 ExtractVectorElements(N->getOperand(0), LHSScalars, 0, NE);
12216 ExtractVectorElements(N->getOperand(1), RHSScalars, 0, NE);
12217
12218 EVT SVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), ResEltVT);
12219 SDVTList VTs = getVTList(ResEltVT, SVT);
12220 SmallVector<SDValue, 8> ResScalars;
12221 SmallVector<SDValue, 8> OvScalars;
12222 for (unsigned i = 0; i < NE; ++i) {
12223 SDValue Res = getNode(Opcode, dl, VTs, LHSScalars[i], RHSScalars[i]);
12224 SDValue Ov =
12225 getSelect(dl, OvEltVT, Res.getValue(1),
12226 getBoolConstant(true, dl, OvEltVT, ResVT),
12227 getConstant(0, dl, OvEltVT));
12228
12229 ResScalars.push_back(Res);
12230 OvScalars.push_back(Ov);
12231 }
12232
12233 ResScalars.append(ResNE - NE, getUNDEF(ResEltVT));
12234 OvScalars.append(ResNE - NE, getUNDEF(OvEltVT));
12235
12236 EVT NewResVT = EVT::getVectorVT(*getContext(), ResEltVT, ResNE);
12237 EVT NewOvVT = EVT::getVectorVT(*getContext(), OvEltVT, ResNE);
12238 return std::make_pair(getBuildVector(NewResVT, dl, ResScalars),
12239 getBuildVector(NewOvVT, dl, OvScalars));
12240}
12241
12244 unsigned Bytes,
12245 int Dist) const {
12246 if (LD->isVolatile() || Base->isVolatile())
12247 return false;
12248 // TODO: probably too restrictive for atomics, revisit
12249 if (!LD->isSimple())
12250 return false;
12251 if (LD->isIndexed() || Base->isIndexed())
12252 return false;
12253 if (LD->getChain() != Base->getChain())
12254 return false;
12255 EVT VT = LD->getMemoryVT();
12256 if (VT.getSizeInBits() / 8 != Bytes)
12257 return false;
12258
12259 auto BaseLocDecomp = BaseIndexOffset::match(Base, *this);
12260 auto LocDecomp = BaseIndexOffset::match(LD, *this);
12261
12262 int64_t Offset = 0;
12263 if (BaseLocDecomp.equalBaseIndex(LocDecomp, *this, Offset))
12264 return (Dist * (int64_t)Bytes == Offset);
12265 return false;
12266}
12267
12268/// InferPtrAlignment - Infer alignment of a load / store address. Return
12269/// std::nullopt if it cannot be inferred.
12271 // If this is a GlobalAddress + cst, return the alignment.
12272 const GlobalValue *GV = nullptr;
12273 int64_t GVOffset = 0;
12274 if (TLI->isGAPlusOffset(Ptr.getNode(), GV, GVOffset)) {
12275 unsigned PtrWidth = getDataLayout().getPointerTypeSizeInBits(GV->getType());
12276 KnownBits Known(PtrWidth);
12278 unsigned AlignBits = Known.countMinTrailingZeros();
12279 if (AlignBits)
12280 return commonAlignment(Align(1ull << std::min(31U, AlignBits)), GVOffset);
12281 }
12282
12283 // If this is a direct reference to a stack slot, use information about the
12284 // stack slot's alignment.
12285 int FrameIdx = INT_MIN;
12286 int64_t FrameOffset = 0;
12287 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr)) {
12288 FrameIdx = FI->getIndex();
12289 } else if (isBaseWithConstantOffset(Ptr) &&
12290 isa<FrameIndexSDNode>(Ptr.getOperand(0))) {
12291 // Handle FI+Cst
12292 FrameIdx = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
12293 FrameOffset = Ptr.getConstantOperandVal(1);
12294 }
12295
12296 if (FrameIdx != INT_MIN) {
12298 return commonAlignment(MFI.getObjectAlign(FrameIdx), FrameOffset);
12299 }
12300
12301 return std::nullopt;
12302}
12303
12304/// Split the scalar node with EXTRACT_ELEMENT using the provided
12305/// VTs and return the low/high part.
12306std::pair<SDValue, SDValue> SelectionDAG::SplitScalar(const SDValue &N,
12307 const SDLoc &DL,
12308 const EVT &LoVT,
12309 const EVT &HiVT) {
12310 assert(!LoVT.isVector() && !HiVT.isVector() && !N.getValueType().isVector() &&
12311 "Split node must be a scalar type");
12312 SDValue Lo =
12314 SDValue Hi =
12316 return std::make_pair(Lo, Hi);
12317}
12318
12319/// GetSplitDestVTs - Compute the VTs needed for the low/hi parts of a type
12320/// which is split (or expanded) into two not necessarily identical pieces.
12321std::pair<EVT, EVT> SelectionDAG::GetSplitDestVTs(const EVT &VT) const {
12322 // Currently all types are split in half.
12323 EVT LoVT, HiVT;
12324 if (!VT.isVector())
12325 LoVT = HiVT = TLI->getTypeToTransformTo(*getContext(), VT);
12326 else
12327 LoVT = HiVT = VT.getHalfNumVectorElementsVT(*getContext());
12328
12329 return std::make_pair(LoVT, HiVT);
12330}
12331
12332/// GetDependentSplitDestVTs - Compute the VTs needed for the low/hi parts of a
12333/// type, dependent on an enveloping VT that has been split into two identical
12334/// pieces. Sets the HiIsEmpty flag when hi type has zero storage size.
12335std::pair<EVT, EVT>
12337 bool *HiIsEmpty) const {
12338 EVT EltTp = VT.getVectorElementType();
12339 // Examples:
12340 // custom VL=8 with enveloping VL=8/8 yields 8/0 (hi empty)
12341 // custom VL=9 with enveloping VL=8/8 yields 8/1
12342 // custom VL=10 with enveloping VL=8/8 yields 8/2
12343 // etc.
12344 ElementCount VTNumElts = VT.getVectorElementCount();
12345 ElementCount EnvNumElts = EnvVT.getVectorElementCount();
12346 assert(VTNumElts.isScalable() == EnvNumElts.isScalable() &&
12347 "Mixing fixed width and scalable vectors when enveloping a type");
12348 EVT LoVT, HiVT;
12349 if (VTNumElts.getKnownMinValue() > EnvNumElts.getKnownMinValue()) {
12350 LoVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
12351 HiVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts - EnvNumElts);
12352 *HiIsEmpty = false;
12353 } else {
12354 // Flag that hi type has zero storage size, but return split envelop type
12355 // (this would be easier if vector types with zero elements were allowed).
12356 LoVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts);
12357 HiVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
12358 *HiIsEmpty = true;
12359 }
12360 return std::make_pair(LoVT, HiVT);
12361}
12362
12363/// SplitVector - Split the vector with EXTRACT_SUBVECTOR and return the
12364/// low/high part.
12365std::pair<SDValue, SDValue>
12366SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT,
12367 const EVT &HiVT) {
12368 assert(LoVT.isScalableVector() == HiVT.isScalableVector() &&
12369 LoVT.isScalableVector() == N.getValueType().isScalableVector() &&
12370 "Splitting vector with an invalid mixture of fixed and scalable "
12371 "vector types");
12373 N.getValueType().getVectorMinNumElements() &&
12374 "More vector elements requested than available!");
12375 SDValue Lo, Hi;
12376 Lo =
12378 // For scalable vectors it is safe to use LoVT.getVectorMinNumElements()
12379 // (rather than having to use ElementCount), because EXTRACT_SUBVECTOR scales
12380 // IDX with the runtime scaling factor of the result vector type. For
12381 // fixed-width result vectors, that runtime scaling factor is 1.
12384 return std::make_pair(Lo, Hi);
12385}
12386
12387std::pair<SDValue, SDValue> SelectionDAG::SplitEVL(SDValue N, EVT VecVT,
12388 const SDLoc &DL) {
12389 // Split the vector length parameter.
12390 // %evl -> umin(%evl, %halfnumelts) and usubsat(%evl - %halfnumelts).
12391 EVT VT = N.getValueType();
12393 "Expecting the mask to be an evenly-sized vector");
12394 unsigned HalfMinNumElts = VecVT.getVectorMinNumElements() / 2;
12395 SDValue HalfNumElts =
12396 VecVT.isFixedLengthVector()
12397 ? getConstant(HalfMinNumElts, DL, VT)
12398 : getVScale(DL, VT, APInt(VT.getScalarSizeInBits(), HalfMinNumElts));
12399 SDValue Lo = getNode(ISD::UMIN, DL, VT, N, HalfNumElts);
12400 SDValue Hi = getNode(ISD::USUBSAT, DL, VT, N, HalfNumElts);
12401 return std::make_pair(Lo, Hi);
12402}
12403
12404/// Widen the vector up to the next power of two using INSERT_SUBVECTOR.
12406 EVT VT = N.getValueType();
12409 return getNode(ISD::INSERT_SUBVECTOR, DL, WideVT, getUNDEF(WideVT), N,
12411}
12412
12415 unsigned Start, unsigned Count,
12416 EVT EltVT) {
12417 EVT VT = Op.getValueType();
12418 if (Count == 0)
12419 Count = VT.getVectorNumElements();
12420 if (EltVT == EVT())
12421 EltVT = VT.getVectorElementType();
12422 SDLoc SL(Op);
12423 for (unsigned i = Start, e = Start + Count; i != e; ++i) {
12424 Args.push_back(getNode(ISD::EXTRACT_VECTOR_ELT, SL, EltVT, Op,
12425 getVectorIdxConstant(i, SL)));
12426 }
12427}
12428
12429// getAddressSpace - Return the address space this GlobalAddress belongs to.
12431 return getGlobal()->getType()->getAddressSpace();
12432}
12433
12436 return Val.MachineCPVal->getType();
12437 return Val.ConstVal->getType();
12438}
12439
12440bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue, APInt &SplatUndef,
12441 unsigned &SplatBitSize,
12442 bool &HasAnyUndefs,
12443 unsigned MinSplatBits,
12444 bool IsBigEndian) const {
12445 EVT VT = getValueType(0);
12446 assert(VT.isVector() && "Expected a vector type");
12447 unsigned VecWidth = VT.getSizeInBits();
12448 if (MinSplatBits > VecWidth)
12449 return false;
12450
12451 // FIXME: The widths are based on this node's type, but build vectors can
12452 // truncate their operands.
12453 SplatValue = APInt(VecWidth, 0);
12454 SplatUndef = APInt(VecWidth, 0);
12455
12456 // Get the bits. Bits with undefined values (when the corresponding element
12457 // of the vector is an ISD::UNDEF value) are set in SplatUndef and cleared
12458 // in SplatValue. If any of the values are not constant, give up and return
12459 // false.
12460 unsigned int NumOps = getNumOperands();
12461 assert(NumOps > 0 && "isConstantSplat has 0-size build vector");
12462 unsigned EltWidth = VT.getScalarSizeInBits();
12463
12464 for (unsigned j = 0; j < NumOps; ++j) {
12465 unsigned i = IsBigEndian ? NumOps - 1 - j : j;
12466 SDValue OpVal = getOperand(i);
12467 unsigned BitPos = j * EltWidth;
12468
12469 if (OpVal.isUndef())
12470 SplatUndef.setBits(BitPos, BitPos + EltWidth);
12471 else if (auto *CN = dyn_cast<ConstantSDNode>(OpVal))
12472 SplatValue.insertBits(CN->getAPIntValue().zextOrTrunc(EltWidth), BitPos);
12473 else if (auto *CN = dyn_cast<ConstantFPSDNode>(OpVal))
12474 SplatValue.insertBits(CN->getValueAPF().bitcastToAPInt(), BitPos);
12475 else
12476 return false;
12477 }
12478
12479 // The build_vector is all constants or undefs. Find the smallest element
12480 // size that splats the vector.
12481 HasAnyUndefs = (SplatUndef != 0);
12482
12483 // FIXME: This does not work for vectors with elements less than 8 bits.
12484 while (VecWidth > 8) {
12485 // If we can't split in half, stop here.
12486 if (VecWidth & 1)
12487 break;
12488
12489 unsigned HalfSize = VecWidth / 2;
12490 APInt HighValue = SplatValue.extractBits(HalfSize, HalfSize);
12491 APInt LowValue = SplatValue.extractBits(HalfSize, 0);
12492 APInt HighUndef = SplatUndef.extractBits(HalfSize, HalfSize);
12493 APInt LowUndef = SplatUndef.extractBits(HalfSize, 0);
12494
12495 // If the two halves do not match (ignoring undef bits), stop here.
12496 if ((HighValue & ~LowUndef) != (LowValue & ~HighUndef) ||
12497 MinSplatBits > HalfSize)
12498 break;
12499
12500 SplatValue = HighValue | LowValue;
12501 SplatUndef = HighUndef & LowUndef;
12502
12503 VecWidth = HalfSize;
12504 }
12505
12506 // FIXME: The loop above only tries to split in halves. But if the input
12507 // vector for example is <3 x i16> it wouldn't be able to detect a
12508 // SplatBitSize of 16. No idea if that is a design flaw currently limiting
12509 // optimizations. I guess that back in the days when this helper was created
12510 // vectors normally was power-of-2 sized.
12511
12512 SplatBitSize = VecWidth;
12513 return true;
12514}
12515
12517 BitVector *UndefElements) const {
12518 unsigned NumOps = getNumOperands();
12519 if (UndefElements) {
12520 UndefElements->clear();
12521 UndefElements->resize(NumOps);
12522 }
12523 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
12524 if (!DemandedElts)
12525 return SDValue();
12526 SDValue Splatted;
12527 for (unsigned i = 0; i != NumOps; ++i) {
12528 if (!DemandedElts[i])
12529 continue;
12530 SDValue Op = getOperand(i);
12531 if (Op.isUndef()) {
12532 if (UndefElements)
12533 (*UndefElements)[i] = true;
12534 } else if (!Splatted) {
12535 Splatted = Op;
12536 } else if (Splatted != Op) {
12537 return SDValue();
12538 }
12539 }
12540
12541 if (!Splatted) {
12542 unsigned FirstDemandedIdx = DemandedElts.countr_zero();
12543 assert(getOperand(FirstDemandedIdx).isUndef() &&
12544 "Can only have a splat without a constant for all undefs.");
12545 return getOperand(FirstDemandedIdx);
12546 }
12547
12548 return Splatted;
12549}
12550
12552 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
12553 return getSplatValue(DemandedElts, UndefElements);
12554}
12555
12557 SmallVectorImpl<SDValue> &Sequence,
12558 BitVector *UndefElements) const {
12559 unsigned NumOps = getNumOperands();
12560 Sequence.clear();
12561 if (UndefElements) {
12562 UndefElements->clear();
12563 UndefElements->resize(NumOps);
12564 }
12565 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
12566 if (!DemandedElts || NumOps < 2 || !isPowerOf2_32(NumOps))
12567 return false;
12568
12569 // Set the undefs even if we don't find a sequence (like getSplatValue).
12570 if (UndefElements)
12571 for (unsigned I = 0; I != NumOps; ++I)
12572 if (DemandedElts[I] && getOperand(I).isUndef())
12573 (*UndefElements)[I] = true;
12574
12575 // Iteratively widen the sequence length looking for repetitions.
12576 for (unsigned SeqLen = 1; SeqLen < NumOps; SeqLen *= 2) {
12577 Sequence.append(SeqLen, SDValue());
12578 for (unsigned I = 0; I != NumOps; ++I) {
12579 if (!DemandedElts[I])
12580 continue;
12581 SDValue &SeqOp = Sequence[I % SeqLen];
12583 if (Op.isUndef()) {
12584 if (!SeqOp)
12585 SeqOp = Op;
12586 continue;
12587 }
12588 if (SeqOp && !SeqOp.isUndef() && SeqOp != Op) {
12589 Sequence.clear();
12590 break;
12591 }
12592 SeqOp = Op;
12593 }
12594 if (!Sequence.empty())
12595 return true;
12596 }
12597
12598 assert(Sequence.empty() && "Failed to empty non-repeating sequence pattern");
12599 return false;
12600}
12601
12603 BitVector *UndefElements) const {
12604 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
12605 return getRepeatedSequence(DemandedElts, Sequence, UndefElements);
12606}
12607
12610 BitVector *UndefElements) const {
12611 return dyn_cast_or_null<ConstantSDNode>(
12612 getSplatValue(DemandedElts, UndefElements));
12613}
12614
12617 return dyn_cast_or_null<ConstantSDNode>(getSplatValue(UndefElements));
12618}
12619
12622 BitVector *UndefElements) const {
12623 return dyn_cast_or_null<ConstantFPSDNode>(
12624 getSplatValue(DemandedElts, UndefElements));
12625}
12626
12629 return dyn_cast_or_null<ConstantFPSDNode>(getSplatValue(UndefElements));
12630}
12631
12632int32_t
12634 uint32_t BitWidth) const {
12635 if (ConstantFPSDNode *CN =
12636 dyn_cast_or_null<ConstantFPSDNode>(getSplatValue(UndefElements))) {
12637 bool IsExact;
12638 APSInt IntVal(BitWidth);
12639 const APFloat &APF = CN->getValueAPF();
12640 if (APF.convertToInteger(IntVal, APFloat::rmTowardZero, &IsExact) !=
12641 APFloat::opOK ||
12642 !IsExact)
12643 return -1;
12644
12645 return IntVal.exactLogBase2();
12646 }
12647 return -1;
12648}
12649
12651 bool IsLittleEndian, unsigned DstEltSizeInBits,
12652 SmallVectorImpl<APInt> &RawBitElements, BitVector &UndefElements) const {
12653 // Early-out if this contains anything but Undef/Constant/ConstantFP.
12654 if (!isConstant())
12655 return false;
12656
12657 unsigned NumSrcOps = getNumOperands();
12658 unsigned SrcEltSizeInBits = getValueType(0).getScalarSizeInBits();
12659 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
12660 "Invalid bitcast scale");
12661
12662 // Extract raw src bits.
12663 SmallVector<APInt> SrcBitElements(NumSrcOps,
12664 APInt::getZero(SrcEltSizeInBits));
12665 BitVector SrcUndeElements(NumSrcOps, false);
12666
12667 for (unsigned I = 0; I != NumSrcOps; ++I) {
12669 if (Op.isUndef()) {
12670 SrcUndeElements.set(I);
12671 continue;
12672 }
12673 auto *CInt = dyn_cast<ConstantSDNode>(Op);
12674 auto *CFP = dyn_cast<ConstantFPSDNode>(Op);
12675 assert((CInt || CFP) && "Unknown constant");
12676 SrcBitElements[I] = CInt ? CInt->getAPIntValue().trunc(SrcEltSizeInBits)
12677 : CFP->getValueAPF().bitcastToAPInt();
12678 }
12679
12680 // Recast to dst width.
12681 recastRawBits(IsLittleEndian, DstEltSizeInBits, RawBitElements,
12682 SrcBitElements, UndefElements, SrcUndeElements);
12683 return true;
12684}
12685
12686void BuildVectorSDNode::recastRawBits(bool IsLittleEndian,
12687 unsigned DstEltSizeInBits,
12688 SmallVectorImpl<APInt> &DstBitElements,
12689 ArrayRef<APInt> SrcBitElements,
12690 BitVector &DstUndefElements,
12691 const BitVector &SrcUndefElements) {
12692 unsigned NumSrcOps = SrcBitElements.size();
12693 unsigned SrcEltSizeInBits = SrcBitElements[0].getBitWidth();
12694 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
12695 "Invalid bitcast scale");
12696 assert(NumSrcOps == SrcUndefElements.size() &&
12697 "Vector size mismatch");
12698
12699 unsigned NumDstOps = (NumSrcOps * SrcEltSizeInBits) / DstEltSizeInBits;
12700 DstUndefElements.clear();
12701 DstUndefElements.resize(NumDstOps, false);
12702 DstBitElements.assign(NumDstOps, APInt::getZero(DstEltSizeInBits));
12703
12704 // Concatenate src elements constant bits together into dst element.
12705 if (SrcEltSizeInBits <= DstEltSizeInBits) {
12706 unsigned Scale = DstEltSizeInBits / SrcEltSizeInBits;
12707 for (unsigned I = 0; I != NumDstOps; ++I) {
12708 DstUndefElements.set(I);
12709 APInt &DstBits = DstBitElements[I];
12710 for (unsigned J = 0; J != Scale; ++J) {
12711 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
12712 if (SrcUndefElements[Idx])
12713 continue;
12714 DstUndefElements.reset(I);
12715 const APInt &SrcBits = SrcBitElements[Idx];
12716 assert(SrcBits.getBitWidth() == SrcEltSizeInBits &&
12717 "Illegal constant bitwidths");
12718 DstBits.insertBits(SrcBits, J * SrcEltSizeInBits);
12719 }
12720 }
12721 return;
12722 }
12723
12724 // Split src element constant bits into dst elements.
12725 unsigned Scale = SrcEltSizeInBits / DstEltSizeInBits;
12726 for (unsigned I = 0; I != NumSrcOps; ++I) {
12727 if (SrcUndefElements[I]) {
12728 DstUndefElements.set(I * Scale, (I + 1) * Scale);
12729 continue;
12730 }
12731 const APInt &SrcBits = SrcBitElements[I];
12732 for (unsigned J = 0; J != Scale; ++J) {
12733 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
12734 APInt &DstBits = DstBitElements[Idx];
12735 DstBits = SrcBits.extractBits(DstEltSizeInBits, J * DstEltSizeInBits);
12736 }
12737 }
12738}
12739
12741 for (const SDValue &Op : op_values()) {
12742 unsigned Opc = Op.getOpcode();
12743 if (Opc != ISD::UNDEF && Opc != ISD::Constant && Opc != ISD::ConstantFP)
12744 return false;
12745 }
12746 return true;
12747}
12748
12749std::optional<std::pair<APInt, APInt>>
12751 unsigned NumOps = getNumOperands();
12752 if (NumOps < 2)
12753 return std::nullopt;
12754
12755 if (!isa<ConstantSDNode>(getOperand(0)) ||
12756 !isa<ConstantSDNode>(getOperand(1)))
12757 return std::nullopt;
12758
12759 unsigned EltSize = getValueType(0).getScalarSizeInBits();
12760 APInt Start = getConstantOperandAPInt(0).trunc(EltSize);
12761 APInt Stride = getConstantOperandAPInt(1).trunc(EltSize) - Start;
12762
12763 if (Stride.isZero())
12764 return std::nullopt;
12765
12766 for (unsigned i = 2; i < NumOps; ++i) {
12767 if (!isa<ConstantSDNode>(getOperand(i)))
12768 return std::nullopt;
12769
12770 APInt Val = getConstantOperandAPInt(i).trunc(EltSize);
12771 if (Val != (Start + (Stride * i)))
12772 return std::nullopt;
12773 }
12774
12775 return std::make_pair(Start, Stride);
12776}
12777
12778bool ShuffleVectorSDNode::isSplatMask(const int *Mask, EVT VT) {
12779 // Find the first non-undef value in the shuffle mask.
12780 unsigned i, e;
12781 for (i = 0, e = VT.getVectorNumElements(); i != e && Mask[i] < 0; ++i)
12782 /* search */;
12783
12784 // If all elements are undefined, this shuffle can be considered a splat
12785 // (although it should eventually get simplified away completely).
12786 if (i == e)
12787 return true;
12788
12789 // Make sure all remaining elements are either undef or the same as the first
12790 // non-undef value.
12791 for (int Idx = Mask[i]; i != e; ++i)
12792 if (Mask[i] >= 0 && Mask[i] != Idx)
12793 return false;
12794 return true;
12795}
12796
12797// Returns the SDNode if it is a constant integer BuildVector
12798// or constant integer.
12800 if (isa<ConstantSDNode>(N))
12801 return N.getNode();
12803 return N.getNode();
12804 // Treat a GlobalAddress supporting constant offset folding as a
12805 // constant integer.
12806 if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(N))
12807 if (GA->getOpcode() == ISD::GlobalAddress &&
12808 TLI->isOffsetFoldingLegal(GA))
12809 return GA;
12810 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
12811 isa<ConstantSDNode>(N.getOperand(0)))
12812 return N.getNode();
12813 return nullptr;
12814}
12815
12816// Returns the SDNode if it is a constant float BuildVector
12817// or constant float.
12819 if (isa<ConstantFPSDNode>(N))
12820 return N.getNode();
12821
12823 return N.getNode();
12824
12825 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
12826 isa<ConstantFPSDNode>(N.getOperand(0)))
12827 return N.getNode();
12828
12829 return nullptr;
12830}
12831
12832void SelectionDAG::createOperands(SDNode *Node, ArrayRef<SDValue> Vals) {
12833 assert(!Node->OperandList && "Node already has operands");
12835 "too many operands to fit into SDNode");
12836 SDUse *Ops = OperandRecycler.allocate(
12837 ArrayRecycler<SDUse>::Capacity::get(Vals.size()), OperandAllocator);
12838
12839 bool IsDivergent = false;
12840 for (unsigned I = 0; I != Vals.size(); ++I) {
12841 Ops[I].setUser(Node);
12842 Ops[I].setInitial(Vals[I]);
12843 if (Ops[I].Val.getValueType() != MVT::Other) // Skip Chain. It does not carry divergence.
12844 IsDivergent |= Ops[I].getNode()->isDivergent();
12845 }
12846 Node->NumOperands = Vals.size();
12847 Node->OperandList = Ops;
12848 if (!TLI->isSDNodeAlwaysUniform(Node)) {
12849 IsDivergent |= TLI->isSDNodeSourceOfDivergence(Node, FLI, UA);
12850 Node->SDNodeBits.IsDivergent = IsDivergent;
12851 }
12853}
12854
12857 size_t Limit = SDNode::getMaxNumOperands();
12858 while (Vals.size() > Limit) {
12859 unsigned SliceIdx = Vals.size() - Limit;
12860 auto ExtractedTFs = ArrayRef<SDValue>(Vals).slice(SliceIdx, Limit);
12861 SDValue NewTF = getNode(ISD::TokenFactor, DL, MVT::Other, ExtractedTFs);
12862 Vals.erase(Vals.begin() + SliceIdx, Vals.end());
12863 Vals.emplace_back(NewTF);
12864 }
12865 return getNode(ISD::TokenFactor, DL, MVT::Other, Vals);
12866}
12867
12869 EVT VT, SDNodeFlags Flags) {
12870 switch (Opcode) {
12871 default:
12872 return SDValue();
12873 case ISD::ADD:
12874 case ISD::OR:
12875 case ISD::XOR:
12876 case ISD::UMAX:
12877 return getConstant(0, DL, VT);
12878 case ISD::MUL:
12879 return getConstant(1, DL, VT);
12880 case ISD::AND:
12881 case ISD::UMIN:
12882 return getAllOnesConstant(DL, VT);
12883 case ISD::SMAX:
12885 case ISD::SMIN:
12887 case ISD::FADD:
12888 return getConstantFP(-0.0, DL, VT);
12889 case ISD::FMUL:
12890 return getConstantFP(1.0, DL, VT);
12891 case ISD::FMINNUM:
12892 case ISD::FMAXNUM: {
12893 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
12894 const fltSemantics &Semantics = EVTToAPFloatSemantics(VT);
12895 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics) :
12896 !Flags.hasNoInfs() ? APFloat::getInf(Semantics) :
12897 APFloat::getLargest(Semantics);
12898 if (Opcode == ISD::FMAXNUM)
12899 NeutralAF.changeSign();
12900
12901 return getConstantFP(NeutralAF, DL, VT);
12902 }
12903 case ISD::FMINIMUM:
12904 case ISD::FMAXIMUM: {
12905 // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
12906 const fltSemantics &Semantics = EVTToAPFloatSemantics(VT);
12907 APFloat NeutralAF = !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
12908 : APFloat::getLargest(Semantics);
12909 if (Opcode == ISD::FMAXIMUM)
12910 NeutralAF.changeSign();
12911
12912 return getConstantFP(NeutralAF, DL, VT);
12913 }
12914
12915 }
12916}
12917
12918/// Helper used to make a call to a library function that has one argument of
12919/// pointer type.
12920///
12921/// Such functions include 'fegetmode', 'fesetenv' and some others, which are
12922/// used to get or set floating-point state. They have one argument of pointer
12923/// type, which points to the memory region containing bits of the
12924/// floating-point state. The value returned by such function is ignored in the
12925/// created call.
12926///
12927/// \param LibFunc Reference to library function (value of RTLIB::Libcall).
12928/// \param Ptr Pointer used to save/load state.
12929/// \param InChain Ingoing token chain.
12930/// \returns Outgoing chain token.
12932 SDValue InChain,
12933 const SDLoc &DLoc) {
12934 assert(InChain.getValueType() == MVT::Other && "Expected token chain");
12937 Entry.Node = Ptr;
12938 Entry.Ty = Ptr.getValueType().getTypeForEVT(*getContext());
12939 Args.push_back(Entry);
12940 RTLIB::Libcall LC = static_cast<RTLIB::Libcall>(LibFunc);
12941 SDValue Callee = getExternalSymbol(TLI->getLibcallName(LC),
12942 TLI->getPointerTy(getDataLayout()));
12944 CLI.setDebugLoc(DLoc).setChain(InChain).setLibCallee(
12945 TLI->getLibcallCallingConv(LC), Type::getVoidTy(*getContext()), Callee,
12946 std::move(Args));
12947 return TLI->LowerCallTo(CLI).second;
12948}
12949
12951 assert(From && To && "Invalid SDNode; empty source SDValue?");
12952 auto I = SDEI.find(From);
12953 if (I == SDEI.end())
12954 return;
12955
12956 // Use of operator[] on the DenseMap may cause an insertion, which invalidates
12957 // the iterator, hence the need to make a copy to prevent a use-after-free.
12958 NodeExtraInfo NEI = I->second;
12959 if (LLVM_LIKELY(!NEI.PCSections) && LLVM_LIKELY(!NEI.MMRA)) {
12960 // No deep copy required for the types of extra info set.
12961 //
12962 // FIXME: Investigate if other types of extra info also need deep copy. This
12963 // depends on the types of nodes they can be attached to: if some extra info
12964 // is only ever attached to nodes where a replacement To node is always the
12965 // node where later use and propagation of the extra info has the intended
12966 // semantics, no deep copy is required.
12967 SDEI[To] = std::move(NEI);
12968 return;
12969 }
12970
12971 // We need to copy NodeExtraInfo to all _new_ nodes that are being introduced
12972 // through the replacement of From with To. Otherwise, replacements of a node
12973 // (From) with more complex nodes (To and its operands) may result in lost
12974 // extra info where the root node (To) is insignificant in further propagating
12975 // and using extra info when further lowering to MIR.
12976 //
12977 // In the first step pre-populate the visited set with the nodes reachable
12978 // from the old From node. This avoids copying NodeExtraInfo to parts of the
12979 // DAG that is not new and should be left untouched.
12980 SmallVector<const SDNode *> Leafs{From}; // Leafs reachable with VisitFrom.
12981 DenseSet<const SDNode *> FromReach; // The set of nodes reachable from From.
12982 auto VisitFrom = [&](auto &&Self, const SDNode *N, int MaxDepth) {
12983 if (MaxDepth == 0) {
12984 // Remember this node in case we need to increase MaxDepth and continue
12985 // populating FromReach from this node.
12986 Leafs.emplace_back(N);
12987 return;
12988 }
12989 if (!FromReach.insert(N).second)
12990 return;
12991 for (const SDValue &Op : N->op_values())
12992 Self(Self, Op.getNode(), MaxDepth - 1);
12993 };
12994
12995 // Copy extra info to To and all its transitive operands (that are new).
12997 auto DeepCopyTo = [&](auto &&Self, const SDNode *N) {
12998 if (FromReach.contains(N))
12999 return true;
13000 if (!Visited.insert(N).second)
13001 return true;
13002 if (getEntryNode().getNode() == N)
13003 return false;
13004 for (const SDValue &Op : N->op_values()) {
13005 if (!Self(Self, Op.getNode()))
13006 return false;
13007 }
13008 // Copy only if entry node was not reached.
13009 SDEI[N] = NEI;
13010 return true;
13011 };
13012
13013 // We first try with a lower MaxDepth, assuming that the path to common
13014 // operands between From and To is relatively short. This significantly
13015 // improves performance in the common case. The initial MaxDepth is big
13016 // enough to avoid retry in the common case; the last MaxDepth is large
13017 // enough to avoid having to use the fallback below (and protects from
13018 // potential stack exhaustion from recursion).
13019 for (int PrevDepth = 0, MaxDepth = 16; MaxDepth <= 1024;
13020 PrevDepth = MaxDepth, MaxDepth *= 2, Visited.clear()) {
13021 // StartFrom is the previous (or initial) set of leafs reachable at the
13022 // previous maximum depth.
13024 std::swap(StartFrom, Leafs);
13025 for (const SDNode *N : StartFrom)
13026 VisitFrom(VisitFrom, N, MaxDepth - PrevDepth);
13027 if (LLVM_LIKELY(DeepCopyTo(DeepCopyTo, To)))
13028 return;
13029 // This should happen very rarely (reached the entry node).
13030 LLVM_DEBUG(dbgs() << __func__ << ": MaxDepth=" << MaxDepth << " too low\n");
13031 assert(!Leafs.empty());
13032 }
13033
13034 // This should not happen - but if it did, that means the subgraph reachable
13035 // from From has depth greater or equal to maximum MaxDepth, and VisitFrom()
13036 // could not visit all reachable common operands. Consequently, we were able
13037 // to reach the entry node.
13038 errs() << "warning: incomplete propagation of SelectionDAG::NodeExtraInfo\n";
13039 assert(false && "From subgraph too complex - increase max. MaxDepth?");
13040 // Best-effort fallback if assertions disabled.
13041 SDEI[To] = std::move(NEI);
13042}
13043
13044#ifndef NDEBUG
13045static void checkForCyclesHelper(const SDNode *N,
13048 const llvm::SelectionDAG *DAG) {
13049 // If this node has already been checked, don't check it again.
13050 if (Checked.count(N))
13051 return;
13052
13053 // If a node has already been visited on this depth-first walk, reject it as
13054 // a cycle.
13055 if (!Visited.insert(N).second) {
13056 errs() << "Detected cycle in SelectionDAG\n";
13057 dbgs() << "Offending node:\n";
13058 N->dumprFull(DAG); dbgs() << "\n";
13059 abort();
13060 }
13061
13062 for (const SDValue &Op : N->op_values())
13063 checkForCyclesHelper(Op.getNode(), Visited, Checked, DAG);
13064
13065 Checked.insert(N);
13066 Visited.erase(N);
13067}
13068#endif
13069
13071 const llvm::SelectionDAG *DAG,
13072 bool force) {
13073#ifndef NDEBUG
13074 bool check = force;
13075#ifdef EXPENSIVE_CHECKS
13076 check = true;
13077#endif // EXPENSIVE_CHECKS
13078 if (check) {
13079 assert(N && "Checking nonexistent SDNode");
13082 checkForCyclesHelper(N, visited, checked, DAG);
13083 }
13084#endif // !NDEBUG
13085}
13086
13087void llvm::checkForCycles(const llvm::SelectionDAG *DAG, bool force) {
13088 checkForCycles(DAG->getRoot().getNode(), DAG, force);
13089}
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
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:685
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition: Function.h:682
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition: Function.h:340
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:751
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition: ISDOpcodes.h:237
@ CTLZ_ZERO_UNDEF
Definition: ISDOpcodes.h:724
@ 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:1178
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
Definition: ISDOpcodes.h:477
@ ATOMIC_LOAD_FMAX
Definition: ISDOpcodes.h:1283
@ 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:1346
@ VECREDUCE_SMIN
Definition: ISDOpcodes.h:1377
@ FGETSIGN
INT = FGETSIGN(FP) - Return the sign bit of the specified floating point value as an integer 0/1 valu...
Definition: ISDOpcodes.h:498
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
Definition: ISDOpcodes.h:251
@ ATOMIC_LOAD_NAND
Definition: ISDOpcodes.h:1276
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition: ISDOpcodes.h:560
@ JUMP_TABLE_DEBUG_INFO
JUMP_TABLE_DEBUG_INFO - Jumptable debug info.
Definition: ISDOpcodes.h:1067
@ BSWAP
Byte Swap and Counting operators.
Definition: ISDOpcodes.h:715
@ TargetBlockAddress
Definition: ISDOpcodes.h:170
@ ConstantFP
Definition: ISDOpcodes.h:77
@ ATOMIC_LOAD_MAX
Definition: ISDOpcodes.h:1278
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, ptr, val) This corresponds to "store atomic" instruction.
Definition: ISDOpcodes.h:1248
@ ATOMIC_LOAD_UMIN
Definition: ISDOpcodes.h:1279
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
Definition: ISDOpcodes.h:270
@ FMAD
FMAD - Perform a * b + c, while getting the same result as the separately rounded operations.
Definition: ISDOpcodes.h:488
@ FMAXNUM_IEEE
Definition: ISDOpcodes.h:986
@ ADD
Simple integer binary arithmetic operators.
Definition: ISDOpcodes.h:240
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
Definition: ISDOpcodes.h:1038
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition: ISDOpcodes.h:784
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition: ISDOpcodes.h:484
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition: ISDOpcodes.h:199
@ GlobalAddress
Definition: ISDOpcodes.h:78
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
Definition: ISDOpcodes.h:1261
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition: ISDOpcodes.h:791
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition: ISDOpcodes.h:544
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
Definition: ISDOpcodes.h:1362
@ FADD
Simple binary floating point operators.
Definition: ISDOpcodes.h:391
@ VECREDUCE_FMAXIMUM
FMINIMUM/FMAXIMUM nodes propatate NaNs and signed zeroes using the llvm.minimum and llvm....
Definition: ISDOpcodes.h:1366
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition: ISDOpcodes.h:689
@ SIGN_EXTEND_VECTOR_INREG
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
Definition: ISDOpcodes.h:821
@ VECREDUCE_SMAX
Definition: ISDOpcodes.h:1376
@ STRICT_FSETCCS
Definition: ISDOpcodes.h:478
@ FP16_TO_FP
FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions and truncation for half-preci...
Definition: ISDOpcodes.h:914
@ ATOMIC_LOAD_OR
Definition: ISDOpcodes.h:1274
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
Definition: ISDOpcodes.h:904
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition: ISDOpcodes.h:230
@ ATOMIC_LOAD_XOR
Definition: ISDOpcodes.h:1275
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
Definition: ISDOpcodes.h:940
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
Definition: ISDOpcodes.h:1407
@ ATOMIC_LOAD_FADD
Definition: ISDOpcodes.h:1281
@ 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:1174
@ 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:1109
@ SIGN_EXTEND
Conversion operators.
Definition: ISDOpcodes.h:775
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
Definition: ISDOpcodes.h:663
@ SCALAR_TO_VECTOR
SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a scalar value into element 0 of the...
Definition: ISDOpcodes.h:621
@ TargetExternalSymbol
Definition: ISDOpcodes.h:169
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
Definition: ISDOpcodes.h:1359
@ CTTZ_ZERO_UNDEF
Bit counting operators with an undefined result for zero inputs.
Definition: ISDOpcodes.h:723
@ 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:1228
@ VECREDUCE_FMIN
Definition: ISDOpcodes.h:1363
@ SETCCCARRY
Like SetCC, ops #0 and #1 are the LHS and RHS operands to compare, but op #2 is a boolean indicating ...
Definition: ISDOpcodes.h:759
@ FNEG
Perform various unary floating-point operations inspired by libm.
Definition: ISDOpcodes.h:931
@ ATOMIC_LOAD_FSUB
Definition: ISDOpcodes.h:1282
@ BR_CC
BR_CC - Conditional branch.
Definition: ISDOpcodes.h:1084
@ SSUBO
Same for subtraction.
Definition: ISDOpcodes.h:328
@ ATOMIC_LOAD_MIN
Definition: ISDOpcodes.h:1277
@ STEP_VECTOR
STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised of a linear sequence of unsign...
Definition: ISDOpcodes.h:647
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition: ISDOpcodes.h:501
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition: ISDOpcodes.h:350
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition: ISDOpcodes.h:728
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
Definition: ISDOpcodes.h:1244
@ UNDEF
UNDEF - An undefined node.
Definition: ISDOpcodes.h:212
@ VECREDUCE_UMAX
Definition: ISDOpcodes.h:1378
@ 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:223
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition: ISDOpcodes.h:628
@ 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:1284
@ BasicBlock
Various leaf nodes.
Definition: ISDOpcodes.h:71
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition: ISDOpcodes.h:209
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition: ISDOpcodes.h:324
@ 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:1371
@ MULHU
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
Definition: ISDOpcodes.h:652
@ SHL
Shift and rotation operations.
Definition: ISDOpcodes.h:706
@ ATOMIC_LOAD_CLR
Definition: ISDOpcodes.h:1273
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
Definition: ISDOpcodes.h:601
@ ATOMIC_LOAD_AND
Definition: ISDOpcodes.h:1272
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition: ISDOpcodes.h:574
@ FMINNUM_IEEE
FMINNUM_IEEE/FMAXNUM_IEEE - Perform floating-point minimumNumber or maximumNumber on two values,...
Definition: ISDOpcodes.h:985
@ 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:536
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition: ISDOpcodes.h:781
@ TargetConstantFP
Definition: ISDOpcodes.h:159
@ FP_TO_UINT_SAT
Definition: ISDOpcodes.h:857
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
Definition: ISDOpcodes.h:743
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
Definition: ISDOpcodes.h:1336
@ ATOMIC_CMP_SWAP
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo,...
Definition: ISDOpcodes.h:1255
@ ATOMIC_LOAD_UMAX
Definition: ISDOpcodes.h:1280
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum or maximum on two values.
Definition: ISDOpcodes.h:972
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition: ISDOpcodes.h:360
@ SMULO
Same for multiplication.
Definition: ISDOpcodes.h:332
@ 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:810
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition: ISDOpcodes.h:799
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition: ISDOpcodes.h:675
@ LIFETIME_START
This corresponds to the llvm.lifetime.
Definition: ISDOpcodes.h:1311
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition: ISDOpcodes.h:889
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition: ISDOpcodes.h:737
@ UADDO_CARRY
Carry-using nodes for multiple precision addition and subtraction.
Definition: ISDOpcodes.h:304
@ HANDLENODE
HANDLENODE node - Used as a handle for various purposes.
Definition: ISDOpcodes.h:1198
@ VECREDUCE_UMIN
Definition: ISDOpcodes.h:1379
@ BF16_TO_FP
BF16_TO_FP, FP_TO_BF16 - These operators are used to perform promotions and truncation for bfloat16.
Definition: ISDOpcodes.h:923
@ ATOMIC_LOAD_UDEC_WRAP
Definition: ISDOpcodes.h:1286
@ ATOMIC_LOAD_ADD
Definition: ISDOpcodes.h:1270
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition: ISDOpcodes.h:466
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
Definition: ISDOpcodes.h:991
@ ATOMIC_LOAD_SUB
Definition: ISDOpcodes.h:1271
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition: ISDOpcodes.h:837
@ TargetConstant
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification,...
Definition: ISDOpcodes.h:158
@ STRICT_FP_EXTEND
X = STRICT_FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition: ISDOpcodes.h:471
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition: ISDOpcodes.h:681
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition: ISDOpcodes.h:184
@ GET_FPENV_MEM
Gets the current floating-point environment.
Definition: ISDOpcodes.h:1014
@ PSEUDO_PROBE
Pseudo probe for AutoFDO, as a place holder in a basic block to improve the sample counts quality.
Definition: ISDOpcodes.h:1331
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
Definition: ISDOpcodes.h:658
@ VECREDUCE_FMUL
Definition: ISDOpcodes.h:1360
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
Definition: ISDOpcodes.h:280
@ SPLAT_VECTOR_PARTS
SPLAT_VECTOR_PARTS(SCALAR1, SCALAR2, ...) - Returns a vector with the scalar values joined together a...
Definition: ISDOpcodes.h:637
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition: ISDOpcodes.h:525
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition: ISDOpcodes.h:52
@ VECTOR_SPLICE
VECTOR_SPLICE(VEC1, VEC2, IMM) - Returns a subvector of the same type as VEC1/VEC2 from CONCAT_VECTOR...
Definition: ISDOpcodes.h:613
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
Definition: ISDOpcodes.h:1269
@ ExternalSymbol
Definition: ISDOpcodes.h:83
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
Definition: ISDOpcodes.h:945
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition: ISDOpcodes.h:870
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
Definition: ISDOpcodes.h:832
@ ADDRSPACECAST
ADDRSPACECAST - This operator converts between pointers of different address spaces.
Definition: ISDOpcodes.h:908
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
Definition: ISDOpcodes.h:856
@ VECREDUCE_FMINIMUM
Definition: ISDOpcodes.h:1367
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition: ISDOpcodes.h:787
@ VAARG
VAARG - VAARG has four operands: an input chain, a pointer, a SRCVALUE, and the alignment.
Definition: ISDOpcodes.h:1153
@ BlockAddress
Definition: ISDOpcodes.h:84
@ VECREDUCE_SEQ_FMUL
Definition: ISDOpcodes.h:1347
@ SHL_PARTS
SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded integer shift operations.
Definition: ISDOpcodes.h:764
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition: ISDOpcodes.h:61
@ ATOMIC_LOAD_UINC_WRAP
Definition: ISDOpcodes.h:1285
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition: ISDOpcodes.h:494
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition: ISDOpcodes.h:341
@ AssertZext
Definition: ISDOpcodes.h:62
@ SET_FPENV_MEM
Sets the current floating point environment.
Definition: ISDOpcodes.h:1019
@ SADDO_CARRY
Carry-using overflow-aware nodes for multiple precision addition and subtraction.
Definition: ISDOpcodes.h:314
@ 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:516
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:1419
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:1588
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:1593
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:1492
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:1479
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:1530
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:1510
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:1527
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:1509
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)