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 return true;
5067
5068 case ISD::UNDEF:
5069 return PoisonOnly;
5070
5071 case ISD::BUILD_VECTOR:
5072 // NOTE: BUILD_VECTOR has implicit truncation of wider scalar elements -
5073 // this shouldn't affect the result.
5074 for (unsigned i = 0, e = Op.getNumOperands(); i < e; ++i) {
5075 if (!DemandedElts[i])
5076 continue;
5078 Depth + 1))
5079 return false;
5080 }
5081 return true;
5082
5083 // TODO: Search for noundef attributes from library functions.
5084
5085 // TODO: Pointers dereferenced by ISD::LOAD/STORE ops are noundef.
5086
5087 default:
5088 // Allow the target to implement this method for its nodes.
5089 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
5090 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
5092 Op, DemandedElts, *this, PoisonOnly, Depth);
5093 break;
5094 }
5095
5096 // If Op can't create undef/poison and none of its operands are undef/poison
5097 // then Op is never undef/poison.
5098 // NOTE: TargetNodes can handle this in themselves in
5099 // isGuaranteedNotToBeUndefOrPoisonForTargetNode or let
5100 // TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode handle it.
5101 return !canCreateUndefOrPoison(Op, PoisonOnly, /*ConsiderFlags*/ true,
5102 Depth) &&
5103 all_of(Op->ops(), [&](SDValue V) {
5104 return isGuaranteedNotToBeUndefOrPoison(V, PoisonOnly, Depth + 1);
5105 });
5106}
5107
5109 bool ConsiderFlags,
5110 unsigned Depth) const {
5111 // TODO: Assume we don't know anything for now.
5112 EVT VT = Op.getValueType();
5113 if (VT.isScalableVector())
5114 return true;
5115
5116 APInt DemandedElts = VT.isVector()
5118 : APInt(1, 1);
5119 return canCreateUndefOrPoison(Op, DemandedElts, PoisonOnly, ConsiderFlags,
5120 Depth);
5121}
5122
5124 bool PoisonOnly, bool ConsiderFlags,
5125 unsigned Depth) const {
5126 // TODO: Assume we don't know anything for now.
5127 EVT VT = Op.getValueType();
5128 if (VT.isScalableVector())
5129 return true;
5130
5131 if (ConsiderFlags && Op->hasPoisonGeneratingFlags())
5132 return true;
5133
5134 unsigned Opcode = Op.getOpcode();
5135 switch (Opcode) {
5136 case ISD::FREEZE:
5139 case ISD::AND:
5140 case ISD::XOR:
5141 case ISD::ROTL:
5142 case ISD::ROTR:
5143 case ISD::FSHL:
5144 case ISD::FSHR:
5145 case ISD::BSWAP:
5146 case ISD::CTPOP:
5147 case ISD::BITREVERSE:
5148 case ISD::PARITY:
5149 case ISD::SIGN_EXTEND:
5150 case ISD::TRUNCATE:
5154 case ISD::BITCAST:
5155 case ISD::BUILD_VECTOR:
5156 case ISD::BUILD_PAIR:
5157 return false;
5158
5159 case ISD::SETCC: {
5160 // Integer setcc cannot create undef or poison.
5161 if (Op.getOperand(0).getValueType().isInteger())
5162 return false;
5163
5164 // FP compares are more complicated. They can create poison for nan/infinity
5165 // based on options and flags. The options and flags also cause special
5166 // nonan condition codes to be used. Those condition codes may be preserved
5167 // even if the nonan flag is dropped somewhere.
5168 ISD::CondCode CCCode = cast<CondCodeSDNode>(Op.getOperand(2))->get();
5169 if (((unsigned)CCCode & 0x10U))
5170 return true;
5171
5173 return Options.NoNaNsFPMath || Options.NoInfsFPMath;
5174 }
5175
5176 case ISD::OR:
5177 case ISD::ZERO_EXTEND:
5178 case ISD::ADD:
5179 case ISD::SUB:
5180 case ISD::MUL:
5181 // No poison except from flags (which is handled above)
5182 return false;
5183
5184 case ISD::SHL:
5185 // If the max shift amount isn't in range, then the shift can create poison.
5186 return !getValidMaximumShiftAmountConstant(Op, DemandedElts);
5187
5189 // Check if we demand any upper (undef) elements.
5190 return !PoisonOnly && DemandedElts.ugt(1);
5191
5193 // Ensure that the element index is in bounds.
5194 EVT VecVT = Op.getOperand(0).getValueType();
5195 KnownBits KnownIdx = computeKnownBits(Op.getOperand(1), Depth + 1);
5196 return KnownIdx.getMaxValue().uge(VecVT.getVectorMinNumElements());
5197 }
5198
5200 // Ensure that the element index is in bounds.
5201 EVT VecVT = Op.getOperand(0).getValueType();
5202 KnownBits KnownIdx = computeKnownBits(Op.getOperand(2), Depth + 1);
5203 return KnownIdx.getMaxValue().uge(VecVT.getVectorMinNumElements());
5204 }
5205
5206 default:
5207 // Allow the target to implement this method for its nodes.
5208 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
5209 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
5211 Op, DemandedElts, *this, PoisonOnly, ConsiderFlags, Depth);
5212 break;
5213 }
5214
5215 // Be conservative and return true.
5216 return true;
5217}
5218
5220 unsigned Opcode = Op.getOpcode();
5221 if (Opcode == ISD::OR)
5222 return Op->getFlags().hasDisjoint() ||
5223 haveNoCommonBitsSet(Op.getOperand(0), Op.getOperand(1));
5224 if (Opcode == ISD::XOR)
5225 return isMinSignedConstant(Op.getOperand(1));
5226 return false;
5227}
5228
5230 return Op.getNumOperands() == 2 && isa<ConstantSDNode>(Op.getOperand(1)) &&
5231 (Op.getOpcode() == ISD::ADD || isADDLike(Op));
5232}
5233
5234bool SelectionDAG::isKnownNeverNaN(SDValue Op, bool SNaN, unsigned Depth) const {
5235 // If we're told that NaNs won't happen, assume they won't.
5236 if (getTarget().Options.NoNaNsFPMath || Op->getFlags().hasNoNaNs())
5237 return true;
5238
5239 if (Depth >= MaxRecursionDepth)
5240 return false; // Limit search depth.
5241
5242 // If the value is a constant, we can obviously see if it is a NaN or not.
5243 if (const ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Op)) {
5244 return !C->getValueAPF().isNaN() ||
5245 (SNaN && !C->getValueAPF().isSignaling());
5246 }
5247
5248 unsigned Opcode = Op.getOpcode();
5249 switch (Opcode) {
5250 case ISD::FADD:
5251 case ISD::FSUB:
5252 case ISD::FMUL:
5253 case ISD::FDIV:
5254 case ISD::FREM:
5255 case ISD::FSIN:
5256 case ISD::FCOS:
5257 case ISD::FMA:
5258 case ISD::FMAD: {
5259 if (SNaN)
5260 return true;
5261 // TODO: Need isKnownNeverInfinity
5262 return false;
5263 }
5264 case ISD::FCANONICALIZE:
5265 case ISD::FEXP:
5266 case ISD::FEXP2:
5267 case ISD::FEXP10:
5268 case ISD::FTRUNC:
5269 case ISD::FFLOOR:
5270 case ISD::FCEIL:
5271 case ISD::FROUND:
5272 case ISD::FROUNDEVEN:
5273 case ISD::FRINT:
5274 case ISD::LRINT:
5275 case ISD::LLRINT:
5276 case ISD::FNEARBYINT:
5277 case ISD::FLDEXP: {
5278 if (SNaN)
5279 return true;
5280 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
5281 }
5282 case ISD::FABS:
5283 case ISD::FNEG:
5284 case ISD::FCOPYSIGN: {
5285 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
5286 }
5287 case ISD::SELECT:
5288 return isKnownNeverNaN(Op.getOperand(1), SNaN, Depth + 1) &&
5289 isKnownNeverNaN(Op.getOperand(2), SNaN, Depth + 1);
5290 case ISD::FP_EXTEND:
5291 case ISD::FP_ROUND: {
5292 if (SNaN)
5293 return true;
5294 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
5295 }
5296 case ISD::SINT_TO_FP:
5297 case ISD::UINT_TO_FP:
5298 return true;
5299 case ISD::FSQRT: // Need is known positive
5300 case ISD::FLOG:
5301 case ISD::FLOG2:
5302 case ISD::FLOG10:
5303 case ISD::FPOWI:
5304 case ISD::FPOW: {
5305 if (SNaN)
5306 return true;
5307 // TODO: Refine on operand
5308 return false;
5309 }
5310 case ISD::FMINNUM:
5311 case ISD::FMAXNUM: {
5312 // Only one needs to be known not-nan, since it will be returned if the
5313 // other ends up being one.
5314 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1) ||
5315 isKnownNeverNaN(Op.getOperand(1), SNaN, Depth + 1);
5316 }
5317 case ISD::FMINNUM_IEEE:
5318 case ISD::FMAXNUM_IEEE: {
5319 if (SNaN)
5320 return true;
5321 // This can return a NaN if either operand is an sNaN, or if both operands
5322 // are NaN.
5323 return (isKnownNeverNaN(Op.getOperand(0), false, Depth + 1) &&
5324 isKnownNeverSNaN(Op.getOperand(1), Depth + 1)) ||
5325 (isKnownNeverNaN(Op.getOperand(1), false, Depth + 1) &&
5326 isKnownNeverSNaN(Op.getOperand(0), Depth + 1));
5327 }
5328 case ISD::FMINIMUM:
5329 case ISD::FMAXIMUM: {
5330 // TODO: Does this quiet or return the origina NaN as-is?
5331 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1) &&
5332 isKnownNeverNaN(Op.getOperand(1), SNaN, Depth + 1);
5333 }
5335 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
5336 }
5337 case ISD::BUILD_VECTOR: {
5338 for (const SDValue &Opnd : Op->ops())
5339 if (!isKnownNeverNaN(Opnd, SNaN, Depth + 1))
5340 return false;
5341 return true;
5342 }
5343 default:
5344 if (Opcode >= ISD::BUILTIN_OP_END ||
5345 Opcode == ISD::INTRINSIC_WO_CHAIN ||
5346 Opcode == ISD::INTRINSIC_W_CHAIN ||
5347 Opcode == ISD::INTRINSIC_VOID) {
5348 return TLI->isKnownNeverNaNForTargetNode(Op, *this, SNaN, Depth);
5349 }
5350
5351 return false;
5352 }
5353}
5354
5356 assert(Op.getValueType().isFloatingPoint() &&
5357 "Floating point type expected");
5358
5359 // If the value is a constant, we can obviously see if it is a zero or not.
5361 Op, [](ConstantFPSDNode *C) { return !C->isZero(); });
5362}
5363
5365 if (Depth >= MaxRecursionDepth)
5366 return false; // Limit search depth.
5367
5368 assert(!Op.getValueType().isFloatingPoint() &&
5369 "Floating point types unsupported - use isKnownNeverZeroFloat");
5370
5371 // If the value is a constant, we can obviously see if it is a zero or not.
5373 [](ConstantSDNode *C) { return !C->isZero(); }))
5374 return true;
5375
5376 // TODO: Recognize more cases here. Most of the cases are also incomplete to
5377 // some degree.
5378 switch (Op.getOpcode()) {
5379 default:
5380 break;
5381
5382 case ISD::OR:
5383 return isKnownNeverZero(Op.getOperand(1), Depth + 1) ||
5384 isKnownNeverZero(Op.getOperand(0), Depth + 1);
5385
5386 case ISD::VSELECT:
5387 case ISD::SELECT:
5388 return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
5389 isKnownNeverZero(Op.getOperand(2), Depth + 1);
5390
5391 case ISD::SHL: {
5392 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
5393 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
5394 KnownBits ValKnown = computeKnownBits(Op.getOperand(0), Depth + 1);
5395 // 1 << X is never zero.
5396 if (ValKnown.One[0])
5397 return true;
5398 // If max shift cnt of known ones is non-zero, result is non-zero.
5399 APInt MaxCnt = computeKnownBits(Op.getOperand(1), Depth + 1).getMaxValue();
5400 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
5401 !ValKnown.One.shl(MaxCnt).isZero())
5402 return true;
5403 break;
5404 }
5405 case ISD::UADDSAT:
5406 case ISD::UMAX:
5407 return isKnownNeverZero(Op.getOperand(1), Depth + 1) ||
5408 isKnownNeverZero(Op.getOperand(0), Depth + 1);
5409
5410 // For smin/smax: If either operand is known negative/positive
5411 // respectively we don't need the other to be known at all.
5412 case ISD::SMAX: {
5413 KnownBits Op1 = computeKnownBits(Op.getOperand(1), Depth + 1);
5414 if (Op1.isStrictlyPositive())
5415 return true;
5416
5417 KnownBits Op0 = computeKnownBits(Op.getOperand(0), Depth + 1);
5418 if (Op0.isStrictlyPositive())
5419 return true;
5420
5421 if (Op1.isNonZero() && Op0.isNonZero())
5422 return true;
5423
5424 return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
5425 isKnownNeverZero(Op.getOperand(0), Depth + 1);
5426 }
5427 case ISD::SMIN: {
5428 KnownBits Op1 = computeKnownBits(Op.getOperand(1), Depth + 1);
5429 if (Op1.isNegative())
5430 return true;
5431
5432 KnownBits Op0 = computeKnownBits(Op.getOperand(0), Depth + 1);
5433 if (Op0.isNegative())
5434 return true;
5435
5436 if (Op1.isNonZero() && Op0.isNonZero())
5437 return true;
5438
5439 return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
5440 isKnownNeverZero(Op.getOperand(0), Depth + 1);
5441 }
5442 case ISD::UMIN:
5443 return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
5444 isKnownNeverZero(Op.getOperand(0), Depth + 1);
5445
5446 case ISD::ROTL:
5447 case ISD::ROTR:
5448 case ISD::BITREVERSE:
5449 case ISD::BSWAP:
5450 case ISD::CTPOP:
5451 case ISD::ABS:
5452 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
5453
5454 case ISD::SRA:
5455 case ISD::SRL: {
5456 if (Op->getFlags().hasExact())
5457 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
5458 KnownBits ValKnown = computeKnownBits(Op.getOperand(0), Depth + 1);
5459 if (ValKnown.isNegative())
5460 return true;
5461 // If max shift cnt of known ones is non-zero, result is non-zero.
5462 APInt MaxCnt = computeKnownBits(Op.getOperand(1), Depth + 1).getMaxValue();
5463 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
5464 !ValKnown.One.lshr(MaxCnt).isZero())
5465 return true;
5466 break;
5467 }
5468 case ISD::UDIV:
5469 case ISD::SDIV:
5470 // div exact can only produce a zero if the dividend is zero.
5471 // TODO: For udiv this is also true if Op1 u<= Op0
5472 if (Op->getFlags().hasExact())
5473 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
5474 break;
5475
5476 case ISD::ADD:
5477 if (Op->getFlags().hasNoUnsignedWrap())
5478 if (isKnownNeverZero(Op.getOperand(1), Depth + 1) ||
5479 isKnownNeverZero(Op.getOperand(0), Depth + 1))
5480 return true;
5481 // TODO: There are a lot more cases we can prove for add.
5482 break;
5483
5484 case ISD::SUB: {
5485 if (isNullConstant(Op.getOperand(0)))
5486 return isKnownNeverZero(Op.getOperand(1), Depth + 1);
5487
5488 std::optional<bool> ne =
5489 KnownBits::ne(computeKnownBits(Op.getOperand(0), Depth + 1),
5490 computeKnownBits(Op.getOperand(1), Depth + 1));
5491 return ne && *ne;
5492 }
5493
5494 case ISD::MUL:
5495 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
5496 if (isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
5497 isKnownNeverZero(Op.getOperand(0), Depth + 1))
5498 return true;
5499 break;
5500
5501 case ISD::ZERO_EXTEND:
5502 case ISD::SIGN_EXTEND:
5503 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
5504 }
5505
5507}
5508
5510 // Check the obvious case.
5511 if (A == B) return true;
5512
5513 // For negative and positive zero.
5514 if (const ConstantFPSDNode *CA = dyn_cast<ConstantFPSDNode>(A))
5515 if (const ConstantFPSDNode *CB = dyn_cast<ConstantFPSDNode>(B))
5516 if (CA->isZero() && CB->isZero()) return true;
5517
5518 // Otherwise they may not be equal.
5519 return false;
5520}
5521
5522// Only bits set in Mask must be negated, other bits may be arbitrary.
5524 if (isBitwiseNot(V, AllowUndefs))
5525 return V.getOperand(0);
5526
5527 // Handle any_extend (not (truncate X)) pattern, where Mask only sets
5528 // bits in the non-extended part.
5529 ConstantSDNode *MaskC = isConstOrConstSplat(Mask);
5530 if (!MaskC || V.getOpcode() != ISD::ANY_EXTEND)
5531 return SDValue();
5532 SDValue ExtArg = V.getOperand(0);
5533 if (ExtArg.getScalarValueSizeInBits() >=
5534 MaskC->getAPIntValue().getActiveBits() &&
5535 isBitwiseNot(ExtArg, AllowUndefs) &&
5536 ExtArg.getOperand(0).getOpcode() == ISD::TRUNCATE &&
5537 ExtArg.getOperand(0).getOperand(0).getValueType() == V.getValueType())
5538 return ExtArg.getOperand(0).getOperand(0);
5539 return SDValue();
5540}
5541
5543 // Match masked merge pattern (X & ~M) op (Y & M)
5544 // Including degenerate case (X & ~M) op M
5545 auto MatchNoCommonBitsPattern = [&](SDValue Not, SDValue Mask,
5546 SDValue Other) {
5547 if (SDValue NotOperand =
5548 getBitwiseNotOperand(Not, Mask, /* AllowUndefs */ true)) {
5549 if (NotOperand->getOpcode() == ISD::ZERO_EXTEND ||
5550 NotOperand->getOpcode() == ISD::TRUNCATE)
5551 NotOperand = NotOperand->getOperand(0);
5552
5553 if (Other == NotOperand)
5554 return true;
5555 if (Other->getOpcode() == ISD::AND)
5556 return NotOperand == Other->getOperand(0) ||
5557 NotOperand == Other->getOperand(1);
5558 }
5559 return false;
5560 };
5561
5562 if (A->getOpcode() == ISD::ZERO_EXTEND || A->getOpcode() == ISD::TRUNCATE)
5563 A = A->getOperand(0);
5564
5565 if (B->getOpcode() == ISD::ZERO_EXTEND || B->getOpcode() == ISD::TRUNCATE)
5566 B = B->getOperand(0);
5567
5568 if (A->getOpcode() == ISD::AND)
5569 return MatchNoCommonBitsPattern(A->getOperand(0), A->getOperand(1), B) ||
5570 MatchNoCommonBitsPattern(A->getOperand(1), A->getOperand(0), B);
5571 return false;
5572}
5573
5574// FIXME: unify with llvm::haveNoCommonBitsSet.
5576 assert(A.getValueType() == B.getValueType() &&
5577 "Values must have the same type");
5580 return true;
5583}
5584
5585static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step,
5586 SelectionDAG &DAG) {
5587 if (cast<ConstantSDNode>(Step)->isZero())
5588 return DAG.getConstant(0, DL, VT);
5589
5590 return SDValue();
5591}
5592
5595 SelectionDAG &DAG) {
5596 int NumOps = Ops.size();
5597 assert(NumOps != 0 && "Can't build an empty vector!");
5598 assert(!VT.isScalableVector() &&
5599 "BUILD_VECTOR cannot be used with scalable types");
5600 assert(VT.getVectorNumElements() == (unsigned)NumOps &&
5601 "Incorrect element count in BUILD_VECTOR!");
5602
5603 // BUILD_VECTOR of UNDEFs is UNDEF.
5604 if (llvm::all_of(Ops, [](SDValue Op) { return Op.isUndef(); }))
5605 return DAG.getUNDEF(VT);
5606
5607 // BUILD_VECTOR of seq extract/insert from the same vector + type is Identity.
5608 SDValue IdentitySrc;
5609 bool IsIdentity = true;
5610 for (int i = 0; i != NumOps; ++i) {
5611 if (Ops[i].getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
5612 Ops[i].getOperand(0).getValueType() != VT ||
5613 (IdentitySrc && Ops[i].getOperand(0) != IdentitySrc) ||
5614 !isa<ConstantSDNode>(Ops[i].getOperand(1)) ||
5615 Ops[i].getConstantOperandAPInt(1) != i) {
5616 IsIdentity = false;
5617 break;
5618 }
5619 IdentitySrc = Ops[i].getOperand(0);
5620 }
5621 if (IsIdentity)
5622 return IdentitySrc;
5623
5624 return SDValue();
5625}
5626
5627/// Try to simplify vector concatenation to an input value, undef, or build
5628/// vector.
5631 SelectionDAG &DAG) {
5632 assert(!Ops.empty() && "Can't concatenate an empty list of vectors!");
5633 assert(llvm::all_of(Ops,
5634 [Ops](SDValue Op) {
5635 return Ops[0].getValueType() == Op.getValueType();
5636 }) &&
5637 "Concatenation of vectors with inconsistent value types!");
5638 assert((Ops[0].getValueType().getVectorElementCount() * Ops.size()) ==
5639 VT.getVectorElementCount() &&
5640 "Incorrect element count in vector concatenation!");
5641
5642 if (Ops.size() == 1)
5643 return Ops[0];
5644
5645 // Concat of UNDEFs is UNDEF.
5646 if (llvm::all_of(Ops, [](SDValue Op) { return Op.isUndef(); }))
5647 return DAG.getUNDEF(VT);
5648
5649 // Scan the operands and look for extract operations from a single source
5650 // that correspond to insertion at the same location via this concatenation:
5651 // concat (extract X, 0*subvec_elts), (extract X, 1*subvec_elts), ...
5652 SDValue IdentitySrc;
5653 bool IsIdentity = true;
5654 for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
5655 SDValue Op = Ops[i];
5656 unsigned IdentityIndex = i * Op.getValueType().getVectorMinNumElements();
5657 if (Op.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
5658 Op.getOperand(0).getValueType() != VT ||
5659 (IdentitySrc && Op.getOperand(0) != IdentitySrc) ||
5660 Op.getConstantOperandVal(1) != IdentityIndex) {
5661 IsIdentity = false;
5662 break;
5663 }
5664 assert((!IdentitySrc || IdentitySrc == Op.getOperand(0)) &&
5665 "Unexpected identity source vector for concat of extracts");
5666 IdentitySrc = Op.getOperand(0);
5667 }
5668 if (IsIdentity) {
5669 assert(IdentitySrc && "Failed to set source vector of extracts");
5670 return IdentitySrc;
5671 }
5672
5673 // The code below this point is only designed to work for fixed width
5674 // vectors, so we bail out for now.
5675 if (VT.isScalableVector())
5676 return SDValue();
5677
5678 // A CONCAT_VECTOR with all UNDEF/BUILD_VECTOR operands can be
5679 // simplified to one big BUILD_VECTOR.
5680 // FIXME: Add support for SCALAR_TO_VECTOR as well.
5681 EVT SVT = VT.getScalarType();
5683 for (SDValue Op : Ops) {
5684 EVT OpVT = Op.getValueType();
5685 if (Op.isUndef())
5686 Elts.append(OpVT.getVectorNumElements(), DAG.getUNDEF(SVT));
5687 else if (Op.getOpcode() == ISD::BUILD_VECTOR)
5688 Elts.append(Op->op_begin(), Op->op_end());
5689 else
5690 return SDValue();
5691 }
5692
5693 // BUILD_VECTOR requires all inputs to be of the same type, find the
5694 // maximum type and extend them all.
5695 for (SDValue Op : Elts)
5696 SVT = (SVT.bitsLT(Op.getValueType()) ? Op.getValueType() : SVT);
5697
5698 if (SVT.bitsGT(VT.getScalarType())) {
5699 for (SDValue &Op : Elts) {
5700 if (Op.isUndef())
5701 Op = DAG.getUNDEF(SVT);
5702 else
5703 Op = DAG.getTargetLoweringInfo().isZExtFree(Op.getValueType(), SVT)
5704 ? DAG.getZExtOrTrunc(Op, DL, SVT)
5705 : DAG.getSExtOrTrunc(Op, DL, SVT);
5706 }
5707 }
5708
5709 SDValue V = DAG.getBuildVector(VT, DL, Elts);
5710 NewSDValueDbgMsg(V, "New node fold concat vectors: ", &DAG);
5711 return V;
5712}
5713
5714/// Gets or creates the specified node.
5715SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT) {
5716 SDVTList VTs = getVTList(VT);
5718 AddNodeIDNode(ID, Opcode, VTs, std::nullopt);
5719 void *IP = nullptr;
5720 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
5721 return SDValue(E, 0);
5722
5723 auto *N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
5724 CSEMap.InsertNode(N, IP);
5725
5726 InsertNode(N);
5727 SDValue V = SDValue(N, 0);
5728 NewSDValueDbgMsg(V, "Creating new node: ", this);
5729 return V;
5730}
5731
5732SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
5733 SDValue N1) {
5734 SDNodeFlags Flags;
5735 if (Inserter)
5736 Flags = Inserter->getFlags();
5737 return getNode(Opcode, DL, VT, N1, Flags);
5738}
5739
5740SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
5741 SDValue N1, const SDNodeFlags Flags) {
5742 assert(N1.getOpcode() != ISD::DELETED_NODE && "Operand is DELETED_NODE!");
5743
5744 // Constant fold unary operations with a vector integer or float operand.
5745 switch (Opcode) {
5746 default:
5747 // FIXME: Entirely reasonable to perform folding of other unary
5748 // operations here as the need arises.
5749 break;
5750 case ISD::FNEG:
5751 case ISD::FABS:
5752 case ISD::FCEIL:
5753 case ISD::FTRUNC:
5754 case ISD::FFLOOR:
5755 case ISD::FP_EXTEND:
5756 case ISD::FP_TO_SINT:
5757 case ISD::FP_TO_UINT:
5758 case ISD::FP_TO_FP16:
5759 case ISD::FP_TO_BF16:
5760 case ISD::TRUNCATE:
5761 case ISD::ANY_EXTEND:
5762 case ISD::ZERO_EXTEND:
5763 case ISD::SIGN_EXTEND:
5764 case ISD::UINT_TO_FP:
5765 case ISD::SINT_TO_FP:
5766 case ISD::FP16_TO_FP:
5767 case ISD::BF16_TO_FP:
5768 case ISD::BITCAST:
5769 case ISD::ABS:
5770 case ISD::BITREVERSE:
5771 case ISD::BSWAP:
5772 case ISD::CTLZ:
5774 case ISD::CTTZ:
5776 case ISD::CTPOP:
5777 case ISD::STEP_VECTOR: {
5778 SDValue Ops = {N1};
5779 if (SDValue Fold = FoldConstantArithmetic(Opcode, DL, VT, Ops))
5780 return Fold;
5781 }
5782 }
5783
5784 unsigned OpOpcode = N1.getNode()->getOpcode();
5785 switch (Opcode) {
5786 case ISD::STEP_VECTOR:
5787 assert(VT.isScalableVector() &&
5788 "STEP_VECTOR can only be used with scalable types");
5789 assert(OpOpcode == ISD::TargetConstant &&
5790 VT.getVectorElementType() == N1.getValueType() &&
5791 "Unexpected step operand");
5792 break;
5793 case ISD::FREEZE:
5794 assert(VT == N1.getValueType() && "Unexpected VT!");
5795 if (isGuaranteedNotToBeUndefOrPoison(N1, /*PoisonOnly*/ false,
5796 /*Depth*/ 1))
5797 return N1;
5798 break;
5799 case ISD::TokenFactor:
5800 case ISD::MERGE_VALUES:
5802 return N1; // Factor, merge or concat of one node? No need.
5803 case ISD::BUILD_VECTOR: {
5804 // Attempt to simplify BUILD_VECTOR.
5805 SDValue Ops[] = {N1};
5806 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
5807 return V;
5808 break;
5809 }
5810 case ISD::FP_ROUND: llvm_unreachable("Invalid method to make FP_ROUND node");
5811 case ISD::FP_EXTEND:
5813 "Invalid FP cast!");
5814 if (N1.getValueType() == VT) return N1; // noop conversion.
5815 assert((!VT.isVector() || VT.getVectorElementCount() ==
5817 "Vector element count mismatch!");
5818 assert(N1.getValueType().bitsLT(VT) && "Invalid fpext node, dst < src!");
5819 if (N1.isUndef())
5820 return getUNDEF(VT);
5821 break;
5822 case ISD::FP_TO_SINT:
5823 case ISD::FP_TO_UINT:
5824 if (N1.isUndef())
5825 return getUNDEF(VT);
5826 break;
5827 case ISD::SINT_TO_FP:
5828 case ISD::UINT_TO_FP:
5829 // [us]itofp(undef) = 0, because the result value is bounded.
5830 if (N1.isUndef())
5831 return getConstantFP(0.0, DL, VT);
5832 break;
5833 case ISD::SIGN_EXTEND:
5834 assert(VT.isInteger() && N1.getValueType().isInteger() &&
5835 "Invalid SIGN_EXTEND!");
5836 assert(VT.isVector() == N1.getValueType().isVector() &&
5837 "SIGN_EXTEND result type type should be vector iff the operand "
5838 "type is vector!");
5839 if (N1.getValueType() == VT) return N1; // noop extension
5840 assert((!VT.isVector() || VT.getVectorElementCount() ==
5842 "Vector element count mismatch!");
5843 assert(N1.getValueType().bitsLT(VT) && "Invalid sext node, dst < src!");
5844 if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND) {
5845 SDNodeFlags Flags;
5846 if (OpOpcode == ISD::ZERO_EXTEND)
5847 Flags.setNonNeg(N1->getFlags().hasNonNeg());
5848 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
5849 }
5850 if (OpOpcode == ISD::UNDEF)
5851 // sext(undef) = 0, because the top bits will all be the same.
5852 return getConstant(0, DL, VT);
5853 break;
5854 case ISD::ZERO_EXTEND:
5855 assert(VT.isInteger() && N1.getValueType().isInteger() &&
5856 "Invalid ZERO_EXTEND!");
5857 assert(VT.isVector() == N1.getValueType().isVector() &&
5858 "ZERO_EXTEND result type type should be vector iff the operand "
5859 "type is vector!");
5860 if (N1.getValueType() == VT) return N1; // noop extension
5861 assert((!VT.isVector() || VT.getVectorElementCount() ==
5863 "Vector element count mismatch!");
5864 assert(N1.getValueType().bitsLT(VT) && "Invalid zext node, dst < src!");
5865 if (OpOpcode == ISD::ZERO_EXTEND) { // (zext (zext x)) -> (zext x)
5866 SDNodeFlags Flags;
5867 Flags.setNonNeg(N1->getFlags().hasNonNeg());
5868 return getNode(ISD::ZERO_EXTEND, DL, VT, N1.getOperand(0), Flags);
5869 }
5870 if (OpOpcode == ISD::UNDEF)
5871 // zext(undef) = 0, because the top bits will be zero.
5872 return getConstant(0, DL, VT);
5873
5874 // Skip unnecessary zext_inreg pattern:
5875 // (zext (trunc x)) -> x iff the upper bits are known zero.
5876 // TODO: Remove (zext (trunc (and x, c))) exception which some targets
5877 // use to recognise zext_inreg patterns.
5878 if (OpOpcode == ISD::TRUNCATE) {
5879 SDValue OpOp = N1.getOperand(0);
5880 if (OpOp.getValueType() == VT) {
5881 if (OpOp.getOpcode() != ISD::AND) {
5884 if (MaskedValueIsZero(OpOp, HiBits)) {
5885 transferDbgValues(N1, OpOp);
5886 return OpOp;
5887 }
5888 }
5889 }
5890 }
5891 break;
5892 case ISD::ANY_EXTEND:
5893 assert(VT.isInteger() && N1.getValueType().isInteger() &&
5894 "Invalid ANY_EXTEND!");
5895 assert(VT.isVector() == N1.getValueType().isVector() &&
5896 "ANY_EXTEND result type type should be vector iff the operand "
5897 "type is vector!");
5898 if (N1.getValueType() == VT) return N1; // noop extension
5899 assert((!VT.isVector() || VT.getVectorElementCount() ==
5901 "Vector element count mismatch!");
5902 assert(N1.getValueType().bitsLT(VT) && "Invalid anyext node, dst < src!");
5903
5904 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
5905 OpOpcode == ISD::ANY_EXTEND) {
5906 SDNodeFlags Flags;
5907 if (OpOpcode == ISD::ZERO_EXTEND)
5908 Flags.setNonNeg(N1->getFlags().hasNonNeg());
5909 // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x)
5910 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
5911 }
5912 if (OpOpcode == ISD::UNDEF)
5913 return getUNDEF(VT);
5914
5915 // (ext (trunc x)) -> x
5916 if (OpOpcode == ISD::TRUNCATE) {
5917 SDValue OpOp = N1.getOperand(0);
5918 if (OpOp.getValueType() == VT) {
5919 transferDbgValues(N1, OpOp);
5920 return OpOp;
5921 }
5922 }
5923 break;
5924 case ISD::TRUNCATE:
5925 assert(VT.isInteger() && N1.getValueType().isInteger() &&
5926 "Invalid TRUNCATE!");
5927 assert(VT.isVector() == N1.getValueType().isVector() &&
5928 "TRUNCATE result type type should be vector iff the operand "
5929 "type is vector!");
5930 if (N1.getValueType() == VT) return N1; // noop truncate
5931 assert((!VT.isVector() || VT.getVectorElementCount() ==
5933 "Vector element count mismatch!");
5934 assert(N1.getValueType().bitsGT(VT) && "Invalid truncate node, src < dst!");
5935 if (OpOpcode == ISD::TRUNCATE)
5936 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
5937 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
5938 OpOpcode == ISD::ANY_EXTEND) {
5939 // If the source is smaller than the dest, we still need an extend.
5941 VT.getScalarType()))
5942 return getNode(OpOpcode, DL, VT, N1.getOperand(0));
5943 if (N1.getOperand(0).getValueType().bitsGT(VT))
5944 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
5945 return N1.getOperand(0);
5946 }
5947 if (OpOpcode == ISD::UNDEF)
5948 return getUNDEF(VT);
5949 if (OpOpcode == ISD::VSCALE && !NewNodesMustHaveLegalTypes)
5950 return getVScale(DL, VT,
5952 break;
5956 assert(VT.isVector() && "This DAG node is restricted to vector types.");
5957 assert(N1.getValueType().bitsLE(VT) &&
5958 "The input must be the same size or smaller than the result.");
5961 "The destination vector type must have fewer lanes than the input.");
5962 break;
5963 case ISD::ABS:
5964 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid ABS!");
5965 if (OpOpcode == ISD::UNDEF)
5966 return getConstant(0, DL, VT);
5967 break;
5968 case ISD::BSWAP:
5969 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BSWAP!");
5970 assert((VT.getScalarSizeInBits() % 16 == 0) &&
5971 "BSWAP types must be a multiple of 16 bits!");
5972 if (OpOpcode == ISD::UNDEF)
5973 return getUNDEF(VT);
5974 // bswap(bswap(X)) -> X.
5975 if (OpOpcode == ISD::BSWAP)
5976 return N1.getOperand(0);
5977 break;
5978 case ISD::BITREVERSE:
5979 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BITREVERSE!");
5980 if (OpOpcode == ISD::UNDEF)
5981 return getUNDEF(VT);
5982 break;
5983 case ISD::BITCAST:
5985 "Cannot BITCAST between types of different sizes!");
5986 if (VT == N1.getValueType()) return N1; // noop conversion.
5987 if (OpOpcode == ISD::BITCAST) // bitconv(bitconv(x)) -> bitconv(x)
5988 return getNode(ISD::BITCAST, DL, VT, N1.getOperand(0));
5989 if (OpOpcode == ISD::UNDEF)
5990 return getUNDEF(VT);
5991 break;
5993 assert(VT.isVector() && !N1.getValueType().isVector() &&
5994 (VT.getVectorElementType() == N1.getValueType() ||
5996 N1.getValueType().isInteger() &&
5998 "Illegal SCALAR_TO_VECTOR node!");
5999 if (OpOpcode == ISD::UNDEF)
6000 return getUNDEF(VT);
6001 // scalar_to_vector(extract_vector_elt V, 0) -> V, top bits are undefined.
6002 if (OpOpcode == ISD::EXTRACT_VECTOR_ELT &&
6003 isa<ConstantSDNode>(N1.getOperand(1)) &&
6004 N1.getConstantOperandVal(1) == 0 &&
6005 N1.getOperand(0).getValueType() == VT)
6006 return N1.getOperand(0);
6007 break;
6008 case ISD::FNEG:
6009 // Negation of an unknown bag of bits is still completely undefined.
6010 if (OpOpcode == ISD::UNDEF)
6011 return getUNDEF(VT);
6012
6013 if (OpOpcode == ISD::FNEG) // --X -> X
6014 return N1.getOperand(0);
6015 break;
6016 case ISD::FABS:
6017 if (OpOpcode == ISD::FNEG) // abs(-X) -> abs(X)
6018 return getNode(ISD::FABS, DL, VT, N1.getOperand(0));
6019 break;
6020 case ISD::VSCALE:
6021 assert(VT == N1.getValueType() && "Unexpected VT!");
6022 break;
6023 case ISD::CTPOP:
6024 if (N1.getValueType().getScalarType() == MVT::i1)
6025 return N1;
6026 break;
6027 case ISD::CTLZ:
6028 case ISD::CTTZ:
6029 if (N1.getValueType().getScalarType() == MVT::i1)
6030 return getNOT(DL, N1, N1.getValueType());
6031 break;
6032 case ISD::VECREDUCE_ADD:
6033 if (N1.getValueType().getScalarType() == MVT::i1)
6034 return getNode(ISD::VECREDUCE_XOR, DL, VT, N1);
6035 break;
6038 if (N1.getValueType().getScalarType() == MVT::i1)
6039 return getNode(ISD::VECREDUCE_OR, DL, VT, N1);
6040 break;
6043 if (N1.getValueType().getScalarType() == MVT::i1)
6044 return getNode(ISD::VECREDUCE_AND, DL, VT, N1);
6045 break;
6046 case ISD::SPLAT_VECTOR:
6047 assert(VT.isVector() && "Wrong return type!");
6048 // FIXME: Hexagon uses i32 scalar for a floating point zero vector so allow
6049 // that for now.
6051 (VT.isFloatingPoint() && N1.getValueType() == MVT::i32) ||
6053 N1.getValueType().isInteger() &&
6055 "Wrong operand type!");
6056 break;
6057 }
6058
6059 SDNode *N;
6060 SDVTList VTs = getVTList(VT);
6061 SDValue Ops[] = {N1};
6062 if (VT != MVT::Glue) { // Don't CSE glue producing nodes
6064 AddNodeIDNode(ID, Opcode, VTs, Ops);
6065 void *IP = nullptr;
6066 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
6067 E->intersectFlagsWith(Flags);
6068 return SDValue(E, 0);
6069 }
6070
6071 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6072 N->setFlags(Flags);
6073 createOperands(N, Ops);
6074 CSEMap.InsertNode(N, IP);
6075 } else {
6076 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6077 createOperands(N, Ops);
6078 }
6079
6080 InsertNode(N);
6081 SDValue V = SDValue(N, 0);
6082 NewSDValueDbgMsg(V, "Creating new node: ", this);
6083 return V;
6084}
6085
6086static std::optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
6087 const APInt &C2) {
6088 switch (Opcode) {
6089 case ISD::ADD: return C1 + C2;
6090 case ISD::SUB: return C1 - C2;
6091 case ISD::MUL: return C1 * C2;
6092 case ISD::AND: return C1 & C2;
6093 case ISD::OR: return C1 | C2;
6094 case ISD::XOR: return C1 ^ C2;
6095 case ISD::SHL: return C1 << C2;
6096 case ISD::SRL: return C1.lshr(C2);
6097 case ISD::SRA: return C1.ashr(C2);
6098 case ISD::ROTL: return C1.rotl(C2);
6099 case ISD::ROTR: return C1.rotr(C2);
6100 case ISD::SMIN: return C1.sle(C2) ? C1 : C2;
6101 case ISD::SMAX: return C1.sge(C2) ? C1 : C2;
6102 case ISD::UMIN: return C1.ule(C2) ? C1 : C2;
6103 case ISD::UMAX: return C1.uge(C2) ? C1 : C2;
6104 case ISD::SADDSAT: return C1.sadd_sat(C2);
6105 case ISD::UADDSAT: return C1.uadd_sat(C2);
6106 case ISD::SSUBSAT: return C1.ssub_sat(C2);
6107 case ISD::USUBSAT: return C1.usub_sat(C2);
6108 case ISD::SSHLSAT: return C1.sshl_sat(C2);
6109 case ISD::USHLSAT: return C1.ushl_sat(C2);
6110 case ISD::UDIV:
6111 if (!C2.getBoolValue())
6112 break;
6113 return C1.udiv(C2);
6114 case ISD::UREM:
6115 if (!C2.getBoolValue())
6116 break;
6117 return C1.urem(C2);
6118 case ISD::SDIV:
6119 if (!C2.getBoolValue())
6120 break;
6121 return C1.sdiv(C2);
6122 case ISD::SREM:
6123 if (!C2.getBoolValue())
6124 break;
6125 return C1.srem(C2);
6126 case ISD::AVGFLOORS:
6127 return APIntOps::avgFloorS(C1, C2);
6128 case ISD::AVGFLOORU:
6129 return APIntOps::avgFloorU(C1, C2);
6130 case ISD::AVGCEILS:
6131 return APIntOps::avgCeilS(C1, C2);
6132 case ISD::AVGCEILU:
6133 return APIntOps::avgCeilU(C1, C2);
6134 case ISD::ABDS:
6135 return APIntOps::abds(C1, C2);
6136 case ISD::ABDU:
6137 return APIntOps::abdu(C1, C2);
6138 case ISD::MULHS:
6139 return APIntOps::mulhs(C1, C2);
6140 case ISD::MULHU:
6141 return APIntOps::mulhu(C1, C2);
6142 }
6143 return std::nullopt;
6144}
6145// Handle constant folding with UNDEF.
6146// TODO: Handle more cases.
6147static std::optional<APInt> FoldValueWithUndef(unsigned Opcode, const APInt &C1,
6148 bool IsUndef1, const APInt &C2,
6149 bool IsUndef2) {
6150 if (!(IsUndef1 || IsUndef2))
6151 return FoldValue(Opcode, C1, C2);
6152
6153 // Fold and(x, undef) -> 0
6154 // Fold mul(x, undef) -> 0
6155 if (Opcode == ISD::AND || Opcode == ISD::MUL)
6156 return APInt::getZero(C1.getBitWidth());
6157
6158 return std::nullopt;
6159}
6160
6162 const GlobalAddressSDNode *GA,
6163 const SDNode *N2) {
6164 if (GA->getOpcode() != ISD::GlobalAddress)
6165 return SDValue();
6166 if (!TLI->isOffsetFoldingLegal(GA))
6167 return SDValue();
6168 auto *C2 = dyn_cast<ConstantSDNode>(N2);
6169 if (!C2)
6170 return SDValue();
6171 int64_t Offset = C2->getSExtValue();
6172 switch (Opcode) {
6173 case ISD::ADD: break;
6174 case ISD::SUB: Offset = -uint64_t(Offset); break;
6175 default: return SDValue();
6176 }
6177 return getGlobalAddress(GA->getGlobal(), SDLoc(C2), VT,
6178 GA->getOffset() + uint64_t(Offset));
6179}
6180
6181bool SelectionDAG::isUndef(unsigned Opcode, ArrayRef<SDValue> Ops) {
6182 switch (Opcode) {
6183 case ISD::SDIV:
6184 case ISD::UDIV:
6185 case ISD::SREM:
6186 case ISD::UREM: {
6187 // If a divisor is zero/undef or any element of a divisor vector is
6188 // zero/undef, the whole op is undef.
6189 assert(Ops.size() == 2 && "Div/rem should have 2 operands");
6190 SDValue Divisor = Ops[1];
6191 if (Divisor.isUndef() || isNullConstant(Divisor))
6192 return true;
6193
6194 return ISD::isBuildVectorOfConstantSDNodes(Divisor.getNode()) &&
6195 llvm::any_of(Divisor->op_values(),
6196 [](SDValue V) { return V.isUndef() ||
6197 isNullConstant(V); });
6198 // TODO: Handle signed overflow.
6199 }
6200 // TODO: Handle oversized shifts.
6201 default:
6202 return false;
6203 }
6204}
6205
6207 EVT VT, ArrayRef<SDValue> Ops) {
6208 // If the opcode is a target-specific ISD node, there's nothing we can
6209 // do here and the operand rules may not line up with the below, so
6210 // bail early.
6211 // We can't create a scalar CONCAT_VECTORS so skip it. It will break
6212 // for concats involving SPLAT_VECTOR. Concats of BUILD_VECTORS are handled by
6213 // foldCONCAT_VECTORS in getNode before this is called.
6214 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::CONCAT_VECTORS)
6215 return SDValue();
6216
6217 unsigned NumOps = Ops.size();
6218 if (NumOps == 0)
6219 return SDValue();
6220
6221 if (isUndef(Opcode, Ops))
6222 return getUNDEF(VT);
6223
6224 // Handle unary special cases.
6225 if (NumOps == 1) {
6226 SDValue N1 = Ops[0];
6227
6228 // Constant fold unary operations with an integer constant operand. Even
6229 // opaque constant will be folded, because the folding of unary operations
6230 // doesn't create new constants with different values. Nevertheless, the
6231 // opaque flag is preserved during folding to prevent future folding with
6232 // other constants.
6233 if (auto *C = dyn_cast<ConstantSDNode>(N1)) {
6234 const APInt &Val = C->getAPIntValue();
6235 switch (Opcode) {
6236 case ISD::SIGN_EXTEND:
6237 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
6238 C->isTargetOpcode(), C->isOpaque());
6239 case ISD::TRUNCATE:
6240 if (C->isOpaque())
6241 break;
6242 [[fallthrough]];
6243 case ISD::ZERO_EXTEND:
6244 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
6245 C->isTargetOpcode(), C->isOpaque());
6246 case ISD::ANY_EXTEND:
6247 // Some targets like RISCV prefer to sign extend some types.
6248 if (TLI->isSExtCheaperThanZExt(N1.getValueType(), VT))
6249 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
6250 C->isTargetOpcode(), C->isOpaque());
6251 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
6252 C->isTargetOpcode(), C->isOpaque());
6253 case ISD::ABS:
6254 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
6255 C->isOpaque());
6256 case ISD::BITREVERSE:
6257 return getConstant(Val.reverseBits(), DL, VT, C->isTargetOpcode(),
6258 C->isOpaque());
6259 case ISD::BSWAP:
6260 return getConstant(Val.byteSwap(), DL, VT, C->isTargetOpcode(),
6261 C->isOpaque());
6262 case ISD::CTPOP:
6263 return getConstant(Val.popcount(), DL, VT, C->isTargetOpcode(),
6264 C->isOpaque());
6265 case ISD::CTLZ:
6267 return getConstant(Val.countl_zero(), DL, VT, C->isTargetOpcode(),
6268 C->isOpaque());
6269 case ISD::CTTZ:
6271 return getConstant(Val.countr_zero(), DL, VT, C->isTargetOpcode(),
6272 C->isOpaque());
6273 case ISD::UINT_TO_FP:
6274 case ISD::SINT_TO_FP: {
6277 (void)apf.convertFromAPInt(Val, Opcode == ISD::SINT_TO_FP,
6279 return getConstantFP(apf, DL, VT);
6280 }
6281 case ISD::FP16_TO_FP:
6282 case ISD::BF16_TO_FP: {
6283 bool Ignored;
6284 APFloat FPV(Opcode == ISD::FP16_TO_FP ? APFloat::IEEEhalf()
6285 : APFloat::BFloat(),
6286 (Val.getBitWidth() == 16) ? Val : Val.trunc(16));
6287
6288 // This can return overflow, underflow, or inexact; we don't care.
6289 // FIXME need to be more flexible about rounding mode.
6290 (void)FPV.convert(EVTToAPFloatSemantics(VT),
6292 return getConstantFP(FPV, DL, VT);
6293 }
6294 case ISD::STEP_VECTOR:
6295 if (SDValue V = FoldSTEP_VECTOR(DL, VT, N1, *this))
6296 return V;
6297 break;
6298 case ISD::BITCAST:
6299 if (VT == MVT::f16 && C->getValueType(0) == MVT::i16)
6300 return getConstantFP(APFloat(APFloat::IEEEhalf(), Val), DL, VT);
6301 if (VT == MVT::f32 && C->getValueType(0) == MVT::i32)
6302 return getConstantFP(APFloat(APFloat::IEEEsingle(), Val), DL, VT);
6303 if (VT == MVT::f64 && C->getValueType(0) == MVT::i64)
6304 return getConstantFP(APFloat(APFloat::IEEEdouble(), Val), DL, VT);
6305 if (VT == MVT::f128 && C->getValueType(0) == MVT::i128)
6306 return getConstantFP(APFloat(APFloat::IEEEquad(), Val), DL, VT);
6307 break;
6308 }
6309 }
6310
6311 // Constant fold unary operations with a floating point constant operand.
6312 if (auto *C = dyn_cast<ConstantFPSDNode>(N1)) {
6313 APFloat V = C->getValueAPF(); // make copy
6314 switch (Opcode) {
6315 case ISD::FNEG:
6316 V.changeSign();
6317 return getConstantFP(V, DL, VT);
6318 case ISD::FABS:
6319 V.clearSign();
6320 return getConstantFP(V, DL, VT);
6321 case ISD::FCEIL: {
6322 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardPositive);
6323 if (fs == APFloat::opOK || fs == APFloat::opInexact)
6324 return getConstantFP(V, DL, VT);
6325 return SDValue();
6326 }
6327 case ISD::FTRUNC: {
6328 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardZero);
6329 if (fs == APFloat::opOK || fs == APFloat::opInexact)
6330 return getConstantFP(V, DL, VT);
6331 return SDValue();
6332 }
6333 case ISD::FFLOOR: {
6334 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardNegative);
6335 if (fs == APFloat::opOK || fs == APFloat::opInexact)
6336 return getConstantFP(V, DL, VT);
6337 return SDValue();
6338 }
6339 case ISD::FP_EXTEND: {
6340 bool ignored;
6341 // This can return overflow, underflow, or inexact; we don't care.
6342 // FIXME need to be more flexible about rounding mode.
6344 &ignored);
6345 return getConstantFP(V, DL, VT);
6346 }
6347 case ISD::FP_TO_SINT:
6348 case ISD::FP_TO_UINT: {
6349 bool ignored;
6350 APSInt IntVal(VT.getSizeInBits(), Opcode == ISD::FP_TO_UINT);
6351 // FIXME need to be more flexible about rounding mode.
6353 V.convertToInteger(IntVal, APFloat::rmTowardZero, &ignored);
6354 if (s == APFloat::opInvalidOp) // inexact is OK, in fact usual
6355 break;
6356 return getConstant(IntVal, DL, VT);
6357 }
6358 case ISD::FP_TO_FP16:
6359 case ISD::FP_TO_BF16: {
6360 bool Ignored;
6361 // This can return overflow, underflow, or inexact; we don't care.
6362 // FIXME need to be more flexible about rounding mode.
6363 (void)V.convert(Opcode == ISD::FP_TO_FP16 ? APFloat::IEEEhalf()
6364 : APFloat::BFloat(),
6366 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
6367 }
6368 case ISD::BITCAST:
6369 if (VT == MVT::i16 && C->getValueType(0) == MVT::f16)
6370 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
6371 VT);
6372 if (VT == MVT::i16 && C->getValueType(0) == MVT::bf16)
6373 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
6374 VT);
6375 if (VT == MVT::i32 && C->getValueType(0) == MVT::f32)
6376 return getConstant((uint32_t)V.bitcastToAPInt().getZExtValue(), DL,
6377 VT);
6378 if (VT == MVT::i64 && C->getValueType(0) == MVT::f64)
6379 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
6380 break;
6381 }
6382 }
6383
6384 // Early-out if we failed to constant fold a bitcast.
6385 if (Opcode == ISD::BITCAST)
6386 return SDValue();
6387 }
6388
6389 // Handle binops special cases.
6390 if (NumOps == 2) {
6391 if (SDValue CFP = foldConstantFPMath(Opcode, DL, VT, Ops))
6392 return CFP;
6393
6394 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
6395 if (auto *C2 = dyn_cast<ConstantSDNode>(Ops[1])) {
6396 if (C1->isOpaque() || C2->isOpaque())
6397 return SDValue();
6398
6399 std::optional<APInt> FoldAttempt =
6400 FoldValue(Opcode, C1->getAPIntValue(), C2->getAPIntValue());
6401 if (!FoldAttempt)
6402 return SDValue();
6403
6404 SDValue Folded = getConstant(*FoldAttempt, DL, VT);
6405 assert((!Folded || !VT.isVector()) &&
6406 "Can't fold vectors ops with scalar operands");
6407 return Folded;
6408 }
6409 }
6410
6411 // fold (add Sym, c) -> Sym+c
6412 if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(Ops[0]))
6413 return FoldSymbolOffset(Opcode, VT, GA, Ops[1].getNode());
6414 if (TLI->isCommutativeBinOp(Opcode))
6415 if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(Ops[1]))
6416 return FoldSymbolOffset(Opcode, VT, GA, Ops[0].getNode());
6417 }
6418
6419 // This is for vector folding only from here on.
6420 if (!VT.isVector())
6421 return SDValue();
6422
6423 ElementCount NumElts = VT.getVectorElementCount();
6424
6425 // See if we can fold through bitcasted integer ops.
6426 if (NumOps == 2 && VT.isFixedLengthVector() && VT.isInteger() &&
6427 Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
6428 Ops[0].getOpcode() == ISD::BITCAST &&
6429 Ops[1].getOpcode() == ISD::BITCAST) {
6430 SDValue N1 = peekThroughBitcasts(Ops[0]);
6431 SDValue N2 = peekThroughBitcasts(Ops[1]);
6432 auto *BV1 = dyn_cast<BuildVectorSDNode>(N1);
6433 auto *BV2 = dyn_cast<BuildVectorSDNode>(N2);
6434 EVT BVVT = N1.getValueType();
6435 if (BV1 && BV2 && BVVT.isInteger() && BVVT == N2.getValueType()) {
6436 bool IsLE = getDataLayout().isLittleEndian();
6437 unsigned EltBits = VT.getScalarSizeInBits();
6438 SmallVector<APInt> RawBits1, RawBits2;
6439 BitVector UndefElts1, UndefElts2;
6440 if (BV1->getConstantRawBits(IsLE, EltBits, RawBits1, UndefElts1) &&
6441 BV2->getConstantRawBits(IsLE, EltBits, RawBits2, UndefElts2)) {
6442 SmallVector<APInt> RawBits;
6443 for (unsigned I = 0, E = NumElts.getFixedValue(); I != E; ++I) {
6444 std::optional<APInt> Fold = FoldValueWithUndef(
6445 Opcode, RawBits1[I], UndefElts1[I], RawBits2[I], UndefElts2[I]);
6446 if (!Fold)
6447 break;
6448 RawBits.push_back(*Fold);
6449 }
6450 if (RawBits.size() == NumElts.getFixedValue()) {
6451 // We have constant folded, but we need to cast this again back to
6452 // the original (possibly legalized) type.
6453 SmallVector<APInt> DstBits;
6454 BitVector DstUndefs;
6456 DstBits, RawBits, DstUndefs,
6457 BitVector(RawBits.size(), false));
6458 EVT BVEltVT = BV1->getOperand(0).getValueType();
6459 unsigned BVEltBits = BVEltVT.getSizeInBits();
6460 SmallVector<SDValue> Ops(DstBits.size(), getUNDEF(BVEltVT));
6461 for (unsigned I = 0, E = DstBits.size(); I != E; ++I) {
6462 if (DstUndefs[I])
6463 continue;
6464 Ops[I] = getConstant(DstBits[I].sext(BVEltBits), DL, BVEltVT);
6465 }
6466 return getBitcast(VT, getBuildVector(BVVT, DL, Ops));
6467 }
6468 }
6469 }
6470 }
6471
6472 // Fold (mul step_vector(C0), C1) to (step_vector(C0 * C1)).
6473 // (shl step_vector(C0), C1) -> (step_vector(C0 << C1))
6474 if ((Opcode == ISD::MUL || Opcode == ISD::SHL) &&
6475 Ops[0].getOpcode() == ISD::STEP_VECTOR) {
6476 APInt RHSVal;
6477 if (ISD::isConstantSplatVector(Ops[1].getNode(), RHSVal)) {
6478 APInt NewStep = Opcode == ISD::MUL
6479 ? Ops[0].getConstantOperandAPInt(0) * RHSVal
6480 : Ops[0].getConstantOperandAPInt(0) << RHSVal;
6481 return getStepVector(DL, VT, NewStep);
6482 }
6483 }
6484
6485 auto IsScalarOrSameVectorSize = [NumElts](const SDValue &Op) {
6486 return !Op.getValueType().isVector() ||
6487 Op.getValueType().getVectorElementCount() == NumElts;
6488 };
6489
6490 auto IsBuildVectorSplatVectorOrUndef = [](const SDValue &Op) {
6491 return Op.isUndef() || Op.getOpcode() == ISD::CONDCODE ||
6492 Op.getOpcode() == ISD::BUILD_VECTOR ||
6493 Op.getOpcode() == ISD::SPLAT_VECTOR;
6494 };
6495
6496 // All operands must be vector types with the same number of elements as
6497 // the result type and must be either UNDEF or a build/splat vector
6498 // or UNDEF scalars.
6499 if (!llvm::all_of(Ops, IsBuildVectorSplatVectorOrUndef) ||
6500 !llvm::all_of(Ops, IsScalarOrSameVectorSize))
6501 return SDValue();
6502
6503 // If we are comparing vectors, then the result needs to be a i1 boolean that
6504 // is then extended back to the legal result type depending on how booleans
6505 // are represented.
6506 EVT SVT = (Opcode == ISD::SETCC ? MVT::i1 : VT.getScalarType());
6507 ISD::NodeType ExtendCode =
6508 (Opcode == ISD::SETCC && SVT != VT.getScalarType())
6511
6512 // Find legal integer scalar type for constant promotion and
6513 // ensure that its scalar size is at least as large as source.
6514 EVT LegalSVT = VT.getScalarType();
6515 if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
6516 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
6517 if (LegalSVT.bitsLT(VT.getScalarType()))
6518 return SDValue();
6519 }
6520
6521 // For scalable vector types we know we're dealing with SPLAT_VECTORs. We
6522 // only have one operand to check. For fixed-length vector types we may have
6523 // a combination of BUILD_VECTOR and SPLAT_VECTOR.
6524 unsigned NumVectorElts = NumElts.isScalable() ? 1 : NumElts.getFixedValue();
6525
6526 // Constant fold each scalar lane separately.
6527 SmallVector<SDValue, 4> ScalarResults;
6528 for (unsigned I = 0; I != NumVectorElts; I++) {
6529 SmallVector<SDValue, 4> ScalarOps;
6530 for (SDValue Op : Ops) {
6531 EVT InSVT = Op.getValueType().getScalarType();
6532 if (Op.getOpcode() != ISD::BUILD_VECTOR &&
6533 Op.getOpcode() != ISD::SPLAT_VECTOR) {
6534 if (Op.isUndef())
6535 ScalarOps.push_back(getUNDEF(InSVT));
6536 else
6537 ScalarOps.push_back(Op);
6538 continue;
6539 }
6540
6541 SDValue ScalarOp =
6542 Op.getOperand(Op.getOpcode() == ISD::SPLAT_VECTOR ? 0 : I);
6543 EVT ScalarVT = ScalarOp.getValueType();
6544
6545 // Build vector (integer) scalar operands may need implicit
6546 // truncation - do this before constant folding.
6547 if (ScalarVT.isInteger() && ScalarVT.bitsGT(InSVT)) {
6548 // Don't create illegally-typed nodes unless they're constants or undef
6549 // - if we fail to constant fold we can't guarantee the (dead) nodes
6550 // we're creating will be cleaned up before being visited for
6551 // legalization.
6552 if (NewNodesMustHaveLegalTypes && !ScalarOp.isUndef() &&
6553 !isa<ConstantSDNode>(ScalarOp) &&
6554 TLI->getTypeAction(*getContext(), InSVT) !=
6556 return SDValue();
6557 ScalarOp = getNode(ISD::TRUNCATE, DL, InSVT, ScalarOp);
6558 }
6559
6560 ScalarOps.push_back(ScalarOp);
6561 }
6562
6563 // Constant fold the scalar operands.
6564 SDValue ScalarResult = getNode(Opcode, DL, SVT, ScalarOps);
6565
6566 // Legalize the (integer) scalar constant if necessary.
6567 if (LegalSVT != SVT)
6568 ScalarResult = getNode(ExtendCode, DL, LegalSVT, ScalarResult);
6569
6570 // Scalar folding only succeeded if the result is a constant or UNDEF.
6571 if (!ScalarResult.isUndef() && ScalarResult.getOpcode() != ISD::Constant &&
6572 ScalarResult.getOpcode() != ISD::ConstantFP)
6573 return SDValue();
6574 ScalarResults.push_back(ScalarResult);
6575 }
6576
6577 SDValue V = NumElts.isScalable() ? getSplatVector(VT, DL, ScalarResults[0])
6578 : getBuildVector(VT, DL, ScalarResults);
6579 NewSDValueDbgMsg(V, "New node fold constant vector: ", this);
6580 return V;
6581}
6582
6584 EVT VT, ArrayRef<SDValue> Ops) {
6585 // TODO: Add support for unary/ternary fp opcodes.
6586 if (Ops.size() != 2)
6587 return SDValue();
6588
6589 // TODO: We don't do any constant folding for strict FP opcodes here, but we
6590 // should. That will require dealing with a potentially non-default
6591 // rounding mode, checking the "opStatus" return value from the APFloat
6592 // math calculations, and possibly other variations.
6593 SDValue N1 = Ops[0];
6594 SDValue N2 = Ops[1];
6595 ConstantFPSDNode *N1CFP = isConstOrConstSplatFP(N1, /*AllowUndefs*/ false);
6596 ConstantFPSDNode *N2CFP = isConstOrConstSplatFP(N2, /*AllowUndefs*/ false);
6597 if (N1CFP && N2CFP) {
6598 APFloat C1 = N1CFP->getValueAPF(); // make copy
6599 const APFloat &C2 = N2CFP->getValueAPF();
6600 switch (Opcode) {
6601 case ISD::FADD:
6603 return getConstantFP(C1, DL, VT);
6604 case ISD::FSUB:
6606 return getConstantFP(C1, DL, VT);
6607 case ISD::FMUL:
6609 return getConstantFP(C1, DL, VT);
6610 case ISD::FDIV:
6612 return getConstantFP(C1, DL, VT);
6613 case ISD::FREM:
6614 C1.mod(C2);
6615 return getConstantFP(C1, DL, VT);
6616 case ISD::FCOPYSIGN:
6617 C1.copySign(C2);
6618 return getConstantFP(C1, DL, VT);
6619 case ISD::FMINNUM:
6620 return getConstantFP(minnum(C1, C2), DL, VT);
6621 case ISD::FMAXNUM:
6622 return getConstantFP(maxnum(C1, C2), DL, VT);
6623 case ISD::FMINIMUM:
6624 return getConstantFP(minimum(C1, C2), DL, VT);
6625 case ISD::FMAXIMUM:
6626 return getConstantFP(maximum(C1, C2), DL, VT);
6627 default: break;
6628 }
6629 }
6630 if (N1CFP && Opcode == ISD::FP_ROUND) {
6631 APFloat C1 = N1CFP->getValueAPF(); // make copy
6632 bool Unused;
6633 // This can return overflow, underflow, or inexact; we don't care.
6634 // FIXME need to be more flexible about rounding mode.
6636 &Unused);
6637 return getConstantFP(C1, DL, VT);
6638 }
6639
6640 switch (Opcode) {
6641 case ISD::FSUB:
6642 // -0.0 - undef --> undef (consistent with "fneg undef")
6643 if (ConstantFPSDNode *N1C = isConstOrConstSplatFP(N1, /*AllowUndefs*/ true))
6644 if (N1C && N1C->getValueAPF().isNegZero() && N2.isUndef())
6645 return getUNDEF(VT);
6646 [[fallthrough]];
6647
6648 case ISD::FADD:
6649 case ISD::FMUL:
6650 case ISD::FDIV:
6651 case ISD::FREM:
6652 // If both operands are undef, the result is undef. If 1 operand is undef,
6653 // the result is NaN. This should match the behavior of the IR optimizer.
6654 if (N1.isUndef() && N2.isUndef())
6655 return getUNDEF(VT);
6656 if (N1.isUndef() || N2.isUndef())
6658 }
6659 return SDValue();
6660}
6661
6663 assert(Val.getValueType().isInteger() && "Invalid AssertAlign!");
6664
6665 // There's no need to assert on a byte-aligned pointer. All pointers are at
6666 // least byte aligned.
6667 if (A == Align(1))
6668 return Val;
6669
6670 SDVTList VTs = getVTList(Val.getValueType());
6672 AddNodeIDNode(ID, ISD::AssertAlign, VTs, {Val});
6673 ID.AddInteger(A.value());
6674
6675 void *IP = nullptr;
6676 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
6677 return SDValue(E, 0);
6678
6679 auto *N =
6680 newSDNode<AssertAlignSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, A);
6681 createOperands(N, {Val});
6682
6683 CSEMap.InsertNode(N, IP);
6684 InsertNode(N);
6685
6686 SDValue V(N, 0);
6687 NewSDValueDbgMsg(V, "Creating new node: ", this);
6688 return V;
6689}
6690
6691SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
6692 SDValue N1, SDValue N2) {
6693 SDNodeFlags Flags;
6694 if (Inserter)
6695 Flags = Inserter->getFlags();
6696 return getNode(Opcode, DL, VT, N1, N2, Flags);
6697}
6698
6700 SDValue &N2) const {
6701 if (!TLI->isCommutativeBinOp(Opcode))
6702 return;
6703
6704 // Canonicalize:
6705 // binop(const, nonconst) -> binop(nonconst, const)
6710 if ((N1C && !N2C) || (N1CFP && !N2CFP))
6711 std::swap(N1, N2);
6712
6713 // Canonicalize:
6714 // binop(splat(x), step_vector) -> binop(step_vector, splat(x))
6715 else if (N1.getOpcode() == ISD::SPLAT_VECTOR &&
6717 std::swap(N1, N2);
6718}
6719
6720SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
6721 SDValue N1, SDValue N2, const SDNodeFlags Flags) {
6723 N2.getOpcode() != ISD::DELETED_NODE &&
6724 "Operand is DELETED_NODE!");
6725
6726 canonicalizeCommutativeBinop(Opcode, N1, N2);
6727
6728 auto *N1C = dyn_cast<ConstantSDNode>(N1);
6729 auto *N2C = dyn_cast<ConstantSDNode>(N2);
6730
6731 // Don't allow undefs in vector splats - we might be returning N2 when folding
6732 // to zero etc.
6733 ConstantSDNode *N2CV =
6734 isConstOrConstSplat(N2, /*AllowUndefs*/ false, /*AllowTruncation*/ true);
6735
6736 switch (Opcode) {
6737 default: break;
6738 case ISD::TokenFactor:
6739 assert(VT == MVT::Other && N1.getValueType() == MVT::Other &&
6740 N2.getValueType() == MVT::Other && "Invalid token factor!");
6741 // Fold trivial token factors.
6742 if (N1.getOpcode() == ISD::EntryToken) return N2;
6743 if (N2.getOpcode() == ISD::EntryToken) return N1;
6744 if (N1 == N2) return N1;
6745 break;
6746 case ISD::BUILD_VECTOR: {
6747 // Attempt to simplify BUILD_VECTOR.
6748 SDValue Ops[] = {N1, N2};
6749 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
6750 return V;
6751 break;
6752 }
6753 case ISD::CONCAT_VECTORS: {
6754 SDValue Ops[] = {N1, N2};
6755 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
6756 return V;
6757 break;
6758 }
6759 case ISD::AND:
6760 assert(VT.isInteger() && "This operator does not apply to FP types!");
6761 assert(N1.getValueType() == N2.getValueType() &&
6762 N1.getValueType() == VT && "Binary operator types must match!");
6763 // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's
6764 // worth handling here.
6765 if (N2CV && N2CV->isZero())
6766 return N2;
6767 if (N2CV && N2CV->isAllOnes()) // X & -1 -> X
6768 return N1;
6769 break;
6770 case ISD::OR:
6771 case ISD::XOR:
6772 case ISD::ADD:
6773 case ISD::SUB:
6774 assert(VT.isInteger() && "This operator does not apply to FP types!");
6775 assert(N1.getValueType() == N2.getValueType() &&
6776 N1.getValueType() == VT && "Binary operator types must match!");
6777 // (X ^|+- 0) -> X. This commonly occurs when legalizing i64 values, so
6778 // it's worth handling here.
6779 if (N2CV && N2CV->isZero())
6780 return N1;
6781 if ((Opcode == ISD::ADD || Opcode == ISD::SUB) && VT.isVector() &&
6782 VT.getVectorElementType() == MVT::i1)
6783 return getNode(ISD::XOR, DL, VT, N1, N2);
6784 break;
6785 case ISD::MUL:
6786 assert(VT.isInteger() && "This operator does not apply to FP types!");
6787 assert(N1.getValueType() == N2.getValueType() &&
6788 N1.getValueType() == VT && "Binary operator types must match!");
6789 if (VT.isVector() && VT.getVectorElementType() == MVT::i1)
6790 return getNode(ISD::AND, DL, VT, N1, N2);
6791 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
6792 const APInt &MulImm = N1->getConstantOperandAPInt(0);
6793 const APInt &N2CImm = N2C->getAPIntValue();
6794 return getVScale(DL, VT, MulImm * N2CImm);
6795 }
6796 break;
6797 case ISD::UDIV:
6798 case ISD::UREM:
6799 case ISD::MULHU:
6800 case ISD::MULHS:
6801 case ISD::SDIV:
6802 case ISD::SREM:
6803 case ISD::SADDSAT:
6804 case ISD::SSUBSAT:
6805 case ISD::UADDSAT:
6806 case ISD::USUBSAT:
6807 assert(VT.isInteger() && "This operator does not apply to FP types!");
6808 assert(N1.getValueType() == N2.getValueType() &&
6809 N1.getValueType() == VT && "Binary operator types must match!");
6810 if (VT.isVector() && VT.getVectorElementType() == MVT::i1) {
6811 // fold (add_sat x, y) -> (or x, y) for bool types.
6812 if (Opcode == ISD::SADDSAT || Opcode == ISD::UADDSAT)
6813 return getNode(ISD::OR, DL, VT, N1, N2);
6814 // fold (sub_sat x, y) -> (and x, ~y) for bool types.
6815 if (Opcode == ISD::SSUBSAT || Opcode == ISD::USUBSAT)
6816 return getNode(ISD::AND, DL, VT, N1, getNOT(DL, N2, VT));
6817 }
6818 break;
6819 case ISD::ABDS:
6820 case ISD::ABDU:
6821 assert(VT.isInteger() && "This operator does not apply to FP types!");
6822 assert(N1.getValueType() == N2.getValueType() &&
6823 N1.getValueType() == VT && "Binary operator types must match!");
6824 break;
6825 case ISD::SMIN:
6826 case ISD::UMAX:
6827 assert(VT.isInteger() && "This operator does not apply to FP types!");
6828 assert(N1.getValueType() == N2.getValueType() &&
6829 N1.getValueType() == VT && "Binary operator types must match!");
6830 if (VT.isVector() && VT.getVectorElementType() == MVT::i1)
6831 return getNode(ISD::OR, DL, VT, N1, N2);
6832 break;
6833 case ISD::SMAX:
6834 case ISD::UMIN:
6835 assert(VT.isInteger() && "This operator does not apply to FP types!");
6836 assert(N1.getValueType() == N2.getValueType() &&
6837 N1.getValueType() == VT && "Binary operator types must match!");
6838 if (VT.isVector() && VT.getVectorElementType() == MVT::i1)
6839 return getNode(ISD::AND, DL, VT, N1, N2);
6840 break;
6841 case ISD::FADD:
6842 case ISD::FSUB:
6843 case ISD::FMUL:
6844 case ISD::FDIV:
6845 case ISD::FREM:
6846 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
6847 assert(N1.getValueType() == N2.getValueType() &&
6848 N1.getValueType() == VT && "Binary operator types must match!");
6849 if (SDValue V = simplifyFPBinop(Opcode, N1, N2, Flags))
6850 return V;
6851 break;
6852 case ISD::FCOPYSIGN: // N1 and result must match. N1/N2 need not match.
6853 assert(N1.getValueType() == VT &&
6856 "Invalid FCOPYSIGN!");
6857 break;
6858 case ISD::SHL:
6859 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
6860 const APInt &MulImm = N1->getConstantOperandAPInt(0);
6861 const APInt &ShiftImm = N2C->getAPIntValue();
6862 return getVScale(DL, VT, MulImm << ShiftImm);
6863 }
6864 [[fallthrough]];
6865 case ISD::SRA:
6866 case ISD::SRL:
6867 if (SDValue V = simplifyShift(N1, N2))
6868 return V;
6869 [[fallthrough]];
6870 case ISD::ROTL:
6871 case ISD::ROTR:
6872 assert(VT == N1.getValueType() &&
6873 "Shift operators return type must be the same as their first arg");
6874 assert(VT.isInteger() && N2.getValueType().isInteger() &&
6875 "Shifts only work on integers");
6876 assert((!VT.isVector() || VT == N2.getValueType()) &&
6877 "Vector shift amounts must be in the same as their first arg");
6878 // Verify that the shift amount VT is big enough to hold valid shift
6879 // amounts. This catches things like trying to shift an i1024 value by an
6880 // i8, which is easy to fall into in generic code that uses
6881 // TLI.getShiftAmount().
6884 "Invalid use of small shift amount with oversized value!");
6885
6886 // Always fold shifts of i1 values so the code generator doesn't need to
6887 // handle them. Since we know the size of the shift has to be less than the
6888 // size of the value, the shift/rotate count is guaranteed to be zero.
6889 if (VT == MVT::i1)
6890 return N1;
6891 if (N2CV && N2CV->isZero())
6892 return N1;
6893 break;
6894 case ISD::FP_ROUND:
6895 assert(VT.isFloatingPoint() &&
6897 VT.bitsLE(N1.getValueType()) &&
6898 N2C && (N2C->getZExtValue() == 0 || N2C->getZExtValue() == 1) &&
6899 "Invalid FP_ROUND!");
6900 if (N1.getValueType() == VT) return N1; // noop conversion.
6901 break;
6902 case ISD::AssertSext:
6903 case ISD::AssertZext: {
6904 EVT EVT = cast<VTSDNode>(N2)->getVT();
6905 assert(VT == N1.getValueType() && "Not an inreg extend!");
6906 assert(VT.isInteger() && EVT.isInteger() &&
6907 "Cannot *_EXTEND_INREG FP types");
6908 assert(!EVT.isVector() &&
6909 "AssertSExt/AssertZExt type should be the vector element type "
6910 "rather than the vector type!");
6911 assert(EVT.bitsLE(VT.getScalarType()) && "Not extending!");
6912 if (VT.getScalarType() == EVT) return N1; // noop assertion.
6913 break;
6914 }
6916 EVT EVT = cast<VTSDNode>(N2)->getVT();
6917 assert(VT == N1.getValueType() && "Not an inreg extend!");
6918 assert(VT.isInteger() && EVT.isInteger() &&
6919 "Cannot *_EXTEND_INREG FP types");
6920 assert(EVT.isVector() == VT.isVector() &&
6921 "SIGN_EXTEND_INREG type should be vector iff the operand "
6922 "type is vector!");
6923 assert((!EVT.isVector() ||
6925 "Vector element counts must match in SIGN_EXTEND_INREG");
6926 assert(EVT.bitsLE(VT) && "Not extending!");
6927 if (EVT == VT) return N1; // Not actually extending
6928
6929 auto SignExtendInReg = [&](APInt Val, llvm::EVT ConstantVT) {
6930 unsigned FromBits = EVT.getScalarSizeInBits();
6931 Val <<= Val.getBitWidth() - FromBits;
6932 Val.ashrInPlace(Val.getBitWidth() - FromBits);
6933 return getConstant(Val, DL, ConstantVT);
6934 };
6935
6936 if (N1C) {
6937 const APInt &Val = N1C->getAPIntValue();
6938 return SignExtendInReg(Val, VT);
6939 }
6940
6943 llvm::EVT OpVT = N1.getOperand(0).getValueType();
6944 for (int i = 0, e = VT.getVectorNumElements(); i != e; ++i) {
6945 SDValue Op = N1.getOperand(i);
6946 if (Op.isUndef()) {
6947 Ops.push_back(getUNDEF(OpVT));
6948 continue;
6949 }
6950 ConstantSDNode *C = cast<ConstantSDNode>(Op);
6951 APInt Val = C->getAPIntValue();
6952 Ops.push_back(SignExtendInReg(Val, OpVT));
6953 }
6954 return getBuildVector(VT, DL, Ops);
6955 }
6956
6957 if (N1.getOpcode() == ISD::SPLAT_VECTOR &&
6958 isa<ConstantSDNode>(N1.getOperand(0)))
6959 return getNode(
6960 ISD::SPLAT_VECTOR, DL, VT,
6961 SignExtendInReg(N1.getConstantOperandAPInt(0),
6962 N1.getOperand(0).getValueType()));
6963 break;
6964 }
6966 case ISD::FP_TO_UINT_SAT: {
6967 assert(VT.isInteger() && cast<VTSDNode>(N2)->getVT().isInteger() &&
6968 N1.getValueType().isFloatingPoint() && "Invalid FP_TO_*INT_SAT");
6969 assert(N1.getValueType().isVector() == VT.isVector() &&
6970 "FP_TO_*INT_SAT type should be vector iff the operand type is "
6971 "vector!");
6972 assert((!VT.isVector() || VT.getVectorElementCount() ==
6974 "Vector element counts must match in FP_TO_*INT_SAT");
6975 assert(!cast<VTSDNode>(N2)->getVT().isVector() &&
6976 "Type to saturate to must be a scalar.");
6977 assert(cast<VTSDNode>(N2)->getVT().bitsLE(VT.getScalarType()) &&
6978 "Not extending!");
6979 break;
6980 }
6983 "The result of EXTRACT_VECTOR_ELT must be at least as wide as the \
6984 element type of the vector.");
6985
6986 // Extract from an undefined value or using an undefined index is undefined.
6987 if (N1.isUndef() || N2.isUndef())
6988 return getUNDEF(VT);
6989
6990 // EXTRACT_VECTOR_ELT of out-of-bounds element is an UNDEF for fixed length
6991 // vectors. For scalable vectors we will provide appropriate support for
6992 // dealing with arbitrary indices.
6993 if (N2C && N1.getValueType().isFixedLengthVector() &&
6994 N2C->getAPIntValue().uge(N1.getValueType().getVectorNumElements()))
6995 return getUNDEF(VT);
6996
6997 // EXTRACT_VECTOR_ELT of CONCAT_VECTORS is often formed while lowering is
6998 // expanding copies of large vectors from registers. This only works for
6999 // fixed length vectors, since we need to know the exact number of
7000 // elements.
7001 if (N2C && N1.getOpcode() == ISD::CONCAT_VECTORS &&
7003 unsigned Factor =
7006 N1.getOperand(N2C->getZExtValue() / Factor),
7007 getVectorIdxConstant(N2C->getZExtValue() % Factor, DL));
7008 }
7009
7010 // EXTRACT_VECTOR_ELT of BUILD_VECTOR or SPLAT_VECTOR is often formed while
7011 // lowering is expanding large vector constants.
7012 if (N2C && (N1.getOpcode() == ISD::BUILD_VECTOR ||
7013 N1.getOpcode() == ISD::SPLAT_VECTOR)) {
7016 "BUILD_VECTOR used for scalable vectors");
7017 unsigned Index =
7018 N1.getOpcode() == ISD::BUILD_VECTOR ? N2C->getZExtValue() : 0;
7019 SDValue Elt = N1.getOperand(Index);
7020
7021 if (VT != Elt.getValueType())
7022 // If the vector element type is not legal, the BUILD_VECTOR operands
7023 // are promoted and implicitly truncated, and the result implicitly
7024 // extended. Make that explicit here.
7025 Elt = getAnyExtOrTrunc(Elt, DL, VT);
7026
7027 return Elt;
7028 }
7029
7030 // EXTRACT_VECTOR_ELT of INSERT_VECTOR_ELT is often formed when vector
7031 // operations are lowered to scalars.
7032 if (N1.getOpcode() == ISD::INSERT_VECTOR_ELT) {
7033 // If the indices are the same, return the inserted element else
7034 // if the indices are known different, extract the element from
7035 // the original vector.
7036 SDValue N1Op2 = N1.getOperand(2);
7037 ConstantSDNode *N1Op2C = dyn_cast<ConstantSDNode>(N1Op2);
7038
7039 if (N1Op2C && N2C) {
7040 if (N1Op2C->getZExtValue() == N2C->getZExtValue()) {
7041 if (VT == N1.getOperand(1).getValueType())
7042 return N1.getOperand(1);
7043 if (VT.isFloatingPoint()) {
7045 return getFPExtendOrRound(N1.getOperand(1), DL, VT);
7046 }
7047 return getSExtOrTrunc(N1.getOperand(1), DL, VT);
7048 }
7049 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0), N2);
7050 }
7051 }
7052
7053 // EXTRACT_VECTOR_ELT of v1iX EXTRACT_SUBVECTOR could be formed
7054 // when vector types are scalarized and v1iX is legal.
7055 // vextract (v1iX extract_subvector(vNiX, Idx)) -> vextract(vNiX,Idx).
7056 // Here we are completely ignoring the extract element index (N2),
7057 // which is fine for fixed width vectors, since any index other than 0
7058 // is undefined anyway. However, this cannot be ignored for scalable
7059 // vectors - in theory we could support this, but we don't want to do this
7060 // without a profitability check.
7061 if (N1.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
7063 N1.getValueType().getVectorNumElements() == 1) {
7064 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0),
7065 N1.getOperand(1));
7066 }
7067 break;
7069 assert(N2C && (unsigned)N2C->getZExtValue() < 2 && "Bad EXTRACT_ELEMENT!");
7070 assert(!N1.getValueType().isVector() && !VT.isVector() &&
7071 (N1.getValueType().isInteger() == VT.isInteger()) &&
7072 N1.getValueType() != VT &&
7073 "Wrong types for EXTRACT_ELEMENT!");
7074
7075 // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding
7076 // 64-bit integers into 32-bit parts. Instead of building the extract of
7077 // the BUILD_PAIR, only to have legalize rip it apart, just do it now.
7078 if (N1.getOpcode() == ISD::BUILD_PAIR)
7079 return N1.getOperand(N2C->getZExtValue());
7080
7081 // EXTRACT_ELEMENT of a constant int is also very common.
7082 if (N1C) {
7083 unsigned ElementSize = VT.getSizeInBits();
7084 unsigned Shift = ElementSize * N2C->getZExtValue();
7085 const APInt &Val = N1C->getAPIntValue();
7086 return getConstant(Val.extractBits(ElementSize, Shift), DL, VT);
7087 }
7088 break;
7090 EVT N1VT = N1.getValueType();
7091 assert(VT.isVector() && N1VT.isVector() &&
7092 "Extract subvector VTs must be vectors!");
7094 "Extract subvector VTs must have the same element type!");
7095 assert((VT.isFixedLengthVector() || N1VT.isScalableVector()) &&
7096 "Cannot extract a scalable vector from a fixed length vector!");
7097 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
7099 "Extract subvector must be from larger vector to smaller vector!");
7100 assert(N2C && "Extract subvector index must be a constant");
7101 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
7102 (VT.getVectorMinNumElements() + N2C->getZExtValue()) <=
7103 N1VT.getVectorMinNumElements()) &&
7104 "Extract subvector overflow!");
7105 assert(N2C->getAPIntValue().getBitWidth() ==
7106 TLI->getVectorIdxTy(getDataLayout()).getFixedSizeInBits() &&
7107 "Constant index for EXTRACT_SUBVECTOR has an invalid size");
7108
7109 // Trivial extraction.
7110 if (VT == N1VT)
7111 return N1;
7112
7113 // EXTRACT_SUBVECTOR of an UNDEF is an UNDEF.
7114 if (N1.isUndef())
7115 return getUNDEF(VT);
7116
7117 // EXTRACT_SUBVECTOR of CONCAT_VECTOR can be simplified if the pieces of
7118 // the concat have the same type as the extract.
7119 if (N1.getOpcode() == ISD::CONCAT_VECTORS &&
7120 VT == N1.getOperand(0).getValueType()) {
7121 unsigned Factor = VT.getVectorMinNumElements();
7122 return N1.getOperand(N2C->getZExtValue() / Factor);
7123 }
7124
7125 // EXTRACT_SUBVECTOR of INSERT_SUBVECTOR is often created
7126 // during shuffle legalization.
7127 if (N1.getOpcode() == ISD::INSERT_SUBVECTOR && N2 == N1.getOperand(2) &&
7128 VT == N1.getOperand(1).getValueType())
7129 return N1.getOperand(1);
7130 break;
7131 }
7132 }
7133
7134 // Perform trivial constant folding.
7135 if (SDValue SV = FoldConstantArithmetic(Opcode, DL, VT, {N1, N2}))
7136 return SV;
7137
7138 // Canonicalize an UNDEF to the RHS, even over a constant.
7139 if (N1.isUndef()) {
7140 if (TLI->isCommutativeBinOp(Opcode)) {
7141 std::swap(N1, N2);
7142 } else {
7143 switch (Opcode) {
7144 case ISD::SUB:
7145 return getUNDEF(VT); // fold op(undef, arg2) -> undef
7147 case ISD::UDIV:
7148 case ISD::SDIV:
7149 case ISD::UREM:
7150 case ISD::SREM:
7151 case ISD::SSUBSAT:
7152 case ISD::USUBSAT:
7153 return getConstant(0, DL, VT); // fold op(undef, arg2) -> 0
7154 }
7155 }
7156 }
7157
7158 // Fold a bunch of operators when the RHS is undef.
7159 if (N2.isUndef()) {
7160 switch (Opcode) {
7161 case ISD::XOR:
7162 if (N1.isUndef())
7163 // Handle undef ^ undef -> 0 special case. This is a common
7164 // idiom (misuse).
7165 return getConstant(0, DL, VT);
7166 [[fallthrough]];
7167 case ISD::ADD:
7168 case ISD::SUB:
7169 case ISD::UDIV:
7170 case ISD::SDIV:
7171 case ISD::UREM:
7172 case ISD::SREM:
7173 return getUNDEF(VT); // fold op(arg1, undef) -> undef
7174 case ISD::MUL:
7175 case ISD::AND:
7176 case ISD::SSUBSAT:
7177 case ISD::USUBSAT:
7178 return getConstant(0, DL, VT); // fold op(arg1, undef) -> 0
7179 case ISD::OR:
7180 case ISD::SADDSAT:
7181 case ISD::UADDSAT:
7182 return getAllOnesConstant(DL, VT);
7183 }
7184 }
7185
7186 // Memoize this node if possible.
7187 SDNode *N;
7188 SDVTList VTs = getVTList(VT);
7189 SDValue Ops[] = {N1, N2};
7190 if (VT != MVT::Glue) {
7192 AddNodeIDNode(ID, Opcode, VTs, Ops);
7193 void *IP = nullptr;
7194 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
7195 E->intersectFlagsWith(Flags);
7196 return SDValue(E, 0);
7197 }
7198
7199 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7200 N->setFlags(Flags);
7201 createOperands(N, Ops);
7202 CSEMap.InsertNode(N, IP);
7203 } else {
7204 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7205 createOperands(N, Ops);
7206 }
7207
7208 InsertNode(N);
7209 SDValue V = SDValue(N, 0);
7210 NewSDValueDbgMsg(V, "Creating new node: ", this);
7211 return V;
7212}
7213
7214SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7215 SDValue N1, SDValue N2, SDValue N3) {
7216 SDNodeFlags Flags;
7217 if (Inserter)
7218 Flags = Inserter->getFlags();
7219 return getNode(Opcode, DL, VT, N1, N2, N3, Flags);
7220}
7221
7222SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7223 SDValue N1, SDValue N2, SDValue N3,
7224 const SDNodeFlags Flags) {
7226 N2.getOpcode() != ISD::DELETED_NODE &&
7227 N3.getOpcode() != ISD::DELETED_NODE &&
7228 "Operand is DELETED_NODE!");
7229 // Perform various simplifications.
7230 switch (Opcode) {
7231 case ISD::FMA:
7232 case ISD::FMAD: {
7233 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
7234 assert(N1.getValueType() == VT && N2.getValueType() == VT &&
7235 N3.getValueType() == VT && "FMA types must match!");
7236 ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1);
7237 ConstantFPSDNode *N2CFP = dyn_cast<ConstantFPSDNode>(N2);
7238 ConstantFPSDNode *N3CFP = dyn_cast<ConstantFPSDNode>(N3);
7239 if (N1CFP && N2CFP && N3CFP) {
7240 APFloat V1 = N1CFP->getValueAPF();
7241 const APFloat &V2 = N2CFP->getValueAPF();
7242 const APFloat &V3 = N3CFP->getValueAPF();
7243 if (Opcode == ISD::FMAD) {
7246 } else
7248 return getConstantFP(V1, DL, VT);
7249 }
7250 break;
7251 }
7252 case ISD::BUILD_VECTOR: {
7253 // Attempt to simplify BUILD_VECTOR.
7254 SDValue Ops[] = {N1, N2, N3};
7255 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
7256 return V;
7257 break;
7258 }
7259 case ISD::CONCAT_VECTORS: {
7260 SDValue Ops[] = {N1, N2, N3};
7261 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
7262 return V;
7263 break;
7264 }
7265 case ISD::SETCC: {
7266 assert(VT.isInteger() && "SETCC result type must be an integer!");
7267 assert(N1.getValueType() == N2.getValueType() &&
7268 "SETCC operands must have the same type!");
7269 assert(VT.isVector() == N1.getValueType().isVector() &&
7270 "SETCC type should be vector iff the operand type is vector!");
7271 assert((!VT.isVector() || VT.getVectorElementCount() ==
7273 "SETCC vector element counts must match!");
7274 // Use FoldSetCC to simplify SETCC's.
7275 if (SDValue V = FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get(), DL))
7276 return V;
7277 // Vector constant folding.
7278 SDValue Ops[] = {N1, N2, N3};
7279 if (SDValue V = FoldConstantArithmetic(Opcode, DL, VT, Ops)) {
7280 NewSDValueDbgMsg(V, "New node vector constant folding: ", this);
7281 return V;
7282 }
7283 break;
7284 }
7285 case ISD::SELECT:
7286 case ISD::VSELECT:
7287 if (SDValue V = simplifySelect(N1, N2, N3))
7288 return V;
7289 break;
7291 llvm_unreachable("should use getVectorShuffle constructor!");
7292 case ISD::VECTOR_SPLICE: {
7293 if (cast<ConstantSDNode>(N3)->isZero())
7294 return N1;
7295 break;
7296 }
7298 ConstantSDNode *N3C = dyn_cast<ConstantSDNode>(N3);
7299 // INSERT_VECTOR_ELT into out-of-bounds element is an UNDEF, except
7300 // for scalable vectors where we will generate appropriate code to
7301 // deal with out-of-bounds cases correctly.
7302 if (N3C && N1.getValueType().isFixedLengthVector() &&
7304 return getUNDEF(VT);
7305
7306 // Undefined index can be assumed out-of-bounds, so that's UNDEF too.
7307 if (N3.isUndef())
7308 return getUNDEF(VT);
7309
7310 // If the inserted element is an UNDEF, just use the input vector.
7311 if (N2.isUndef())
7312 return N1;
7313
7314 break;
7315 }
7316 case ISD::INSERT_SUBVECTOR: {
7317 // Inserting undef into undef is still undef.
7318 if (N1.isUndef() && N2.isUndef())
7319 return getUNDEF(VT);
7320
7321 EVT N2VT = N2.getValueType();
7322 assert(VT == N1.getValueType() &&
7323 "Dest and insert subvector source types must match!");
7324 assert(VT.isVector() && N2VT.isVector() &&
7325 "Insert subvector VTs must be vectors!");
7327 "Insert subvector VTs must have the same element type!");
7328 assert((VT.isScalableVector() || N2VT.isFixedLengthVector()) &&
7329 "Cannot insert a scalable vector into a fixed length vector!");
7330 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
7332 "Insert subvector must be from smaller vector to larger vector!");
7333 assert(isa<ConstantSDNode>(N3) &&
7334 "Insert subvector index must be constant");
7335 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
7336 (N2VT.getVectorMinNumElements() + N3->getAsZExtVal()) <=
7338 "Insert subvector overflow!");
7340 TLI->getVectorIdxTy(getDataLayout()).getFixedSizeInBits() &&
7341 "Constant index for INSERT_SUBVECTOR has an invalid size");
7342
7343 // Trivial insertion.
7344 if (VT == N2VT)
7345 return N2;
7346
7347 // If this is an insert of an extracted vector into an undef vector, we
7348 // can just use the input to the extract.
7349 if (N1.isUndef() && N2.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
7350 N2.getOperand(1) == N3 && N2.getOperand(0).getValueType() == VT)
7351 return N2.getOperand(0);
7352 break;
7353 }
7354 case ISD::BITCAST:
7355 // Fold bit_convert nodes from a type to themselves.
7356 if (N1.getValueType() == VT)
7357 return N1;
7358 break;
7359 case ISD::VP_TRUNCATE:
7360 case ISD::VP_SIGN_EXTEND:
7361 case ISD::VP_ZERO_EXTEND:
7362 // Don't create noop casts.
7363 if (N1.getValueType() == VT)
7364 return N1;
7365 break;
7366 }
7367
7368 // Memoize node if it doesn't produce a glue result.
7369 SDNode *N;
7370 SDVTList VTs = getVTList(VT);
7371 SDValue Ops[] = {N1, N2, N3};
7372 if (VT != MVT::Glue) {
7374 AddNodeIDNode(ID, Opcode, VTs, Ops);
7375 void *IP = nullptr;
7376 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
7377 E->intersectFlagsWith(Flags);
7378 return SDValue(E, 0);
7379 }
7380
7381 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7382 N->setFlags(Flags);
7383 createOperands(N, Ops);
7384 CSEMap.InsertNode(N, IP);
7385 } else {
7386 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7387 createOperands(N, Ops);
7388 }
7389
7390 InsertNode(N);
7391 SDValue V = SDValue(N, 0);
7392 NewSDValueDbgMsg(V, "Creating new node: ", this);
7393 return V;
7394}
7395
7396SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7397 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
7398 SDValue Ops[] = { N1, N2, N3, N4 };
7399 return getNode(Opcode, DL, VT, Ops);
7400}
7401
7402SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7403 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
7404 SDValue N5) {
7405 SDValue Ops[] = { N1, N2, N3, N4, N5 };
7406 return getNode(Opcode, DL, VT, Ops);
7407}
7408
7409/// getStackArgumentTokenFactor - Compute a TokenFactor to force all
7410/// the incoming stack arguments to be loaded from the stack.
7412 SmallVector<SDValue, 8> ArgChains;
7413
7414 // Include the original chain at the beginning of the list. When this is
7415 // used by target LowerCall hooks, this helps legalize find the
7416 // CALLSEQ_BEGIN node.
7417 ArgChains.push_back(Chain);
7418
7419 // Add a chain value for each stack argument.
7420 for (SDNode *U : getEntryNode().getNode()->uses())
7421 if (LoadSDNode *L = dyn_cast<LoadSDNode>(U))
7422 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(L->getBasePtr()))
7423 if (FI->getIndex() < 0)
7424 ArgChains.push_back(SDValue(L, 1));
7425
7426 // Build a tokenfactor for all the chains.
7427 return getNode(ISD::TokenFactor, SDLoc(Chain), MVT::Other, ArgChains);
7428}
7429
7430/// getMemsetValue - Vectorized representation of the memset value
7431/// operand.
7433 const SDLoc &dl) {
7434 assert(!Value.isUndef());
7435
7436 unsigned NumBits = VT.getScalarSizeInBits();
7437 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Value)) {
7438 assert(C->getAPIntValue().getBitWidth() == 8);
7439 APInt Val = APInt::getSplat(NumBits, C->getAPIntValue());
7440 if (VT.isInteger()) {
7441 bool IsOpaque = VT.getSizeInBits() > 64 ||
7442 !DAG.getTargetLoweringInfo().isLegalStoreImmediate(C->getSExtValue());
7443 return DAG.getConstant(Val, dl, VT, false, IsOpaque);
7444 }
7445 return DAG.getConstantFP(APFloat(DAG.EVTToAPFloatSemantics(VT), Val), dl,
7446 VT);
7447 }
7448
7449 assert(Value.getValueType() == MVT::i8 && "memset with non-byte fill value?");
7450 EVT IntVT = VT.getScalarType();
7451 if (!IntVT.isInteger())
7452 IntVT = EVT::getIntegerVT(*DAG.getContext(), IntVT.getSizeInBits());
7453
7454 Value = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, Value);
7455 if (NumBits > 8) {
7456 // Use a multiplication with 0x010101... to extend the input to the
7457 // required length.
7458 APInt Magic = APInt::getSplat(NumBits, APInt(8, 0x01));
7459 Value = DAG.getNode(ISD::MUL, dl, IntVT, Value,
7460 DAG.getConstant(Magic, dl, IntVT));
7461 }
7462
7463 if (VT != Value.getValueType() && !VT.isInteger())
7464 Value = DAG.getBitcast(VT.getScalarType(), Value);
7465 if (VT != Value.getValueType())
7466 Value = DAG.getSplatBuildVector(VT, dl, Value);
7467
7468 return Value;
7469}
7470
7471/// getMemsetStringVal - Similar to getMemsetValue. Except this is only
7472/// used when a memcpy is turned into a memset when the source is a constant
7473/// string ptr.
7475 const TargetLowering &TLI,
7476 const ConstantDataArraySlice &Slice) {
7477 // Handle vector with all elements zero.
7478 if (Slice.Array == nullptr) {
7479 if (VT.isInteger())
7480 return DAG.getConstant(0, dl, VT);
7481 if (VT == MVT::f32 || VT == MVT::f64 || VT == MVT::f128)
7482 return DAG.getConstantFP(0.0, dl, VT);
7483 if (VT.isVector()) {
7484 unsigned NumElts = VT.getVectorNumElements();
7485 MVT EltVT = (VT.getVectorElementType() == MVT::f32) ? MVT::i32 : MVT::i64;
7486 return DAG.getNode(ISD::BITCAST, dl, VT,
7487 DAG.getConstant(0, dl,
7489 EltVT, NumElts)));
7490 }
7491 llvm_unreachable("Expected type!");
7492 }
7493
7494 assert(!VT.isVector() && "Can't handle vector type here!");
7495 unsigned NumVTBits = VT.getSizeInBits();
7496 unsigned NumVTBytes = NumVTBits / 8;
7497 unsigned NumBytes = std::min(NumVTBytes, unsigned(Slice.Length));
7498
7499 APInt Val(NumVTBits, 0);
7500 if (DAG.getDataLayout().isLittleEndian()) {
7501 for (unsigned i = 0; i != NumBytes; ++i)
7502 Val |= (uint64_t)(unsigned char)Slice[i] << i*8;
7503 } else {
7504 for (unsigned i = 0; i != NumBytes; ++i)
7505 Val |= (uint64_t)(unsigned char)Slice[i] << (NumVTBytes-i-1)*8;
7506 }
7507
7508 // If the "cost" of materializing the integer immediate is less than the cost
7509 // of a load, then it is cost effective to turn the load into the immediate.
7510 Type *Ty = VT.getTypeForEVT(*DAG.getContext());
7511 if (TLI.shouldConvertConstantLoadToIntImm(Val, Ty))
7512 return DAG.getConstant(Val, dl, VT);
7513 return SDValue();
7514}
7515
7517 const SDLoc &DL,
7518 const SDNodeFlags Flags) {
7519 EVT VT = Base.getValueType();
7520 SDValue Index;
7521
7522 if (Offset.isScalable())
7523 Index = getVScale(DL, Base.getValueType(),
7524 APInt(Base.getValueSizeInBits().getFixedValue(),
7525 Offset.getKnownMinValue()));
7526 else
7527 Index = getConstant(Offset.getFixedValue(), DL, VT);
7528
7529 return getMemBasePlusOffset(Base, Index, DL, Flags);
7530}
7531
7533 const SDLoc &DL,
7534 const SDNodeFlags Flags) {
7535 assert(Offset.getValueType().isInteger());
7536 EVT BasePtrVT = Ptr.getValueType();
7537 return getNode(ISD::ADD, DL, BasePtrVT, Ptr, Offset, Flags);
7538}
7539
7540/// Returns true if memcpy source is constant data.
7542 uint64_t SrcDelta = 0;
7543 GlobalAddressSDNode *G = nullptr;
7544 if (Src.getOpcode() == ISD::GlobalAddress)
7545 G = cast<GlobalAddressSDNode>(Src);
7546 else if (Src.getOpcode() == ISD::ADD &&
7547 Src.getOperand(0).getOpcode() == ISD::GlobalAddress &&
7548 Src.getOperand(1).getOpcode() == ISD::Constant) {
7549 G = cast<GlobalAddressSDNode>(Src.getOperand(0));
7550 SrcDelta = Src.getConstantOperandVal(1);
7551 }
7552 if (!G)
7553 return false;
7554
7555 return getConstantDataArrayInfo(G->getGlobal(), Slice, 8,
7556 SrcDelta + G->getOffset());
7557}
7558
7560 SelectionDAG &DAG) {
7561 // On Darwin, -Os means optimize for size without hurting performance, so
7562 // only really optimize for size when -Oz (MinSize) is used.
7564 return MF.getFunction().hasMinSize();
7565 return DAG.shouldOptForSize();
7566}
7567
7569 SmallVector<SDValue, 32> &OutChains, unsigned From,
7570 unsigned To, SmallVector<SDValue, 16> &OutLoadChains,
7571 SmallVector<SDValue, 16> &OutStoreChains) {
7572 assert(OutLoadChains.size() && "Missing loads in memcpy inlining");
7573 assert(OutStoreChains.size() && "Missing stores in memcpy inlining");
7574 SmallVector<SDValue, 16> GluedLoadChains;
7575 for (unsigned i = From; i < To; ++i) {
7576 OutChains.push_back(OutLoadChains[i]);
7577 GluedLoadChains.push_back(OutLoadChains[i]);
7578 }
7579
7580 // Chain for all loads.
7581 SDValue LoadToken = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
7582 GluedLoadChains);
7583
7584 for (unsigned i = From; i < To; ++i) {
7585 StoreSDNode *ST = dyn_cast<StoreSDNode>(OutStoreChains[i]);
7586 SDValue NewStore = DAG.getTruncStore(LoadToken, dl, ST->getValue(),
7587 ST->getBasePtr(), ST->getMemoryVT(),
7588 ST->getMemOperand());
7589 OutChains.push_back(NewStore);
7590 }
7591}
7592
7594 SDValue Chain, SDValue Dst, SDValue Src,
7595 uint64_t Size, Align Alignment,
7596 bool isVol, bool AlwaysInline,
7597 MachinePointerInfo DstPtrInfo,
7598 MachinePointerInfo SrcPtrInfo,
7599 const AAMDNodes &AAInfo, AAResults *AA) {
7600 // Turn a memcpy of undef to nop.
7601 // FIXME: We need to honor volatile even is Src is undef.
7602 if (Src.isUndef())
7603 return Chain;
7604
7605 // Expand memcpy to a series of load and store ops if the size operand falls
7606 // below a certain threshold.
7607 // TODO: In the AlwaysInline case, if the size is big then generate a loop
7608 // rather than maybe a humongous number of loads and stores.
7609 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
7610 const DataLayout &DL = DAG.getDataLayout();
7611 LLVMContext &C = *DAG.getContext();
7612 std::vector<EVT> MemOps;
7613 bool DstAlignCanChange = false;
7615 MachineFrameInfo &MFI = MF.getFrameInfo();
7616 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
7617 FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Dst);
7618 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
7619 DstAlignCanChange = true;
7620 MaybeAlign SrcAlign = DAG.InferPtrAlign(Src);
7621 if (!SrcAlign || Alignment > *SrcAlign)
7622 SrcAlign = Alignment;
7623 assert(SrcAlign && "SrcAlign must be set");
7625 // If marked as volatile, perform a copy even when marked as constant.
7626 bool CopyFromConstant = !isVol && isMemSrcFromConstant(Src, Slice);
7627 bool isZeroConstant = CopyFromConstant && Slice.Array == nullptr;
7628 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemcpy(OptSize);
7629 const MemOp Op = isZeroConstant
7630 ? MemOp::Set(Size, DstAlignCanChange, Alignment,
7631 /*IsZeroMemset*/ true, isVol)
7632 : MemOp::Copy(Size, DstAlignCanChange, Alignment,
7633 *SrcAlign, isVol, CopyFromConstant);
7634 if (!TLI.findOptimalMemOpLowering(
7635 MemOps, Limit, Op, DstPtrInfo.getAddrSpace(),
7636 SrcPtrInfo.getAddrSpace(), MF.getFunction().getAttributes()))
7637 return SDValue();
7638
7639 if (DstAlignCanChange) {
7640 Type *Ty = MemOps[0].getTypeForEVT(C);
7641 Align NewAlign = DL.getABITypeAlign(Ty);
7642
7643 // Don't promote to an alignment that would require dynamic stack
7644 // realignment which may conflict with optimizations such as tail call
7645 // optimization.
7647 if (!TRI->hasStackRealignment(MF))
7648 while (NewAlign > Alignment && DL.exceedsNaturalStackAlignment(NewAlign))
7649 NewAlign = NewAlign.previous();
7650
7651 if (NewAlign > Alignment) {
7652 // Give the stack frame object a larger alignment if needed.
7653 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
7654 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
7655 Alignment = NewAlign;
7656 }
7657 }
7658
7659 // Prepare AAInfo for loads/stores after lowering this memcpy.
7660 AAMDNodes NewAAInfo = AAInfo;
7661 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
7662
7663 const Value *SrcVal = dyn_cast_if_present<const Value *>(SrcPtrInfo.V);
7664 bool isConstant =
7665 AA && SrcVal &&
7666 AA->pointsToConstantMemory(MemoryLocation(SrcVal, Size, AAInfo));
7667
7668 MachineMemOperand::Flags MMOFlags =
7670 SmallVector<SDValue, 16> OutLoadChains;
7671 SmallVector<SDValue, 16> OutStoreChains;
7672 SmallVector<SDValue, 32> OutChains;
7673 unsigned NumMemOps = MemOps.size();
7674 uint64_t SrcOff = 0, DstOff = 0;
7675 for (unsigned i = 0; i != NumMemOps; ++i) {
7676 EVT VT = MemOps[i];
7677 unsigned VTSize = VT.getSizeInBits() / 8;
7678 SDValue Value, Store;
7679
7680 if (VTSize > Size) {
7681 // Issuing an unaligned load / store pair that overlaps with the previous
7682 // pair. Adjust the offset accordingly.
7683 assert(i == NumMemOps-1 && i != 0);
7684 SrcOff -= VTSize - Size;
7685 DstOff -= VTSize - Size;
7686 }
7687
7688 if (CopyFromConstant &&
7689 (isZeroConstant || (VT.isInteger() && !VT.isVector()))) {
7690 // It's unlikely a store of a vector immediate can be done in a single
7691 // instruction. It would require a load from a constantpool first.
7692 // We only handle zero vectors here.
7693 // FIXME: Handle other cases where store of vector immediate is done in
7694 // a single instruction.
7695 ConstantDataArraySlice SubSlice;
7696 if (SrcOff < Slice.Length) {
7697 SubSlice = Slice;
7698 SubSlice.move(SrcOff);
7699 } else {
7700 // This is an out-of-bounds access and hence UB. Pretend we read zero.
7701 SubSlice.Array = nullptr;
7702 SubSlice.Offset = 0;
7703 SubSlice.Length = VTSize;
7704 }
7705 Value = getMemsetStringVal(VT, dl, DAG, TLI, SubSlice);
7706 if (Value.getNode()) {
7707 Store = DAG.getStore(
7708 Chain, dl, Value,
7709 DAG.getMemBasePlusOffset(Dst, TypeSize::getFixed(DstOff), dl),
7710 DstPtrInfo.getWithOffset(DstOff), Alignment, MMOFlags, NewAAInfo);
7711 OutChains.push_back(Store);
7712 }
7713 }
7714
7715 if (!Store.getNode()) {
7716 // The type might not be legal for the target. This should only happen
7717 // if the type is smaller than a legal type, as on PPC, so the right
7718 // thing to do is generate a LoadExt/StoreTrunc pair. These simplify
7719 // to Load/Store if NVT==VT.
7720 // FIXME does the case above also need this?
7721 EVT NVT = TLI.getTypeToTransformTo(C, VT);
7722 assert(NVT.bitsGE(VT));
7723
7724 bool isDereferenceable =
7725 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
7726 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
7727 if (isDereferenceable)
7729 if (isConstant)
7730 SrcMMOFlags |= MachineMemOperand::MOInvariant;
7731
7732 Value = DAG.getExtLoad(
7733 ISD::EXTLOAD, dl, NVT, Chain,
7734 DAG.getMemBasePlusOffset(Src, TypeSize::getFixed(SrcOff), dl),
7735 SrcPtrInfo.getWithOffset(SrcOff), VT,
7736 commonAlignment(*SrcAlign, SrcOff), SrcMMOFlags, NewAAInfo);
7737 OutLoadChains.push_back(Value.getValue(1));
7738
7739 Store = DAG.getTruncStore(
7740 Chain, dl, Value,
7741 DAG.getMemBasePlusOffset(Dst, TypeSize::getFixed(DstOff), dl),
7742 DstPtrInfo.getWithOffset(DstOff), VT, Alignment, MMOFlags, NewAAInfo);
7743 OutStoreChains.push_back(Store);
7744 }
7745 SrcOff += VTSize;
7746 DstOff += VTSize;
7747 Size -= VTSize;
7748 }
7749
7750 unsigned GluedLdStLimit = MaxLdStGlue == 0 ?
7752 unsigned NumLdStInMemcpy = OutStoreChains.size();
7753
7754 if (NumLdStInMemcpy) {
7755 // It may be that memcpy might be converted to memset if it's memcpy
7756 // of constants. In such a case, we won't have loads and stores, but
7757 // just stores. In the absence of loads, there is nothing to gang up.
7758 if ((GluedLdStLimit <= 1) || !EnableMemCpyDAGOpt) {
7759 // If target does not care, just leave as it.
7760 for (unsigned i = 0; i < NumLdStInMemcpy; ++i) {
7761 OutChains.push_back(OutLoadChains[i]);
7762 OutChains.push_back(OutStoreChains[i]);
7763 }
7764 } else {
7765 // Ld/St less than/equal limit set by target.
7766 if (NumLdStInMemcpy <= GluedLdStLimit) {
7767 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, 0,
7768 NumLdStInMemcpy, OutLoadChains,
7769 OutStoreChains);
7770 } else {
7771 unsigned NumberLdChain = NumLdStInMemcpy / GluedLdStLimit;
7772 unsigned RemainingLdStInMemcpy = NumLdStInMemcpy % GluedLdStLimit;
7773 unsigned GlueIter = 0;
7774
7775 for (unsigned cnt = 0; cnt < NumberLdChain; ++cnt) {
7776 unsigned IndexFrom = NumLdStInMemcpy - GlueIter - GluedLdStLimit;
7777 unsigned IndexTo = NumLdStInMemcpy - GlueIter;
7778
7779 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, IndexFrom, IndexTo,
7780 OutLoadChains, OutStoreChains);
7781 GlueIter += GluedLdStLimit;
7782 }
7783
7784 // Residual ld/st.
7785 if (RemainingLdStInMemcpy) {
7786 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, 0,
7787 RemainingLdStInMemcpy, OutLoadChains,
7788 OutStoreChains);
7789 }
7790 }
7791 }
7792 }
7793 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
7794}
7795
7797 SDValue Chain, SDValue Dst, SDValue Src,
7798 uint64_t Size, Align Alignment,
7799 bool isVol, bool AlwaysInline,
7800 MachinePointerInfo DstPtrInfo,
7801 MachinePointerInfo SrcPtrInfo,
7802 const AAMDNodes &AAInfo) {
7803 // Turn a memmove of undef to nop.
7804 // FIXME: We need to honor volatile even is Src is undef.
7805 if (Src.isUndef())
7806 return Chain;
7807
7808 // Expand memmove to a series of load and store ops if the size operand falls
7809 // below a certain threshold.
7810 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
7811 const DataLayout &DL = DAG.getDataLayout();
7812 LLVMContext &C = *DAG.getContext();
7813 std::vector<EVT> MemOps;
7814 bool DstAlignCanChange = false;
7816 MachineFrameInfo &MFI = MF.getFrameInfo();
7817 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
7818 FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Dst);
7819 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
7820 DstAlignCanChange = true;
7821 MaybeAlign SrcAlign = DAG.InferPtrAlign(Src);
7822 if (!SrcAlign || Alignment > *SrcAlign)
7823 SrcAlign = Alignment;
7824 assert(SrcAlign && "SrcAlign must be set");
7825 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemmove(OptSize);
7826 if (!TLI.findOptimalMemOpLowering(
7827 MemOps, Limit,
7828 MemOp::Copy(Size, DstAlignCanChange, Alignment, *SrcAlign,
7829 /*IsVolatile*/ true),
7830 DstPtrInfo.getAddrSpace(), SrcPtrInfo.getAddrSpace(),
7831 MF.getFunction().getAttributes()))
7832 return SDValue();
7833
7834 if (DstAlignCanChange) {
7835 Type *Ty = MemOps[0].getTypeForEVT(C);
7836 Align NewAlign = DL.getABITypeAlign(Ty);
7837
7838 // Don't promote to an alignment that would require dynamic stack
7839 // realignment which may conflict with optimizations such as tail call
7840 // optimization.
7842 if (!TRI->hasStackRealignment(MF))
7843 while (NewAlign > Alignment && DL.exceedsNaturalStackAlignment(NewAlign))
7844 NewAlign = NewAlign.previous();
7845
7846 if (NewAlign > Alignment) {
7847 // Give the stack frame object a larger alignment if needed.
7848 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
7849 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
7850 Alignment = NewAlign;
7851 }
7852 }
7853
7854 // Prepare AAInfo for loads/stores after lowering this memmove.
7855 AAMDNodes NewAAInfo = AAInfo;
7856 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
7857
7858 MachineMemOperand::Flags MMOFlags =
7860 uint64_t SrcOff = 0, DstOff = 0;
7861 SmallVector<SDValue, 8> LoadValues;
7862 SmallVector<SDValue, 8> LoadChains;
7863 SmallVector<SDValue, 8> OutChains;
7864 unsigned NumMemOps = MemOps.size();
7865 for (unsigned i = 0; i < NumMemOps; i++) {
7866 EVT VT = MemOps[i];
7867 unsigned VTSize = VT.getSizeInBits() / 8;
7868 SDValue Value;
7869
7870 bool isDereferenceable =
7871 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
7872 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
7873 if (isDereferenceable)
7875
7876 Value = DAG.getLoad(
7877 VT, dl, Chain,
7878 DAG.getMemBasePlusOffset(Src, TypeSize::getFixed(SrcOff), dl),
7879 SrcPtrInfo.getWithOffset(SrcOff), *SrcAlign, SrcMMOFlags, NewAAInfo);
7880 LoadValues.push_back(Value);
7881 LoadChains.push_back(Value.getValue(1));
7882 SrcOff += VTSize;
7883 }
7884 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, LoadChains);
7885 OutChains.clear();
7886 for (unsigned i = 0; i < NumMemOps; i++) {
7887 EVT VT = MemOps[i];
7888 unsigned VTSize = VT.getSizeInBits() / 8;
7889 SDValue Store;
7890
7891 Store = DAG.getStore(
7892 Chain, dl, LoadValues[i],
7893 DAG.getMemBasePlusOffset(Dst, TypeSize::getFixed(DstOff), dl),
7894 DstPtrInfo.getWithOffset(DstOff), Alignment, MMOFlags, NewAAInfo);
7895 OutChains.push_back(Store);
7896 DstOff += VTSize;
7897 }
7898
7899 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
7900}
7901
7902/// Lower the call to 'memset' intrinsic function into a series of store
7903/// operations.
7904///
7905/// \param DAG Selection DAG where lowered code is placed.
7906/// \param dl Link to corresponding IR location.
7907/// \param Chain Control flow dependency.
7908/// \param Dst Pointer to destination memory location.
7909/// \param Src Value of byte to write into the memory.
7910/// \param Size Number of bytes to write.
7911/// \param Alignment Alignment of the destination in bytes.
7912/// \param isVol True if destination is volatile.
7913/// \param AlwaysInline Makes sure no function call is generated.
7914/// \param DstPtrInfo IR information on the memory pointer.
7915/// \returns New head in the control flow, if lowering was successful, empty
7916/// SDValue otherwise.
7917///
7918/// The function tries to replace 'llvm.memset' intrinsic with several store
7919/// operations and value calculation code. This is usually profitable for small
7920/// memory size or when the semantic requires inlining.
7922 SDValue Chain, SDValue Dst, SDValue Src,
7923 uint64_t Size, Align Alignment, bool isVol,
7924 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
7925 const AAMDNodes &AAInfo) {
7926 // Turn a memset of undef to nop.
7927 // FIXME: We need to honor volatile even is Src is undef.
7928 if (Src.isUndef())
7929 return Chain;
7930
7931 // Expand memset to a series of load/store ops if the size operand
7932 // falls below a certain threshold.
7933 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
7934 std::vector<EVT> MemOps;
7935 bool DstAlignCanChange = false;
7937 MachineFrameInfo &MFI = MF.getFrameInfo();
7938 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
7939 FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Dst);
7940 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
7941 DstAlignCanChange = true;
7942 bool IsZeroVal = isNullConstant(Src);
7943 unsigned Limit = AlwaysInline ? ~0 : TLI.getMaxStoresPerMemset(OptSize);
7944
7945 if (!TLI.findOptimalMemOpLowering(
7946 MemOps, Limit,
7947 MemOp::Set(Size, DstAlignCanChange, Alignment, IsZeroVal, isVol),
7948 DstPtrInfo.getAddrSpace(), ~0u, MF.getFunction().getAttributes()))
7949 return SDValue();
7950
7951 if (DstAlignCanChange) {
7952 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext());
7953 const DataLayout &DL = DAG.getDataLayout();
7954 Align NewAlign = DL.getABITypeAlign(Ty);
7955
7956 // Don't promote to an alignment that would require dynamic stack
7957 // realignment which may conflict with optimizations such as tail call
7958 // optimization.
7960 if (!TRI->hasStackRealignment(MF))
7961 while (NewAlign > Alignment && DL.exceedsNaturalStackAlignment(NewAlign))
7962 NewAlign = NewAlign.previous();
7963
7964 if (NewAlign > Alignment) {
7965 // Give the stack frame object a larger alignment if needed.
7966 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
7967 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
7968 Alignment = NewAlign;
7969 }
7970 }
7971
7972 SmallVector<SDValue, 8> OutChains;
7973 uint64_t DstOff = 0;
7974 unsigned NumMemOps = MemOps.size();
7975
7976 // Find the largest store and generate the bit pattern for it.
7977 EVT LargestVT = MemOps[0];
7978 for (unsigned i = 1; i < NumMemOps; i++)
7979 if (MemOps[i].bitsGT(LargestVT))
7980 LargestVT = MemOps[i];
7981 SDValue MemSetValue = getMemsetValue(Src, LargestVT, DAG, dl);
7982
7983 // Prepare AAInfo for loads/stores after lowering this memset.
7984 AAMDNodes NewAAInfo = AAInfo;
7985 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
7986
7987 for (unsigned i = 0; i < NumMemOps; i++) {
7988 EVT VT = MemOps[i];
7989 unsigned VTSize = VT.getSizeInBits() / 8;
7990 if (VTSize > Size) {
7991 // Issuing an unaligned load / store pair that overlaps with the previous
7992 // pair. Adjust the offset accordingly.
7993 assert(i == NumMemOps-1 && i != 0);
7994 DstOff -= VTSize - Size;
7995 }
7996
7997 // If this store is smaller than the largest store see whether we can get
7998 // the smaller value for free with a truncate or extract vector element and
7999 // then store.
8000 SDValue Value = MemSetValue;
8001 if (VT.bitsLT(LargestVT)) {
8002 unsigned Index;
8003 unsigned NElts = LargestVT.getSizeInBits() / VT.getSizeInBits();
8004 EVT SVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(), NElts);
8005 if (!LargestVT.isVector() && !VT.isVector() &&
8006 TLI.isTruncateFree(LargestVT, VT))
8007 Value = DAG.getNode(ISD::TRUNCATE, dl, VT, MemSetValue);
8008 else if (LargestVT.isVector() && !VT.isVector() &&
8010 LargestVT.getTypeForEVT(*DAG.getContext()),
8011 VT.getSizeInBits(), Index) &&
8012 TLI.isTypeLegal(SVT) &&
8013 LargestVT.getSizeInBits() == SVT.getSizeInBits()) {
8014 // Target which can combine store(extractelement VectorTy, Idx) can get
8015 // the smaller value for free.
8016 SDValue TailValue = DAG.getNode(ISD::BITCAST, dl, SVT, MemSetValue);
8017 Value = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, VT, TailValue,
8018 DAG.getVectorIdxConstant(Index, dl));
8019 } else
8020 Value = getMemsetValue(Src, VT, DAG, dl);
8021 }
8022 assert(Value.getValueType() == VT && "Value with wrong type.");
8023 SDValue Store = DAG.getStore(
8024 Chain, dl, Value,
8025 DAG.getMemBasePlusOffset(Dst, TypeSize::getFixed(DstOff), dl),
8026 DstPtrInfo.getWithOffset(DstOff), Alignment,
8028 NewAAInfo);
8029 OutChains.push_back(Store);
8030 DstOff += VT.getSizeInBits() / 8;
8031 Size -= VTSize;
8032 }
8033
8034 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
8035}
8036
8038 unsigned AS) {
8039 // Lowering memcpy / memset / memmove intrinsics to calls is only valid if all
8040 // pointer operands can be losslessly bitcasted to pointers of address space 0
8041 if (AS != 0 && !TLI->getTargetMachine().isNoopAddrSpaceCast(AS, 0)) {
8042 report_fatal_error("cannot lower memory intrinsic in address space " +
8043 Twine(AS));
8044 }
8045}
8046
8048 SDValue Src, SDValue Size, Align Alignment,
8049 bool isVol, bool AlwaysInline, bool isTailCall,
8050 MachinePointerInfo DstPtrInfo,
8051 MachinePointerInfo SrcPtrInfo,
8052 const AAMDNodes &AAInfo, AAResults *AA) {
8053 // Check to see if we should lower the memcpy to loads and stores first.
8054 // For cases within the target-specified limits, this is the best choice.
8055 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
8056 if (ConstantSize) {
8057 // Memcpy with size zero? Just return the original chain.
8058 if (ConstantSize->isZero())
8059 return Chain;
8060
8062 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
8063 isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo, AA);
8064 if (Result.getNode())
8065 return Result;
8066 }
8067
8068 // Then check to see if we should lower the memcpy with target-specific
8069 // code. If the target chooses to do this, this is the next best.
8070 if (TSI) {
8071 SDValue Result = TSI->EmitTargetCodeForMemcpy(
8072 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline,
8073 DstPtrInfo, SrcPtrInfo);
8074 if (Result.getNode())
8075 return Result;
8076 }
8077
8078 // If we really need inline code and the target declined to provide it,
8079 // use a (potentially long) sequence of loads and stores.
8080 if (AlwaysInline) {
8081 assert(ConstantSize && "AlwaysInline requires a constant size!");
8083 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
8084 isVol, true, DstPtrInfo, SrcPtrInfo, AAInfo, AA);
8085 }
8086
8089
8090 // FIXME: If the memcpy is volatile (isVol), lowering it to a plain libc
8091 // memcpy is not guaranteed to be safe. libc memcpys aren't required to
8092 // respect volatile, so they may do things like read or write memory
8093 // beyond the given memory regions. But fixing this isn't easy, and most
8094 // people don't care.
8095
8096 // Emit a library call.
8099 Entry.Ty = PointerType::getUnqual(*getContext());
8100 Entry.Node = Dst; Args.push_back(Entry);
8101 Entry.Node = Src; Args.push_back(Entry);
8102
8103 Entry.Ty = getDataLayout().getIntPtrType(*getContext());
8104 Entry.Node = Size; Args.push_back(Entry);
8105 // FIXME: pass in SDLoc
8107 CLI.setDebugLoc(dl)
8108 .setChain(Chain)
8109 .setLibCallee(TLI->getLibcallCallingConv(RTLIB::MEMCPY),
8110 Dst.getValueType().getTypeForEVT(*getContext()),
8111 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMCPY),
8112 TLI->getPointerTy(getDataLayout())),
8113 std::move(Args))
8115 .setTailCall(isTailCall);
8116
8117 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
8118 return CallResult.second;
8119}
8120
8122 SDValue Dst, SDValue Src, SDValue Size,
8123 Type *SizeTy, unsigned ElemSz,
8124 bool isTailCall,
8125 MachinePointerInfo DstPtrInfo,
8126 MachinePointerInfo SrcPtrInfo) {
8127 // Emit a library call.
8130 Entry.Ty = getDataLayout().getIntPtrType(*getContext());
8131 Entry.Node = Dst;
8132 Args.push_back(Entry);
8133
8134 Entry.Node = Src;
8135 Args.push_back(Entry);
8136
8137 Entry.Ty = SizeTy;
8138 Entry.Node = Size;
8139 Args.push_back(Entry);
8140
8141 RTLIB::Libcall LibraryCall =
8143 if (LibraryCall == RTLIB::UNKNOWN_LIBCALL)
8144 report_fatal_error("Unsupported element size");
8145
8147 CLI.setDebugLoc(dl)
8148 .setChain(Chain)
8149 .setLibCallee(TLI->getLibcallCallingConv(LibraryCall),
8151 getExternalSymbol(TLI->getLibcallName(LibraryCall),
8152 TLI->getPointerTy(getDataLayout())),
8153 std::move(Args))
8155 .setTailCall(isTailCall);
8156
8157 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
8158 return CallResult.second;
8159}
8160
8162 SDValue Src, SDValue Size, Align Alignment,
8163 bool isVol, bool isTailCall,
8164 MachinePointerInfo DstPtrInfo,
8165 MachinePointerInfo SrcPtrInfo,
8166 const AAMDNodes &AAInfo, AAResults *AA) {
8167 // Check to see if we should lower the memmove to loads and stores first.
8168 // For cases within the target-specified limits, this is the best choice.
8169 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
8170 if (ConstantSize) {
8171 // Memmove with size zero? Just return the original chain.
8172 if (ConstantSize->isZero())
8173 return Chain;
8174
8176 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
8177 isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo);
8178 if (Result.getNode())
8179 return Result;
8180 }
8181
8182 // Then check to see if we should lower the memmove with target-specific
8183 // code. If the target chooses to do this, this is the next best.
8184 if (TSI) {
8185 SDValue Result =
8186 TSI->EmitTargetCodeForMemmove(*this, dl, Chain, Dst, Src, Size,
8187 Alignment, isVol, DstPtrInfo, SrcPtrInfo);
8188 if (Result.getNode())
8189 return Result;
8190 }
8191
8194
8195 // FIXME: If the memmove is volatile, lowering it to plain libc memmove may
8196 // not be safe. See memcpy above for more details.
8197
8198 // Emit a library call.
8201 Entry.Ty = PointerType::getUnqual(*getContext());
8202 Entry.Node = Dst; Args.push_back(Entry);
8203 Entry.Node = Src; Args.push_back(Entry);
8204
8205 Entry.Ty = getDataLayout().getIntPtrType(*getContext());
8206 Entry.Node = Size; Args.push_back(Entry);
8207 // FIXME: pass in SDLoc
8209 CLI.setDebugLoc(dl)
8210 .setChain(Chain)
8211 .setLibCallee(TLI->getLibcallCallingConv(RTLIB::MEMMOVE),
8212 Dst.getValueType().getTypeForEVT(*getContext()),
8213 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMMOVE),
8214 TLI->getPointerTy(getDataLayout())),
8215 std::move(Args))
8217 .setTailCall(isTailCall);
8218
8219 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
8220 return CallResult.second;
8221}
8222
8224 SDValue Dst, SDValue Src, SDValue Size,
8225 Type *SizeTy, unsigned ElemSz,
8226 bool isTailCall,
8227 MachinePointerInfo DstPtrInfo,
8228 MachinePointerInfo SrcPtrInfo) {
8229 // Emit a library call.
8232 Entry.Ty = getDataLayout().getIntPtrType(*getContext());
8233 Entry.Node = Dst;
8234 Args.push_back(Entry);
8235
8236 Entry.Node = Src;
8237 Args.push_back(Entry);
8238
8239 Entry.Ty = SizeTy;
8240 Entry.Node = Size;
8241 Args.push_back(Entry);
8242
8243 RTLIB::Libcall LibraryCall =
8245 if (LibraryCall == RTLIB::UNKNOWN_LIBCALL)
8246 report_fatal_error("Unsupported element size");
8247
8249 CLI.setDebugLoc(dl)
8250 .setChain(Chain)
8251 .setLibCallee(TLI->getLibcallCallingConv(LibraryCall),
8253 getExternalSymbol(TLI->getLibcallName(LibraryCall),
8254 TLI->getPointerTy(getDataLayout())),
8255 std::move(Args))
8257 .setTailCall(isTailCall);
8258
8259 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
8260 return CallResult.second;
8261}
8262
8264 SDValue Src, SDValue Size, Align Alignment,
8265 bool isVol, bool AlwaysInline, bool isTailCall,
8266 MachinePointerInfo DstPtrInfo,
8267 const AAMDNodes &AAInfo) {
8268 // Check to see if we should lower the memset to stores first.
8269 // For cases within the target-specified limits, this is the best choice.
8270 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
8271 if (ConstantSize) {
8272 // Memset with size zero? Just return the original chain.
8273 if (ConstantSize->isZero())
8274 return Chain;
8275
8276 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
8277 ConstantSize->getZExtValue(), Alignment,
8278 isVol, false, DstPtrInfo, AAInfo);
8279
8280 if (Result.getNode())
8281 return Result;
8282 }
8283
8284 // Then check to see if we should lower the memset with target-specific
8285 // code. If the target chooses to do this, this is the next best.
8286 if (TSI) {
8287 SDValue Result = TSI->EmitTargetCodeForMemset(
8288 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline, DstPtrInfo);
8289 if (Result.getNode())
8290 return Result;
8291 }
8292
8293 // If we really need inline code and the target declined to provide it,
8294 // use a (potentially long) sequence of loads and stores.
8295 if (AlwaysInline) {
8296 assert(ConstantSize && "AlwaysInline requires a constant size!");
8297 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
8298 ConstantSize->getZExtValue(), Alignment,
8299 isVol, true, DstPtrInfo, AAInfo);
8300 assert(Result &&
8301 "getMemsetStores must return a valid sequence when AlwaysInline");
8302 return Result;
8303 }
8304
8306
8307 // Emit a library call.
8308 auto &Ctx = *getContext();
8309 const auto& DL = getDataLayout();
8310
8312 // FIXME: pass in SDLoc
8313 CLI.setDebugLoc(dl).setChain(Chain);
8314
8315 const char *BzeroName = getTargetLoweringInfo().getLibcallName(RTLIB::BZERO);
8316
8317 // Helper function to create an Entry from Node and Type.
8318 const auto CreateEntry = [](SDValue Node, Type *Ty) {
8320 Entry.Node = Node;
8321 Entry.Ty = Ty;
8322 return Entry;
8323 };
8324
8325 // If zeroing out and bzero is present, use it.
8326 if (isNullConstant(Src) && BzeroName) {
8328 Args.push_back(CreateEntry(Dst, PointerType::getUnqual(Ctx)));
8329 Args.push_back(CreateEntry(Size, DL.getIntPtrType(Ctx)));
8330 CLI.setLibCallee(
8331 TLI->getLibcallCallingConv(RTLIB::BZERO), Type::getVoidTy(Ctx),
8332 getExternalSymbol(BzeroName, TLI->getPointerTy(DL)), std::move(Args));
8333 } else {
8335 Args.push_back(CreateEntry(Dst, PointerType::getUnqual(Ctx)));
8336 Args.push_back(CreateEntry(Src, Src.getValueType().getTypeForEVT(Ctx)));
8337 Args.push_back(CreateEntry(Size, DL.getIntPtrType(Ctx)));
8338 CLI.setLibCallee(TLI->getLibcallCallingConv(RTLIB::MEMSET),
8339 Dst.getValueType().getTypeForEVT(Ctx),
8340 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMSET),
8341 TLI->getPointerTy(DL)),
8342 std::move(Args));
8343 }
8344
8345 CLI.setDiscardResult().setTailCall(isTailCall);
8346
8347 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
8348 return CallResult.second;
8349}
8350
8353 Type *SizeTy, unsigned ElemSz,
8354 bool isTailCall,
8355 MachinePointerInfo DstPtrInfo) {
8356 // Emit a library call.
8359 Entry.Ty = getDataLayout().getIntPtrType(*getContext());
8360 Entry.Node = Dst;
8361 Args.push_back(Entry);
8362
8363 Entry.Ty = Type::getInt8Ty(*getContext());
8364 Entry.Node = Value;
8365 Args.push_back(Entry);
8366
8367 Entry.Ty = SizeTy;
8368 Entry.Node = Size;
8369 Args.push_back(Entry);
8370
8371 RTLIB::Libcall LibraryCall =
8373 if (LibraryCall == RTLIB::UNKNOWN_LIBCALL)
8374 report_fatal_error("Unsupported element size");
8375
8377 CLI.setDebugLoc(dl)
8378 .setChain(Chain)
8379 .setLibCallee(TLI->getLibcallCallingConv(LibraryCall),
8381 getExternalSymbol(TLI->getLibcallName(LibraryCall),
8382 TLI->getPointerTy(getDataLayout())),
8383 std::move(Args))
8385 .setTailCall(isTailCall);
8386
8387 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
8388 return CallResult.second;
8389}
8390
8391SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
8392 SDVTList VTList, ArrayRef<SDValue> Ops,
8393 MachineMemOperand *MMO) {
8395 ID.AddInteger(MemVT.getRawBits());
8396 AddNodeIDNode(ID, Opcode, VTList, Ops);
8397 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
8398 ID.AddInteger(MMO->getFlags());
8399 void* IP = nullptr;
8400 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
8401 cast<AtomicSDNode>(E)->refineAlignment(MMO);
8402 return SDValue(E, 0);
8403 }
8404
8405 auto *N = newSDNode<AtomicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
8406 VTList, MemVT, MMO);
8407 createOperands(N, Ops);
8408
8409 CSEMap.InsertNode(N, IP);
8410 InsertNode(N);
8411 return SDValue(N, 0);
8412}
8413
8415 EVT MemVT, SDVTList VTs, SDValue Chain,
8416 SDValue Ptr, SDValue Cmp, SDValue Swp,
8417 MachineMemOperand *MMO) {
8418 assert(Opcode == ISD::ATOMIC_CMP_SWAP ||
8420 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types");
8421
8422 SDValue Ops[] = {Chain, Ptr, Cmp, Swp};
8423 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
8424}
8425
8426SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
8427 SDValue Chain, SDValue Ptr, SDValue Val,
8428 MachineMemOperand *MMO) {
8429 assert((Opcode == ISD::ATOMIC_LOAD_ADD ||
8430 Opcode == ISD::ATOMIC_LOAD_SUB ||
8431 Opcode == ISD::ATOMIC_LOAD_AND ||
8432 Opcode == ISD::ATOMIC_LOAD_CLR ||
8433 Opcode == ISD::ATOMIC_LOAD_OR ||
8434 Opcode == ISD::ATOMIC_LOAD_XOR ||
8435 Opcode == ISD::ATOMIC_LOAD_NAND ||
8436 Opcode == ISD::ATOMIC_LOAD_MIN ||
8437 Opcode == ISD::ATOMIC_LOAD_MAX ||
8438 Opcode == ISD::ATOMIC_LOAD_UMIN ||
8439 Opcode == ISD::ATOMIC_LOAD_UMAX ||
8440 Opcode == ISD::ATOMIC_LOAD_FADD ||
8441 Opcode == ISD::ATOMIC_LOAD_FSUB ||
8442 Opcode == ISD::ATOMIC_LOAD_FMAX ||
8443 Opcode == ISD::ATOMIC_LOAD_FMIN ||
8444 Opcode == ISD::ATOMIC_LOAD_UINC_WRAP ||
8445 Opcode == ISD::ATOMIC_LOAD_UDEC_WRAP ||
8446 Opcode == ISD::ATOMIC_SWAP ||
8447 Opcode == ISD::ATOMIC_STORE) &&
8448 "Invalid Atomic Op");
8449
8450 EVT VT = Val.getValueType();
8451
8452 SDVTList VTs = Opcode == ISD::ATOMIC_STORE ? getVTList(MVT::Other) :
8453 getVTList(VT, MVT::Other);
8454 SDValue Ops[] = {Chain, Ptr, Val};
8455 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
8456}
8457
8458SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
8459 EVT VT, SDValue Chain, SDValue Ptr,
8460 MachineMemOperand *MMO) {
8461 assert(Opcode == ISD::ATOMIC_LOAD && "Invalid Atomic Op");
8462
8463 SDVTList VTs = getVTList(VT, MVT::Other);
8464 SDValue Ops[] = {Chain, Ptr};
8465 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
8466}
8467
8468/// getMergeValues - Create a MERGE_VALUES node from the given operands.
8470 if (Ops.size() == 1)
8471 return Ops[0];
8472
8474 VTs.reserve(Ops.size());
8475 for (const SDValue &Op : Ops)
8476 VTs.push_back(Op.getValueType());
8477 return getNode(ISD::MERGE_VALUES, dl, getVTList(VTs), Ops);
8478}
8479
8481 unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef<SDValue> Ops,
8482 EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment,
8484 const AAMDNodes &AAInfo) {
8485 if (Size.hasValue() && !Size.getValue())
8487
8489 MachineMemOperand *MMO =
8490 MF.getMachineMemOperand(PtrInfo, Flags, Size, Alignment, AAInfo);
8491
8492 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, MMO);
8493}
8494
8496 SDVTList VTList,
8497 ArrayRef<SDValue> Ops, EVT MemVT,
8498 MachineMemOperand *MMO) {
8499 assert((Opcode == ISD::INTRINSIC_VOID ||
8500 Opcode == ISD::INTRINSIC_W_CHAIN ||
8501 Opcode == ISD::PREFETCH ||
8502 (Opcode <= (unsigned)std::numeric_limits<int>::max() &&
8503 (int)Opcode >= ISD::FIRST_TARGET_MEMORY_OPCODE)) &&
8504 "Opcode is not a memory-accessing opcode!");
8505
8506 // Memoize the node unless it returns a glue result.
8508 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
8510 AddNodeIDNode(ID, Opcode, VTList, Ops);
8511 ID.AddInteger(getSyntheticNodeSubclassData<MemIntrinsicSDNode>(
8512 Opcode, dl.getIROrder(), VTList, MemVT, MMO));
8513 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
8514 ID.AddInteger(MMO->getFlags());
8515 ID.AddInteger(MemVT.getRawBits());
8516 void *IP = nullptr;
8517 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
8518 cast<MemIntrinsicSDNode>(E)->refineAlignment(MMO);
8519 return SDValue(E, 0);
8520 }
8521
8522 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
8523 VTList, MemVT, MMO);
8524 createOperands(N, Ops);
8525
8526 CSEMap.InsertNode(N, IP);
8527 } else {
8528 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
8529 VTList, MemVT, MMO);
8530 createOperands(N, Ops);
8531 }
8532 InsertNode(N);
8533 SDValue V(N, 0);
8534 NewSDValueDbgMsg(V, "Creating new node: ", this);
8535 return V;
8536}
8537
8539 SDValue Chain, int FrameIndex,
8540 int64_t Size, int64_t Offset) {
8541 const unsigned Opcode = IsStart ? ISD::LIFETIME_START : ISD::LIFETIME_END;
8542 const auto VTs = getVTList(MVT::Other);
8543 SDValue Ops[2] = {
8544 Chain,
8545 getFrameIndex(FrameIndex,
8546 getTargetLoweringInfo().getFrameIndexTy(getDataLayout()),
8547 true)};
8548
8550 AddNodeIDNode(ID, Opcode, VTs, Ops);
8551 ID.AddInteger(FrameIndex);
8552 ID.AddInteger(Size);
8553 ID.AddInteger(Offset);
8554 void *IP = nullptr;
8555 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
8556 return SDValue(E, 0);
8557
8558 LifetimeSDNode *N = newSDNode<LifetimeSDNode>(
8559 Opcode, dl.getIROrder(), dl.getDebugLoc(), VTs, Size, Offset);
8560 createOperands(N, Ops);
8561 CSEMap.InsertNode(N, IP);
8562 InsertNode(N);
8563 SDValue V(N, 0);
8564 NewSDValueDbgMsg(V, "Creating new node: ", this);
8565 return V;
8566}
8567
8569 uint64_t Guid, uint64_t Index,
8570 uint32_t Attr) {
8571 const unsigned Opcode = ISD::PSEUDO_PROBE;
8572 const auto VTs = getVTList(MVT::Other);
8573 SDValue Ops[] = {Chain};
8575 AddNodeIDNode(ID, Opcode, VTs, Ops);
8576 ID.AddInteger(Guid);
8577 ID.AddInteger(Index);
8578 void *IP = nullptr;
8579 if (SDNode *E = FindNodeOrInsertPos(ID, Dl, IP))
8580 return SDValue(E, 0);
8581
8582 auto *N = newSDNode<PseudoProbeSDNode>(
8583 Opcode, Dl.getIROrder(), Dl.getDebugLoc(), VTs, Guid, Index, Attr);
8584 createOperands(N, Ops);
8585 CSEMap.InsertNode(N, IP);
8586 InsertNode(N);
8587 SDValue V(N, 0);
8588 NewSDValueDbgMsg(V, "Creating new node: ", this);
8589 return V;
8590}
8591
8592/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
8593/// MachinePointerInfo record from it. This is particularly useful because the
8594/// code generator has many cases where it doesn't bother passing in a
8595/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
8597 SelectionDAG &DAG, SDValue Ptr,
8598 int64_t Offset = 0) {
8599 // If this is FI+Offset, we can model it.
8600 if (const FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr))
8602 FI->getIndex(), Offset);
8603
8604 // If this is (FI+Offset1)+Offset2, we can model it.
8605 if (Ptr.getOpcode() != ISD::ADD ||
8606 !isa<ConstantSDNode>(Ptr.getOperand(1)) ||
8607 !isa<FrameIndexSDNode>(Ptr.getOperand(0)))
8608 return Info;
8609
8610 int FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
8612 DAG.getMachineFunction(), FI,
8613 Offset + cast<ConstantSDNode>(Ptr.getOperand(1))->getSExtValue());
8614}
8615
8616/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
8617/// MachinePointerInfo record from it. This is particularly useful because the
8618/// code generator has many cases where it doesn't bother passing in a
8619/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
8621 SelectionDAG &DAG, SDValue Ptr,
8622 SDValue OffsetOp) {
8623 // If the 'Offset' value isn't a constant, we can't handle this.
8624 if (ConstantSDNode *OffsetNode = dyn_cast<ConstantSDNode>(OffsetOp))
8625 return InferPointerInfo(Info, DAG, Ptr, OffsetNode->getSExtValue());
8626 if (OffsetOp.isUndef())
8627 return InferPointerInfo(Info, DAG, Ptr);
8628 return Info;
8629}
8630
8632 EVT VT, const SDLoc &dl, SDValue Chain,
8634 MachinePointerInfo PtrInfo, EVT MemVT,
8635 Align Alignment,
8636 MachineMemOperand::Flags MMOFlags,
8637 const AAMDNodes &AAInfo, const MDNode *Ranges) {
8638 assert(Chain.getValueType() == MVT::Other &&
8639 "Invalid chain type");
8640
8641 MMOFlags |= MachineMemOperand::MOLoad;
8642 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
8643 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
8644 // clients.
8645 if (PtrInfo.V.isNull())
8646 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
8647
8650 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
8651 Alignment, AAInfo, Ranges);
8652 return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO);
8653}
8654
8656 EVT VT, const SDLoc &dl, SDValue Chain,
8657 SDValue Ptr, SDValue Offset, EVT MemVT,
8658 MachineMemOperand *MMO) {
8659 if (VT == MemVT) {
8660 ExtType = ISD::NON_EXTLOAD;
8661 } else if (ExtType == ISD::NON_EXTLOAD) {
8662 assert(VT == MemVT && "Non-extending load from different memory type!");
8663 } else {
8664 // Extending load.
8665 assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) &&
8666 "Should only be an extending load, not truncating!");
8667 assert(VT.isInteger() == MemVT.isInteger() &&
8668 "Cannot convert from FP to Int or Int -> FP!");
8669 assert(VT.isVector() == MemVT.isVector() &&
8670 "Cannot use an ext load to convert to or from a vector!");
8671 assert((!VT.isVector() ||
8673 "Cannot use an ext load to change the number of vector elements!");
8674 }
8675
8676 bool Indexed = AM != ISD::UNINDEXED;
8677 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
8678
8679 SDVTList VTs = Indexed ?
8680 getVTList(VT, Ptr.getValueType(), MVT::Other) : getVTList(VT, MVT::Other);
8681 SDValue Ops[] = { Chain, Ptr, Offset };
8683 AddNodeIDNode(ID, ISD::LOAD, VTs, Ops);
8684 ID.AddInteger(MemVT.getRawBits());
8685 ID.AddInteger(getSyntheticNodeSubclassData<LoadSDNode>(
8686 dl.getIROrder(), VTs, AM, ExtType, MemVT, MMO));
8687 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
8688 ID.AddInteger(MMO->getFlags());
8689 void *IP = nullptr;
8690 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
8691 cast<LoadSDNode>(E)->refineAlignment(MMO);
8692 return SDValue(E, 0);
8693 }
8694 auto *N = newSDNode<LoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
8695 ExtType, MemVT, MMO);
8696 createOperands(N, Ops);
8697
8698 CSEMap.InsertNode(N, IP);
8699 InsertNode(N);
8700 SDValue V(N, 0);
8701 NewSDValueDbgMsg(V, "Creating new node: ", this);
8702 return V;
8703}
8704
8707 MaybeAlign Alignment,
8708 MachineMemOperand::Flags MMOFlags,
8709 const AAMDNodes &AAInfo, const MDNode *Ranges) {
8710 SDValue Undef = getUNDEF(Ptr.getValueType());
8711 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
8712 PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges);
8713}
8714
8717 SDValue Undef = getUNDEF(Ptr.getValueType());
8718 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
8719 VT, MMO);
8720}
8721
8723 EVT VT, SDValue Chain, SDValue Ptr,
8724 MachinePointerInfo PtrInfo, EVT MemVT,
8725 MaybeAlign Alignment,
8726 MachineMemOperand::Flags MMOFlags,
8727 const AAMDNodes &AAInfo) {
8728 SDValue Undef = getUNDEF(Ptr.getValueType());
8729 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, PtrInfo,
8730 MemVT, Alignment, MMOFlags, AAInfo);
8731}
8732
8734 EVT VT, SDValue Chain, SDValue Ptr, EVT MemVT,
8735 MachineMemOperand *MMO) {
8736 SDValue Undef = getUNDEF(Ptr.getValueType());
8737 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef,
8738 MemVT, MMO);
8739}
8740
8744 LoadSDNode *LD = cast<LoadSDNode>(OrigLoad);
8745 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
8746 // Don't propagate the invariant or dereferenceable flags.
8747 auto MMOFlags =
8748 LD->getMemOperand()->getFlags() &
8750 return getLoad(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
8751 LD->getChain(), Base, Offset, LD->getPointerInfo(),
8752 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo());
8753}
8754
8757 Align Alignment,
8758 MachineMemOperand::Flags MMOFlags,
8759 const AAMDNodes &AAInfo) {
8760 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
8761
8762 MMOFlags |= MachineMemOperand::MOStore;
8763 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
8764
8765 if (PtrInfo.V.isNull())
8766 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
8767
8770 MachineMemOperand *MMO =
8771 MF.getMachineMemOperand(PtrInfo, MMOFlags, Size, Alignment, AAInfo);
8772 return getStore(Chain, dl, Val, Ptr, MMO);
8773}
8774
8777 assert(Chain.getValueType() == MVT::Other &&
8778 "Invalid chain type");
8779 EVT VT = Val.getValueType();
8780 SDVTList VTs = getVTList(MVT::Other);
8781 SDValue Undef = getUNDEF(Ptr.getValueType());
8782 SDValue Ops[] = { Chain, Val, Ptr, Undef };
8784 AddNodeIDNode(ID, ISD::STORE, VTs, Ops);
8785 ID.AddInteger(VT.getRawBits());
8786 ID.AddInteger(getSyntheticNodeSubclassData<StoreSDNode>(
8787 dl.getIROrder(), VTs, ISD::UNINDEXED, false, VT, MMO));
8788 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
8789 ID.AddInteger(MMO->getFlags());
8790 void *IP = nullptr;
8791 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
8792 cast<StoreSDNode>(E)->refineAlignment(MMO);
8793 return SDValue(E, 0);
8794 }
8795 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
8796 ISD::UNINDEXED, false, VT, MMO);
8797 createOperands(N, Ops);
8798
8799 CSEMap.InsertNode(N, IP);
8800 InsertNode(N);
8801 SDValue V(N, 0);
8802 NewSDValueDbgMsg(V, "Creating new node: ", this);
8803 return V;
8804}
8805
8808 EVT SVT, Align Alignment,
8809 MachineMemOperand::Flags MMOFlags,
8810 const AAMDNodes &AAInfo) {
8811 assert(Chain.getValueType() == MVT::Other &&
8812 "Invalid chain type");
8813
8814 MMOFlags |= MachineMemOperand::MOStore;
8815 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
8816
8817 if (PtrInfo.V.isNull())
8818 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
8819
8822 PtrInfo, MMOFlags, LocationSize::precise(SVT.getStoreSize()), Alignment,
8823 AAInfo);
8824 return getTruncStore(Chain, dl, Val, Ptr, SVT, MMO);
8825}
8826
8828 SDValue Ptr, EVT SVT,
8829 MachineMemOperand *MMO) {
8830 EVT VT = Val.getValueType();
8831
8832 assert(Chain.getValueType() == MVT::Other &&
8833 "Invalid chain type");
8834 if (VT == SVT)
8835 return getStore(Chain, dl, Val, Ptr, MMO);
8836
8838 "Should only be a truncating store, not extending!");
8839 assert(VT.isInteger() == SVT.isInteger() &&
8840 "Can't do FP-INT conversion!");
8841 assert(VT.isVector() == SVT.isVector() &&
8842 "Cannot use trunc store to convert to or from a vector!");
8843 assert((!VT.isVector() ||
8845 "Cannot use trunc store to change the number of vector elements!");
8846
8847 SDVTList VTs = getVTList(MVT::Other);
8848 SDValue Undef = getUNDEF(Ptr.getValueType());
8849 SDValue Ops[] = { Chain, Val, Ptr, Undef };
8851 AddNodeIDNode(ID, ISD::STORE, VTs, Ops);
8852 ID.AddInteger(SVT.getRawBits());
8853 ID.AddInteger(getSyntheticNodeSubclassData<StoreSDNode>(
8854 dl.getIROrder(), VTs, ISD::UNINDEXED, true, SVT, MMO));
8855 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
8856 ID.AddInteger(MMO->getFlags());
8857 void *IP = nullptr;
8858 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
8859 cast<StoreSDNode>(E)->refineAlignment(MMO);
8860 return SDValue(E, 0);
8861 }
8862 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
8863 ISD::UNINDEXED, true, SVT, MMO);
8864 createOperands(N, Ops);
8865
8866 CSEMap.InsertNode(N, IP);
8867 InsertNode(N);
8868 SDValue V(N, 0);
8869 NewSDValueDbgMsg(V, "Creating new node: ", this);
8870 return V;
8871}
8872
8876 StoreSDNode *ST = cast<StoreSDNode>(OrigStore);
8877 assert(ST->getOffset().isUndef() && "Store is already a indexed store!");
8878 SDVTList VTs = getVTList(Base.getValueType(), MVT::Other);
8879 SDValue Ops[] = { ST->getChain(), ST->getValue(), Base, Offset };
8881 AddNodeIDNode(ID, ISD::STORE, VTs, Ops);
8882 ID.AddInteger(ST->getMemoryVT().getRawBits());
8883 ID.AddInteger(ST->getRawSubclassData());
8884 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
8885 ID.AddInteger(ST->getMemOperand()->getFlags());
8886 void *IP = nullptr;
8887 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
8888 return SDValue(E, 0);
8889
8890 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
8891 ST->isTruncatingStore(), ST->getMemoryVT(),
8892 ST->getMemOperand());
8893 createOperands(N, Ops);
8894
8895 CSEMap.InsertNode(N, IP);
8896 InsertNode(N);
8897 SDValue V(N, 0);
8898 NewSDValueDbgMsg(V, "Creating new node: ", this);
8899 return V;
8900}
8901
8903 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl,
8904 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL,
8905 MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment,
8906 MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo,
8907 const MDNode *Ranges, bool IsExpanding) {
8908 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
8909
8910 MMOFlags |= MachineMemOperand::MOLoad;
8911 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
8912 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
8913 // clients.
8914 if (PtrInfo.V.isNull())
8915 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
8916
8919 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
8920 Alignment, AAInfo, Ranges);
8921 return getLoadVP(AM, ExtType, VT, dl, Chain, Ptr, Offset, Mask, EVL, MemVT,
8922 MMO, IsExpanding);
8923}
8924
8926 ISD::LoadExtType ExtType, EVT VT,
8927 const SDLoc &dl, SDValue Chain, SDValue Ptr,
8928 SDValue Offset, SDValue Mask, SDValue EVL,
8929 EVT MemVT, MachineMemOperand *MMO,
8930 bool IsExpanding) {
8931 bool Indexed = AM != ISD::UNINDEXED;
8932 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
8933
8934 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
8935 : getVTList(VT, MVT::Other);
8936 SDValue Ops[] = {Chain, Ptr, Offset, Mask, EVL};
8938 AddNodeIDNode(ID, ISD::VP_LOAD, VTs, Ops);
8939 ID.AddInteger(MemVT.getRawBits());
8940 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadSDNode>(
8941 dl.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
8942 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
8943 ID.AddInteger(MMO->getFlags());
8944 void *IP = nullptr;
8945 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
8946 cast<VPLoadSDNode>(E)->refineAlignment(MMO);
8947 return SDValue(E, 0);
8948 }
8949 auto *N = newSDNode<VPLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
8950 ExtType, IsExpanding, MemVT, MMO);
8951 createOperands(N, Ops);
8952
8953 CSEMap.InsertNode(N, IP);
8954 InsertNode(N);
8955 SDValue V(N, 0);
8956 NewSDValueDbgMsg(V, "Creating new node: ", this);
8957 return V;
8958}
8959
8961 SDValue Ptr, SDValue Mask, SDValue EVL,
8962 MachinePointerInfo PtrInfo,
8963 MaybeAlign Alignment,
8964 MachineMemOperand::Flags MMOFlags,
8965 const AAMDNodes &AAInfo, const MDNode *Ranges,
8966 bool IsExpanding) {
8967 SDValue Undef = getUNDEF(Ptr.getValueType());
8968 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
8969 Mask, EVL, PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges,
8970 IsExpanding);
8971}
8972
8974 SDValue Ptr, SDValue Mask, SDValue EVL,
8975 MachineMemOperand *MMO, bool IsExpanding) {
8976 SDValue Undef = getUNDEF(Ptr.getValueType());
8977 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
8978 Mask, EVL, VT, MMO, IsExpanding);
8979}
8980
8982 EVT VT, SDValue Chain, SDValue Ptr,
8983 SDValue Mask, SDValue EVL,
8984 MachinePointerInfo PtrInfo, EVT MemVT,
8985 MaybeAlign Alignment,
8986 MachineMemOperand::Flags MMOFlags,
8987 const AAMDNodes &AAInfo, bool IsExpanding) {
8988 SDValue Undef = getUNDEF(Ptr.getValueType());
8989 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
8990 EVL, PtrInfo, MemVT, Alignment, MMOFlags, AAInfo, nullptr,
8991 IsExpanding);
8992}
8993
8995 EVT VT, SDValue Chain, SDValue Ptr,
8996 SDValue Mask, SDValue EVL, EVT MemVT,
8997 MachineMemOperand *MMO, bool IsExpanding) {
8998 SDValue Undef = getUNDEF(Ptr.getValueType());
8999 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
9000 EVL, MemVT, MMO, IsExpanding);
9001}
9002
9006 auto *LD = cast<VPLoadSDNode>(OrigLoad);
9007 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
9008 // Don't propagate the invariant or dereferenceable flags.
9009 auto MMOFlags =
9010 LD->getMemOperand()->getFlags() &
9012 return getLoadVP(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
9013 LD->getChain(), Base, Offset, LD->getMask(),
9014 LD->getVectorLength(), LD->getPointerInfo(),
9015 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo(),
9016 nullptr, LD->isExpandingLoad());
9017}
9018
9021 SDValue EVL, EVT MemVT, MachineMemOperand *MMO,
9022 ISD::MemIndexedMode AM, bool IsTruncating,
9023 bool IsCompressing) {
9024 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9025 bool Indexed = AM != ISD::UNINDEXED;
9026 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
9027 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
9028 : getVTList(MVT::Other);
9029 SDValue Ops[] = {Chain, Val, Ptr, Offset, Mask, EVL};
9031 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
9032 ID.AddInteger(MemVT.getRawBits());
9033 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
9034 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
9035 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9036 ID.AddInteger(MMO->getFlags());
9037 void *IP = nullptr;
9038 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9039 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
9040 return SDValue(E, 0);
9041 }
9042 auto *N = newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
9043 IsTruncating, IsCompressing, MemVT, MMO);
9044 createOperands(N, Ops);
9045
9046 CSEMap.InsertNode(N, IP);
9047 InsertNode(N);
9048 SDValue V(N, 0);
9049 NewSDValueDbgMsg(V, "Creating new node: ", this);
9050 return V;
9051}
9052
9054 SDValue Val, SDValue Ptr, SDValue Mask,
9055 SDValue EVL, MachinePointerInfo PtrInfo,
9056 EVT SVT, Align Alignment,
9057 MachineMemOperand::Flags MMOFlags,
9058 const AAMDNodes &AAInfo,
9059 bool IsCompressing) {
9060 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9061
9062 MMOFlags |= MachineMemOperand::MOStore;
9063 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
9064
9065 if (PtrInfo.V.isNull())
9066 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
9067
9070 PtrInfo, MMOFlags, LocationSize::precise(SVT.getStoreSize()), Alignment,
9071 AAInfo);
9072 return getTruncStoreVP(Chain, dl, Val, Ptr, Mask, EVL, SVT, MMO,
9073 IsCompressing);
9074}
9075
9077 SDValue Val, SDValue Ptr, SDValue Mask,
9078 SDValue EVL, EVT SVT,
9079 MachineMemOperand *MMO,
9080 bool IsCompressing) {
9081 EVT VT = Val.getValueType();
9082
9083 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9084 if (VT == SVT)
9085 return getStoreVP(Chain, dl, Val, Ptr, getUNDEF(Ptr.getValueType()), Mask,
9086 EVL, VT, MMO, ISD::UNINDEXED,
9087 /*IsTruncating*/ false, IsCompressing);
9088
9090 "Should only be a truncating store, not extending!");
9091 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
9092 assert(VT.isVector() == SVT.isVector() &&
9093 "Cannot use trunc store to convert to or from a vector!");
9094 assert((!VT.isVector() ||
9096 "Cannot use trunc store to change the number of vector elements!");
9097
9098 SDVTList VTs = getVTList(MVT::Other);
9099 SDValue Undef = getUNDEF(Ptr.getValueType());
9100 SDValue Ops[] = {Chain, Val, Ptr, Undef, Mask, EVL};
9102 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
9103 ID.AddInteger(SVT.getRawBits());
9104 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
9105 dl.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
9106 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9107 ID.AddInteger(MMO->getFlags());
9108 void *IP = nullptr;
9109 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9110 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
9111 return SDValue(E, 0);
9112 }
9113 auto *N =
9114 newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
9115 ISD::UNINDEXED, true, IsCompressing, SVT, MMO);
9116 createOperands(N, Ops);
9117
9118 CSEMap.InsertNode(N, IP);
9119 InsertNode(N);
9120 SDValue V(N, 0);
9121 NewSDValueDbgMsg(V, "Creating new node: ", this);
9122 return V;
9123}
9124
9128 auto *ST = cast<VPStoreSDNode>(OrigStore);
9129 assert(ST->getOffset().isUndef() && "Store is already an indexed store!");
9130 SDVTList VTs = getVTList(Base.getValueType(), MVT::Other);
9131 SDValue Ops[] = {ST->getChain(), ST->getValue(), Base,
9132 Offset, ST->getMask(), ST->getVectorLength()};
9134 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
9135 ID.AddInteger(ST->getMemoryVT().getRawBits());
9136 ID.AddInteger(ST->getRawSubclassData());
9137 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
9138 ID.AddInteger(ST->getMemOperand()->getFlags());
9139 void *IP = nullptr;
9140 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
9141 return SDValue(E, 0);
9142
9143 auto *N = newSDNode<VPStoreSDNode>(
9144 dl.getIROrder(), dl.getDebugLoc(), VTs, AM, ST->isTruncatingStore(),
9145 ST->isCompressingStore(), ST->getMemoryVT(), ST->getMemOperand());
9146 createOperands(N, Ops);
9147
9148 CSEMap.InsertNode(N, IP);
9149 InsertNode(N);
9150 SDValue V(N, 0);
9151 NewSDValueDbgMsg(V, "Creating new node: ", this);
9152 return V;
9153}
9154
9156 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL,
9157 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask,
9158 SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding) {
9159 bool Indexed = AM != ISD::UNINDEXED;
9160 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
9161
9162 SDValue Ops[] = {Chain, Ptr, Offset, Stride, Mask, EVL};
9163 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
9164 : getVTList(VT, MVT::Other);
9166 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_LOAD, VTs, Ops);
9167 ID.AddInteger(VT.getRawBits());
9168 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedLoadSDNode>(
9169 DL.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
9170 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9171
9172 void *IP = nullptr;
9173 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
9174 cast<VPStridedLoadSDNode>(E)->refineAlignment(MMO);
9175 return SDValue(E, 0);
9176 }
9177
9178 auto *N =
9179 newSDNode<VPStridedLoadSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, AM,
9180 ExtType, IsExpanding, MemVT, MMO);
9181 createOperands(N, Ops);
9182 CSEMap.InsertNode(N, IP);
9183 InsertNode(N);
9184 SDValue V(N, 0);
9185 NewSDValueDbgMsg(V, "Creating new node: ", this);
9186 return V;
9187}
9188
9190 SDValue Ptr, SDValue Stride,
9191 SDValue Mask, SDValue EVL,
9192 MachineMemOperand *MMO,
9193 bool IsExpanding) {
9194 SDValue Undef = getUNDEF(Ptr.getValueType());
9196 Undef, Stride, Mask, EVL, VT, MMO, IsExpanding);
9197}
9198
9200 ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain,
9201 SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT,
9202 MachineMemOperand *MMO, bool IsExpanding) {
9203 SDValue Undef = getUNDEF(Ptr.getValueType());
9204 return getStridedLoadVP(ISD::UNINDEXED, ExtType, VT, DL, Chain, Ptr, Undef,
9205 Stride, Mask, EVL, MemVT, MMO, IsExpanding);
9206}
9207
9209 SDValue Val, SDValue Ptr,
9210 SDValue Offset, SDValue Stride,
9211 SDValue Mask, SDValue EVL, EVT MemVT,
9212 MachineMemOperand *MMO,
9214 bool IsTruncating, bool IsCompressing) {
9215 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9216 bool Indexed = AM != ISD::UNINDEXED;
9217 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
9218 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
9219 : getVTList(MVT::Other);
9220 SDValue Ops[] = {Chain, Val, Ptr, Offset, Stride, Mask, EVL};
9222 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
9223 ID.AddInteger(MemVT.getRawBits());
9224 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
9225 DL.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
9226 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9227 void *IP = nullptr;
9228 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
9229 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
9230 return SDValue(E, 0);
9231 }
9232 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
9233 VTs, AM, IsTruncating,
9234 IsCompressing, MemVT, MMO);
9235 createOperands(N, Ops);
9236
9237 CSEMap.InsertNode(N, IP);
9238 InsertNode(N);
9239 SDValue V(N, 0);
9240 NewSDValueDbgMsg(V, "Creating new node: ", this);
9241 return V;
9242}
9243
9245 SDValue Val, SDValue Ptr,
9246 SDValue Stride, SDValue Mask,
9247 SDValue EVL, EVT SVT,
9248 MachineMemOperand *MMO,
9249 bool IsCompressing) {
9250 EVT VT = Val.getValueType();
9251
9252 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9253 if (VT == SVT)
9254 return getStridedStoreVP(Chain, DL, Val, Ptr, getUNDEF(Ptr.getValueType()),
9255 Stride, Mask, EVL, VT, MMO, ISD::UNINDEXED,
9256 /*IsTruncating*/ false, IsCompressing);
9257
9259 "Should only be a truncating store, not extending!");
9260 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
9261 assert(VT.isVector() == SVT.isVector() &&
9262 "Cannot use trunc store to convert to or from a vector!");
9263 assert((!VT.isVector() ||
9265 "Cannot use trunc store to change the number of vector elements!");
9266
9267 SDVTList VTs = getVTList(MVT::Other);
9268 SDValue Undef = getUNDEF(Ptr.getValueType());
9269 SDValue Ops[] = {Chain, Val, Ptr, Undef, Stride, Mask, EVL};
9271 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
9272 ID.AddInteger(SVT.getRawBits());
9273 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
9274 DL.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
9275 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9276 void *IP = nullptr;
9277 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
9278 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
9279 return SDValue(E, 0);
9280 }
9281 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
9282 VTs, ISD::UNINDEXED, true,
9283 IsCompressing, SVT, MMO);
9284 createOperands(N, Ops);
9285
9286 CSEMap.InsertNode(N, IP);
9287 InsertNode(N);
9288 SDValue V(N, 0);
9289 NewSDValueDbgMsg(V, "Creating new node: ", this);
9290 return V;
9291}
9292
9295 ISD::MemIndexType IndexType) {
9296 assert(Ops.size() == 6 && "Incompatible number of operands");
9297
9299 AddNodeIDNode(ID, ISD::VP_GATHER, VTs, Ops);
9300 ID.AddInteger(VT.getRawBits());
9301 ID.AddInteger(getSyntheticNodeSubclassData<VPGatherSDNode>(
9302 dl.getIROrder(), VTs, VT, MMO, IndexType));
9303 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9304 ID.AddInteger(MMO->getFlags());
9305 void *IP = nullptr;
9306 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9307 cast<VPGatherSDNode>(E)->refineAlignment(MMO);
9308 return SDValue(E, 0);
9309 }
9310
9311 auto *N = newSDNode<VPGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
9312 VT, MMO, IndexType);
9313 createOperands(N, Ops);
9314
9315 assert(N->getMask().getValueType().getVectorElementCount() ==
9316 N->getValueType(0).getVectorElementCount() &&
9317 "Vector width mismatch between mask and data");
9318 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
9319 N->getValueType(0).getVectorElementCount().isScalable() &&
9320 "Scalable flags of index and data do not match");
9322 N->getIndex().getValueType().getVectorElementCount(),
9323 N->getValueType(0).getVectorElementCount()) &&
9324 "Vector width mismatch between index and data");
9325 assert(isa<ConstantSDNode>(N->getScale()) &&
9326 N->getScale()->getAsAPIntVal().isPowerOf2() &&
9327 "Scale should be a constant power of 2");
9328
9329 CSEMap.InsertNode(N, IP);
9330 InsertNode(N);
9331 SDValue V(N, 0);
9332 NewSDValueDbgMsg(V, "Creating new node: ", this);
9333 return V;
9334}
9335
9338 MachineMemOperand *MMO,
9339 ISD::MemIndexType IndexType) {
9340 assert(Ops.size() == 7 && "Incompatible number of operands");
9341
9343 AddNodeIDNode(ID, ISD::VP_SCATTER, VTs, Ops);
9344 ID.AddInteger(VT.getRawBits());
9345 ID.AddInteger(getSyntheticNodeSubclassData<VPScatterSDNode>(
9346 dl.getIROrder(), VTs, VT, MMO, IndexType));
9347 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9348 ID.AddInteger(MMO->getFlags());
9349 void *IP = nullptr;
9350 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9351 cast<VPScatterSDNode>(E)->refineAlignment(MMO);
9352 return SDValue(E, 0);
9353 }
9354 auto *N = newSDNode<VPScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
9355 VT, MMO, IndexType);
9356 createOperands(N, Ops);
9357
9358 assert(N->getMask().getValueType().getVectorElementCount() ==
9359 N->getValue().getValueType().getVectorElementCount() &&
9360 "Vector width mismatch between mask and data");
9361 assert(
9362 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
9363 N->getValue().getValueType().getVectorElementCount().isScalable() &&
9364 "Scalable flags of index and data do not match");
9366 N->getIndex().getValueType().getVectorElementCount(),
9367 N->getValue().getValueType().getVectorElementCount()) &&
9368 "Vector width mismatch between index and data");
9369 assert(isa<ConstantSDNode>(N->getScale()) &&
9370 N->getScale()->getAsAPIntVal().isPowerOf2() &&
9371 "Scale should be a constant power of 2");
9372
9373 CSEMap.InsertNode(N, IP);
9374 InsertNode(N);
9375 SDValue V(N, 0);
9376 NewSDValueDbgMsg(V, "Creating new node: ", this);
9377 return V;
9378}
9379
9382 SDValue PassThru, EVT MemVT,
9383 MachineMemOperand *MMO,
9385 ISD::LoadExtType ExtTy, bool isExpanding) {
9386 bool Indexed = AM != ISD::UNINDEXED;
9387 assert((Indexed || Offset.isUndef()) &&
9388 "Unindexed masked load with an offset!");
9389 SDVTList VTs = Indexed ? getVTList(VT, Base.getValueType(), MVT::Other)
9390 : getVTList(VT, MVT::Other);
9391 SDValue Ops[] = {Chain, Base, Offset, Mask, PassThru};
9393 AddNodeIDNode(ID, ISD::MLOAD, VTs, Ops);
9394 ID.AddInteger(MemVT.getRawBits());
9395 ID.AddInteger(getSyntheticNodeSubclassData<MaskedLoadSDNode>(
9396 dl.getIROrder(), VTs, AM, ExtTy, isExpanding, MemVT, MMO));
9397 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9398 ID.AddInteger(MMO->getFlags());
9399 void *IP = nullptr;
9400 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9401 cast<MaskedLoadSDNode>(E)->refineAlignment(MMO);
9402 return SDValue(E, 0);
9403 }
9404 auto *N = newSDNode<MaskedLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
9405 AM, ExtTy, isExpanding, MemVT, MMO);
9406 createOperands(N, Ops);
9407
9408 CSEMap.InsertNode(N, IP);
9409 InsertNode(N);
9410 SDValue V(N, 0);
9411 NewSDValueDbgMsg(V, "Creating new node: ", this);
9412 return V;
9413}
9414
9418 MaskedLoadSDNode *LD = cast<MaskedLoadSDNode>(OrigLoad);
9419 assert(LD->getOffset().isUndef() && "Masked load is already a indexed load!");
9420 return getMaskedLoad(OrigLoad.getValueType(), dl, LD->getChain(), Base,
9421 Offset, LD->getMask(), LD->getPassThru(),
9422 LD->getMemoryVT(), LD->getMemOperand(), AM,
9423 LD->getExtensionType(), LD->isExpandingLoad());
9424}
9425
9428 SDValue Mask, EVT MemVT,
9429 MachineMemOperand *MMO,
9430 ISD::MemIndexedMode AM, bool IsTruncating,
9431 bool IsCompressing) {
9432 assert(Chain.getValueType() == MVT::Other &&
9433 "Invalid chain type");
9434 bool Indexed = AM != ISD::UNINDEXED;
9435 assert((Indexed || Offset.isUndef()) &&
9436 "Unindexed masked store with an offset!");
9437 SDVTList VTs = Indexed ? getVTList(Base.getValueType(), MVT::Other)
9438 : getVTList(MVT::Other);
9439 SDValue Ops[] = {Chain, Val, Base, Offset, Mask};
9441 AddNodeIDNode(ID, ISD::MSTORE, VTs, Ops);
9442 ID.AddInteger(MemVT.getRawBits());
9443 ID.AddInteger(getSyntheticNodeSubclassData<MaskedStoreSDNode>(
9444 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
9445 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9446 ID.AddInteger(MMO->getFlags());
9447 void *IP = nullptr;
9448 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9449 cast<MaskedStoreSDNode>(E)->refineAlignment(MMO);
9450 return SDValue(E, 0);
9451 }
9452 auto *N =
9453 newSDNode<MaskedStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
9454 IsTruncating, IsCompressing, MemVT, MMO);
9455 createOperands(N, Ops);
9456
9457 CSEMap.InsertNode(N, IP);
9458 InsertNode(N);
9459 SDValue V(N, 0);
9460 NewSDValueDbgMsg(V, "Creating new node: ", this);
9461 return V;
9462}
9463
9467 MaskedStoreSDNode *ST = cast<MaskedStoreSDNode>(OrigStore);
9468 assert(ST->getOffset().isUndef() &&
9469 "Masked store is already a indexed store!");
9470 return getMaskedStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
9471 ST->getMask(), ST->getMemoryVT(), ST->getMemOperand(),
9472 AM, ST->isTruncatingStore(), ST->isCompressingStore());
9473}
9474
9477 MachineMemOperand *MMO,
9478 ISD::MemIndexType IndexType,
9479 ISD::LoadExtType ExtTy) {
9480 assert(Ops.size() == 6 && "Incompatible number of operands");
9481
9483 AddNodeIDNode(ID, ISD::MGATHER, VTs, Ops);
9484 ID.AddInteger(MemVT.getRawBits());
9485 ID.AddInteger(getSyntheticNodeSubclassData<MaskedGatherSDNode>(
9486 dl.getIROrder(), VTs, MemVT, MMO, IndexType, ExtTy));
9487 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9488 ID.AddInteger(MMO->getFlags());
9489 void *IP = nullptr;
9490 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9491 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
9492 return SDValue(E, 0);
9493 }
9494
9495 auto *N = newSDNode<MaskedGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(),
9496 VTs, MemVT, MMO, IndexType, ExtTy);
9497 createOperands(N, Ops);
9498
9499 assert(N->getPassThru().getValueType() == N->getValueType(0) &&
9500 "Incompatible type of the PassThru value in MaskedGatherSDNode");
9501 assert(N->getMask().getValueType().getVectorElementCount() ==
9502 N->getValueType(0).getVectorElementCount() &&
9503 "Vector width mismatch between mask and data");
9504 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
9505 N->getValueType(0).getVectorElementCount().isScalable() &&
9506 "Scalable flags of index and data do not match");
9508 N->getIndex().getValueType().getVectorElementCount(),
9509 N->getValueType(0).getVectorElementCount()) &&
9510 "Vector width mismatch between index and data");
9511 assert(isa<ConstantSDNode>(N->getScale()) &&
9512 N->getScale()->getAsAPIntVal().isPowerOf2() &&
9513 "Scale should be a constant power of 2");
9514
9515 CSEMap.InsertNode(N, IP);
9516 InsertNode(N);
9517 SDValue V(N, 0);
9518 NewSDValueDbgMsg(V, "Creating new node: ", this);
9519 return V;
9520}
9521
9524 MachineMemOperand *MMO,
9525 ISD::MemIndexType IndexType,
9526 bool IsTrunc) {
9527 assert(Ops.size() == 6 && "Incompatible number of operands");
9528
9530 AddNodeIDNode(ID, ISD::MSCATTER, VTs, Ops);
9531 ID.AddInteger(MemVT.getRawBits());
9532 ID.AddInteger(getSyntheticNodeSubclassData<MaskedScatterSDNode>(
9533 dl.getIROrder(), VTs, MemVT, MMO, IndexType, IsTrunc));
9534 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9535 ID.AddInteger(MMO->getFlags());
9536 void *IP = nullptr;
9537 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9538 cast<MaskedScatterSDNode>(E)->refineAlignment(MMO);
9539 return SDValue(E, 0);
9540 }
9541
9542 auto *N = newSDNode<MaskedScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(),
9543 VTs, MemVT, MMO, IndexType, IsTrunc);
9544 createOperands(N, Ops);
9545
9546 assert(N->getMask().getValueType().getVectorElementCount() ==
9547 N->getValue().getValueType().getVectorElementCount() &&
9548 "Vector width mismatch between mask and data");
9549 assert(
9550 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
9551 N->getValue().getValueType().getVectorElementCount().isScalable() &&
9552 "Scalable flags of index and data do not match");
9554 N->getIndex().getValueType().getVectorElementCount(),
9555 N->getValue().getValueType().getVectorElementCount()) &&
9556 "Vector width mismatch between index and data");
9557 assert(isa<ConstantSDNode>(N->getScale()) &&
9558 N->getScale()->getAsAPIntVal().isPowerOf2() &&
9559 "Scale should be a constant power of 2");
9560
9561 CSEMap.InsertNode(N, IP);
9562 InsertNode(N);
9563 SDValue V(N, 0);
9564 NewSDValueDbgMsg(V, "Creating new node: ", this);
9565 return V;
9566}
9567
9569 EVT MemVT, MachineMemOperand *MMO) {
9570 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9571 SDVTList VTs = getVTList(MVT::Other);
9572 SDValue Ops[] = {Chain, Ptr};
9575 ID.AddInteger(MemVT.getRawBits());
9576 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
9577 ISD::GET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
9578 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9579 ID.AddInteger(MMO->getFlags());
9580 void *IP = nullptr;
9581 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
9582 return SDValue(E, 0);
9583
9584 auto *N = newSDNode<FPStateAccessSDNode>(ISD::GET_FPENV_MEM, dl.getIROrder(),
9585 dl.getDebugLoc(), VTs, MemVT, MMO);
9586 createOperands(N, Ops);
9587
9588 CSEMap.InsertNode(N, IP);
9589 InsertNode(N);
9590 SDValue V(N, 0);
9591 NewSDValueDbgMsg(V, "Creating new node: ", this);
9592 return V;
9593}
9594
9596 EVT MemVT, MachineMemOperand *MMO) {
9597 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
9598 SDVTList VTs = getVTList(MVT::Other);
9599 SDValue Ops[] = {Chain, Ptr};
9602 ID.AddInteger(MemVT.getRawBits());
9603 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
9604 ISD::SET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
9605 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9606 ID.AddInteger(MMO->getFlags());
9607 void *IP = nullptr;
9608 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
9609 return SDValue(E, 0);
9610
9611 auto *N = newSDNode<FPStateAccessSDNode>(ISD::SET_FPENV_MEM, dl.getIROrder(),
9612 dl.getDebugLoc(), VTs, MemVT, MMO);
9613 createOperands(N, Ops);
9614
9615 CSEMap.InsertNode(N, IP);
9616 InsertNode(N);
9617 SDValue V(N, 0);
9618 NewSDValueDbgMsg(V, "Creating new node: ", this);
9619 return V;
9620}
9621
9623 // select undef, T, F --> T (if T is a constant), otherwise F
9624 // select, ?, undef, F --> F
9625 // select, ?, T, undef --> T
9626 if (Cond.isUndef())
9627 return isConstantValueOfAnyType(T) ? T : F;
9628 if (T.isUndef())
9629 return F;
9630 if (F.isUndef())
9631 return T;
9632
9633 // select true, T, F --> T
9634 // select false, T, F --> F
9635 if (auto *CondC = dyn_cast<ConstantSDNode>(Cond))
9636 return CondC->isZero() ? F : T;
9637
9638 // TODO: This should simplify VSELECT with non-zero constant condition using
9639 // something like this (but check boolean contents to be complete?):
9640 if (ConstantSDNode *CondC = isConstOrConstSplat(Cond, /*AllowUndefs*/ false,
9641 /*AllowTruncation*/ true))
9642 if (CondC->isZero())
9643 return F;
9644
9645 // select ?, T, T --> T
9646 if (T == F)
9647 return T;
9648
9649 return SDValue();
9650}
9651
9653 // shift undef, Y --> 0 (can always assume that the undef value is 0)
9654 if (X.isUndef())
9655 return getConstant(0, SDLoc(X.getNode()), X.getValueType());
9656 // shift X, undef --> undef (because it may shift by the bitwidth)
9657 if (Y.isUndef())
9658 return getUNDEF(X.getValueType());
9659
9660 // shift 0, Y --> 0
9661 // shift X, 0 --> X
9663 return X;
9664
9665 // shift X, C >= bitwidth(X) --> undef
9666 // All vector elements must be too big (or undef) to avoid partial undefs.
9667 auto isShiftTooBig = [X](ConstantSDNode *Val) {
9668 return !Val || Val->getAPIntValue().uge(X.getScalarValueSizeInBits());
9669 };
9670 if (ISD::matchUnaryPredicate(Y, isShiftTooBig, true))
9671 return getUNDEF(X.getValueType());
9672
9673 // shift i1/vXi1 X, Y --> X (any non-zero shift amount is undefined).
9674 if (X.getValueType().getScalarType() == MVT::i1)
9675 return X;
9676
9677 return SDValue();
9678}
9679
9681 SDNodeFlags Flags) {
9682 // If this operation has 'nnan' or 'ninf' and at least 1 disallowed operand
9683 // (an undef operand can be chosen to be Nan/Inf), then the result of this
9684 // operation is poison. That result can be relaxed to undef.
9685 ConstantFPSDNode *XC = isConstOrConstSplatFP(X, /* AllowUndefs */ true);
9686 ConstantFPSDNode *YC = isConstOrConstSplatFP(Y, /* AllowUndefs */ true);
9687 bool HasNan = (XC && XC->getValueAPF().isNaN()) ||
9688 (YC && YC->getValueAPF().isNaN());
9689 bool HasInf = (XC && XC->getValueAPF().isInfinity()) ||
9690 (YC && YC->getValueAPF().isInfinity());
9691
9692 if (Flags.hasNoNaNs() && (HasNan || X.isUndef() || Y.isUndef()))
9693 return getUNDEF(X.getValueType());
9694
9695 if (Flags.hasNoInfs() && (HasInf || X.isUndef() || Y.isUndef()))
9696 return getUNDEF(X.getValueType());
9697
9698 if (!YC)
9699 return SDValue();
9700
9701 // X + -0.0 --> X
9702 if (Opcode == ISD::FADD)
9703 if (YC->getValueAPF().isNegZero())
9704 return X;
9705
9706 // X - +0.0 --> X
9707 if (Opcode == ISD::FSUB)
9708 if (YC->getValueAPF().isPosZero())
9709 return X;
9710
9711 // X * 1.0 --> X
9712 // X / 1.0 --> X
9713 if (Opcode == ISD::FMUL || Opcode == ISD::FDIV)
9714 if (YC->getValueAPF().isExactlyValue(1.0))
9715 return X;
9716
9717 // X * 0.0 --> 0.0
9718 if (Opcode == ISD::FMUL && Flags.hasNoNaNs() && Flags.hasNoSignedZeros())
9719 if (YC->getValueAPF().isZero())
9720 return getConstantFP(0.0, SDLoc(Y), Y.getValueType());
9721
9722 return SDValue();
9723}
9724
9726 SDValue Ptr, SDValue SV, unsigned Align) {
9727 SDValue Ops[] = { Chain, Ptr, SV, getTargetConstant(Align, dl, MVT::i32) };
9728 return getNode(ISD::VAARG, dl, getVTList(VT, MVT::Other), Ops);
9729}
9730
9731SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9732 ArrayRef<SDUse> Ops) {
9733 switch (Ops.size()) {
9734 case 0: return getNode(Opcode, DL, VT);
9735 case 1: return getNode(Opcode, DL, VT, static_cast<const SDValue>(Ops[0]));
9736 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]);
9737 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]);
9738 default: break;
9739 }
9740
9741 // Copy from an SDUse array into an SDValue array for use with
9742 // the regular getNode logic.
9743 SmallVector<SDValue, 8> NewOps(Ops.begin(), Ops.end());
9744 return getNode(Opcode, DL, VT, NewOps);
9745}
9746
9747SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9748 ArrayRef<SDValue> Ops) {
9749 SDNodeFlags Flags;
9750 if (Inserter)
9751 Flags = Inserter->getFlags();
9752 return getNode(Opcode, DL, VT, Ops, Flags);
9753}
9754
9755SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9756 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
9757 unsigned NumOps = Ops.size();
9758 switch (NumOps) {
9759 case 0: return getNode(Opcode, DL, VT);
9760 case 1: return getNode(Opcode, DL, VT, Ops[0], Flags);
9761 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Flags);
9762 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2], Flags);
9763 default: break;
9764 }
9765
9766#ifndef NDEBUG
9767 for (const auto &Op : Ops)
9768 assert(Op.getOpcode() != ISD::DELETED_NODE &&
9769 "Operand is DELETED_NODE!");
9770#endif
9771
9772 switch (Opcode) {
9773 default: break;
9774 case ISD::BUILD_VECTOR:
9775 // Attempt to simplify BUILD_VECTOR.
9776 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
9777 return V;
9778 break;
9780 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
9781 return V;
9782 break;
9783 case ISD::SELECT_CC:
9784 assert(NumOps == 5 && "SELECT_CC takes 5 operands!");
9785 assert(Ops[0].getValueType() == Ops[1].getValueType() &&
9786 "LHS and RHS of condition must have same type!");
9787 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
9788 "True and False arms of SelectCC must have same type!");
9789 assert(Ops[2].getValueType() == VT &&
9790 "select_cc node must be of same type as true and false value!");
9791 assert((!Ops[0].getValueType().isVector() ||
9792 Ops[0].getValueType().getVectorElementCount() ==
9793 VT.getVectorElementCount()) &&
9794 "Expected select_cc with vector result to have the same sized "
9795 "comparison type!");
9796 break;
9797 case ISD::BR_CC:
9798 assert(NumOps == 5 && "BR_CC takes 5 operands!");
9799 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
9800 "LHS/RHS of comparison should match types!");
9801 break;
9802 case ISD::VP_ADD:
9803 case ISD::VP_SUB:
9804 // If it is VP_ADD/VP_SUB mask operation then turn it to VP_XOR
9805 if (VT.isVector() && VT.getVectorElementType() == MVT::i1)
9806 Opcode = ISD::VP_XOR;
9807 break;
9808 case ISD::VP_MUL:
9809 // If it is VP_MUL mask operation then turn it to VP_AND
9810 if (VT.isVector() && VT.getVectorElementType() == MVT::i1)
9811 Opcode = ISD::VP_AND;
9812 break;
9813 case ISD::VP_REDUCE_MUL:
9814 // If it is VP_REDUCE_MUL mask operation then turn it to VP_REDUCE_AND
9815 if (VT == MVT::i1)
9816 Opcode = ISD::VP_REDUCE_AND;
9817 break;
9818 case ISD::VP_REDUCE_ADD:
9819 // If it is VP_REDUCE_ADD mask operation then turn it to VP_REDUCE_XOR
9820 if (VT == MVT::i1)
9821 Opcode = ISD::VP_REDUCE_XOR;
9822 break;
9823 case ISD::VP_REDUCE_SMAX:
9824 case ISD::VP_REDUCE_UMIN:
9825 // If it is VP_REDUCE_SMAX/VP_REDUCE_UMIN mask operation then turn it to
9826 // VP_REDUCE_AND.
9827 if (VT == MVT::i1)
9828 Opcode = ISD::VP_REDUCE_AND;
9829 break;
9830 case ISD::VP_REDUCE_SMIN:
9831 case ISD::VP_REDUCE_UMAX:
9832 // If it is VP_REDUCE_SMIN/VP_REDUCE_UMAX mask operation then turn it to
9833 // VP_REDUCE_OR.
9834 if (VT == MVT::i1)
9835 Opcode = ISD::VP_REDUCE_OR;
9836 break;
9837 }
9838
9839 // Memoize nodes.
9840 SDNode *N;
9841 SDVTList VTs = getVTList(VT);
9842
9843 if (VT != MVT::Glue) {
9845 AddNodeIDNode(ID, Opcode, VTs, Ops);
9846 void *IP = nullptr;
9847
9848 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
9849 return SDValue(E, 0);
9850
9851 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9852 createOperands(N, Ops);
9853
9854 CSEMap.InsertNode(N, IP);
9855 } else {
9856 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9857 createOperands(N, Ops);
9858 }
9859
9860 N->setFlags(Flags);
9861 InsertNode(N);
9862 SDValue V(N, 0);
9863 NewSDValueDbgMsg(V, "Creating new node: ", this);
9864 return V;
9865}
9866
9867SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
9868 ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops) {
9869 return getNode(Opcode, DL, getVTList(ResultTys), Ops);
9870}
9871
9872SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
9873 ArrayRef<SDValue> Ops) {
9874 SDNodeFlags Flags;
9875 if (Inserter)
9876 Flags = Inserter->getFlags();
9877 return getNode(Opcode, DL, VTList, Ops, Flags);
9878}
9879
9880SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
9881 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
9882 if (VTList.NumVTs == 1)
9883 return getNode(Opcode, DL, VTList.VTs[0], Ops, Flags);
9884
9885#ifndef NDEBUG
9886 for (const auto &Op : Ops)
9887 assert(Op.getOpcode() != ISD::DELETED_NODE &&
9888 "Operand is DELETED_NODE!");
9889#endif
9890
9891 switch (Opcode) {
9892 case ISD::SADDO:
9893 case ISD::UADDO:
9894 case ISD::SSUBO:
9895 case ISD::USUBO: {
9896 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
9897 "Invalid add/sub overflow op!");
9898 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
9899 Ops[0].getValueType() == Ops[1].getValueType() &&
9900 Ops[0].getValueType() == VTList.VTs[0] &&
9901 "Binary operator types must match!");
9902 SDValue N1 = Ops[0], N2 = Ops[1];
9903 canonicalizeCommutativeBinop(Opcode, N1, N2);
9904
9905 // (X +- 0) -> X with zero-overflow.
9906 ConstantSDNode *N2CV = isConstOrConstSplat(N2, /*AllowUndefs*/ false,
9907 /*AllowTruncation*/ true);
9908 if (N2CV && N2CV->isZero()) {
9909 SDValue ZeroOverFlow = getConstant(0, DL, VTList.VTs[1]);
9910 return getNode(ISD::MERGE_VALUES, DL, VTList, {N1, ZeroOverFlow}, Flags);
9911 }
9912
9913 if (VTList.VTs[0].isVector() &&
9914 VTList.VTs[0].getVectorElementType() == MVT::i1 &&
9915 VTList.VTs[1].getVectorElementType() == MVT::i1) {
9916 SDValue F1 = getFreeze(N1);
9917 SDValue F2 = getFreeze(N2);
9918 // {vXi1,vXi1} (u/s)addo(vXi1 x, vXi1y) -> {xor(x,y),and(x,y)}
9919 if (Opcode == ISD::UADDO || Opcode == ISD::SADDO)
9920 return getNode(ISD::MERGE_VALUES, DL, VTList,
9921 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
9922 getNode(ISD::AND, DL, VTList.VTs[1], F1, F2)},
9923 Flags);
9924 // {vXi1,vXi1} (u/s)subo(vXi1 x, vXi1y) -> {xor(x,y),and(~x,y)}
9925 if (Opcode == ISD::USUBO || Opcode == ISD::SSUBO) {
9926 SDValue NotF1 = getNOT(DL, F1, VTList.VTs[0]);
9927 return getNode(ISD::MERGE_VALUES, DL, VTList,
9928 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
9929 getNode(ISD::AND, DL, VTList.VTs[1], NotF1, F2)},
9930 Flags);
9931 }
9932 }
9933 break;
9934 }
9935 case ISD::SADDO_CARRY:
9936 case ISD::UADDO_CARRY:
9937 case ISD::SSUBO_CARRY:
9938 case ISD::USUBO_CARRY:
9939 assert(VTList.NumVTs == 2 && Ops.size() == 3 &&
9940 "Invalid add/sub overflow op!");
9941 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
9942 Ops[0].getValueType() == Ops[1].getValueType() &&
9943 Ops[0].getValueType() == VTList.VTs[0] &&
9944 Ops[2].getValueType() == VTList.VTs[1] &&
9945 "Binary operator types must match!");
9946 break;
9947 case ISD::SMUL_LOHI:
9948 case ISD::UMUL_LOHI: {
9949 assert(VTList.NumVTs == 2 && Ops.size() == 2 && "Invalid mul lo/hi op!");
9950 assert(VTList.VTs[0].isInteger() && VTList.VTs[0] == VTList.VTs[1] &&
9951 VTList.VTs[0] == Ops[0].getValueType() &&
9952 VTList.VTs[0] == Ops[1].getValueType() &&
9953 "Binary operator types must match!");
9954 // Constant fold.
9955 ConstantSDNode *LHS = dyn_cast<ConstantSDNode>(Ops[0]);
9956 ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(Ops[1]);
9957 if (LHS && RHS) {
9958 unsigned Width = VTList.VTs[0].getScalarSizeInBits();
9959 unsigned OutWidth = Width * 2;
9960 APInt Val = LHS->getAPIntValue();
9961 APInt Mul = RHS->getAPIntValue();
9962 if (Opcode == ISD::SMUL_LOHI) {
9963 Val = Val.sext(OutWidth);
9964 Mul = Mul.sext(OutWidth);
9965 } else {
9966 Val = Val.zext(OutWidth);
9967 Mul = Mul.zext(OutWidth);
9968 }
9969 Val *= Mul;
9970
9971 SDValue Hi =
9972 getConstant(Val.extractBits(Width, Width), DL, VTList.VTs[0]);
9973 SDValue Lo = getConstant(Val.trunc(Width), DL, VTList.VTs[0]);
9974 return getNode(ISD::MERGE_VALUES, DL, VTList, {Lo, Hi}, Flags);
9975 }
9976 break;
9977 }
9978 case ISD::FFREXP: {
9979 assert(VTList.NumVTs == 2 && Ops.size() == 1 && "Invalid ffrexp op!");
9980 assert(VTList.VTs[0].isFloatingPoint() && VTList.VTs[1].isInteger() &&
9981 VTList.VTs[0] == Ops[0].getValueType() && "frexp type mismatch");
9982
9983 if (const ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Ops[0])) {
9984 int FrexpExp;
9985 APFloat FrexpMant =
9986 frexp(C->getValueAPF(), FrexpExp, APFloat::rmNearestTiesToEven);
9987 SDValue Result0 = getConstantFP(FrexpMant, DL, VTList.VTs[0]);
9988 SDValue Result1 =
9989 getConstant(FrexpMant.isFinite() ? FrexpExp : 0, DL, VTList.VTs[1]);
9990 return getNode(ISD::MERGE_VALUES, DL, VTList, {Result0, Result1}, Flags);
9991 }
9992
9993 break;
9994 }
9996 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
9997 "Invalid STRICT_FP_EXTEND!");
9998 assert(VTList.VTs[0].isFloatingPoint() &&
9999 Ops[1].getValueType().isFloatingPoint() && "Invalid FP cast!");
10000 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
10001 "STRICT_FP_EXTEND result type should be vector iff the operand "
10002 "type is vector!");
10003 assert((!VTList.VTs[0].isVector() ||
10004 VTList.VTs[0].getVectorElementCount() ==
10005 Ops[1].getValueType().getVectorElementCount()) &&
10006 "Vector element count mismatch!");
10007 assert(Ops[1].getValueType().bitsLT(VTList.VTs[0]) &&
10008 "Invalid fpext node, dst <= src!");
10009 break;
10011 assert(VTList.NumVTs == 2 && Ops.size() == 3 && "Invalid STRICT_FP_ROUND!");
10012 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
10013 "STRICT_FP_ROUND result type should be vector iff the operand "
10014 "type is vector!");
10015 assert((!VTList.VTs[0].isVector() ||
10016 VTList.VTs[0].getVectorElementCount() ==
10017 Ops[1].getValueType().getVectorElementCount()) &&
10018 "Vector element count mismatch!");
10019 assert(VTList.VTs[0].isFloatingPoint() &&
10020 Ops[1].getValueType().isFloatingPoint() &&
10021 VTList.VTs[0].bitsLT(Ops[1].getValueType()) &&
10022 isa<ConstantSDNode>(Ops[2]) &&
10023 (Ops[2]->getAsZExtVal() == 0 || Ops[2]->getAsZExtVal() == 1) &&
10024 "Invalid STRICT_FP_ROUND!");
10025 break;
10026#if 0
10027 // FIXME: figure out how to safely handle things like
10028 // int foo(int x) { return 1 << (x & 255); }
10029 // int bar() { return foo(256); }
10030 case ISD::SRA_PARTS:
10031 case ISD::SRL_PARTS:
10032 case ISD::SHL_PARTS:
10033 if (N3.getOpcode() == ISD::SIGN_EXTEND_INREG &&
10034 cast<VTSDNode>(N3.getOperand(1))->getVT() != MVT::i1)
10035 return getNode(Opcode, DL, VT, N1, N2, N3.getOperand(0));
10036 else if (N3.getOpcode() == ISD::AND)
10037 if (ConstantSDNode *AndRHS = dyn_cast<ConstantSDNode>(N3.getOperand(1))) {
10038 // If the and is only masking out bits that cannot effect the shift,
10039 // eliminate the and.
10040 unsigned NumBits = VT.getScalarSizeInBits()*2;
10041 if ((AndRHS->getValue() & (NumBits-1)) == NumBits-1)
10042 return getNode(Opcode, DL, VT, N1, N2, N3.getOperand(0));
10043 }
10044 break;
10045#endif
10046 }
10047
10048 // Memoize the node unless it returns a glue result.
10049 SDNode *N;
10050 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
10052 AddNodeIDNode(ID, Opcode, VTList, Ops);
10053 void *IP = nullptr;
10054 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
10055 return SDValue(E, 0);
10056
10057 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
10058 createOperands(N, Ops);
10059 CSEMap.InsertNode(N, IP);
10060 } else {
10061 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
10062 createOperands(N, Ops);
10063 }
10064
10065 N->setFlags(Flags);
10066 InsertNode(N);
10067 SDValue V(N, 0);
10068 NewSDValueDbgMsg(V, "Creating new node: ", this);
10069 return V;
10070}
10071
10072SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
10073 SDVTList VTList) {
10074 return getNode(Opcode, DL, VTList, std::nullopt);
10075}
10076
10077SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
10078 SDValue N1) {
10079 SDValue Ops[] = { N1 };
10080 return getNode(Opcode, DL, VTList, Ops);
10081}
10082
10083SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
10084 SDValue N1, SDValue N2) {
10085 SDValue Ops[] = { N1, N2 };
10086 return getNode(Opcode, DL, VTList, Ops);
10087}
10088
10089SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
10090 SDValue N1, SDValue N2, SDValue N3) {
10091 SDValue Ops[] = { N1, N2, N3 };
10092 return getNode(Opcode, DL, VTList, Ops);
10093}
10094
10095SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
10096 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
10097 SDValue Ops[] = { N1, N2, N3, N4 };
10098 return getNode(Opcode, DL, VTList, Ops);
10099}
10100
10101SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
10102 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
10103 SDValue N5) {
10104 SDValue Ops[] = { N1, N2, N3, N4, N5 };
10105 return getNode(Opcode, DL, VTList, Ops);
10106}
10107
10109 return makeVTList(SDNode::getValueTypeList(VT), 1);
10110}
10111
10114 ID.AddInteger(2U);
10115 ID.AddInteger(VT1.getRawBits());
10116 ID.AddInteger(VT2.getRawBits());
10117
10118 void *IP = nullptr;
10119 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
10120 if (!Result) {
10121 EVT *Array = Allocator.Allocate<EVT>(2);
10122 Array[0] = VT1;
10123 Array[1] = VT2;
10124 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 2);
10125 VTListMap.InsertNode(Result, IP);
10126 }
10127 return Result->getSDVTList();
10128}
10129
10132 ID.AddInteger(3U);
10133 ID.AddInteger(VT1.getRawBits());
10134 ID.AddInteger(VT2.getRawBits());
10135 ID.AddInteger(VT3.getRawBits());
10136
10137 void *IP = nullptr;
10138 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
10139 if (!Result) {
10140 EVT *Array = Allocator.Allocate<EVT>(3);
10141 Array[0] = VT1;
10142 Array[1] = VT2;
10143 Array[2] = VT3;
10144 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 3);
10145 VTListMap.InsertNode(Result, IP);
10146 }
10147 return Result->getSDVTList();
10148}
10149
10152 ID.AddInteger(4U);
10153 ID.AddInteger(VT1.getRawBits());
10154 ID.AddInteger(VT2.getRawBits());
10155 ID.AddInteger(VT3.getRawBits());
10156 ID.AddInteger(VT4.getRawBits());
10157
10158 void *IP = nullptr;
10159 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
10160 if (!Result) {
10161 EVT *Array = Allocator.Allocate<EVT>(4);
10162 Array[0] = VT1;
10163 Array[1] = VT2;
10164 Array[2] = VT3;
10165 Array[3] = VT4;
10166 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 4);
10167 VTListMap.InsertNode(Result, IP);
10168 }
10169 return Result->getSDVTList();
10170}
10171
10173 unsigned NumVTs = VTs.size();
10175 ID.AddInteger(NumVTs);
10176 for (unsigned index = 0; index < NumVTs; index++) {
10177 ID.AddInteger(VTs[index].getRawBits());
10178 }
10179
10180 void *IP = nullptr;
10181 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
10182 if (!Result) {
10183 EVT *Array = Allocator.Allocate<EVT>(NumVTs);
10184 llvm::copy(VTs, Array);
10185 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, NumVTs);
10186 VTListMap.InsertNode(Result, IP);
10187 }
10188 return Result->getSDVTList();
10189}
10190
10191
10192/// UpdateNodeOperands - *Mutate* the specified node in-place to have the
10193/// specified operands. If the resultant node already exists in the DAG,
10194/// this does not modify the specified node, instead it returns the node that
10195/// already exists. If the resultant node does not exist in the DAG, the
10196/// input node is returned. As a degenerate case, if you specify the same
10197/// input operands as the node already has, the input node is returned.
10199 assert(N->getNumOperands() == 1 && "Update with wrong number of operands");
10200
10201 // Check to see if there is no change.
10202 if (Op == N->getOperand(0)) return N;
10203
10204 // See if the modified node already exists.
10205 void *InsertPos = nullptr;
10206 if (SDNode *Existing = FindModifiedNodeSlot(N, Op, InsertPos))
10207 return Existing;
10208
10209 // Nope it doesn't. Remove the node from its current place in the maps.
10210 if (InsertPos)
10211 if (!RemoveNodeFromCSEMaps(N))
10212 InsertPos = nullptr;
10213
10214 // Now we update the operands.
10215 N->OperandList[0].set(Op);
10216
10218 // If this gets put into a CSE map, add it.
10219 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
10220 return N;
10221}
10222
10224 assert(N->getNumOperands() == 2 && "Update with wrong number of operands");
10225
10226 // Check to see if there is no change.
10227 if (Op1 == N->getOperand(0) && Op2 == N->getOperand(1))
10228 return N; // No operands changed, just return the input node.
10229
10230 // See if the modified node already exists.
10231 void *InsertPos = nullptr;
10232 if (SDNode *Existing = FindModifiedNodeSlot(N, Op1, Op2, InsertPos))
10233 return Existing;
10234
10235 // Nope it doesn't. Remove the node from its current place in the maps.
10236 if (InsertPos)
10237 if (!RemoveNodeFromCSEMaps(N))
10238 InsertPos = nullptr;
10239
10240 // Now we update the operands.
10241 if (N->OperandList[0] != Op1)
10242 N->OperandList[0].set(Op1);
10243 if (N->OperandList[1] != Op2)
10244 N->OperandList[1].set(Op2);
10245
10247 // If this gets put into a CSE map, add it.
10248 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
10249 return N;
10250}
10251
10254 SDValue Ops[] = { Op1, Op2, Op3 };
10255 return UpdateNodeOperands(N, Ops);
10256}
10257
10260 SDValue Op3, SDValue Op4) {
10261 SDValue Ops[] = { Op1, Op2, Op3, Op4 };
10262 return UpdateNodeOperands(N, Ops);
10263}
10264
10267 SDValue Op3, SDValue Op4, SDValue Op5) {
10268 SDValue Ops[] = { Op1, Op2, Op3, Op4, Op5 };
10269 return UpdateNodeOperands(N, Ops);
10270}
10271
10274 unsigned NumOps = Ops.size();
10275 assert(N->getNumOperands() == NumOps &&
10276 "Update with wrong number of operands");
10277
10278 // If no operands changed just return the input node.
10279 if (std::equal(Ops.begin(), Ops.end(), N->op_begin()))
10280 return N;
10281
10282 // See if the modified node already exists.
10283 void *InsertPos = nullptr;
10284 if (SDNode *Existing = FindModifiedNodeSlot(N, Ops, InsertPos))
10285 return Existing;
10286
10287 // Nope it doesn't. Remove the node from its current place in the maps.
10288 if (InsertPos)
10289 if (!RemoveNodeFromCSEMaps(N))
10290 InsertPos = nullptr;
10291
10292 // Now we update the operands.
10293 for (unsigned i = 0; i != NumOps; ++i)
10294 if (N->OperandList[i] != Ops[i])
10295 N->OperandList[i].set(Ops[i]);
10296
10298 // If this gets put into a CSE map, add it.
10299 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
10300 return N;
10301}
10302
10303/// DropOperands - Release the operands and set this node to have
10304/// zero operands.
10306 // Unlike the code in MorphNodeTo that does this, we don't need to
10307 // watch for dead nodes here.
10308 for (op_iterator I = op_begin(), E = op_end(); I != E; ) {
10309 SDUse &Use = *I++;
10310 Use.set(SDValue());
10311 }
10312}
10313
10315 ArrayRef<MachineMemOperand *> NewMemRefs) {
10316 if (NewMemRefs.empty()) {
10317 N->clearMemRefs();
10318 return;
10319 }
10320
10321 // Check if we can avoid allocating by storing a single reference directly.
10322 if (NewMemRefs.size() == 1) {
10323 N->MemRefs = NewMemRefs[0];
10324 N->NumMemRefs = 1;
10325 return;
10326 }
10327
10328 MachineMemOperand **MemRefsBuffer =
10329 Allocator.template Allocate<MachineMemOperand *>(NewMemRefs.size());
10330 llvm::copy(NewMemRefs, MemRefsBuffer);
10331 N->MemRefs = MemRefsBuffer;
10332 N->NumMemRefs = static_cast<int>(NewMemRefs.size());
10333}
10334
10335/// SelectNodeTo - These are wrappers around MorphNodeTo that accept a
10336/// machine opcode.
10337///
10339 EVT VT) {
10340 SDVTList VTs = getVTList(VT);
10341 return SelectNodeTo(N, MachineOpc, VTs, std::nullopt);
10342}
10343
10345 EVT VT, SDValue Op1) {
10346 SDVTList VTs = getVTList(VT);
10347 SDValue Ops[] = { Op1 };
10348 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10349}
10350
10352 EVT VT, SDValue Op1,
10353 SDValue Op2) {
10354 SDVTList VTs = getVTList(VT);
10355 SDValue Ops[] = { Op1, Op2 };
10356 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10357}
10358
10360 EVT VT, SDValue Op1,
10361 SDValue Op2, SDValue Op3) {
10362 SDVTList VTs = getVTList(VT);
10363 SDValue Ops[] = { Op1, Op2, Op3 };
10364 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10365}
10366
10368 EVT VT, ArrayRef<SDValue> Ops) {
10369 SDVTList VTs = getVTList(VT);
10370 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10371}
10372
10374 EVT VT1, EVT VT2, ArrayRef<SDValue> Ops) {
10375 SDVTList VTs = getVTList(VT1, VT2);
10376 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10377}
10378
10380 EVT VT1, EVT VT2) {
10381 SDVTList VTs = getVTList(VT1, VT2);
10382 return SelectNodeTo(N, MachineOpc, VTs, std::nullopt);
10383}
10384
10386 EVT VT1, EVT VT2, EVT VT3,
10387 ArrayRef<SDValue> Ops) {
10388 SDVTList VTs = getVTList(VT1, VT2, VT3);
10389 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10390}
10391
10393 EVT VT1, EVT VT2,
10394 SDValue Op1, SDValue Op2) {
10395 SDVTList VTs = getVTList(VT1, VT2);
10396 SDValue Ops[] = { Op1, Op2 };
10397 return SelectNodeTo(N, MachineOpc, VTs, Ops);
10398}
10399
10401 SDVTList VTs,ArrayRef<SDValue> Ops) {
10402 SDNode *New = MorphNodeTo(N, ~MachineOpc, VTs, Ops);
10403 // Reset the NodeID to -1.
10404 New->setNodeId(-1);
10405 if (New != N) {
10406 ReplaceAllUsesWith(N, New);
10408 }
10409 return New;
10410}
10411
10412/// UpdateSDLocOnMergeSDNode - If the opt level is -O0 then it throws away
10413/// the line number information on the merged node since it is not possible to
10414/// preserve the information that operation is associated with multiple lines.
10415/// This will make the debugger working better at -O0, were there is a higher
10416/// probability having other instructions associated with that line.
10417///
10418/// For IROrder, we keep the smaller of the two
10419SDNode *SelectionDAG::UpdateSDLocOnMergeSDNode(SDNode *N, const SDLoc &OLoc) {
10420 DebugLoc NLoc = N->getDebugLoc();
10421 if (NLoc && OptLevel == CodeGenOptLevel::None && OLoc.getDebugLoc() != NLoc) {
10422 N->setDebugLoc(DebugLoc());
10423 }
10424 unsigned Order = std::min(N->getIROrder(), OLoc.getIROrder());
10425 N->setIROrder(Order);
10426 return N;
10427}
10428
10429/// MorphNodeTo - This *mutates* the specified node to have the specified
10430/// return type, opcode, and operands.
10431///
10432/// Note that MorphNodeTo returns the resultant node. If there is already a
10433/// node of the specified opcode and operands, it returns that node instead of
10434/// the current one. Note that the SDLoc need not be the same.
10435///
10436/// Using MorphNodeTo is faster than creating a new node and swapping it in
10437/// with ReplaceAllUsesWith both because it often avoids allocating a new
10438/// node, and because it doesn't require CSE recalculation for any of
10439/// the node's users.
10440///
10441/// However, note that MorphNodeTo recursively deletes dead nodes from the DAG.
10442/// As a consequence it isn't appropriate to use from within the DAG combiner or
10443/// the legalizer which maintain worklists that would need to be updated when
10444/// deleting things.
10446 SDVTList VTs, ArrayRef<SDValue> Ops) {
10447 // If an identical node already exists, use it.
10448 void *IP = nullptr;
10449 if (VTs.VTs[VTs.NumVTs-1] != MVT::Glue) {
10451 AddNodeIDNode(ID, Opc, VTs, Ops);
10452 if (SDNode *ON = FindNodeOrInsertPos(ID, SDLoc(N), IP))
10453 return UpdateSDLocOnMergeSDNode(ON, SDLoc(N));
10454 }
10455
10456 if (!RemoveNodeFromCSEMaps(N))
10457 IP = nullptr;
10458
10459 // Start the morphing.
10460 N->NodeType = Opc;
10461 N->ValueList = VTs.VTs;
10462 N->NumValues = VTs.NumVTs;
10463
10464 // Clear the operands list, updating used nodes to remove this from their
10465 // use list. Keep track of any operands that become dead as a result.
10466 SmallPtrSet<SDNode*, 16> DeadNodeSet;
10467 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
10468 SDUse &Use = *I++;
10469 SDNode *Used = Use.getNode();
10470 Use.set(SDValue());
10471 if (Used->use_empty())
10472 DeadNodeSet.insert(Used);
10473 }
10474
10475 // For MachineNode, initialize the memory references information.
10476 if (MachineSDNode *MN = dyn_cast<MachineSDNode>(N))
10477 MN->clearMemRefs();
10478
10479 // Swap for an appropriately sized array from the recycler.
10480 removeOperands(N);
10481 createOperands(N, Ops);
10482
10483 // Delete any nodes that are still dead after adding the uses for the
10484 // new operands.
10485 if (!DeadNodeSet.empty()) {
10486 SmallVector<SDNode *, 16> DeadNodes;
10487 for (SDNode *N : DeadNodeSet)
10488 if (N->use_empty())
10489 DeadNodes.push_back(N);
10490 RemoveDeadNodes(DeadNodes);
10491 }
10492
10493 if (IP)
10494 CSEMap.InsertNode(N, IP); // Memoize the new node.
10495 return N;
10496}
10497
10499 unsigned OrigOpc = Node->getOpcode();
10500 unsigned NewOpc;
10501 switch (OrigOpc) {
10502 default:
10503 llvm_unreachable("mutateStrictFPToFP called with unexpected opcode!");
10504#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
10505 case ISD::STRICT_##DAGN: NewOpc = ISD::DAGN; break;
10506#define CMP_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
10507 case ISD::STRICT_##DAGN: NewOpc = ISD::SETCC; break;
10508#include "llvm/IR/ConstrainedOps.def"
10509 }
10510
10511 assert(Node->getNumValues() == 2 && "Unexpected number of results!");
10512
10513 // We're taking this node out of the chain, so we need to re-link things.
10514 SDValue InputChain = Node->getOperand(0);
10515 SDValue OutputChain = SDValue(Node, 1);
10516 ReplaceAllUsesOfValueWith(OutputChain, InputChain);
10517
10519 for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
10520 Ops.push_back(Node->getOperand(i));
10521
10522 SDVTList VTs = getVTList(Node->getValueType(0));
10523 SDNode *Res = MorphNodeTo(Node, NewOpc, VTs, Ops);
10524
10525 // MorphNodeTo can operate in two ways: if an existing node with the
10526 // specified operands exists, it can just return it. Otherwise, it
10527 // updates the node in place to have the requested operands.
10528 if (Res == Node) {
10529 // If we updated the node in place, reset the node ID. To the isel,
10530 // this should be just like a newly allocated machine node.
10531 Res->setNodeId(-1);
10532 } else {
10533 ReplaceAllUsesWith(Node, Res);
10534 RemoveDeadNode(Node);
10535 }
10536
10537 return Res;
10538}
10539
10540/// getMachineNode - These are used for target selectors to create a new node
10541/// with specified return type(s), MachineInstr opcode, and operands.
10542///
10543/// Note that getMachineNode returns the resultant node. If there is already a
10544/// node of the specified opcode and operands, it returns that node instead of
10545/// the current one.
10547 EVT VT) {
10548 SDVTList VTs = getVTList(VT);
10549 return getMachineNode(Opcode, dl, VTs, std::nullopt);
10550}
10551
10553 EVT VT, SDValue Op1) {
10554 SDVTList VTs = getVTList(VT);
10555 SDValue Ops[] = { Op1 };
10556 return getMachineNode(Opcode, dl, VTs, Ops);
10557}
10558
10560 EVT VT, SDValue Op1, SDValue Op2) {
10561 SDVTList VTs = getVTList(VT);
10562 SDValue Ops[] = { Op1, Op2 };
10563 return getMachineNode(Opcode, dl, VTs, Ops);
10564}
10565
10567 EVT VT, SDValue Op1, SDValue Op2,
10568 SDValue Op3) {
10569 SDVTList VTs = getVTList(VT);
10570 SDValue Ops[] = { Op1, Op2, Op3 };
10571 return getMachineNode(Opcode, dl, VTs, Ops);
10572}
10573
10575 EVT VT, ArrayRef<SDValue> Ops) {
10576 SDVTList VTs = getVTList(VT);
10577 return getMachineNode(Opcode, dl, VTs, Ops);
10578}
10579
10581 EVT VT1, EVT VT2, SDValue Op1,
10582 SDValue Op2) {
10583 SDVTList VTs = getVTList(VT1, VT2);
10584 SDValue Ops[] = { Op1, Op2 };
10585 return getMachineNode(Opcode, dl, VTs, Ops);
10586}
10587
10589 EVT VT1, EVT VT2, SDValue Op1,
10590 SDValue Op2, SDValue Op3) {
10591 SDVTList VTs = getVTList(VT1, VT2);
10592 SDValue Ops[] = { Op1, Op2, Op3 };
10593 return getMachineNode(Opcode, dl, VTs, Ops);
10594}
10595
10597 EVT VT1, EVT VT2,
10598 ArrayRef<SDValue> Ops) {
10599 SDVTList VTs = getVTList(VT1, VT2);
10600 return getMachineNode(Opcode, dl, VTs, Ops);
10601}
10602
10604 EVT VT1, EVT VT2, EVT VT3,
10605 SDValue Op1, SDValue Op2) {
10606 SDVTList VTs = getVTList(VT1, VT2, VT3);
10607 SDValue Ops[] = { Op1, Op2 };
10608 return getMachineNode(Opcode, dl, VTs, Ops);
10609}
10610
10612 EVT VT1, EVT VT2, EVT VT3,
10613 SDValue Op1, SDValue Op2,
10614 SDValue Op3) {
10615 SDVTList VTs = getVTList(VT1, VT2, VT3);
10616 SDValue Ops[] = { Op1, Op2, Op3 };
10617 return getMachineNode(Opcode, dl, VTs, Ops);
10618}
10619
10621 EVT VT1, EVT VT2, EVT VT3,
10622 ArrayRef<SDValue> Ops) {
10623 SDVTList VTs = getVTList(VT1, VT2, VT3);
10624 return getMachineNode(Opcode, dl, VTs, Ops);
10625}
10626
10628 ArrayRef<EVT> ResultTys,
10629 ArrayRef<SDValue> Ops) {
10630 SDVTList VTs = getVTList(ResultTys);
10631 return getMachineNode(Opcode, dl, VTs, Ops);
10632}
10633
10635 SDVTList VTs,
10636 ArrayRef<SDValue> Ops) {
10637 bool DoCSE = VTs.VTs[VTs.NumVTs-1] != MVT::Glue;
10639 void *IP = nullptr;
10640
10641 if (DoCSE) {
10643 AddNodeIDNode(ID, ~Opcode, VTs, Ops);
10644 IP = nullptr;
10645 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
10646 return cast<MachineSDNode>(UpdateSDLocOnMergeSDNode(E, DL));
10647 }
10648 }
10649
10650 // Allocate a new MachineSDNode.
10651 N = newSDNode<MachineSDNode>(~Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
10652 createOperands(N, Ops);
10653
10654 if (DoCSE)
10655 CSEMap.InsertNode(N, IP);
10656
10657 InsertNode(N);
10658 NewSDValueDbgMsg(SDValue(N, 0), "Creating new machine node: ", this);
10659 return N;
10660}
10661
10662/// getTargetExtractSubreg - A convenience function for creating
10663/// TargetOpcode::EXTRACT_SUBREG nodes.
10665 SDValue Operand) {
10666 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
10667 SDNode *Subreg = getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL,
10668 VT, Operand, SRIdxVal);
10669 return SDValue(Subreg, 0);
10670}
10671
10672/// getTargetInsertSubreg - A convenience function for creating
10673/// TargetOpcode::INSERT_SUBREG nodes.
10675 SDValue Operand, SDValue Subreg) {
10676 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
10677 SDNode *Result = getMachineNode(TargetOpcode::INSERT_SUBREG, DL,
10678 VT, Operand, Subreg, SRIdxVal);
10679 return SDValue(Result, 0);
10680}
10681
10682/// getNodeIfExists - Get the specified node if it's already available, or
10683/// else return NULL.
10685 ArrayRef<SDValue> Ops) {
10686 SDNodeFlags Flags;
10687 if (Inserter)
10688 Flags = Inserter->getFlags();
10689 return getNodeIfExists(Opcode, VTList, Ops, Flags);
10690}
10691
10694 const SDNodeFlags Flags) {
10695 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {
10697 AddNodeIDNode(ID, Opcode, VTList, Ops);
10698 void *IP = nullptr;
10699 if (SDNode *E = FindNodeOrInsertPos(ID, SDLoc(), IP)) {
10700 E->intersectFlagsWith(Flags);
10701 return E;
10702 }
10703 }
10704 return nullptr;
10705}
10706
10707/// doesNodeExist - Check if a node exists without modifying its flags.
10708bool SelectionDAG::doesNodeExist(unsigned Opcode, SDVTList VTList,
10709 ArrayRef<SDValue> Ops) {
10710 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {
10712 AddNodeIDNode(ID, Opcode, VTList, Ops);
10713 void *IP = nullptr;
10714 if (FindNodeOrInsertPos(ID, SDLoc(), IP))
10715 return true;
10716 }
10717 return false;
10718}
10719
10720/// getDbgValue - Creates a SDDbgValue node.
10721///
10722/// SDNode
10724 SDNode *N, unsigned R, bool IsIndirect,
10725 const DebugLoc &DL, unsigned O) {
10726 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
10727 "Expected inlined-at fields to agree");
10728 return new (DbgInfo->getAlloc())
10729 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromNode(N, R),
10730 {}, IsIndirect, DL, O,
10731 /*IsVariadic=*/false);
10732}
10733
10734/// Constant
10736 DIExpression *Expr,
10737 const Value *C,
10738 const DebugLoc &DL, unsigned O) {
10739 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
10740 "Expected inlined-at fields to agree");
10741 return new (DbgInfo->getAlloc())
10742 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromConst(C), {},
10743 /*IsIndirect=*/false, DL, O,
10744 /*IsVariadic=*/false);
10745}
10746
10747/// FrameIndex
10749 DIExpression *Expr, unsigned FI,
10750 bool IsIndirect,
10751 const DebugLoc &DL,
10752 unsigned O) {
10753 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
10754 "Expected inlined-at fields to agree");
10755 return getFrameIndexDbgValue(Var, Expr, FI, {}, IsIndirect, DL, O);
10756}
10757
10758/// FrameIndex with dependencies
10760 DIExpression *Expr, unsigned FI,
10761 ArrayRef<SDNode *> Dependencies,
10762 bool IsIndirect,
10763 const DebugLoc &DL,
10764 unsigned O) {
10765 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
10766 "Expected inlined-at fields to agree");
10767 return new (DbgInfo->getAlloc())
10768 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromFrameIdx(FI),
10769 Dependencies, IsIndirect, DL, O,
10770 /*IsVariadic=*/false);
10771}
10772
10773/// VReg
10775 unsigned VReg, bool IsIndirect,
10776 const DebugLoc &DL, unsigned O) {
10777 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
10778 "Expected inlined-at fields to agree");
10779 return new (DbgInfo->getAlloc())
10780 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromVReg(VReg),
10781 {}, IsIndirect, DL, O,
10782 /*IsVariadic=*/false);
10783}
10784
10787 ArrayRef<SDNode *> Dependencies,
10788 bool IsIndirect, const DebugLoc &DL,
10789 unsigned O, bool IsVariadic) {
10790 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
10791 "Expected inlined-at fields to agree");
10792 return new (DbgInfo->getAlloc())
10793 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, Locs, Dependencies, IsIndirect,
10794 DL, O, IsVariadic);
10795}
10796
10798 unsigned OffsetInBits, unsigned SizeInBits,
10799 bool InvalidateDbg) {
10800 SDNode *FromNode = From.getNode();
10801 SDNode *ToNode = To.getNode();
10802 assert(FromNode && ToNode && "Can't modify dbg values");
10803
10804 // PR35338
10805 // TODO: assert(From != To && "Redundant dbg value transfer");
10806 // TODO: assert(FromNode != ToNode && "Intranode dbg value transfer");
10807 if (From == To || FromNode == ToNode)
10808 return;
10809
10810 if (!FromNode->getHasDebugValue())
10811 return;
10812
10813 SDDbgOperand FromLocOp =
10814 SDDbgOperand::fromNode(From.getNode(), From.getResNo());
10816
10818 for (SDDbgValue *Dbg : GetDbgValues(FromNode)) {
10819 if (Dbg->isInvalidated())
10820 continue;
10821
10822 // TODO: assert(!Dbg->isInvalidated() && "Transfer of invalid dbg value");
10823
10824 // Create a new location ops vector that is equal to the old vector, but
10825 // with each instance of FromLocOp replaced with ToLocOp.
10826 bool Changed = false;
10827 auto NewLocOps = Dbg->copyLocationOps();
10828 std::replace_if(
10829 NewLocOps.begin(), NewLocOps.end(),
10830 [&Changed, FromLocOp](const SDDbgOperand &Op) {
10831 bool Match = Op == FromLocOp;
10832 Changed |= Match;
10833 return Match;
10834 },
10835 ToLocOp);
10836 // Ignore this SDDbgValue if we didn't find a matching location.
10837 if (!Changed)
10838 continue;
10839
10840 DIVariable *Var = Dbg->getVariable();
10841 auto *Expr = Dbg->getExpression();
10842 // If a fragment is requested, update the expression.
10843 if (SizeInBits) {
10844 // When splitting a larger (e.g., sign-extended) value whose
10845 // lower bits are described with an SDDbgValue, do not attempt
10846 // to transfer the SDDbgValue to the upper bits.
10847 if (auto FI = Expr->getFragmentInfo())
10848 if (OffsetInBits + SizeInBits > FI->SizeInBits)
10849 continue;
10850 auto Fragment = DIExpression::createFragmentExpression(Expr, OffsetInBits,
10851 SizeInBits);
10852 if (!Fragment)
10853 continue;
10854 Expr = *Fragment;
10855 }
10856
10857 auto AdditionalDependencies = Dbg->getAdditionalDependencies();
10858 // Clone the SDDbgValue and move it to To.
10859 SDDbgValue *Clone = getDbgValueList(
10860 Var, Expr, NewLocOps, AdditionalDependencies, Dbg->isIndirect(),
10861 Dbg->getDebugLoc(), std::max(ToNode->getIROrder(), Dbg->getOrder()),
10862 Dbg->isVariadic());
10863 ClonedDVs.push_back(Clone);
10864
10865 if (InvalidateDbg) {
10866 // Invalidate value and indicate the SDDbgValue should not be emitted.
10867 Dbg->setIsInvalidated();
10868 Dbg->setIsEmitted();
10869 }
10870 }
10871
10872 for (SDDbgValue *Dbg : ClonedDVs) {
10873 assert(is_contained(Dbg->getSDNodes(), ToNode) &&
10874 "Transferred DbgValues should depend on the new SDNode");
10875 AddDbgValue(Dbg, false);
10876 }
10877}
10878
10880 if (!N.getHasDebugValue())
10881 return;
10882
10884 for (auto *DV : GetDbgValues(&N)) {
10885 if (DV->isInvalidated())
10886 continue;
10887 switch (N.getOpcode()) {
10888 default:
10889 break;
10890 case ISD::ADD: {
10891 SDValue N0 = N.getOperand(0);
10892 SDValue N1 = N.getOperand(1);
10893 if (!isa<ConstantSDNode>(N0)) {
10894 bool RHSConstant = isa<ConstantSDNode>(N1);
10896 if (RHSConstant)
10897 Offset = N.getConstantOperandVal(1);
10898 // We are not allowed to turn indirect debug values variadic, so
10899 // don't salvage those.
10900 if (!RHSConstant && DV->isIndirect())
10901 continue;
10902
10903 // Rewrite an ADD constant node into a DIExpression. Since we are
10904 // performing arithmetic to compute the variable's *value* in the
10905 // DIExpression, we need to mark the expression with a
10906 // DW_OP_stack_value.
10907 auto *DIExpr = DV->getExpression();
10908 auto NewLocOps = DV->copyLocationOps();
10909 bool Changed = false;
10910 size_t OrigLocOpsSize = NewLocOps.size();
10911 for (size_t i = 0; i < OrigLocOpsSize; ++i) {
10912 // We're not given a ResNo to compare against because the whole
10913 // node is going away. We know that any ISD::ADD only has one
10914 // result, so we can assume any node match is using the result.
10915 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
10916 NewLocOps[i].getSDNode() != &N)
10917 continue;
10918 NewLocOps[i] = SDDbgOperand::fromNode(N0.getNode(), N0.getResNo());
10919 if (RHSConstant) {
10922 DIExpr = DIExpression::appendOpsToArg(DIExpr, ExprOps, i, true);
10923 } else {
10924 // Convert to a variadic expression (if not already).
10925 // convertToVariadicExpression() returns a const pointer, so we use
10926 // a temporary const variable here.
10927 const auto *TmpDIExpr =
10931 ExprOps.push_back(NewLocOps.size());
10932 ExprOps.push_back(dwarf::DW_OP_plus);
10935 NewLocOps.push_back(RHS);
10936 DIExpr = DIExpression::appendOpsToArg(TmpDIExpr, ExprOps, i, true);
10937 }
10938 Changed = true;
10939 }
10940 (void)Changed;
10941 assert(Changed && "Salvage target doesn't use N");
10942
10943 bool IsVariadic =
10944 DV->isVariadic() || OrigLocOpsSize != NewLocOps.size();
10945
10946 auto AdditionalDependencies = DV->getAdditionalDependencies();
10947 SDDbgValue *Clone = getDbgValueList(
10948 DV->getVariable(), DIExpr, NewLocOps, AdditionalDependencies,
10949 DV->isIndirect(), DV->getDebugLoc(), DV->getOrder(), IsVariadic);
10950 ClonedDVs.push_back(Clone);
10951 DV->setIsInvalidated();
10952 DV->setIsEmitted();
10953 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting";
10954 N0.getNode()->dumprFull(this);
10955 dbgs() << " into " << *DIExpr << '\n');
10956 }
10957 break;
10958 }
10959 case ISD::TRUNCATE: {
10960 SDValue N0 = N.getOperand(0);
10961 TypeSize FromSize = N0.getValueSizeInBits();
10962 TypeSize ToSize = N.getValueSizeInBits(0);
10963
10964 DIExpression *DbgExpression = DV->getExpression();
10965 auto ExtOps = DIExpression::getExtOps(FromSize, ToSize, false);
10966 auto NewLocOps = DV->copyLocationOps();
10967 bool Changed = false;
10968 for (size_t i = 0; i < NewLocOps.size(); ++i) {
10969 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
10970 NewLocOps[i].getSDNode() != &N)
10971 continue;
10972
10973 NewLocOps[i] = SDDbgOperand::fromNode(N0.getNode(), N0.getResNo());
10974 DbgExpression = DIExpression::appendOpsToArg(DbgExpression, ExtOps, i);
10975 Changed = true;
10976 }
10977 assert(Changed && "Salvage target doesn't use N");
10978 (void)Changed;
10979
10980 SDDbgValue *Clone =
10981 getDbgValueList(DV->getVariable(), DbgExpression, NewLocOps,
10982 DV->getAdditionalDependencies(), DV->isIndirect(),
10983 DV->getDebugLoc(), DV->getOrder(), DV->isVariadic());
10984
10985 ClonedDVs.push_back(Clone);
10986 DV->setIsInvalidated();
10987 DV->setIsEmitted();
10988 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting"; N0.getNode()->dumprFull(this);
10989 dbgs() << " into " << *DbgExpression << '\n');
10990 break;
10991 }
10992 }
10993 }
10994
10995 for (SDDbgValue *Dbg : ClonedDVs) {
10996 assert(!Dbg->getSDNodes().empty() &&
10997 "Salvaged DbgValue should depend on a new SDNode");
10998 AddDbgValue(Dbg, false);
10999 }
11000}
11001
11002/// Creates a SDDbgLabel node.
11004 const DebugLoc &DL, unsigned O) {
11005 assert(cast<DILabel>(Label)->isValidLocationForIntrinsic(DL) &&
11006 "Expected inlined-at fields to agree");
11007 return new (DbgInfo->getAlloc()) SDDbgLabel(Label, DL, O);
11008}
11009
11010namespace {
11011
11012/// RAUWUpdateListener - Helper for ReplaceAllUsesWith - When the node
11013/// pointed to by a use iterator is deleted, increment the use iterator
11014/// so that it doesn't dangle.
11015///
11016class RAUWUpdateListener : public SelectionDAG::DAGUpdateListener {
11019
11020 void NodeDeleted(SDNode *N, SDNode *E) override {
11021 // Increment the iterator as needed.
11022 while (UI != UE && N == *UI)
11023 ++UI;
11024 }
11025
11026public:
11027 RAUWUpdateListener(SelectionDAG &d,
11030 : SelectionDAG::DAGUpdateListener(d), UI(ui), UE(ue) {}
11031};
11032
11033} // end anonymous namespace
11034
11035/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
11036/// This can cause recursive merging of nodes in the DAG.
11037///
11038/// This version assumes From has a single result value.
11039///
11041 SDNode *From = FromN.getNode();
11042 assert(From->getNumValues() == 1 && FromN.getResNo() == 0 &&
11043 "Cannot replace with this method!");
11044 assert(From != To.getNode() && "Cannot replace uses of with self");
11045
11046 // Preserve Debug Values
11047 transferDbgValues(FromN, To);
11048 // Preserve extra info.
11049 copyExtraInfo(From, To.getNode());
11050
11051 // Iterate over all the existing uses of From. New uses will be added
11052 // to the beginning of the use list, which we avoid visiting.
11053 // This specifically avoids visiting uses of From that arise while the
11054 // replacement is happening, because any such uses would be the result
11055 // of CSE: If an existing node looks like From after one of its operands
11056 // is replaced by To, we don't want to replace of all its users with To
11057 // too. See PR3018 for more info.
11058 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
11059 RAUWUpdateListener Listener(*this, UI, UE);
11060 while (UI != UE) {
11061 SDNode *User = *UI;
11062
11063 // This node is about to morph, remove its old self from the CSE maps.
11064 RemoveNodeFromCSEMaps(User);
11065
11066 // A user can appear in a use list multiple times, and when this
11067 // happens the uses are usually next to each other in the list.
11068 // To help reduce the number of CSE recomputations, process all
11069 // the uses of this user that we can find this way.
11070 do {
11071 SDUse &Use = UI.getUse();
11072 ++UI;
11073 Use.set(To);
11074 if (To->isDivergent() != From->isDivergent())
11076 } while (UI != UE && *UI == User);
11077 // Now that we have modified User, add it back to the CSE maps. If it
11078 // already exists there, recursively merge the results together.
11079 AddModifiedNodeToCSEMaps(User);
11080 }
11081
11082 // If we just RAUW'd the root, take note.
11083 if (FromN == getRoot())
11084 setRoot(To);
11085}
11086
11087/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
11088/// This can cause recursive merging of nodes in the DAG.
11089///
11090/// This version assumes that for each value of From, there is a
11091/// corresponding value in To in the same position with the same type.
11092///
11094#ifndef NDEBUG
11095 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
11096 assert((!From->hasAnyUseOfValue(i) ||
11097 From->getValueType(i) == To->getValueType(i)) &&
11098 "Cannot use this version of ReplaceAllUsesWith!");
11099#endif
11100
11101 // Handle the trivial case.
11102 if (From == To)
11103 return;
11104
11105 // Preserve Debug Info. Only do this if there's a use.
11106 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
11107 if (From->hasAnyUseOfValue(i)) {
11108 assert((i < To->getNumValues()) && "Invalid To location");
11110 }
11111 // Preserve extra info.
11112 copyExtraInfo(From, To);
11113
11114 // Iterate over just the existing users of From. See the comments in
11115 // the ReplaceAllUsesWith above.
11116 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
11117 RAUWUpdateListener Listener(*this, UI, UE);
11118 while (UI != UE) {
11119 SDNode *User = *UI;
11120
11121 // This node is about to morph, remove its old self from the CSE maps.
11122 RemoveNodeFromCSEMaps(User);
11123
11124 // A user can appear in a use list multiple times, and when this
11125 // happens the uses are usually next to each other in the list.
11126 // To help reduce the number of CSE recomputations, process all
11127 // the uses of this user that we can find this way.
11128 do {
11129 SDUse &Use = UI.getUse();
11130 ++UI;
11131 Use.setNode(To);
11132 if (To->isDivergent() != From->isDivergent())
11134 } while (UI != UE && *UI == User);
11135
11136 // Now that we have modified User, add it back to the CSE maps. If it
11137 // already exists there, recursively merge the results together.
11138 AddModifiedNodeToCSEMaps(User);
11139 }
11140
11141 // If we just RAUW'd the root, take note.
11142 if (From == getRoot().getNode())
11143 setRoot(SDValue(To, getRoot().getResNo()));
11144}
11145
11146/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
11147/// This can cause recursive merging of nodes in the DAG.
11148///
11149/// This version can replace From with any result values. To must match the
11150/// number and types of values returned by From.
11152 if (From->getNumValues() == 1) // Handle the simple case efficiently.
11153 return ReplaceAllUsesWith(SDValue(From, 0), To[0]);
11154
11155 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) {
11156 // Preserve Debug Info.
11157 transferDbgValues(SDValue(From, i), To[i]);
11158 // Preserve extra info.
11159 copyExtraInfo(From, To[i].getNode());
11160 }
11161
11162 // Iterate over just the existing users of From. See the comments in
11163 // the ReplaceAllUsesWith above.
11164 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
11165 RAUWUpdateListener Listener(*this, UI, UE);
11166 while (UI != UE) {
11167 SDNode *User = *UI;
11168
11169 // This node is about to morph, remove its old self from the CSE maps.
11170 RemoveNodeFromCSEMaps(User);
11171
11172 // A user can appear in a use list multiple times, and when this happens the
11173 // uses are usually next to each other in the list. To help reduce the
11174 // number of CSE and divergence recomputations, process all the uses of this
11175 // user that we can find this way.
11176 bool To_IsDivergent = false;
11177 do {
11178 SDUse &Use = UI.getUse();
11179 const SDValue &ToOp = To[Use.getResNo()];
11180 ++UI;
11181 Use.set(ToOp);
11182 To_IsDivergent |= ToOp->isDivergent();
11183 } while (UI != UE && *UI == User);
11184
11185 if (To_IsDivergent != From->isDivergent())
11187
11188 // Now that we have modified User, add it back to the CSE maps. If it
11189 // already exists there, recursively merge the results together.
11190 AddModifiedNodeToCSEMaps(User);
11191 }
11192
11193 // If we just RAUW'd the root, take note.
11194 if (From == getRoot().getNode())
11195 setRoot(SDValue(To[getRoot().getResNo()]));
11196}
11197
11198/// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
11199/// uses of other values produced by From.getNode() alone. The Deleted
11200/// vector is handled the same way as for ReplaceAllUsesWith.
11202 // Handle the really simple, really trivial case efficiently.
11203 if (From == To) return;
11204
11205 // Handle the simple, trivial, case efficiently.
11206 if (From.getNode()->getNumValues() == 1) {
11208 return;
11209 }
11210
11211 // Preserve Debug Info.
11213 copyExtraInfo(From.getNode(), To.getNode());
11214
11215 // Iterate over just the existing users of From. See the comments in
11216 // the ReplaceAllUsesWith above.
11217 SDNode::use_iterator UI = From.getNode()->use_begin(),
11218 UE = From.getNode()->use_end();
11219 RAUWUpdateListener Listener(*this, UI, UE);
11220 while (UI != UE) {
11221 SDNode *User = *UI;
11222 bool UserRemovedFromCSEMaps = false;
11223
11224 // A user can appear in a use list multiple times, and when this
11225 // happens the uses are usually next to each other in the list.
11226 // To help reduce the number of CSE recomputations, process all
11227 // the uses of this user that we can find this way.
11228 do {
11229 SDUse &Use = UI.getUse();
11230
11231 // Skip uses of different values from the same node.
11232 if (Use.getResNo() != From.getResNo()) {
11233 ++UI;
11234 continue;
11235 }
11236
11237 // If this node hasn't been modified yet, it's still in the CSE maps,
11238 // so remove its old self from the CSE maps.
11239 if (!UserRemovedFromCSEMaps) {
11240 RemoveNodeFromCSEMaps(User);
11241 UserRemovedFromCSEMaps = true;
11242 }
11243
11244 ++UI;
11245 Use.set(To);
11246 if (To->isDivergent() != From->isDivergent())
11248 } while (UI != UE && *UI == User);
11249 // We are iterating over all uses of the From node, so if a use
11250 // doesn't use the specific value, no changes are made.
11251 if (!UserRemovedFromCSEMaps)
11252 continue;
11253
11254 // Now that we have modified User, add it back to the CSE maps. If it
11255 // already exists there, recursively merge the results together.
11256 AddModifiedNodeToCSEMaps(User);
11257 }
11258
11259 // If we just RAUW'd the root, take note.
11260 if (From == getRoot())
11261 setRoot(To);
11262}
11263
11264namespace {
11265
11266/// UseMemo - This class is used by SelectionDAG::ReplaceAllUsesOfValuesWith
11267/// to record information about a use.
11268struct UseMemo {
11269 SDNode *User;
11270 unsigned Index;
11271 SDUse *Use;
11272};
11273
11274/// operator< - Sort Memos by User.
11275bool operator<(const UseMemo &L, const UseMemo &R) {
11276 return (intptr_t)L.User < (intptr_t)R.User;
11277}
11278
11279/// RAUOVWUpdateListener - Helper for ReplaceAllUsesOfValuesWith - When the node
11280/// pointed to by a UseMemo is deleted, set the User to nullptr to indicate that
11281/// the node already has been taken care of recursively.
11282class RAUOVWUpdateListener : public SelectionDAG::DAGUpdateListener {
11284
11285 void NodeDeleted(SDNode *N, SDNode *E) override {
11286 for (UseMemo &Memo : Uses)
11287 if (Memo.User == N)
11288 Memo.User = nullptr;
11289 }
11290
11291public:
11292 RAUOVWUpdateListener(SelectionDAG &d, SmallVector<UseMemo, 4> &uses)
11293 : SelectionDAG::DAGUpdateListener(d), Uses(uses) {}
11294};
11295
11296} // end anonymous namespace
11297
11299 if (TLI->isSDNodeAlwaysUniform(N)) {
11300 assert(!TLI->isSDNodeSourceOfDivergence(N, FLI, UA) &&
11301 "Conflicting divergence information!");
11302 return false;
11303 }
11304 if (TLI->isSDNodeSourceOfDivergence(N, FLI, UA))
11305 return true;
11306 for (const auto &Op : N->ops()) {
11307 if (Op.Val.getValueType() != MVT::Other && Op.getNode()->isDivergent())
11308 return true;
11309 }
11310 return false;
11311}
11312
11314 SmallVector<SDNode *, 16> Worklist(1, N);
11315 do {
11316 N = Worklist.pop_back_val();
11317 bool IsDivergent = calculateDivergence(N);
11318 if (N->SDNodeBits.IsDivergent != IsDivergent) {
11319 N->SDNodeBits.IsDivergent = IsDivergent;
11320 llvm::append_range(Worklist, N->uses());
11321 }
11322 } while (!Worklist.empty());
11323}
11324
11325void SelectionDAG::CreateTopologicalOrder(std::vector<SDNode *> &Order) {
11327 Order.reserve(AllNodes.size());
11328 for (auto &N : allnodes()) {
11329 unsigned NOps = N.getNumOperands();
11330 Degree[&N] = NOps;
11331 if (0 == NOps)
11332 Order.push_back(&N);
11333 }
11334 for (size_t I = 0; I != Order.size(); ++I) {
11335 SDNode *N = Order[I];
11336 for (auto *U : N->uses()) {
11337 unsigned &UnsortedOps = Degree[U];
11338 if (0 == --UnsortedOps)
11339 Order.push_back(U);
11340 }
11341 }
11342}
11343
11344#ifndef NDEBUG
11346 std::vector<SDNode *> TopoOrder;
11347 CreateTopologicalOrder(TopoOrder);
11348 for (auto *N : TopoOrder) {
11349 assert(calculateDivergence(N) == N->isDivergent() &&
11350 "Divergence bit inconsistency detected");
11351 }
11352}
11353#endif
11354
11355/// ReplaceAllUsesOfValuesWith - Replace any uses of From with To, leaving
11356/// uses of other values produced by From.getNode() alone. The same value
11357/// may appear in both the From and To list. The Deleted vector is
11358/// handled the same way as for ReplaceAllUsesWith.
11360 const SDValue *To,
11361 unsigned Num){
11362 // Handle the simple, trivial case efficiently.
11363 if (Num == 1)
11364 return ReplaceAllUsesOfValueWith(*From, *To);
11365
11366 transferDbgValues(*From, *To);
11367 copyExtraInfo(From->getNode(), To->getNode());
11368
11369 // Read up all the uses and make records of them. This helps
11370 // processing new uses that are introduced during the
11371 // replacement process.
11373 for (unsigned i = 0; i != Num; ++i) {
11374 unsigned FromResNo = From[i].getResNo();
11375 SDNode *FromNode = From[i].getNode();
11376 for (SDNode::use_iterator UI = FromNode->use_begin(),
11377 E = FromNode->use_end(); UI != E; ++UI) {
11378 SDUse &Use = UI.getUse();
11379 if (Use.getResNo() == FromResNo) {
11380 UseMemo Memo = { *UI, i, &Use };
11381 Uses.push_back(Memo);
11382 }
11383 }
11384 }
11385
11386 // Sort the uses, so that all the uses from a given User are together.
11388 RAUOVWUpdateListener Listener(*this, Uses);
11389
11390 for (unsigned UseIndex = 0, UseIndexEnd = Uses.size();
11391 UseIndex != UseIndexEnd; ) {
11392 // We know that this user uses some value of From. If it is the right
11393 // value, update it.
11394 SDNode *User = Uses[UseIndex].User;
11395 // If the node has been deleted by recursive CSE updates when updating
11396 // another node, then just skip this entry.
11397 if (User == nullptr) {
11398 ++UseIndex;
11399 continue;
11400 }
11401
11402 // This node is about to morph, remove its old self from the CSE maps.
11403 RemoveNodeFromCSEMaps(User);
11404
11405 // The Uses array is sorted, so all the uses for a given User
11406 // are next to each other in the list.
11407 // To help reduce the number of CSE recomputations, process all
11408 // the uses of this user that we can find this way.
11409 do {
11410 unsigned i = Uses[UseIndex].Index;
11411 SDUse &Use = *Uses[UseIndex].Use;
11412 ++UseIndex;
11413
11414 Use.set(To[i]);
11415 } while (UseIndex != UseIndexEnd && Uses[UseIndex].User == User);
11416
11417 // Now that we have modified User, add it back to the CSE maps. If it
11418 // already exists there, recursively merge the results together.
11419 AddModifiedNodeToCSEMaps(User);
11420 }
11421}
11422
11423/// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
11424/// based on their topological order. It returns the maximum id and a vector
11425/// of the SDNodes* in assigned order by reference.
11427 unsigned DAGSize = 0;
11428
11429 // SortedPos tracks the progress of the algorithm. Nodes before it are
11430 // sorted, nodes after it are unsorted. When the algorithm completes
11431 // it is at the end of the list.
11432 allnodes_iterator SortedPos = allnodes_begin();
11433
11434 // Visit all the nodes. Move nodes with no operands to the front of
11435 // the list immediately. Annotate nodes that do have operands with their
11436 // operand count. Before we do this, the Node Id fields of the nodes
11437 // may contain arbitrary values. After, the Node Id fields for nodes
11438 // before SortedPos will contain the topological sort index, and the
11439 // Node Id fields for nodes At SortedPos and after will contain the
11440 // count of outstanding operands.
11442 checkForCycles(&N, this);
11443 unsigned Degree = N.getNumOperands();
11444 if (Degree == 0) {
11445 // A node with no uses, add it to the result array immediately.
11446 N.setNodeId(DAGSize++);
11447 allnodes_iterator Q(&N);
11448 if (Q != SortedPos)
11449 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(Q));
11450 assert(SortedPos != AllNodes.end() && "Overran node list");
11451 ++SortedPos;
11452 } else {
11453 // Temporarily use the Node Id as scratch space for the degree count.
11454 N.setNodeId(Degree);
11455 }
11456 }
11457
11458 // Visit all the nodes. As we iterate, move nodes into sorted order,
11459 // such that by the time the end is reached all nodes will be sorted.
11460 for (SDNode &Node : allnodes()) {
11461 SDNode *N = &Node;
11462 checkForCycles(N, this);
11463 // N is in sorted position, so all its uses have one less operand
11464 // that needs to be sorted.
11465 for (SDNode *P : N->uses()) {
11466 unsigned Degree = P->getNodeId();
11467 assert(Degree != 0 && "Invalid node degree");
11468 --Degree;
11469 if (Degree == 0) {
11470 // All of P's operands are sorted, so P may sorted now.
11471 P->setNodeId(DAGSize++);
11472 if (P->getIterator() != SortedPos)
11473 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(P));
11474 assert(SortedPos != AllNodes.end() && "Overran node list");
11475 ++SortedPos;
11476 } else {
11477 // Update P's outstanding operand count.
11478 P->setNodeId(Degree);
11479 }
11480 }
11481 if (Node.getIterator() == SortedPos) {
11482#ifndef NDEBUG
11484 SDNode *S = &*++I;
11485 dbgs() << "Overran sorted position:\n";
11486 S->dumprFull(this); dbgs() << "\n";
11487 dbgs() << "Checking if this is due to cycles\n";
11488 checkForCycles(this, true);
11489#endif
11490 llvm_unreachable(nullptr);
11491 }
11492 }
11493
11494 assert(SortedPos == AllNodes.end() &&
11495 "Topological sort incomplete!");
11496 assert(AllNodes.front().getOpcode() == ISD::EntryToken &&
11497 "First node in topological sort is not the entry token!");
11498 assert(AllNodes.front().getNodeId() == 0 &&
11499 "First node in topological sort has non-zero id!");
11500 assert(AllNodes.front().getNumOperands() == 0 &&
11501 "First node in topological sort has operands!");
11502 assert(AllNodes.back().getNodeId() == (int)DAGSize-1 &&
11503 "Last node in topologic sort has unexpected id!");
11504 assert(AllNodes.back().use_empty() &&
11505 "Last node in topologic sort has users!");
11506 assert(DAGSize == allnodes_size() && "Node count mismatch!");
11507 return DAGSize;
11508}
11509
11510/// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the
11511/// value is produced by SD.
11512void SelectionDAG::AddDbgValue(SDDbgValue *DB, bool isParameter) {
11513 for (SDNode *SD : DB->getSDNodes()) {
11514 if (!SD)
11515 continue;
11516 assert(DbgInfo->getSDDbgValues(SD).empty() || SD->getHasDebugValue());
11517 SD->setHasDebugValue(true);
11518 }
11519 DbgInfo->add(DB, isParameter);
11520}
11521
11522void SelectionDAG::AddDbgLabel(SDDbgLabel *DB) { DbgInfo->add(DB); }
11523
11525 SDValue NewMemOpChain) {
11526 assert(isa<MemSDNode>(NewMemOpChain) && "Expected a memop node");
11527 assert(NewMemOpChain.getValueType() == MVT::Other && "Expected a token VT");
11528 // The new memory operation must have the same position as the old load in
11529 // terms of memory dependency. Create a TokenFactor for the old load and new
11530 // memory operation and update uses of the old load's output chain to use that
11531 // TokenFactor.
11532 if (OldChain == NewMemOpChain || OldChain.use_empty())
11533 return NewMemOpChain;
11534
11535 SDValue TokenFactor = getNode(ISD::TokenFactor, SDLoc(OldChain), MVT::Other,
11536 OldChain, NewMemOpChain);
11537 ReplaceAllUsesOfValueWith(OldChain, TokenFactor);
11538 UpdateNodeOperands(TokenFactor.getNode(), OldChain, NewMemOpChain);
11539 return TokenFactor;
11540}
11541
11543 SDValue NewMemOp) {
11544 assert(isa<MemSDNode>(NewMemOp.getNode()) && "Expected a memop node");
11545 SDValue OldChain = SDValue(OldLoad, 1);
11546 SDValue NewMemOpChain = NewMemOp.getValue(1);
11547 return makeEquivalentMemoryOrdering(OldChain, NewMemOpChain);
11548}
11549
11551 Function **OutFunction) {
11552 assert(isa<ExternalSymbolSDNode>(Op) && "Node should be an ExternalSymbol");
11553
11554 auto *Symbol = cast<ExternalSymbolSDNode>(Op)->getSymbol();
11555 auto *Module = MF->getFunction().getParent();
11556 auto *Function = Module->getFunction(Symbol);
11557
11558 if (OutFunction != nullptr)
11559 *OutFunction = Function;
11560
11561 if (Function != nullptr) {
11562 auto PtrTy = TLI->getPointerTy(getDataLayout(), Function->getAddressSpace());
11563 return getGlobalAddress(Function, SDLoc(Op), PtrTy);
11564 }
11565
11566 std::string ErrorStr;
11567 raw_string_ostream ErrorFormatter(ErrorStr);
11568 ErrorFormatter << "Undefined external symbol ";
11569 ErrorFormatter << '"' << Symbol << '"';
11570 report_fatal_error(Twine(ErrorFormatter.str()));
11571}
11572
11573//===----------------------------------------------------------------------===//
11574// SDNode Class
11575//===----------------------------------------------------------------------===//
11576
11578 ConstantSDNode *Const = dyn_cast<ConstantSDNode>(V);
11579 return Const != nullptr && Const->isZero();
11580}
11581
11583 ConstantFPSDNode *Const = dyn_cast<ConstantFPSDNode>(V);
11584 return Const != nullptr && Const->isZero() && !Const->isNegative();
11585}
11586
11588 ConstantSDNode *Const = dyn_cast<ConstantSDNode>(V);
11589 return Const != nullptr && Const->isAllOnes();
11590}
11591
11593 ConstantSDNode *Const = dyn_cast<ConstantSDNode>(V);
11594 return Const != nullptr && Const->isOne();
11595}
11596
11598 ConstantSDNode *Const = dyn_cast<ConstantSDNode>(V);
11599 return Const != nullptr && Const->isMinSignedValue();
11600}
11601
11602bool llvm::isNeutralConstant(unsigned Opcode, SDNodeFlags Flags, SDValue V,
11603 unsigned OperandNo) {
11604 // NOTE: The cases should match with IR's ConstantExpr::getBinOpIdentity().
11605 // TODO: Target-specific opcodes could be added.
11606 if (auto *ConstV = isConstOrConstSplat(V, /*AllowUndefs*/ false,
11607 /*AllowTruncation*/ true)) {
11608 APInt Const = ConstV->getAPIntValue().trunc(V.getScalarValueSizeInBits());
11609 switch (Opcode) {
11610 case ISD::ADD:
11611 case ISD::OR:
11612 case ISD::XOR:
11613 case ISD::UMAX:
11614 return Const.isZero();
11615 case ISD::MUL:
11616 return Const.isOne();
11617 case ISD::AND:
11618 case ISD::UMIN:
11619 return Const.isAllOnes();
11620 case ISD::SMAX:
11621 return Const.isMinSignedValue();
11622 case ISD::SMIN:
11623 return Const.isMaxSignedValue();
11624 case ISD::SUB:
11625 case ISD::SHL:
11626 case ISD::SRA:
11627 case ISD::SRL:
11628 return OperandNo == 1 && Const.isZero();
11629 case ISD::UDIV:
11630 case ISD::SDIV:
11631 return OperandNo == 1 && Const.isOne();
11632 }
11633 } else if (auto *ConstFP = isConstOrConstSplatFP(V)) {
11634 switch (Opcode) {
11635 case ISD::FADD:
11636 return ConstFP->isZero() &&
11637 (Flags.hasNoSignedZeros() || ConstFP->isNegative());
11638 case ISD::FSUB:
11639 return OperandNo == 1 && ConstFP->isZero() &&
11640 (Flags.hasNoSignedZeros() || !ConstFP->isNegative());
11641 case ISD::FMUL:
11642 return ConstFP->isExactlyValue(1.0);
11643 case ISD::FDIV:
11644 return OperandNo == 1 && ConstFP->isExactlyValue(1.0);
11645 case ISD::FMINNUM:
11646 case ISD::FMAXNUM: {
11647 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
11648 EVT VT = V.getValueType();
11650 APFloat NeutralAF = !Flags.hasNoNaNs()
11651 ? APFloat::getQNaN(Semantics)
11652 : !Flags.hasNoInfs()
11653 ? APFloat::getInf(Semantics)
11654 : APFloat::getLargest(Semantics);
11655 if (Opcode == ISD::FMAXNUM)
11656 NeutralAF.changeSign();
11657
11658 return ConstFP->isExactlyValue(NeutralAF);
11659 }
11660 }
11661 }
11662 return false;
11663}
11664
11666 while (V.getOpcode() == ISD::BITCAST)
11667 V = V.getOperand(0);
11668 return V;
11669}
11670
11672 while (V.getOpcode() == ISD::BITCAST && V.getOperand(0).hasOneUse())
11673 V = V.getOperand(0);
11674 return V;
11675}
11676
11678 while (V.getOpcode() == ISD::EXTRACT_SUBVECTOR)
11679 V = V.getOperand(0);
11680 return V;
11681}
11682
11684 while (V.getOpcode() == ISD::TRUNCATE)
11685 V = V.getOperand(0);
11686 return V;
11687}
11688
11689bool llvm::isBitwiseNot(SDValue V, bool AllowUndefs) {
11690 if (V.getOpcode() != ISD::XOR)
11691 return false;
11692 V = peekThroughBitcasts(V.getOperand(1));
11693 unsigned NumBits = V.getScalarValueSizeInBits();
11694 ConstantSDNode *C =
11695 isConstOrConstSplat(V, AllowUndefs, /*AllowTruncation*/ true);
11696 return C && (C->getAPIntValue().countr_one() >= NumBits);
11697}
11698
11700 bool AllowTruncation) {
11701 EVT VT = N.getValueType();
11702 APInt DemandedElts = VT.isFixedLengthVector()
11704 : APInt(1, 1);
11705 return isConstOrConstSplat(N, DemandedElts, AllowUndefs, AllowTruncation);
11706}
11707
11709 bool AllowUndefs,
11710 bool AllowTruncation) {
11711 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N))
11712 return CN;
11713
11714 // SplatVectors can truncate their operands. Ignore that case here unless
11715 // AllowTruncation is set.
11716 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
11717 EVT VecEltVT = N->getValueType(0).getVectorElementType();
11718 if (auto *CN = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
11719 EVT CVT = CN->getValueType(0);
11720 assert(CVT.bitsGE(VecEltVT) && "Illegal splat_vector element extension");
11721 if (AllowTruncation || CVT == VecEltVT)
11722 return CN;
11723 }
11724 }
11725
11726 if (BuildVectorSDNode *BV = dyn_cast<BuildVectorSDNode>(N)) {
11727 BitVector UndefElements;
11728 ConstantSDNode *CN = BV->getConstantSplatNode(DemandedElts, &UndefElements);
11729
11730 // BuildVectors can truncate their operands. Ignore that case here unless
11731 // AllowTruncation is set.
11732 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
11733 if (CN && (UndefElements.none() || AllowUndefs)) {
11734 EVT CVT = CN->getValueType(0);
11735 EVT NSVT = N.getValueType().getScalarType();
11736 assert(CVT.bitsGE(NSVT) && "Illegal build vector element extension");
11737 if (AllowTruncation || (CVT == NSVT))
11738 return CN;
11739 }
11740 }
11741
11742 return nullptr;
11743}
11744
11746 EVT VT = N.getValueType();
11747 APInt DemandedElts = VT.isFixedLengthVector()
11749 : APInt(1, 1);
11750 return isConstOrConstSplatFP(N, DemandedElts, AllowUndefs);
11751}
11752
11754 const APInt &DemandedElts,
11755 bool AllowUndefs) {
11756 if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N))
11757 return CN;
11758
11759 if (BuildVectorSDNode *BV = dyn_cast<BuildVectorSDNode>(N)) {
11760 BitVector UndefElements;
11761 ConstantFPSDNode *CN =
11762 BV->getConstantFPSplatNode(DemandedElts, &UndefElements);
11763 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
11764 if (CN && (UndefElements.none() || AllowUndefs))
11765 return CN;
11766 }
11767
11768 if (N.getOpcode() == ISD::SPLAT_VECTOR)
11769 if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N.getOperand(0)))
11770 return CN;
11771
11772 return nullptr;
11773}
11774
11775bool llvm::isNullOrNullSplat(SDValue N, bool AllowUndefs) {
11776 // TODO: may want to use peekThroughBitcast() here.
11777 ConstantSDNode *C =
11778 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
11779 return C && C->isZero();
11780}
11781
11782bool llvm::isOneOrOneSplat(SDValue N, bool AllowUndefs) {
11783 ConstantSDNode *C =
11784 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation*/ true);
11785 return C && C->isOne();
11786}
11787
11788bool llvm::isAllOnesOrAllOnesSplat(SDValue N, bool AllowUndefs) {
11790 unsigned BitWidth = N.getScalarValueSizeInBits();
11791 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs);
11792 return C && C->isAllOnes() && C->getValueSizeInBits(0) == BitWidth;
11793}
11794
11796 DropOperands();
11797}
11798
11799MemSDNode::MemSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl,
11800 SDVTList VTs, EVT memvt, MachineMemOperand *mmo)
11801 : SDNode(Opc, Order, dl, VTs), MemoryVT(memvt), MMO(mmo) {
11802 MemSDNodeBits.IsVolatile = MMO->isVolatile();
11803 MemSDNodeBits.IsNonTemporal = MMO->isNonTemporal();
11804 MemSDNodeBits.IsDereferenceable = MMO->isDereferenceable();
11805 MemSDNodeBits.IsInvariant = MMO->isInvariant();
11806
11807 // We check here that the size of the memory operand fits within the size of
11808 // the MMO. This is because the MMO might indicate only a possible address
11809 // range instead of specifying the affected memory addresses precisely.
11810 assert(
11811 (!MMO->getType().isValid() ||
11813 "Size mismatch!");
11814}
11815
11816/// Profile - Gather unique data for the node.
11817///
11819 AddNodeIDNode(ID, this);
11820}
11821
11822namespace {
11823
11824 struct EVTArray {
11825 std::vector<EVT> VTs;
11826
11827 EVTArray() {
11828 VTs.reserve(MVT::VALUETYPE_SIZE);
11829 for (unsigned i = 0; i < MVT::VALUETYPE_SIZE; ++i)
11830 VTs.push_back(MVT((MVT::SimpleValueType)i));
11831 }
11832 };
11833
11834} // end anonymous namespace
11835
11836/// getValueTypeList - Return a pointer to the specified value type.
11837///
11838const EVT *SDNode::getValueTypeList(EVT VT) {
11839 static std::set<EVT, EVT::compareRawBits> EVTs;
11840 static EVTArray SimpleVTArray;
11841 static sys::SmartMutex<true> VTMutex;
11842
11843 if (VT.isExtended()) {
11844 sys::SmartScopedLock<true> Lock(VTMutex);
11845 return &(*EVTs.insert(VT).first);
11846 }
11847 assert(VT.getSimpleVT() < MVT::VALUETYPE_SIZE && "Value type out of range!");
11848 return &SimpleVTArray.VTs[VT.getSimpleVT().SimpleTy];
11849}
11850
11851/// hasNUsesOfValue - Return true if there are exactly NUSES uses of the
11852/// indicated value. This method ignores uses of other values defined by this
11853/// operation.
11854bool SDNode::hasNUsesOfValue(unsigned NUses, unsigned Value) const {
11855 assert(Value < getNumValues() && "Bad value!");
11856
11857 // TODO: Only iterate over uses of a given value of the node
11858 for (SDNode::use_iterator UI = use_begin(), E = use_end(); UI != E; ++UI) {
11859 if (UI.getUse().getResNo() == Value) {
11860 if (NUses == 0)
11861 return false;
11862 --NUses;
11863 }
11864 }
11865
11866 // Found exactly the right number of uses?
11867 return NUses == 0;
11868}
11869
11870/// hasAnyUseOfValue - Return true if there are any use of the indicated
11871/// value. This method ignores uses of other values defined by this operation.
11872bool SDNode::hasAnyUseOfValue(unsigned Value) const {
11873 assert(Value < getNumValues() && "Bad value!");
11874
11875 for (SDNode::use_iterator UI = use_begin(), E = use_end(); UI != E; ++UI)
11876 if (UI.getUse().getResNo() == Value)
11877 return true;
11878
11879 return false;
11880}
11881
11882/// isOnlyUserOf - Return true if this node is the only use of N.
11883bool SDNode::isOnlyUserOf(const SDNode *N) const {
11884 bool Seen = false;
11885 for (const SDNode *User : N->uses()) {
11886 if (User == this)
11887 Seen = true;
11888 else
11889 return false;
11890 }
11891
11892 return Seen;
11893}
11894
11895/// Return true if the only users of N are contained in Nodes.
11897 bool Seen = false;
11898 for (const SDNode *User : N->uses()) {
11899 if (llvm::is_contained(Nodes, User))
11900 Seen = true;
11901 else
11902 return false;
11903 }
11904
11905 return Seen;
11906}
11907
11908/// isOperand - Return true if this node is an operand of N.
11909bool SDValue::isOperandOf(const SDNode *N) const {
11910 return is_contained(N->op_values(), *this);
11911}
11912
11913bool SDNode::isOperandOf(const SDNode *N) const {
11914 return any_of(N->op_values(),
11915 [this](SDValue Op) { return this == Op.getNode(); });
11916}
11917
11918/// reachesChainWithoutSideEffects - Return true if this operand (which must
11919/// be a chain) reaches the specified operand without crossing any
11920/// side-effecting instructions on any chain path. In practice, this looks
11921/// through token factors and non-volatile loads. In order to remain efficient,
11922/// this only looks a couple of nodes in, it does not do an exhaustive search.
11923///
11924/// Note that we only need to examine chains when we're searching for
11925/// side-effects; SelectionDAG requires that all side-effects are represented
11926/// by chains, even if another operand would force a specific ordering. This
11927/// constraint is necessary to allow transformations like splitting loads.
11929 unsigned Depth) const {
11930 if (*this == Dest) return true;
11931
11932 // Don't search too deeply, we just want to be able to see through
11933 // TokenFactor's etc.
11934 if (Depth == 0) return false;
11935
11936 // If this is a token factor, all inputs to the TF happen in parallel.
11937 if (getOpcode() == ISD::TokenFactor) {
11938 // First, try a shallow search.
11939 if (is_contained((*this)->ops(), Dest)) {
11940 // We found the chain we want as an operand of this TokenFactor.
11941 // Essentially, we reach the chain without side-effects if we could
11942 // serialize the TokenFactor into a simple chain of operations with
11943 // Dest as the last operation. This is automatically true if the
11944 // chain has one use: there are no other ordering constraints.
11945 // If the chain has more than one use, we give up: some other
11946 // use of Dest might force a side-effect between Dest and the current
11947 // node.
11948 if (Dest.hasOneUse())
11949 return true;
11950 }
11951 // Next, try a deep search: check whether every operand of the TokenFactor
11952 // reaches Dest.
11953 return llvm::all_of((*this)->ops(), [=](SDValue Op) {
11954 return Op.reachesChainWithoutSideEffects(Dest, Depth - 1);
11955 });
11956 }
11957
11958 // Loads don't have side effects, look through them.
11959 if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(*this)) {
11960 if (Ld->isUnordered())
11961 return Ld->getChain().reachesChainWithoutSideEffects(Dest, Depth-1);
11962 }
11963 return false;
11964}
11965
11966bool SDNode::hasPredecessor(const SDNode *N) const {
11969 Worklist.push_back(this);
11970 return hasPredecessorHelper(N, Visited, Worklist);
11971}
11972
11974 this->Flags.intersectWith(Flags);
11975}
11976
11977SDValue
11979 ArrayRef<ISD::NodeType> CandidateBinOps,
11980 bool AllowPartials) {
11981 // The pattern must end in an extract from index 0.
11982 if (Extract->getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
11983 !isNullConstant(Extract->getOperand(1)))
11984 return SDValue();
11985
11986 // Match against one of the candidate binary ops.
11987 SDValue Op = Extract->getOperand(0);
11988 if (llvm::none_of(CandidateBinOps, [Op](ISD::NodeType BinOp) {
11989 return Op.getOpcode() == unsigned(BinOp);
11990 }))
11991 return SDValue();
11992
11993 // Floating-point reductions may require relaxed constraints on the final step
11994 // of the reduction because they may reorder intermediate operations.
11995 unsigned CandidateBinOp = Op.getOpcode();
11996 if (Op.getValueType().isFloatingPoint()) {
11997 SDNodeFlags Flags = Op->getFlags();
11998 switch (CandidateBinOp) {
11999 case ISD::FADD:
12000 if (!Flags.hasNoSignedZeros() || !Flags.hasAllowReassociation())
12001 return SDValue();
12002 break;
12003 default:
12004 llvm_unreachable("Unhandled FP opcode for binop reduction");
12005 }
12006 }
12007
12008 // Matching failed - attempt to see if we did enough stages that a partial
12009 // reduction from a subvector is possible.
12010 auto PartialReduction = [&](SDValue Op, unsigned NumSubElts) {
12011 if (!AllowPartials || !Op)
12012 return SDValue();
12013 EVT OpVT = Op.getValueType();
12014 EVT OpSVT = OpVT.getScalarType();
12015 EVT SubVT = EVT::getVectorVT(*getContext(), OpSVT, NumSubElts);
12016 if (!TLI->isExtractSubvectorCheap(SubVT, OpVT, 0))
12017 return SDValue();
12018 BinOp = (ISD::NodeType)CandidateBinOp;
12019 return getNode(ISD::EXTRACT_SUBVECTOR, SDLoc(Op), SubVT, Op,
12021 };
12022
12023 // At each stage, we're looking for something that looks like:
12024 // %s = shufflevector <8 x i32> %op, <8 x i32> undef,
12025 // <8 x i32> <i32 2, i32 3, i32 undef, i32 undef,
12026 // i32 undef, i32 undef, i32 undef, i32 undef>
12027 // %a = binop <8 x i32> %op, %s
12028 // Where the mask changes according to the stage. E.g. for a 3-stage pyramid,
12029 // we expect something like:
12030 // <4,5,6,7,u,u,u,u>
12031 // <2,3,u,u,u,u,u,u>
12032 // <1,u,u,u,u,u,u,u>
12033 // While a partial reduction match would be:
12034 // <2,3,u,u,u,u,u,u>
12035 // <1,u,u,u,u,u,u,u>
12036 unsigned Stages = Log2_32(Op.getValueType().getVectorNumElements());
12037 SDValue PrevOp;
12038 for (unsigned i = 0; i < Stages; ++i) {
12039 unsigned MaskEnd = (1 << i);
12040
12041 if (Op.getOpcode() != CandidateBinOp)
12042 return PartialReduction(PrevOp, MaskEnd);
12043
12044 SDValue Op0 = Op.getOperand(0);
12045 SDValue Op1 = Op.getOperand(1);
12046
12047 ShuffleVectorSDNode *Shuffle = dyn_cast<ShuffleVectorSDNode>(Op0);
12048 if (Shuffle) {
12049 Op = Op1;
12050 } else {
12051 Shuffle = dyn_cast<ShuffleVectorSDNode>(Op1);
12052 Op = Op0;
12053 }
12054
12055 // The first operand of the shuffle should be the same as the other operand
12056 // of the binop.
12057 if (!Shuffle || Shuffle->getOperand(0) != Op)
12058 return PartialReduction(PrevOp, MaskEnd);
12059
12060 // Verify the shuffle has the expected (at this stage of the pyramid) mask.
12061 for (int Index = 0; Index < (int)MaskEnd; ++Index)
12062 if (Shuffle->getMaskElt(Index) != (int)(MaskEnd + Index))
12063 return PartialReduction(PrevOp, MaskEnd);
12064
12065 PrevOp = Op;
12066 }
12067
12068 // Handle subvector reductions, which tend to appear after the shuffle
12069 // reduction stages.
12070 while (Op.getOpcode() == CandidateBinOp) {
12071 unsigned NumElts = Op.getValueType().getVectorNumElements();
12072 SDValue Op0 = Op.getOperand(0);
12073 SDValue Op1 = Op.getOperand(1);
12074 if (Op0.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
12076 Op0.getOperand(0) != Op1.getOperand(0))
12077 break;
12078 SDValue Src = Op0.getOperand(0);
12079 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
12080 if (NumSrcElts != (2 * NumElts))
12081 break;
12082 if (!(Op0.getConstantOperandAPInt(1) == 0 &&
12083 Op1.getConstantOperandAPInt(1) == NumElts) &&
12084 !(Op1.getConstantOperandAPInt(1) == 0 &&
12085 Op0.getConstantOperandAPInt(1) == NumElts))
12086 break;
12087 Op = Src;
12088 }
12089
12090 BinOp = (ISD::NodeType)CandidateBinOp;
12091 return Op;
12092}
12093
12095 EVT VT = N->getValueType(0);
12096 EVT EltVT = VT.getVectorElementType();
12097 unsigned NE = VT.getVectorNumElements();
12098
12099 SDLoc dl(N);
12100
12101 // If ResNE is 0, fully unroll the vector op.
12102 if (ResNE == 0)
12103 ResNE = NE;
12104 else if (NE > ResNE)
12105 NE = ResNE;
12106
12107 if (N->getNumValues() == 2) {
12108 SmallVector<SDValue, 8> Scalars0, Scalars1;
12109 SmallVector<SDValue, 4> Operands(N->getNumOperands());
12110 EVT VT1 = N->getValueType(1);
12111 EVT EltVT1 = VT1.getVectorElementType();
12112
12113 unsigned i;
12114 for (i = 0; i != NE; ++i) {
12115 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
12116 SDValue Operand = N->getOperand(j);
12117 EVT OperandVT = Operand.getValueType();
12118
12119 // A vector operand; extract a single element.
12120 EVT OperandEltVT = OperandVT.getVectorElementType();
12121 Operands[j] = getNode(ISD::EXTRACT_VECTOR_ELT, dl, OperandEltVT,
12122 Operand, getVectorIdxConstant(i, dl));
12123 }
12124
12125 SDValue EltOp = getNode(N->getOpcode(), dl, {EltVT, EltVT1}, Operands);
12126 Scalars0.push_back(EltOp);
12127 Scalars1.push_back(EltOp.getValue(1));
12128 }
12129
12130 SDValue Vec0 = getBuildVector(VT, dl, Scalars0);
12131 SDValue Vec1 = getBuildVector(VT1, dl, Scalars1);
12132 return getMergeValues({Vec0, Vec1}, dl);
12133 }
12134
12135 assert(N->getNumValues() == 1 &&
12136 "Can't unroll a vector with multiple results!");
12137
12139 SmallVector<SDValue, 4> Operands(N->getNumOperands());
12140
12141 unsigned i;
12142 for (i= 0; i != NE; ++i) {
12143 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
12144 SDValue Operand = N->getOperand(j);
12145 EVT OperandVT = Operand.getValueType();
12146 if (OperandVT.isVector()) {
12147 // A vector operand; extract a single element.
12148 EVT OperandEltVT = OperandVT.getVectorElementType();
12149 Operands[j] = getNode(ISD::EXTRACT_VECTOR_ELT, dl, OperandEltVT,
12150 Operand, getVectorIdxConstant(i, dl));
12151 } else {
12152 // A scalar operand; just use it as is.
12153 Operands[j] = Operand;
12154 }
12155 }
12156
12157 switch (N->getOpcode()) {
12158 default: {
12159 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands,
12160 N->getFlags()));
12161 break;
12162 }
12163 case ISD::VSELECT:
12164 Scalars.push_back(getNode(ISD::SELECT, dl, EltVT, Operands));
12165 break;
12166 case ISD::SHL:
12167 case ISD::SRA:
12168 case ISD::SRL:
12169 case ISD::ROTL:
12170 case ISD::ROTR:
12171 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands[0],
12173 Operands[1])));
12174 break;
12176 EVT ExtVT = cast<VTSDNode>(Operands[1])->getVT().getVectorElementType();
12177 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT,
12178 Operands[0],
12179 getValueType(ExtVT)));
12180 }
12181 }
12182 }
12183
12184 for (; i < ResNE; ++i)
12185 Scalars.push_back(getUNDEF(EltVT));
12186
12187 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResNE);
12188 return getBuildVector(VecVT, dl, Scalars);
12189}
12190
12191std::pair<SDValue, SDValue> SelectionDAG::UnrollVectorOverflowOp(
12192 SDNode *N, unsigned ResNE) {
12193 unsigned Opcode = N->getOpcode();
12194 assert((Opcode == ISD::UADDO || Opcode == ISD::SADDO ||
12195 Opcode == ISD::USUBO || Opcode == ISD::SSUBO ||
12196 Opcode == ISD::UMULO || Opcode == ISD::SMULO) &&
12197 "Expected an overflow opcode");
12198
12199 EVT ResVT = N->getValueType(0);
12200 EVT OvVT = N->getValueType(1);
12201 EVT ResEltVT = ResVT.getVectorElementType();
12202 EVT OvEltVT = OvVT.getVectorElementType();
12203 SDLoc dl(N);
12204
12205 // If ResNE is 0, fully unroll the vector op.
12206 unsigned NE = ResVT.getVectorNumElements();
12207 if (ResNE == 0)
12208 ResNE = NE;
12209 else if (NE > ResNE)
12210 NE = ResNE;
12211
12212 SmallVector<SDValue, 8> LHSScalars;
12213 SmallVector<SDValue, 8> RHSScalars;
12214 ExtractVectorElements(N->getOperand(0), LHSScalars, 0, NE);
12215 ExtractVectorElements(N->getOperand(1), RHSScalars, 0, NE);
12216
12217 EVT SVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), ResEltVT);
12218 SDVTList VTs = getVTList(ResEltVT, SVT);
12219 SmallVector<SDValue, 8> ResScalars;
12220 SmallVector<SDValue, 8> OvScalars;
12221 for (unsigned i = 0; i < NE; ++i) {
12222 SDValue Res = getNode(Opcode, dl, VTs, LHSScalars[i], RHSScalars[i]);
12223 SDValue Ov =
12224 getSelect(dl, OvEltVT, Res.getValue(1),
12225 getBoolConstant(true, dl, OvEltVT, ResVT),
12226 getConstant(0, dl, OvEltVT));
12227
12228 ResScalars.push_back(Res);
12229 OvScalars.push_back(Ov);
12230 }
12231
12232 ResScalars.append(ResNE - NE, getUNDEF(ResEltVT));
12233 OvScalars.append(ResNE - NE, getUNDEF(OvEltVT));
12234
12235 EVT NewResVT = EVT::getVectorVT(*getContext(), ResEltVT, ResNE);
12236 EVT NewOvVT = EVT::getVectorVT(*getContext(), OvEltVT, ResNE);
12237 return std::make_pair(getBuildVector(NewResVT, dl, ResScalars),
12238 getBuildVector(NewOvVT, dl, OvScalars));
12239}
12240
12243 unsigned Bytes,
12244 int Dist) const {
12245 if (LD->isVolatile() || Base->isVolatile())
12246 return false;
12247 // TODO: probably too restrictive for atomics, revisit
12248 if (!LD->isSimple())
12249 return false;
12250 if (LD->isIndexed() || Base->isIndexed())
12251 return false;
12252 if (LD->getChain() != Base->getChain())
12253 return false;
12254 EVT VT = LD->getMemoryVT();
12255 if (VT.getSizeInBits() / 8 != Bytes)
12256 return false;
12257
12258 auto BaseLocDecomp = BaseIndexOffset::match(Base, *this);
12259 auto LocDecomp = BaseIndexOffset::match(LD, *this);
12260
12261 int64_t Offset = 0;
12262 if (BaseLocDecomp.equalBaseIndex(LocDecomp, *this, Offset))
12263 return (Dist * (int64_t)Bytes == Offset);
12264 return false;
12265}
12266
12267/// InferPtrAlignment - Infer alignment of a load / store address. Return
12268/// std::nullopt if it cannot be inferred.
12270 // If this is a GlobalAddress + cst, return the alignment.
12271 const GlobalValue *GV = nullptr;
12272 int64_t GVOffset = 0;
12273 if (TLI->isGAPlusOffset(Ptr.getNode(), GV, GVOffset)) {
12274 unsigned PtrWidth = getDataLayout().getPointerTypeSizeInBits(GV->getType());
12275 KnownBits Known(PtrWidth);
12277 unsigned AlignBits = Known.countMinTrailingZeros();
12278 if (AlignBits)
12279 return commonAlignment(Align(1ull << std::min(31U, AlignBits)), GVOffset);
12280 }
12281
12282 // If this is a direct reference to a stack slot, use information about the
12283 // stack slot's alignment.
12284 int FrameIdx = INT_MIN;
12285 int64_t FrameOffset = 0;
12286 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr)) {
12287 FrameIdx = FI->getIndex();
12288 } else if (isBaseWithConstantOffset(Ptr) &&
12289 isa<FrameIndexSDNode>(Ptr.getOperand(0))) {
12290 // Handle FI+Cst
12291 FrameIdx = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
12292 FrameOffset = Ptr.getConstantOperandVal(1);
12293 }
12294
12295 if (FrameIdx != INT_MIN) {
12297 return commonAlignment(MFI.getObjectAlign(FrameIdx), FrameOffset);
12298 }
12299
12300 return std::nullopt;
12301}
12302
12303/// Split the scalar node with EXTRACT_ELEMENT using the provided
12304/// VTs and return the low/high part.
12305std::pair<SDValue, SDValue> SelectionDAG::SplitScalar(const SDValue &N,
12306 const SDLoc &DL,
12307 const EVT &LoVT,
12308 const EVT &HiVT) {
12309 assert(!LoVT.isVector() && !HiVT.isVector() && !N.getValueType().isVector() &&
12310 "Split node must be a scalar type");
12311 SDValue Lo =
12313 SDValue Hi =
12315 return std::make_pair(Lo, Hi);
12316}
12317
12318/// GetSplitDestVTs - Compute the VTs needed for the low/hi parts of a type
12319/// which is split (or expanded) into two not necessarily identical pieces.
12320std::pair<EVT, EVT> SelectionDAG::GetSplitDestVTs(const EVT &VT) const {
12321 // Currently all types are split in half.
12322 EVT LoVT, HiVT;
12323 if (!VT.isVector())
12324 LoVT = HiVT = TLI->getTypeToTransformTo(*getContext(), VT);
12325 else
12326 LoVT = HiVT = VT.getHalfNumVectorElementsVT(*getContext());
12327
12328 return std::make_pair(LoVT, HiVT);
12329}
12330
12331/// GetDependentSplitDestVTs - Compute the VTs needed for the low/hi parts of a
12332/// type, dependent on an enveloping VT that has been split into two identical
12333/// pieces. Sets the HiIsEmpty flag when hi type has zero storage size.
12334std::pair<EVT, EVT>
12336 bool *HiIsEmpty) const {
12337 EVT EltTp = VT.getVectorElementType();
12338 // Examples:
12339 // custom VL=8 with enveloping VL=8/8 yields 8/0 (hi empty)
12340 // custom VL=9 with enveloping VL=8/8 yields 8/1
12341 // custom VL=10 with enveloping VL=8/8 yields 8/2
12342 // etc.
12343 ElementCount VTNumElts = VT.getVectorElementCount();
12344 ElementCount EnvNumElts = EnvVT.getVectorElementCount();
12345 assert(VTNumElts.isScalable() == EnvNumElts.isScalable() &&
12346 "Mixing fixed width and scalable vectors when enveloping a type");
12347 EVT LoVT, HiVT;
12348 if (VTNumElts.getKnownMinValue() > EnvNumElts.getKnownMinValue()) {
12349 LoVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
12350 HiVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts - EnvNumElts);
12351 *HiIsEmpty = false;
12352 } else {
12353 // Flag that hi type has zero storage size, but return split envelop type
12354 // (this would be easier if vector types with zero elements were allowed).
12355 LoVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts);
12356 HiVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
12357 *HiIsEmpty = true;
12358 }
12359 return std::make_pair(LoVT, HiVT);
12360}
12361
12362/// SplitVector - Split the vector with EXTRACT_SUBVECTOR and return the
12363/// low/high part.
12364std::pair<SDValue, SDValue>
12365SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT,
12366 const EVT &HiVT) {
12367 assert(LoVT.isScalableVector() == HiVT.isScalableVector() &&
12368 LoVT.isScalableVector() == N.getValueType().isScalableVector() &&
12369 "Splitting vector with an invalid mixture of fixed and scalable "
12370 "vector types");
12372 N.getValueType().getVectorMinNumElements() &&
12373 "More vector elements requested than available!");
12374 SDValue Lo, Hi;
12375 Lo =
12377 // For scalable vectors it is safe to use LoVT.getVectorMinNumElements()
12378 // (rather than having to use ElementCount), because EXTRACT_SUBVECTOR scales
12379 // IDX with the runtime scaling factor of the result vector type. For
12380 // fixed-width result vectors, that runtime scaling factor is 1.
12383 return std::make_pair(Lo, Hi);
12384}
12385
12386std::pair<SDValue, SDValue> SelectionDAG::SplitEVL(SDValue N, EVT VecVT,
12387 const SDLoc &DL) {
12388 // Split the vector length parameter.
12389 // %evl -> umin(%evl, %halfnumelts) and usubsat(%evl - %halfnumelts).
12390 EVT VT = N.getValueType();
12392 "Expecting the mask to be an evenly-sized vector");
12393 unsigned HalfMinNumElts = VecVT.getVectorMinNumElements() / 2;
12394 SDValue HalfNumElts =
12395 VecVT.isFixedLengthVector()
12396 ? getConstant(HalfMinNumElts, DL, VT)
12397 : getVScale(DL, VT, APInt(VT.getScalarSizeInBits(), HalfMinNumElts));
12398 SDValue Lo = getNode(ISD::UMIN, DL, VT, N, HalfNumElts);
12399 SDValue Hi = getNode(ISD::USUBSAT, DL, VT, N, HalfNumElts);
12400 return std::make_pair(Lo, Hi);
12401}
12402
12403/// Widen the vector up to the next power of two using INSERT_SUBVECTOR.
12405 EVT VT = N.getValueType();
12408 return getNode(ISD::INSERT_SUBVECTOR, DL, WideVT, getUNDEF(WideVT), N,
12410}
12411
12414 unsigned Start, unsigned Count,
12415 EVT EltVT) {
12416 EVT VT = Op.getValueType();
12417 if (Count == 0)
12418 Count = VT.getVectorNumElements();
12419 if (EltVT == EVT())
12420 EltVT = VT.getVectorElementType();
12421 SDLoc SL(Op);
12422 for (unsigned i = Start, e = Start + Count; i != e; ++i) {
12423 Args.push_back(getNode(ISD::EXTRACT_VECTOR_ELT, SL, EltVT, Op,
12424 getVectorIdxConstant(i, SL)));
12425 }
12426}
12427
12428// getAddressSpace - Return the address space this GlobalAddress belongs to.
12430 return getGlobal()->getType()->getAddressSpace();
12431}
12432
12435 return Val.MachineCPVal->getType();
12436 return Val.ConstVal->getType();
12437}
12438
12439bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue, APInt &SplatUndef,
12440 unsigned &SplatBitSize,
12441 bool &HasAnyUndefs,
12442 unsigned MinSplatBits,
12443 bool IsBigEndian) const {
12444 EVT VT = getValueType(0);
12445 assert(VT.isVector() && "Expected a vector type");
12446 unsigned VecWidth = VT.getSizeInBits();
12447 if (MinSplatBits > VecWidth)
12448 return false;
12449
12450 // FIXME: The widths are based on this node's type, but build vectors can
12451 // truncate their operands.
12452 SplatValue = APInt(VecWidth, 0);
12453 SplatUndef = APInt(VecWidth, 0);
12454
12455 // Get the bits. Bits with undefined values (when the corresponding element
12456 // of the vector is an ISD::UNDEF value) are set in SplatUndef and cleared
12457 // in SplatValue. If any of the values are not constant, give up and return
12458 // false.
12459 unsigned int NumOps = getNumOperands();
12460 assert(NumOps > 0 && "isConstantSplat has 0-size build vector");
12461 unsigned EltWidth = VT.getScalarSizeInBits();
12462
12463 for (unsigned j = 0; j < NumOps; ++j) {
12464 unsigned i = IsBigEndian ? NumOps - 1 - j : j;
12465 SDValue OpVal = getOperand(i);
12466 unsigned BitPos = j * EltWidth;
12467
12468 if (OpVal.isUndef())
12469 SplatUndef.setBits(BitPos, BitPos + EltWidth);
12470 else if (auto *CN = dyn_cast<ConstantSDNode>(OpVal))
12471 SplatValue.insertBits(CN->getAPIntValue().zextOrTrunc(EltWidth), BitPos);
12472 else if (auto *CN = dyn_cast<ConstantFPSDNode>(OpVal))
12473 SplatValue.insertBits(CN->getValueAPF().bitcastToAPInt(), BitPos);
12474 else
12475 return false;
12476 }
12477
12478 // The build_vector is all constants or undefs. Find the smallest element
12479 // size that splats the vector.
12480 HasAnyUndefs = (SplatUndef != 0);
12481
12482 // FIXME: This does not work for vectors with elements less than 8 bits.
12483 while (VecWidth > 8) {
12484 // If we can't split in half, stop here.
12485 if (VecWidth & 1)
12486 break;
12487
12488 unsigned HalfSize = VecWidth / 2;
12489 APInt HighValue = SplatValue.extractBits(HalfSize, HalfSize);
12490 APInt LowValue = SplatValue.extractBits(HalfSize, 0);
12491 APInt HighUndef = SplatUndef.extractBits(HalfSize, HalfSize);
12492 APInt LowUndef = SplatUndef.extractBits(HalfSize, 0);
12493
12494 // If the two halves do not match (ignoring undef bits), stop here.
12495 if ((HighValue & ~LowUndef) != (LowValue & ~HighUndef) ||
12496 MinSplatBits > HalfSize)
12497 break;
12498
12499 SplatValue = HighValue | LowValue;
12500 SplatUndef = HighUndef & LowUndef;
12501
12502 VecWidth = HalfSize;
12503 }
12504
12505 // FIXME: The loop above only tries to split in halves. But if the input
12506 // vector for example is <3 x i16> it wouldn't be able to detect a
12507 // SplatBitSize of 16. No idea if that is a design flaw currently limiting
12508 // optimizations. I guess that back in the days when this helper was created
12509 // vectors normally was power-of-2 sized.
12510
12511 SplatBitSize = VecWidth;
12512 return true;
12513}
12514
12516 BitVector *UndefElements) const {
12517 unsigned NumOps = getNumOperands();
12518 if (UndefElements) {
12519 UndefElements->clear();
12520 UndefElements->resize(NumOps);
12521 }
12522 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
12523 if (!DemandedElts)
12524 return SDValue();
12525 SDValue Splatted;
12526 for (unsigned i = 0; i != NumOps; ++i) {
12527 if (!DemandedElts[i])
12528 continue;
12529 SDValue Op = getOperand(i);
12530 if (Op.isUndef()) {
12531 if (UndefElements)
12532 (*UndefElements)[i] = true;
12533 } else if (!Splatted) {
12534 Splatted = Op;
12535 } else if (Splatted != Op) {
12536 return SDValue();
12537 }
12538 }
12539
12540 if (!Splatted) {
12541 unsigned FirstDemandedIdx = DemandedElts.countr_zero();
12542 assert(getOperand(FirstDemandedIdx).isUndef() &&
12543 "Can only have a splat without a constant for all undefs.");
12544 return getOperand(FirstDemandedIdx);
12545 }
12546
12547 return Splatted;
12548}
12549
12551 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
12552 return getSplatValue(DemandedElts, UndefElements);
12553}
12554
12556 SmallVectorImpl<SDValue> &Sequence,
12557 BitVector *UndefElements) const {
12558 unsigned NumOps = getNumOperands();
12559 Sequence.clear();
12560 if (UndefElements) {
12561 UndefElements->clear();
12562 UndefElements->resize(NumOps);
12563 }
12564 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
12565 if (!DemandedElts || NumOps < 2 || !isPowerOf2_32(NumOps))
12566 return false;
12567
12568 // Set the undefs even if we don't find a sequence (like getSplatValue).
12569 if (UndefElements)
12570 for (unsigned I = 0; I != NumOps; ++I)
12571 if (DemandedElts[I] && getOperand(I).isUndef())
12572 (*UndefElements)[I] = true;
12573
12574 // Iteratively widen the sequence length looking for repetitions.
12575 for (unsigned SeqLen = 1; SeqLen < NumOps; SeqLen *= 2) {
12576 Sequence.append(SeqLen, SDValue());
12577 for (unsigned I = 0; I != NumOps; ++I) {
12578 if (!DemandedElts[I])
12579 continue;
12580 SDValue &SeqOp = Sequence[I % SeqLen];
12582 if (Op.isUndef()) {
12583 if (!SeqOp)
12584 SeqOp = Op;
12585 continue;
12586 }
12587 if (SeqOp && !SeqOp.isUndef() && SeqOp != Op) {
12588 Sequence.clear();
12589 break;
12590 }
12591 SeqOp = Op;
12592 }
12593 if (!Sequence.empty())
12594 return true;
12595 }
12596
12597 assert(Sequence.empty() && "Failed to empty non-repeating sequence pattern");
12598 return false;
12599}
12600
12602 BitVector *UndefElements) const {
12603 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
12604 return getRepeatedSequence(DemandedElts, Sequence, UndefElements);
12605}
12606
12609 BitVector *UndefElements) const {
12610 return dyn_cast_or_null<ConstantSDNode>(
12611 getSplatValue(DemandedElts, UndefElements));
12612}
12613
12616 return dyn_cast_or_null<ConstantSDNode>(getSplatValue(UndefElements));
12617}
12618
12621 BitVector *UndefElements) const {
12622 return dyn_cast_or_null<ConstantFPSDNode>(
12623 getSplatValue(DemandedElts, UndefElements));
12624}
12625
12628 return dyn_cast_or_null<ConstantFPSDNode>(getSplatValue(UndefElements));
12629}
12630
12631int32_t
12633 uint32_t BitWidth) const {
12634 if (ConstantFPSDNode *CN =
12635 dyn_cast_or_null<ConstantFPSDNode>(getSplatValue(UndefElements))) {
12636 bool IsExact;
12637 APSInt IntVal(BitWidth);
12638 const APFloat &APF = CN->getValueAPF();
12639 if (APF.convertToInteger(IntVal, APFloat::rmTowardZero, &IsExact) !=
12640 APFloat::opOK ||
12641 !IsExact)
12642 return -1;
12643
12644 return IntVal.exactLogBase2();
12645 }
12646 return -1;
12647}
12648
12650 bool IsLittleEndian, unsigned DstEltSizeInBits,
12651 SmallVectorImpl<APInt> &RawBitElements, BitVector &UndefElements) const {
12652 // Early-out if this contains anything but Undef/Constant/ConstantFP.
12653 if (!isConstant())
12654 return false;
12655
12656 unsigned NumSrcOps = getNumOperands();
12657 unsigned SrcEltSizeInBits = getValueType(0).getScalarSizeInBits();
12658 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
12659 "Invalid bitcast scale");
12660
12661 // Extract raw src bits.
12662 SmallVector<APInt> SrcBitElements(NumSrcOps,
12663 APInt::getZero(SrcEltSizeInBits));
12664 BitVector SrcUndeElements(NumSrcOps, false);
12665
12666 for (unsigned I = 0; I != NumSrcOps; ++I) {
12668 if (Op.isUndef()) {
12669 SrcUndeElements.set(I);
12670 continue;
12671 }
12672 auto *CInt = dyn_cast<ConstantSDNode>(Op);
12673 auto *CFP = dyn_cast<ConstantFPSDNode>(Op);
12674 assert((CInt || CFP) && "Unknown constant");
12675 SrcBitElements[I] = CInt ? CInt->getAPIntValue().trunc(SrcEltSizeInBits)
12676 : CFP->getValueAPF().bitcastToAPInt();
12677 }
12678
12679 // Recast to dst width.
12680 recastRawBits(IsLittleEndian, DstEltSizeInBits, RawBitElements,
12681 SrcBitElements, UndefElements, SrcUndeElements);
12682 return true;
12683}
12684
12685void BuildVectorSDNode::recastRawBits(bool IsLittleEndian,
12686 unsigned DstEltSizeInBits,
12687 SmallVectorImpl<APInt> &DstBitElements,
12688 ArrayRef<APInt> SrcBitElements,
12689 BitVector &DstUndefElements,
12690 const BitVector &SrcUndefElements) {
12691 unsigned NumSrcOps = SrcBitElements.size();
12692 unsigned SrcEltSizeInBits = SrcBitElements[0].getBitWidth();
12693 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
12694 "Invalid bitcast scale");
12695 assert(NumSrcOps == SrcUndefElements.size() &&
12696 "Vector size mismatch");
12697
12698 unsigned NumDstOps = (NumSrcOps * SrcEltSizeInBits) / DstEltSizeInBits;
12699 DstUndefElements.clear();
12700 DstUndefElements.resize(NumDstOps, false);
12701 DstBitElements.assign(NumDstOps, APInt::getZero(DstEltSizeInBits));
12702
12703 // Concatenate src elements constant bits together into dst element.
12704 if (SrcEltSizeInBits <= DstEltSizeInBits) {
12705 unsigned Scale = DstEltSizeInBits / SrcEltSizeInBits;
12706 for (unsigned I = 0; I != NumDstOps; ++I) {
12707 DstUndefElements.set(I);
12708 APInt &DstBits = DstBitElements[I];
12709 for (unsigned J = 0; J != Scale; ++J) {
12710 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
12711 if (SrcUndefElements[Idx])
12712 continue;
12713 DstUndefElements.reset(I);
12714 const APInt &SrcBits = SrcBitElements[Idx];
12715 assert(SrcBits.getBitWidth() == SrcEltSizeInBits &&
12716 "Illegal constant bitwidths");
12717 DstBits.insertBits(SrcBits, J * SrcEltSizeInBits);
12718 }
12719 }
12720 return;
12721 }
12722
12723 // Split src element constant bits into dst elements.
12724 unsigned Scale = SrcEltSizeInBits / DstEltSizeInBits;
12725 for (unsigned I = 0; I != NumSrcOps; ++I) {
12726 if (SrcUndefElements[I]) {
12727 DstUndefElements.set(I * Scale, (I + 1) * Scale);
12728 continue;
12729 }
12730 const APInt &SrcBits = SrcBitElements[I];
12731 for (unsigned J = 0; J != Scale; ++J) {
12732 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
12733 APInt &DstBits = DstBitElements[Idx];
12734 DstBits = SrcBits.extractBits(DstEltSizeInBits, J * DstEltSizeInBits);
12735 }
12736 }
12737}
12738
12740 for (const SDValue &Op : op_values()) {
12741 unsigned Opc = Op.getOpcode();
12742 if (Opc != ISD::UNDEF && Opc != ISD::Constant && Opc != ISD::ConstantFP)
12743 return false;
12744 }
12745 return true;
12746}
12747
12748std::optional<std::pair<APInt, APInt>>
12750 unsigned NumOps = getNumOperands();
12751 if (NumOps < 2)
12752 return std::nullopt;
12753
12754 if (!isa<ConstantSDNode>(getOperand(0)) ||
12755 !isa<ConstantSDNode>(getOperand(1)))
12756 return std::nullopt;
12757
12758 unsigned EltSize = getValueType(0).getScalarSizeInBits();
12759 APInt Start = getConstantOperandAPInt(0).trunc(EltSize);
12760 APInt Stride = getConstantOperandAPInt(1).trunc(EltSize) - Start;
12761
12762 if (Stride.isZero())
12763 return std::nullopt;
12764
12765 for (unsigned i = 2; i < NumOps; ++i) {
12766 if (!isa<ConstantSDNode>(getOperand(i)))
12767 return std::nullopt;
12768
12769 APInt Val = getConstantOperandAPInt(i).trunc(EltSize);
12770 if (Val != (Start + (Stride * i)))
12771 return std::nullopt;
12772 }
12773
12774 return std::make_pair(Start, Stride);
12775}
12776
12777bool ShuffleVectorSDNode::isSplatMask(const int *Mask, EVT VT) {
12778 // Find the first non-undef value in the shuffle mask.
12779 unsigned i, e;
12780 for (i = 0, e = VT.getVectorNumElements(); i != e && Mask[i] < 0; ++i)
12781 /* search */;
12782
12783 // If all elements are undefined, this shuffle can be considered a splat
12784 // (although it should eventually get simplified away completely).
12785 if (i == e)
12786 return true;
12787
12788 // Make sure all remaining elements are either undef or the same as the first
12789 // non-undef value.
12790 for (int Idx = Mask[i]; i != e; ++i)
12791 if (Mask[i] >= 0 && Mask[i] != Idx)
12792 return false;
12793 return true;
12794}
12795
12796// Returns the SDNode if it is a constant integer BuildVector
12797// or constant integer.
12799 if (isa<ConstantSDNode>(N))
12800 return N.getNode();
12802 return N.getNode();
12803 // Treat a GlobalAddress supporting constant offset folding as a
12804 // constant integer.
12805 if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(N))
12806 if (GA->getOpcode() == ISD::GlobalAddress &&
12807 TLI->isOffsetFoldingLegal(GA))
12808 return GA;
12809 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
12810 isa<ConstantSDNode>(N.getOperand(0)))
12811 return N.getNode();
12812 return nullptr;
12813}
12814
12815// Returns the SDNode if it is a constant float BuildVector
12816// or constant float.
12818 if (isa<ConstantFPSDNode>(N))
12819 return N.getNode();
12820
12822 return N.getNode();
12823
12824 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
12825 isa<ConstantFPSDNode>(N.getOperand(0)))
12826 return N.getNode();
12827
12828 return nullptr;
12829}
12830
12831void SelectionDAG::createOperands(SDNode *Node, ArrayRef<SDValue> Vals) {
12832 assert(!Node->OperandList && "Node already has operands");
12834 "too many operands to fit into SDNode");
12835 SDUse *Ops = OperandRecycler.allocate(
12836 ArrayRecycler<SDUse>::Capacity::get(Vals.size()), OperandAllocator);
12837
12838 bool IsDivergent = false;
12839 for (unsigned I = 0; I != Vals.size(); ++I) {
12840 Ops[I].setUser(Node);
12841 Ops[I].setInitial(Vals[I]);
12842 if (Ops[I].Val.getValueType() != MVT::Other) // Skip Chain. It does not carry divergence.
12843 IsDivergent |= Ops[I].getNode()->isDivergent();
12844 }
12845 Node->NumOperands = Vals.size();
12846 Node->OperandList = Ops;
12847 if (!TLI->isSDNodeAlwaysUniform(Node)) {
12848 IsDivergent |= TLI->isSDNodeSourceOfDivergence(Node, FLI, UA);
12849 Node->SDNodeBits.IsDivergent = IsDivergent;
12850 }
12852}
12853
12856 size_t Limit = SDNode::getMaxNumOperands();
12857 while (Vals.size() > Limit) {
12858 unsigned SliceIdx = Vals.size() - Limit;
12859 auto ExtractedTFs = ArrayRef<SDValue>(Vals).slice(SliceIdx, Limit);
12860 SDValue NewTF = getNode(ISD::TokenFactor, DL, MVT::Other, ExtractedTFs);
12861 Vals.erase(Vals.begin() + SliceIdx, Vals.end());
12862 Vals.emplace_back(NewTF);
12863 }
12864 return getNode(ISD::TokenFactor, DL, MVT::Other, Vals);
12865}
12866
12868 EVT VT, SDNodeFlags Flags) {
12869 switch (Opcode) {
12870 default:
12871 return SDValue();
12872 case ISD::ADD:
12873 case ISD::OR:
12874 case ISD::XOR:
12875 case ISD::UMAX:
12876 return getConstant(0, DL, VT);
12877 case ISD::MUL:
12878 return getConstant(1, DL, VT);
12879 case ISD::AND:
12880 case ISD::UMIN:
12881 return getAllOnesConstant(DL, VT);
12882 case ISD::SMAX:
12884 case ISD::SMIN:
12886 case ISD::FADD:
12887 return getConstantFP(-0.0, DL, VT);
12888 case ISD::FMUL:
12889 return getConstantFP(1.0, DL, VT);
12890 case ISD::FMINNUM:
12891 case ISD::FMAXNUM: {
12892 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
12893 const fltSemantics &Semantics = EVTToAPFloatSemantics(VT);
12894 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics) :
12895 !Flags.hasNoInfs() ? APFloat::getInf(Semantics) :
12896 APFloat::getLargest(Semantics);
12897 if (Opcode == ISD::FMAXNUM)
12898 NeutralAF.changeSign();
12899
12900 return getConstantFP(NeutralAF, DL, VT);
12901 }
12902 case ISD::FMINIMUM:
12903 case ISD::FMAXIMUM: {
12904 // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
12905 const fltSemantics &Semantics = EVTToAPFloatSemantics(VT);
12906 APFloat NeutralAF = !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
12907 : APFloat::getLargest(Semantics);
12908 if (Opcode == ISD::FMAXIMUM)
12909 NeutralAF.changeSign();
12910
12911 return getConstantFP(NeutralAF, DL, VT);
12912 }
12913
12914 }
12915}
12916
12917/// Helper used to make a call to a library function that has one argument of
12918/// pointer type.
12919///
12920/// Such functions include 'fegetmode', 'fesetenv' and some others, which are
12921/// used to get or set floating-point state. They have one argument of pointer
12922/// type, which points to the memory region containing bits of the
12923/// floating-point state. The value returned by such function is ignored in the
12924/// created call.
12925///
12926/// \param LibFunc Reference to library function (value of RTLIB::Libcall).
12927/// \param Ptr Pointer used to save/load state.
12928/// \param InChain Ingoing token chain.
12929/// \returns Outgoing chain token.
12931 SDValue InChain,
12932 const SDLoc &DLoc) {
12933 assert(InChain.getValueType() == MVT::Other && "Expected token chain");
12936 Entry.Node = Ptr;
12937 Entry.Ty = Ptr.getValueType().getTypeForEVT(*getContext());
12938 Args.push_back(Entry);
12939 RTLIB::Libcall LC = static_cast<RTLIB::Libcall>(LibFunc);
12940 SDValue Callee = getExternalSymbol(TLI->getLibcallName(LC),
12941 TLI->getPointerTy(getDataLayout()));
12943 CLI.setDebugLoc(DLoc).setChain(InChain).setLibCallee(
12944 TLI->getLibcallCallingConv(LC), Type::getVoidTy(*getContext()), Callee,
12945 std::move(Args));
12946 return TLI->LowerCallTo(CLI).second;
12947}
12948
12950 assert(From && To && "Invalid SDNode; empty source SDValue?");
12951 auto I = SDEI.find(From);
12952 if (I == SDEI.end())
12953 return;
12954
12955 // Use of operator[] on the DenseMap may cause an insertion, which invalidates
12956 // the iterator, hence the need to make a copy to prevent a use-after-free.
12957 NodeExtraInfo NEI = I->second;
12958 if (LLVM_LIKELY(!NEI.PCSections) && LLVM_LIKELY(!NEI.MMRA)) {
12959 // No deep copy required for the types of extra info set.
12960 //
12961 // FIXME: Investigate if other types of extra info also need deep copy. This
12962 // depends on the types of nodes they can be attached to: if some extra info
12963 // is only ever attached to nodes where a replacement To node is always the
12964 // node where later use and propagation of the extra info has the intended
12965 // semantics, no deep copy is required.
12966 SDEI[To] = std::move(NEI);
12967 return;
12968 }
12969
12970 // We need to copy NodeExtraInfo to all _new_ nodes that are being introduced
12971 // through the replacement of From with To. Otherwise, replacements of a node
12972 // (From) with more complex nodes (To and its operands) may result in lost
12973 // extra info where the root node (To) is insignificant in further propagating
12974 // and using extra info when further lowering to MIR.
12975 //
12976 // In the first step pre-populate the visited set with the nodes reachable
12977 // from the old From node. This avoids copying NodeExtraInfo to parts of the
12978 // DAG that is not new and should be left untouched.
12979 SmallVector<const SDNode *> Leafs{From}; // Leafs reachable with VisitFrom.
12980 DenseSet<const SDNode *> FromReach; // The set of nodes reachable from From.
12981 auto VisitFrom = [&](auto &&Self, const SDNode *N, int MaxDepth) {
12982 if (MaxDepth == 0) {
12983 // Remember this node in case we need to increase MaxDepth and continue
12984 // populating FromReach from this node.
12985 Leafs.emplace_back(N);
12986 return;
12987 }
12988 if (!FromReach.insert(N).second)
12989 return;
12990 for (const SDValue &Op : N->op_values())
12991 Self(Self, Op.getNode(), MaxDepth - 1);
12992 };
12993
12994 // Copy extra info to To and all its transitive operands (that are new).
12996 auto DeepCopyTo = [&](auto &&Self, const SDNode *N) {
12997 if (FromReach.contains(N))
12998 return true;
12999 if (!Visited.insert(N).second)
13000 return true;
13001 if (getEntryNode().getNode() == N)
13002 return false;
13003 for (const SDValue &Op : N->op_values()) {
13004 if (!Self(Self, Op.getNode()))
13005 return false;
13006 }
13007 // Copy only if entry node was not reached.
13008 SDEI[N] = NEI;
13009 return true;
13010 };
13011
13012 // We first try with a lower MaxDepth, assuming that the path to common
13013 // operands between From and To is relatively short. This significantly
13014 // improves performance in the common case. The initial MaxDepth is big
13015 // enough to avoid retry in the common case; the last MaxDepth is large
13016 // enough to avoid having to use the fallback below (and protects from
13017 // potential stack exhaustion from recursion).
13018 for (int PrevDepth = 0, MaxDepth = 16; MaxDepth <= 1024;
13019 PrevDepth = MaxDepth, MaxDepth *= 2, Visited.clear()) {
13020 // StartFrom is the previous (or initial) set of leafs reachable at the
13021 // previous maximum depth.
13023 std::swap(StartFrom, Leafs);
13024 for (const SDNode *N : StartFrom)
13025 VisitFrom(VisitFrom, N, MaxDepth - PrevDepth);
13026 if (LLVM_LIKELY(DeepCopyTo(DeepCopyTo, To)))
13027 return;
13028 // This should happen very rarely (reached the entry node).
13029 LLVM_DEBUG(dbgs() << __func__ << ": MaxDepth=" << MaxDepth << " too low\n");
13030 assert(!Leafs.empty());
13031 }
13032
13033 // This should not happen - but if it did, that means the subgraph reachable
13034 // from From has depth greater or equal to maximum MaxDepth, and VisitFrom()
13035 // could not visit all reachable common operands. Consequently, we were able
13036 // to reach the entry node.
13037 errs() << "warning: incomplete propagation of SelectionDAG::NodeExtraInfo\n";
13038 assert(false && "From subgraph too complex - increase max. MaxDepth?");
13039 // Best-effort fallback if assertions disabled.
13040 SDEI[To] = std::move(NEI);
13041}
13042
13043#ifndef NDEBUG
13044static void checkForCyclesHelper(const SDNode *N,
13047 const llvm::SelectionDAG *DAG) {
13048 // If this node has already been checked, don't check it again.
13049 if (Checked.count(N))
13050 return;
13051
13052 // If a node has already been visited on this depth-first walk, reject it as
13053 // a cycle.
13054 if (!Visited.insert(N).second) {
13055 errs() << "Detected cycle in SelectionDAG\n";
13056 dbgs() << "Offending node:\n";
13057 N->dumprFull(DAG); dbgs() << "\n";
13058 abort();
13059 }
13060
13061 for (const SDValue &Op : N->op_values())
13062 checkForCyclesHelper(Op.getNode(), Visited, Checked, DAG);
13063
13064 Checked.insert(N);
13065 Visited.erase(N);
13066}
13067#endif
13068
13070 const llvm::SelectionDAG *DAG,
13071 bool force) {
13072#ifndef NDEBUG
13073 bool check = force;
13074#ifdef EXPENSIVE_CHECKS
13075 check = true;
13076#endif // EXPENSIVE_CHECKS
13077 if (check) {
13078 assert(N && "Checking nonexistent SDNode");
13081 checkForCyclesHelper(N, visited, checked, DAG);
13082 }
13083#endif // !NDEBUG
13084}
13085
13086void llvm::checkForCycles(const llvm::SelectionDAG *DAG, bool force) {
13087 checkForCycles(DAG->getRoot().getNode(), DAG, force);
13088}
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:750
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition: ISDOpcodes.h:236
@ CTLZ_ZERO_UNDEF
Definition: ISDOpcodes.h:723
@ TargetConstantPool
Definition: ISDOpcodes.h:168
@ MDNODE_SDNODE
MDNODE_SDNODE - This is a node that holdes an MDNode*, which is used to reference metadata in the IR.
Definition: ISDOpcodes.h:1177
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
Definition: ISDOpcodes.h:476
@ ATOMIC_LOAD_FMAX
Definition: ISDOpcodes.h:1282
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition: ISDOpcodes.h:44
@ VECREDUCE_SEQ_FADD
Generic reduction nodes.
Definition: ISDOpcodes.h:1345
@ VECREDUCE_SMIN
Definition: ISDOpcodes.h:1376
@ FGETSIGN
INT = FGETSIGN(FP) - Return the sign bit of the specified floating point value as an integer 0/1 valu...
Definition: ISDOpcodes.h:497
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
Definition: ISDOpcodes.h:250
@ ATOMIC_LOAD_NAND
Definition: ISDOpcodes.h:1275
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition: ISDOpcodes.h:559
@ JUMP_TABLE_DEBUG_INFO
JUMP_TABLE_DEBUG_INFO - Jumptable debug info.
Definition: ISDOpcodes.h:1066
@ BSWAP
Byte Swap and Counting operators.
Definition: ISDOpcodes.h:714
@ TargetBlockAddress
Definition: ISDOpcodes.h:170
@ ConstantFP
Definition: ISDOpcodes.h:77
@ ATOMIC_LOAD_MAX
Definition: ISDOpcodes.h:1277
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, ptr, val) This corresponds to "store atomic" instruction.
Definition: ISDOpcodes.h:1247
@ ATOMIC_LOAD_UMIN
Definition: ISDOpcodes.h:1278
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
Definition: ISDOpcodes.h:269
@ FMAD
FMAD - Perform a * b + c, while getting the same result as the separately rounded operations.
Definition: ISDOpcodes.h:487
@ FMAXNUM_IEEE
Definition: ISDOpcodes.h:985
@ ADD
Simple integer binary arithmetic operators.
Definition: ISDOpcodes.h:239
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
Definition: ISDOpcodes.h:1037
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition: ISDOpcodes.h:783
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition: ISDOpcodes.h:483
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition: ISDOpcodes.h:199
@ GlobalAddress
Definition: ISDOpcodes.h:78
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
Definition: ISDOpcodes.h:1260
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition: ISDOpcodes.h:790
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition: ISDOpcodes.h:543
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
Definition: ISDOpcodes.h:1361
@ FADD
Simple binary floating point operators.
Definition: ISDOpcodes.h:390
@ VECREDUCE_FMAXIMUM
FMINIMUM/FMAXIMUM nodes propatate NaNs and signed zeroes using the llvm.minimum and llvm....
Definition: ISDOpcodes.h:1365
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition: ISDOpcodes.h:688
@ SIGN_EXTEND_VECTOR_INREG
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
Definition: ISDOpcodes.h:820
@ VECREDUCE_SMAX
Definition: ISDOpcodes.h:1375
@ STRICT_FSETCCS
Definition: ISDOpcodes.h:477
@ FP16_TO_FP
FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions and truncation for half-preci...
Definition: ISDOpcodes.h:913
@ ATOMIC_LOAD_OR
Definition: ISDOpcodes.h:1273
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
Definition: ISDOpcodes.h:903
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition: ISDOpcodes.h:229
@ ATOMIC_LOAD_XOR
Definition: ISDOpcodes.h:1274
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
Definition: ISDOpcodes.h:939
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
Definition: ISDOpcodes.h:1406
@ ATOMIC_LOAD_FADD
Definition: ISDOpcodes.h:1280
@ GlobalTLSAddress
Definition: ISDOpcodes.h:79
@ SRCVALUE
SRCVALUE - This is a node type that holds a Value* that is used to make reference to a value in the L...
Definition: ISDOpcodes.h:1173
@ FrameIndex
Definition: ISDOpcodes.h:80
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
Definition: ISDOpcodes.h:1108
@ SIGN_EXTEND
Conversion operators.
Definition: ISDOpcodes.h:774
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
Definition: ISDOpcodes.h:662
@ SCALAR_TO_VECTOR
SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a scalar value into element 0 of the...
Definition: ISDOpcodes.h:620
@ TargetExternalSymbol
Definition: ISDOpcodes.h:169
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
Definition: ISDOpcodes.h:1358
@ CTTZ_ZERO_UNDEF
Bit counting operators with an undefined result for zero inputs.
Definition: ISDOpcodes.h:722
@ TargetJumpTable
Definition: ISDOpcodes.h:167
@ TargetIndex
TargetIndex - Like a constant pool entry, but with completely target-dependent semantics.
Definition: ISDOpcodes.h:177
@ PREFETCH
PREFETCH - This corresponds to a prefetch intrinsic.
Definition: ISDOpcodes.h:1227
@ VECREDUCE_FMIN
Definition: ISDOpcodes.h:1362
@ SETCCCARRY
Like SetCC, ops #0 and #1 are the LHS and RHS operands to compare, but op #2 is a boolean indicating ...
Definition: ISDOpcodes.h:758
@ FNEG
Perform various unary floating-point operations inspired by libm.
Definition: ISDOpcodes.h:930
@ ATOMIC_LOAD_FSUB
Definition: ISDOpcodes.h:1281
@ BR_CC
BR_CC - Conditional branch.
Definition: ISDOpcodes.h:1083
@ SSUBO
Same for subtraction.
Definition: ISDOpcodes.h:327
@ ATOMIC_LOAD_MIN
Definition: ISDOpcodes.h:1276
@ STEP_VECTOR
STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised of a linear sequence of unsign...
Definition: ISDOpcodes.h:646
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition: ISDOpcodes.h:500
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition: ISDOpcodes.h:349
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition: ISDOpcodes.h:727
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
Definition: ISDOpcodes.h:1243
@ UNDEF
UNDEF - An undefined node.
Definition: ISDOpcodes.h:211
@ VECREDUCE_UMAX
Definition: ISDOpcodes.h:1377
@ RegisterMask
Definition: ISDOpcodes.h:75
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition: ISDOpcodes.h:222
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition: ISDOpcodes.h:627
@ AssertAlign
AssertAlign - These nodes record if a register contains a value that has a known alignment and the tr...
Definition: ISDOpcodes.h:68
@ ATOMIC_LOAD_FMIN
Definition: ISDOpcodes.h:1283
@ BasicBlock
Various leaf nodes.
Definition: ISDOpcodes.h:71
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition: ISDOpcodes.h:323
@ TargetGlobalAddress
TargetGlobalAddress - Like GlobalAddress, but the DAG does no folding or anything else with this node...
Definition: ISDOpcodes.h:164
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
Definition: ISDOpcodes.h:1370
@ MULHU
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
Definition: ISDOpcodes.h:651
@ SHL
Shift and rotation operations.
Definition: ISDOpcodes.h:705
@ ATOMIC_LOAD_CLR
Definition: ISDOpcodes.h:1272
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
Definition: ISDOpcodes.h:600
@ ATOMIC_LOAD_AND
Definition: ISDOpcodes.h:1271
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition: ISDOpcodes.h:573
@ FMINNUM_IEEE
FMINNUM_IEEE/FMAXNUM_IEEE - Perform floating-point minimumNumber or maximumNumber on two values,...
Definition: ISDOpcodes.h:984
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
Definition: ISDOpcodes.h:47
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition: ISDOpcodes.h:535
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition: ISDOpcodes.h:780
@ TargetConstantFP
Definition: ISDOpcodes.h:159
@ FP_TO_UINT_SAT
Definition: ISDOpcodes.h:856
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
Definition: ISDOpcodes.h:742
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
Definition: ISDOpcodes.h:1335
@ ATOMIC_CMP_SWAP
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo,...
Definition: ISDOpcodes.h:1254
@ ATOMIC_LOAD_UMAX
Definition: ISDOpcodes.h:1279
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum or maximum on two values.
Definition: ISDOpcodes.h:971
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition: ISDOpcodes.h:359
@ SMULO
Same for multiplication.
Definition: ISDOpcodes.h:331
@ TargetFrameIndex
Definition: ISDOpcodes.h:166
@ ConstantPool
Definition: ISDOpcodes.h:82
@ ANY_EXTEND_VECTOR_INREG
ANY_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register any-extension of the low la...
Definition: ISDOpcodes.h:809
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition: ISDOpcodes.h:798
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition: ISDOpcodes.h:674
@ LIFETIME_START
This corresponds to the llvm.lifetime.
Definition: ISDOpcodes.h:1310
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition: ISDOpcodes.h:888
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition: ISDOpcodes.h:736
@ UADDO_CARRY
Carry-using nodes for multiple precision addition and subtraction.
Definition: ISDOpcodes.h:303
@ HANDLENODE
HANDLENODE node - Used as a handle for various purposes.
Definition: ISDOpcodes.h:1197
@ VECREDUCE_UMIN
Definition: ISDOpcodes.h:1378
@ BF16_TO_FP
BF16_TO_FP, FP_TO_BF16 - These operators are used to perform promotions and truncation for bfloat16.
Definition: ISDOpcodes.h:922
@ ATOMIC_LOAD_UDEC_WRAP
Definition: ISDOpcodes.h:1285
@ ATOMIC_LOAD_ADD
Definition: ISDOpcodes.h:1269
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition: ISDOpcodes.h:465
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
Definition: ISDOpcodes.h:990
@ ATOMIC_LOAD_SUB
Definition: ISDOpcodes.h:1270
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition: ISDOpcodes.h:836
@ TargetConstant
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification,...
Definition: ISDOpcodes.h:158
@ STRICT_FP_EXTEND
X = STRICT_FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition: ISDOpcodes.h:470
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition: ISDOpcodes.h:680
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition: ISDOpcodes.h:184
@ GET_FPENV_MEM
Gets the current floating-point environment.
Definition: ISDOpcodes.h:1013
@ PSEUDO_PROBE
Pseudo probe for AutoFDO, as a place holder in a basic block to improve the sample counts quality.
Definition: ISDOpcodes.h:1330
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
Definition: ISDOpcodes.h:657
@ VECREDUCE_FMUL
Definition: ISDOpcodes.h:1359
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
Definition: ISDOpcodes.h:279
@ SPLAT_VECTOR_PARTS
SPLAT_VECTOR_PARTS(SCALAR1, SCALAR2, ...) - Returns a vector with the scalar values joined together a...
Definition: ISDOpcodes.h:636
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition: ISDOpcodes.h:524
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition: ISDOpcodes.h:52
@ VECTOR_SPLICE
VECTOR_SPLICE(VEC1, VEC2, IMM) - Returns a subvector of the same type as VEC1/VEC2 from CONCAT_VECTOR...
Definition: ISDOpcodes.h:612
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
Definition: ISDOpcodes.h:1268
@ ExternalSymbol
Definition: ISDOpcodes.h:83
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
Definition: ISDOpcodes.h:944
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition: ISDOpcodes.h:869
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
Definition: ISDOpcodes.h:831
@ ADDRSPACECAST
ADDRSPACECAST - This operator converts between pointers of different address spaces.
Definition: ISDOpcodes.h:907
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
Definition: ISDOpcodes.h:855
@ VECREDUCE_FMINIMUM
Definition: ISDOpcodes.h:1366
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition: ISDOpcodes.h:786
@ VAARG
VAARG - VAARG has four operands: an input chain, a pointer, a SRCVALUE, and the alignment.
Definition: ISDOpcodes.h:1152
@ BlockAddress
Definition: ISDOpcodes.h:84
@ VECREDUCE_SEQ_FMUL
Definition: ISDOpcodes.h:1346
@ SHL_PARTS
SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded integer shift operations.
Definition: ISDOpcodes.h:763
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition: ISDOpcodes.h:61
@ ATOMIC_LOAD_UINC_WRAP
Definition: ISDOpcodes.h:1284
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition: ISDOpcodes.h:493
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition: ISDOpcodes.h:340
@ AssertZext
Definition: ISDOpcodes.h:62
@ SET_FPENV_MEM
Sets the current floating point environment.
Definition: ISDOpcodes.h:1018
@ SADDO_CARRY
Carry-using overflow-aware nodes for multiple precision addition and subtraction.
Definition: ISDOpcodes.h:313
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition: ISDOpcodes.h:192
@ TargetGlobalTLSAddress
Definition: ISDOpcodes.h:165
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition: ISDOpcodes.h:515
unsigned getVPForBaseOpcode(unsigned Opcode)
Translate this non-VP Opcode to its corresponding VP Opcode.
bool isBuildVectorOfConstantSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantSDNode or undef.
NodeType getExtForLoadExtType(bool IsFP, LoadExtType)
bool matchUnaryPredicate(SDValue Op, std::function< bool(ConstantSDNode *)> Match, bool AllowUndefs=false)
Hook for matching ConstantSDNode predicate.
bool isZEXTLoad(const SDNode *N)
Returns true if the specified node is a ZEXTLOAD.
bool matchUnaryFpPredicate(SDValue Op, std::function< bool(ConstantFPSDNode *)> Match, bool AllowUndefs=false)
Hook for matching ConstantFPSDNode predicate.
static const int FIRST_TARGET_MEMORY_OPCODE
FIRST_TARGET_MEMORY_OPCODE - Target-specific pre-isel operations which do not reference a specific me...
Definition: ISDOpcodes.h:1418
bool isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are 0 o...
bool isVectorShrinkable(const SDNode *N, unsigned NewEltSize, bool Signed)
Returns true if the specified node is a vector where all elements can be truncated to the specified e...
bool matchUnaryPredicateImpl(SDValue Op, std::function< bool(ConstNodeType *)> Match, bool AllowUndefs=false)
Attempt to match a unary predicate against a scalar/splat constant or every element of a constant BUI...
bool isVPBinaryOp(unsigned Opcode)
Whether this is a vector-predicated binary operation opcode.
CondCode getSetCCInverse(CondCode Operation, EVT Type)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
std::optional< unsigned > getBaseOpcodeForVP(unsigned Opcode, bool hasFPExcept)
Translate this VP Opcode to its corresponding non-VP Opcode.
bool isTrueWhenEqual(CondCode Cond)
Return true if the specified condition returns true if the two operands to the condition are equal.
Definition: ISDOpcodes.h:1587
std::optional< unsigned > getVPMaskIdx(unsigned Opcode)
The operand position of the vector mask.
unsigned getUnorderedFlavor(CondCode Cond)
This function returns 0 if the condition is always false if an operand is a NaN, 1 if the condition i...
Definition: ISDOpcodes.h:1592
std::optional< unsigned > getVPExplicitVectorLengthIdx(unsigned Opcode)
The operand position of the explicit vector length parameter.
bool isEXTLoad(const SDNode *N)
Returns true if the specified node is a EXTLOAD.
bool allOperandsUndef(const SDNode *N)
Return true if the node has at least one operand and all operands of the specified node are ISD::UNDE...
bool isFreezeUndef(const SDNode *N)
Return true if the specified node is FREEZE(UNDEF).
CondCode getSetCCSwappedOperands(CondCode Operation)
Return the operation corresponding to (Y op X) when given the operation for (X op Y).
MemIndexType
MemIndexType enum - This enum defines how to interpret MGATHER/SCATTER's index parameter when calcula...
Definition: ISDOpcodes.h:1491
bool isBuildVectorAllZeros(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are 0 or undef.
bool isConstantSplatVector(const SDNode *N, APInt &SplatValue)
Node predicates.
bool matchBinaryPredicate(SDValue LHS, SDValue RHS, std::function< bool(ConstantSDNode *, ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTypeMismatch=false)
Attempt to match a binary predicate against a pair of scalar/splat constants or every element of a pa...
bool isVPReduction(unsigned Opcode)
Whether this is a vector-predicated reduction opcode.
MemIndexedMode
MemIndexedMode enum - This enum defines the load / store indexed addressing modes.
Definition: ISDOpcodes.h:1478
bool isBuildVectorOfConstantFPSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantFPSDNode or undef.
bool isSEXTLoad(const SDNode *N)
Returns true if the specified node is a SEXTLOAD.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
Definition: ISDOpcodes.h:1529
bool isBuildVectorAllOnes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are ~0 or undef.
NodeType getVecReduceBaseOpcode(unsigned VecReduceOpcode)
Get underlying scalar opcode for VECREDUCE opcode.
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
Definition: ISDOpcodes.h:1509
bool isVPOpcode(unsigned Opcode)
Whether this is a vector-predicated Opcode.
CondCode getSetCCOrOperation(CondCode Op1, CondCode Op2, EVT Type)
Return the result of a logical OR between different comparisons of identical values: ((X op1 Y) | (X ...
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
deferredval_ty< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
Definition: PatternMatch.h:854
BinaryOp_match< cst_pred_ty< is_zero_int >, ValTy, Instruction::Sub > m_Neg(const ValTy &V)
Matches a 'Neg' as 'sub 0, V'.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
Definition: PatternMatch.h:92
Libcall
RTLIB::Libcall enum - This enum defines all of the runtime library calls the backend can emit.
Libcall getMEMCPY_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMCPY_ELEMENT_UNORDERED_ATOMIC - Return MEMCPY_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
Libcall getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMSET_ELEMENT_UNORDERED_ATOMIC - Return MEMSET_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
Libcall getMEMMOVE_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMMOVE_ELEMENT_UNORDERED_ATOMIC - Return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_* value for the given e...
bool sd_match(SDNode *N, const SelectionDAG *DAG, Pattern &&P)
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:450
@ DW_OP_LLVM_arg
Only used in LLVM metadata.
Definition: Dwarf.h:146
std::lock_guard< SmartMutex< mt_only > > SmartScopedLock
Definition: Mutex.h:69
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition: MathExtras.h:337
@ Offset
Definition: DWP.cpp:456
bool operator<(int64_t V1, const APSInt &V2)
Definition: APSInt.h:361
ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred)
getICmpCondCode - Return the ISD condition code corresponding to the given LLVM IR integer condition ...
Definition: Analysis.cpp:233
SDValue peekThroughExtractSubvectors(SDValue V)
Return the non-extracted vector source operand of V if it exists.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1722
bool isNullConstant(SDValue V)
Returns true if V is a constant integer zero.
bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition: MathExtras.h:239
bool isAllOnesOrAllOnesSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant -1 integer or a splatted vector of a constant -1 integer (with...
Definition: Utils.cpp:1525
SDValue getBitwiseNotOperand(SDValue V, SDValue Mask, bool AllowUndefs)
If V is a bitwise not, returns the inverted operand.
SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are are tuples (A,...
Definition: STLExtras.h:2406
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition: bit.h:307
bool isIntOrFPConstant(SDValue V)
Return true if V is either a integer or FP constant.
bool getAlign(const Function &F, unsigned index, unsigned &align)
bool getConstantDataArrayInfo(const Value *V, ConstantDataArraySlice &Slice, unsigned ElementSize, uint64_t Offset=0)
Returns true if the value V is a pointer into a ConstantDataArray.
int bit_width(T Value)
Returns the number of bits needed to represent Value if Value is nonzero.
Definition: bit.h:317
LLVM_READONLY APFloat maximum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximum semantics.
Definition: APFloat.h:1436
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition: STLExtras.h:2073
bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition: STLExtras.h:656
bool isNullOrNullSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
Definition: Utils.cpp:1507
bool isMinSignedConstant(SDValue V)
Returns true if V is a constant min signed integer value.
ConstantFPSDNode * isConstOrConstSplatFP(SDValue N, bool AllowUndefs=false)
Returns the SDNode if it is a constant splat BuildVector or constant float.
ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
APFloat frexp(const APFloat &X, int &Exp, APFloat::roundingMode RM)
Equivalent of C standard library function.
Definition: APFloat.h:1373
static Error getOffset(const SymbolRef &Sym, SectionRef Sec, uint64_t &Result)
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1729
bool getShuffleDemandedElts(int SrcWidth, ArrayRef< int > Mask, const APInt &DemandedElts, APInt &DemandedLHS, APInt &DemandedRHS, bool AllowUndefElts=false)
Transform a shuffle mask's output demanded element mask into demanded element masks for the 2 operand...
LLVM_READONLY APFloat maxnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2019 maximumNumber semantics.
Definition: APFloat.h:1410
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition: MathExtras.h:324
bool isBitwiseNot(SDValue V, bool AllowUndefs=false)
Returns true if V is a bitwise not operation.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition: MathExtras.h:275
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
void checkForCycles(const SelectionDAG *DAG, bool force=false)
void sort(IteratorTy Start, IteratorTy End)
Definition: STLExtras.h:1647
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
SDValue peekThroughTruncates(SDValue V)
Return the non-truncated source operand of V if it exists.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1736
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:156
ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
SDValue peekThroughOneUseBitcasts(SDValue V)
Return the non-bitcasted and one-use source operand of V if it exists.
CodeGenOptLevel
Code generation optimization level.
Definition: CodeGen.h:54
bool isOneOrOneSplat(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant 1 integer or a splatted vector of a constant 1 integer (with n...
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Other
Any other memory.
LLVM_READONLY APFloat minnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2019 minimumNumber semantics.
Definition: APFloat.h:1396
@ Mul
Product of integers.
void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, unsigned Depth=0, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
DWARFExpression::Operation Op
ConstantSDNode * isConstOrConstSplat(SDValue N, bool AllowUndefs=false, bool AllowTruncation=false)
Returns the SDNode if it is a constant splat BuildVector or constant int.
OutputIt copy(R &&Range, OutputIt Out)
Definition: STLExtras.h:1824
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:191
bool isOneConstant(SDValue V)
Returns true if V is a constant integer one.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition: STLExtras.h:1879
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition: Alignment.h:212
bool isNullFPConstant(SDValue V)
Returns true if V is an FP constant with a value of positive zero.
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
Definition: MathExtras.h:465
unsigned Log2(Align A)
Returns the log2 of the alignment.
Definition: Alignment.h:208
void computeKnownBitsFromRangeMetadata(const MDNode &Ranges, KnownBits &Known)
Compute known bits from the range metadata.
LLVM_READONLY APFloat minimum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimum semantics.
Definition: APFloat.h:1423
bool isNeutralConstant(unsigned Opc, SDNodeFlags Flags, SDValue V, unsigned OperandNo)
Returns true if V is a neutral element of Opc with Flags.
bool isAllOnesConstant(SDValue V)
Returns true if V is an integer constant with all bits set.
constexpr uint64_t NextPowerOf2(uint64_t A)
Returns the next power of two (in 64-bits) that is strictly greater than A.
Definition: MathExtras.h:360
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition: BitVector.h:860
#define N
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition: Metadata.h:760
MDNode * TBAAStruct
The tag for type-based alias analysis (tbaa struct).
Definition: Metadata.h:780
MDNode * TBAA
The tag for type-based alias analysis.
Definition: Metadata.h:777
static const fltSemantics & IEEEsingle() LLVM_READNONE
Definition: APFloat.cpp:249
cmpResult
IEEE-754R 5.11: Floating Point Comparison Relations.
Definition: APFloat.h:220
static constexpr roundingMode rmTowardNegative
Definition: APFloat.h:233
static constexpr roundingMode rmNearestTiesToEven
Definition: APFloat.h:230
static constexpr roundingMode rmTowardZero
Definition: APFloat.h:234
static const fltSemantics & IEEEquad() LLVM_READNONE
Definition: APFloat.cpp:251
static const fltSemantics & IEEEdouble() LLVM_READNONE
Definition: APFloat.cpp:250
static const fltSemantics & IEEEhalf() LLVM_READNONE
Definition: APFloat.cpp:247
static constexpr roundingMode rmTowardPositive
Definition: APFloat.h:232
static const fltSemantics & BFloat() LLVM_READNONE
Definition: APFloat.cpp:248
opStatus
IEEE-754R 7: Default exception handling.
Definition: APFloat.h:246
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
Align previous() const
Definition: Alignment.h:88
Represents offset+length into a ConstantDataArray.
uint64_t Length
Length of the slice.
uint64_t Offset
Slice starts at this Offset.
void move(uint64_t Delta)
Moves the Offset and adjusts Length accordingly.
const ConstantDataArray * Array
ConstantDataArray pointer.
Extended Value Type.
Definition: ValueTypes.h:34
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition: ValueTypes.h:380
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition: ValueTypes.h:136
intptr_t getRawBits() const
Definition: ValueTypes.h:495
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition: ValueTypes.h:73
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition: ValueTypes.h:274
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition: ValueTypes.h:290
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition: ValueTypes.h:146
ElementCount getVectorElementCount() const
Definition: ValueTypes.h:340
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition: ValueTypes.h:358
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition: ValueTypes.h:349
uint64_t getScalarSizeInBits() const
Definition: ValueTypes.h:370
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition: ValueTypes.h:306
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition: ValueTypes.h:64
bool isFixedLengthVector() const
Definition: ValueTypes.h:177
bool isVector() const
Return true if this is a vector value type.
Definition: ValueTypes.h:167
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition: ValueTypes.h:313
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
Definition: ValueTypes.h:282
bool bitsEq(EVT VT) const
Return true if this has the same number of bits as VT.
Definition: ValueTypes.h:246
Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
Definition: ValueTypes.cpp:202
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition: ValueTypes.h:173
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition: ValueTypes.h:318
bool isExtended() const
Test if the given EVT is extended (as opposed to being simple).
Definition: ValueTypes.h:141
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition: ValueTypes.h:326
bool bitsLE(EVT VT) const
Return true if this has no more bits than VT.
Definition: ValueTypes.h:298
EVT getHalfNumVectorElementsVT(LLVMContext &Context) const
Definition: ValueTypes.h:438
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition: ValueTypes.h:151
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition: KnownBits.h:297
KnownBits sextInReg(unsigned SrcBitWidth) const
Return known bits for a in-register sign extension of the value we're tracking.
Definition: KnownBits.cpp:155
static KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from zero-extended multiply-hi.
Definition: KnownBits.cpp:884
unsigned countMinSignBits() const
Returns the number of times the sign bit is replicated into the other bits.
Definition: KnownBits.h:251
static KnownBits smax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smax(LHS, RHS).
Definition: KnownBits.cpp:208
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition: KnownBits.h:104
bool isZero() const
Returns true if value is all zero.
Definition: KnownBits.h:77
void makeNonNegative()
Make this value non-negative.
Definition: KnownBits.h:120
static KnownBits usub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.usub.sat(LHS, RHS)
Definition: KnownBits.cpp:773
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition: KnownBits.h:238
static KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
Definition: KnownBits.cpp:434
static KnownBits urem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for urem(LHS, RHS).
Definition: KnownBits.cpp:1030
bool isUnknown() const
Returns true if we don't know any bits.
Definition: KnownBits.h:63
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition: KnownBits.h:270
static std::optional< bool > ne(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_NE result.
Definition: KnownBits.cpp:502
void makeNegative()
Make this value negative.
Definition: KnownBits.h:115
KnownBits trunc(unsigned BitWidth) const
Return known bits for a truncation of the value we're tracking.
Definition: KnownBits.h:157
KnownBits byteSwap() const
Definition: KnownBits.h:457
bool hasConflict() const
Returns true if there is conflicting information.
Definition: KnownBits.h:47
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition: KnownBits.h:285
void setAllZero()
Make all bits known to be zero and discard any previous information.
Definition: KnownBits.h:89
KnownBits reverseBits() const
Definition: KnownBits.h:461
KnownBits concat(const KnownBits &Lo) const
Concatenate the bits from Lo onto the bottom of *this.
Definition: KnownBits.h:229
unsigned getBitWidth() const
Get the bit width of this value.
Definition: KnownBits.h:40
static KnownBits umax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umax(LHS, RHS).
Definition: KnownBits.cpp:184
KnownBits zext(unsigned BitWidth) const
Return known bits for a zero extension of the value we're tracking.
Definition: KnownBits.h:168
void resetAll()
Resets the known state of all bits.
Definition: KnownBits.h:71
KnownBits unionWith(const KnownBits &RHS) const
Returns KnownBits information that is known to be true for either this or RHS or both.
Definition: KnownBits.h:317
static KnownBits lshr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for lshr(LHS, RHS).
Definition: KnownBits.cpp:376
bool isNonZero() const
Returns true if this value is known to be non-zero.
Definition: KnownBits.h:107
static KnownBits abdu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for abdu(LHS, RHS).
Definition: KnownBits.cpp:234
KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const
Return a subset of the known bits from [bitPosition,bitPosition+numBits).
Definition: KnownBits.h:221
KnownBits intersectWith(const KnownBits &RHS) const
Returns KnownBits information that is known to be true for both this and RHS.
Definition: KnownBits.h:307
KnownBits sext(unsigned BitWidth) const
Return known bits for a sign extension of the value we're tracking.
Definition: KnownBits.h:176
static KnownBits computeForSubBorrow(const KnownBits &LHS, KnownBits RHS, const KnownBits &Borrow)
Compute known bits results from subtracting RHS from LHS with 1-bit Borrow.
Definition: KnownBits.cpp:143
KnownBits zextOrTrunc(unsigned BitWidth) const
Return known bits for a zero extension or truncation of the value we're tracking.
Definition: KnownBits.h:192
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition: KnownBits.h:141
static KnownBits abds(KnownBits LHS, KnownBits RHS)
Compute known bits for abds(LHS, RHS).
Definition: KnownBits.cpp:253
static KnownBits smin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smin(LHS, RHS).
Definition: KnownBits.cpp:221
static KnownBits mulhs(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from sign-extended multiply-hi.
Definition: KnownBits.cpp:875
static KnownBits srem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for srem(LHS, RHS).
Definition: KnownBits.cpp:1049
static KnownBits udiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for udiv(LHS, RHS).
Definition: KnownBits.cpp:988
static KnownBits computeForAddSub(bool Add, bool NSW, bool NUW, const KnownBits &LHS, const KnownBits &RHS)
Compute known bits resulting from adding LHS and RHS.
Definition: KnownBits.cpp:57
bool isStrictlyPositive() const
Returns true if this value is known to be positive.
Definition: KnownBits.h:110
static KnownBits sdiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for sdiv(LHS, RHS).
Definition: KnownBits.cpp:929
static bool haveNoCommonBitsSet(const KnownBits &LHS, const KnownBits &RHS)
Return true if LHS and RHS have no common bits set.
Definition: KnownBits.h:328
bool isNegative() const
Returns true if this value is known to be negative.
Definition: KnownBits.h:101
static KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry)
Compute known bits resulting from adding LHS, RHS and a 1-bit Carry.
Definition: KnownBits.cpp:50
unsigned countMaxLeadingZeros() const
Returns the maximum number of leading zero bits possible.
Definition: KnownBits.h:276
void insertBits(const KnownBits &SubBits, unsigned BitPosition)
Insert the bits from a smaller known bits starting at bitPosition.
Definition: KnownBits.h:215
static KnownBits mul(const KnownBits &LHS, const KnownBits &RHS, bool NoUndefSelfMultiply=false)
Compute known bits resulting from multiplying LHS and RHS.
Definition: KnownBits.cpp:777
KnownBits anyext(unsigned BitWidth) const
Return known bits for an "any" extension of the value we're tracking, where we don't know anything ab...
Definition: KnownBits.h:163
KnownBits abs(bool IntMinIsPoison=false) const
Compute known bits for the absolute value.
Definition: KnownBits.cpp:556
static KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW=false, bool NSW=false, bool ShAmtNonZero=false)
Compute known bits for shl(LHS, RHS).
Definition: KnownBits.cpp:291
static KnownBits umin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umin(LHS, RHS).
Definition: KnownBits.cpp:202
This class contains a discriminated union of information about pointers in memory operands,...
bool isDereferenceable(unsigned Size, LLVMContext &C, const DataLayout &DL) const
Return true if memory region [V, V+Offset+Size) is known to be dereferenceable.
unsigned getAddrSpace() const
Return the LLVM IR address space number that this pointer points into.
PointerUnion< const Value *, const PseudoSourceValue * > V
This is the IR pointer value for the access, or it is null if unknown.
MachinePointerInfo getWithOffset(int64_t O) const
static MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition: Alignment.h:117
static MemOp Set(uint64_t Size, bool DstAlignCanChange, Align DstAlign, bool IsZeroMemset, bool IsVolatile)
static MemOp Copy(uint64_t Size, bool DstAlignCanChange, Align DstAlign, Align SrcAlign, bool IsVolatile, bool MemcpyStrSrc=false)
These are IR-level optimization flags that may be propagated to SDNodes.
void intersectWith(const SDNodeFlags Flags)
Clear any flags in this flag set that aren't also set in Flags.
bool hasNonNeg() const
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
unsigned int NumVTs
Clients of various APIs that cause global effects on the DAG can optionally implement this interface.
Definition: SelectionDAG.h:307
DAGUpdateListener *const Next
Definition: SelectionDAG.h:308
virtual void NodeDeleted(SDNode *N, SDNode *E)
The node N that was deleted and, if E is not null, an equivalent node E that replaced it.
virtual void NodeInserted(SDNode *N)
The node N that was inserted.
virtual void NodeUpdated(SDNode *N)
The node N that was updated.
This structure contains all information that is necessary for lowering calls.
CallLoweringInfo & setLibCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList)
CallLoweringInfo & setDiscardResult(bool Value=true)
CallLoweringInfo & setDebugLoc(const SDLoc &dl)
CallLoweringInfo & setTailCall(bool Value=true)
CallLoweringInfo & setChain(SDValue InChain)