LLVM 24.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"
52#include "llvm/IR/Constant.h"
53#include "llvm/IR/Constants.h"
54#include "llvm/IR/DataLayout.h"
56#include "llvm/IR/DebugLoc.h"
58#include "llvm/IR/Function.h"
59#include "llvm/IR/GlobalValue.h"
60#include "llvm/IR/Metadata.h"
61#include "llvm/IR/Type.h"
65#include "llvm/Support/Debug.h"
75#include <algorithm>
76#include <cassert>
77#include <cstdint>
78#include <cstdlib>
79#include <limits>
80#include <optional>
81#include <string>
82#include <utility>
83#include <vector>
84
85using namespace llvm;
86using namespace llvm::SDPatternMatch;
87
88/// makeVTList - Return an instance of the SDVTList struct initialized with the
89/// specified members.
90static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs) {
91 SDVTList Res = {VTs, NumVTs};
92 return Res;
93}
94
95// Default null implementations of the callbacks.
99
100void SelectionDAG::DAGNodeDeletedListener::anchor() {}
101void SelectionDAG::DAGNodeInsertedListener::anchor() {}
102
103#define DEBUG_TYPE "selectiondag"
104
105static cl::opt<bool> EnableMemCpyDAGOpt("enable-memcpy-dag-opt",
106 cl::Hidden, cl::init(true),
107 cl::desc("Gang up loads and stores generated by inlining of memcpy"));
108
109static cl::opt<int> MaxLdStGlue("ldstmemcpy-glue-max",
110 cl::desc("Number limit for gluing ld/st of memcpy."),
111 cl::Hidden, cl::init(0));
112
114 MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192),
115 cl::desc("DAG combiner limit number of steps when searching DAG "
116 "for predecessor nodes"));
117
119 "vscale-unroll-limit",
120 cl::desc("Maximum vscale for which vector unrolling is allowed."),
121 cl::Hidden, cl::init(64));
122
124 LLVM_DEBUG(dbgs() << Msg; V.getNode()->dump(G););
125}
126
128
129//===----------------------------------------------------------------------===//
130// ConstantFPSDNode Class
131//===----------------------------------------------------------------------===//
132
133/// isExactlyValue - We don't rely on operator== working on double values, as
134/// it returns true for things that are clearly not equal, like -0.0 and 0.0.
135/// As such, this method can be used to do an exact bit-for-bit comparison of
136/// two floating point values.
138 return getValueAPF().bitwiseIsEqual(V);
139}
140
142 const APFloat& Val) {
143 assert(VT.isFloatingPoint() && "Can only convert between FP types");
144
145 // convert modifies in place, so make a copy.
146 APFloat Val2 = APFloat(Val);
147 bool losesInfo;
149 &losesInfo);
150 return !losesInfo;
151}
152
153//===----------------------------------------------------------------------===//
154// ISD Namespace
155//===----------------------------------------------------------------------===//
156
157bool ISD::isConstantSplatVector(const SDNode *N, APInt &SplatVal) {
158 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
159 if (auto OptAPInt = N->getOperand(0)->bitcastToAPInt()) {
160 unsigned EltSize =
161 N->getValueType(0).getVectorElementType().getSizeInBits();
162 SplatVal = OptAPInt->trunc(EltSize);
163 return true;
164 }
165 }
166
167 auto *BV = dyn_cast<BuildVectorSDNode>(N);
168 if (!BV)
169 return false;
170
171 APInt SplatUndef;
172 unsigned SplatBitSize;
173 bool HasUndefs;
174 unsigned EltSize = N->getValueType(0).getVectorElementType().getSizeInBits();
175 // Endianness does not matter here. We are checking for a splat given the
176 // element size of the vector, and if we find such a splat for little endian
177 // layout, then that should be valid also for big endian (as the full vector
178 // size is known to be a multiple of the element size).
179 const bool IsBigEndian = false;
180 return BV->isConstantSplat(SplatVal, SplatUndef, SplatBitSize, HasUndefs,
181 EltSize, IsBigEndian) &&
182 EltSize == SplatBitSize;
183}
184
185// FIXME: AllOnes and AllZeros duplicate a lot of code. Could these be
186// specializations of the more general isConstantSplatVector()?
187
188bool ISD::isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly) {
189 // Look through a bit convert.
190 while (N->getOpcode() == ISD::BITCAST)
191 N = N->getOperand(0).getNode();
192
193 if (!BuildVectorOnly && N->getOpcode() == ISD::SPLAT_VECTOR) {
194 APInt SplatVal;
195 return isConstantSplatVector(N, SplatVal) && SplatVal.isAllOnes();
196 }
197
198 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
199
200 unsigned i = 0, e = N->getNumOperands();
201
202 // Skip over all of the undef values.
203 while (i != e && N->getOperand(i).isUndef())
204 ++i;
205
206 // Do not accept an all-undef vector.
207 if (i == e) return false;
208
209 // Do not accept build_vectors that aren't all constants or which have non-~0
210 // elements. We have to be a bit careful here, as the type of the constant
211 // may not be the same as the type of the vector elements due to type
212 // legalization (the elements are promoted to a legal type for the target and
213 // a vector of a type may be legal when the base element type is not).
214 // We only want to check enough bits to cover the vector elements, because
215 // we care if the resultant vector is all ones, not whether the individual
216 // constants are.
217 SDValue NotZero = N->getOperand(i);
218 if (auto OptAPInt = NotZero->bitcastToAPInt()) {
219 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
220 if (OptAPInt->countr_one() < EltSize)
221 return false;
222 } else
223 return false;
224
225 // Okay, we have at least one ~0 value, check to see if the rest match or are
226 // undefs. Even with the above element type twiddling, this should be OK, as
227 // the same type legalization should have applied to all the elements.
228 for (++i; i != e; ++i)
229 if (N->getOperand(i) != NotZero && !N->getOperand(i).isUndef())
230 return false;
231 return true;
232}
233
234bool ISD::isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly) {
235 // Look through a bit convert.
236 while (N->getOpcode() == ISD::BITCAST)
237 N = N->getOperand(0).getNode();
238
239 if (!BuildVectorOnly && N->getOpcode() == ISD::SPLAT_VECTOR) {
240 APInt SplatVal;
241 return isConstantSplatVector(N, SplatVal) && SplatVal.isZero();
242 }
243
244 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
245
246 bool IsAllUndef = true;
247 for (const SDValue &Op : N->op_values()) {
248 if (Op.isUndef())
249 continue;
250 IsAllUndef = false;
251 // Do not accept build_vectors that aren't all constants or which have non-0
252 // elements. We have to be a bit careful here, as the type of the constant
253 // may not be the same as the type of the vector elements due to type
254 // legalization (the elements are promoted to a legal type for the target
255 // and a vector of a type may be legal when the base element type is not).
256 // We only want to check enough bits to cover the vector elements, because
257 // we care if the resultant vector is all zeros, not whether the individual
258 // constants are.
259 if (auto OptAPInt = Op->bitcastToAPInt()) {
260 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
261 if (OptAPInt->countr_zero() < EltSize)
262 return false;
263 } else
264 return false;
265 }
266
267 // Do not accept an all-undef vector.
268 if (IsAllUndef)
269 return false;
270 return true;
271}
272
274 return isConstantSplatVectorAllOnes(N, /*BuildVectorOnly*/ true);
275}
276
278 return isConstantSplatVectorAllZeros(N, /*BuildVectorOnly*/ true);
279}
280
282 if (N->getOpcode() != ISD::BUILD_VECTOR)
283 return false;
284
285 for (const SDValue &Op : N->op_values()) {
286 if (Op.isUndef())
287 continue;
289 return false;
290 }
291 return true;
292}
293
295 if (N->getOpcode() != ISD::BUILD_VECTOR)
296 return false;
297
298 for (const SDValue &Op : N->op_values()) {
299 if (Op.isUndef())
300 continue;
302 return false;
303 }
304 return true;
305}
306
307bool ISD::isVectorShrinkable(const SDNode *N, unsigned NewEltSize,
308 bool Signed) {
309 assert(N->getValueType(0).isVector() && "Expected a vector!");
310
311 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
312 if (EltSize <= NewEltSize)
313 return false;
314
315 if (N->getOpcode() == ISD::ZERO_EXTEND) {
316 return (N->getOperand(0).getValueType().getScalarSizeInBits() <=
317 NewEltSize) &&
318 !Signed;
319 }
320 if (N->getOpcode() == ISD::SIGN_EXTEND) {
321 return (N->getOperand(0).getValueType().getScalarSizeInBits() <=
322 NewEltSize) &&
323 Signed;
324 }
325 if (N->getOpcode() != ISD::BUILD_VECTOR)
326 return false;
327
328 for (const SDValue &Op : N->op_values()) {
329 if (Op.isUndef())
330 continue;
332 return false;
333
334 APInt C = Op->getAsAPIntVal().trunc(EltSize);
335 if (Signed && C.trunc(NewEltSize).sext(EltSize) != C)
336 return false;
337 if (!Signed && C.trunc(NewEltSize).zext(EltSize) != C)
338 return false;
339 }
340
341 return true;
342}
343
345 // Return false if the node has no operands.
346 // This is "logically inconsistent" with the definition of "all" but
347 // is probably the desired behavior.
348 if (N->getNumOperands() == 0)
349 return false;
350 return all_of(N->op_values(), [](SDValue Op) { return Op.isUndef(); });
351}
352
354 return N->getOpcode() == ISD::FREEZE && N->getOperand(0).isUndef();
355}
356
357template <typename ConstNodeType>
359 std::function<bool(ConstNodeType *)> Match,
360 bool AllowUndefs, bool AllowTruncation) {
361 // FIXME: Add support for scalar UNDEF cases?
362 if (auto *C = dyn_cast<ConstNodeType>(Op))
363 return Match(C);
364
365 // FIXME: Add support for vector UNDEF cases?
366 if (ISD::BUILD_VECTOR != Op.getOpcode() &&
367 ISD::SPLAT_VECTOR != Op.getOpcode())
368 return false;
369
370 if (ISD::SPLAT_VECTOR == Op.getOpcode() && !DemandedElts)
371 return true;
372
373 EVT SVT = Op.getValueType().getScalarType();
374 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
375 if (ISD::SPLAT_VECTOR != Op.getOpcode() && !DemandedElts[i])
376 continue;
377
378 if (AllowUndefs && Op.getOperand(i).isUndef()) {
379 if (!Match(nullptr))
380 return false;
381 continue;
382 }
383
384 auto *Cst = dyn_cast<ConstNodeType>(Op.getOperand(i));
385 if (!Cst || (!AllowTruncation && Cst->getValueType(0) != SVT) ||
386 !Match(Cst))
387 return false;
388 }
389 return true;
390}
391// Build used template types.
393 SDValue, const APInt &, std::function<bool(ConstantSDNode *)>, bool, bool);
395 SDValue, const APInt &, std::function<bool(ConstantFPSDNode *)>, bool,
396 bool);
397
399 SDValue LHS, SDValue RHS, const APInt &DemandedElts,
400 std::function<bool(ConstantSDNode *, ConstantSDNode *)> Match,
401 bool AllowUndefs, bool AllowTypeMismatch) {
402 if (!AllowTypeMismatch && LHS.getValueType() != RHS.getValueType())
403 return false;
404
405 // TODO: Add support for scalar UNDEF cases?
406 if (auto *LHSCst = dyn_cast<ConstantSDNode>(LHS))
407 if (auto *RHSCst = dyn_cast<ConstantSDNode>(RHS))
408 return Match(LHSCst, RHSCst);
409
410 // TODO: Add support for vector UNDEF cases?
411 if (LHS.getOpcode() != RHS.getOpcode() ||
412 (LHS.getOpcode() != ISD::BUILD_VECTOR &&
413 LHS.getOpcode() != ISD::SPLAT_VECTOR))
414 return false;
415
416 if (ISD::SPLAT_VECTOR == LHS.getOpcode() && !DemandedElts)
417 return true;
418
419 EVT SVT = LHS.getValueType().getScalarType();
420 for (unsigned i = 0, e = LHS.getNumOperands(); i != e; ++i) {
421 if (ISD::SPLAT_VECTOR != LHS.getOpcode() && !DemandedElts[i])
422 continue;
423 SDValue LHSOp = LHS.getOperand(i);
424 SDValue RHSOp = RHS.getOperand(i);
425 bool LHSUndef = AllowUndefs && LHSOp.isUndef();
426 bool RHSUndef = AllowUndefs && RHSOp.isUndef();
427 auto *LHSCst = dyn_cast<ConstantSDNode>(LHSOp);
428 auto *RHSCst = dyn_cast<ConstantSDNode>(RHSOp);
429 if ((!LHSCst && !LHSUndef) || (!RHSCst && !RHSUndef))
430 return false;
431 if (!AllowTypeMismatch && (LHSOp.getValueType() != SVT ||
432 LHSOp.getValueType() != RHSOp.getValueType()))
433 return false;
434 if (!Match(LHSCst, RHSCst))
435 return false;
436 }
437 return true;
438}
439
441 switch (MinMaxOpc) {
442 default:
443 llvm_unreachable("unrecognized opcode");
444 case ISD::UMIN:
445 return ISD::UMAX;
446 case ISD::UMAX:
447 return ISD::UMIN;
448 case ISD::SMIN:
449 return ISD::SMAX;
450 case ISD::SMAX:
451 return ISD::SMIN;
452 }
453}
454
456 switch (MinMaxOpc) {
457 default:
458 llvm_unreachable("unrecognized min/max opcode");
459 case ISD::SMIN:
460 return ISD::UMIN;
461 case ISD::SMAX:
462 return ISD::UMAX;
463 case ISD::UMIN:
464 return ISD::SMIN;
465 case ISD::UMAX:
466 return ISD::SMAX;
467 }
468}
469
471 switch (VecReduceOpcode) {
472 default:
473 llvm_unreachable("Expected VECREDUCE opcode");
476 case ISD::VP_REDUCE_FADD:
477 case ISD::VP_REDUCE_SEQ_FADD:
478 return ISD::FADD;
481 case ISD::VP_REDUCE_FMUL:
482 case ISD::VP_REDUCE_SEQ_FMUL:
483 return ISD::FMUL;
485 case ISD::VP_REDUCE_ADD:
486 return ISD::ADD;
488 case ISD::VP_REDUCE_MUL:
489 return ISD::MUL;
491 case ISD::VP_REDUCE_AND:
492 return ISD::AND;
494 case ISD::VP_REDUCE_OR:
495 return ISD::OR;
497 case ISD::VP_REDUCE_XOR:
498 return ISD::XOR;
500 case ISD::VP_REDUCE_SMAX:
501 return ISD::SMAX;
503 case ISD::VP_REDUCE_SMIN:
504 return ISD::SMIN;
506 case ISD::VP_REDUCE_UMAX:
507 return ISD::UMAX;
509 case ISD::VP_REDUCE_UMIN:
510 return ISD::UMIN;
512 case ISD::VP_REDUCE_FMAX:
513 return ISD::FMAXNUM;
515 case ISD::VP_REDUCE_FMIN:
516 return ISD::FMINNUM;
518 case ISD::VP_REDUCE_FMAXIMUM:
519 return ISD::FMAXIMUM;
521 case ISD::VP_REDUCE_FMINIMUM:
522 return ISD::FMINIMUM;
524 return ISD::FMAXIMUMNUM;
526 return ISD::FMINIMUMNUM;
527 }
528}
529
531 switch (MaskedOpc) {
532 case ISD::MASKED_UDIV:
533 return ISD::UDIV;
534 case ISD::MASKED_SDIV:
535 return ISD::SDIV;
536 case ISD::MASKED_UREM:
537 return ISD::UREM;
538 case ISD::MASKED_SREM:
539 return ISD::SREM;
540 default:
541 llvm_unreachable("Expected masked binop opcode");
542 }
543}
544
545bool ISD::isVPOpcode(unsigned Opcode) {
546 switch (Opcode) {
547 default:
548 return false;
549#define BEGIN_REGISTER_VP_SDNODE(VPSD, ...) \
550 case ISD::VPSD: \
551 return true;
552#include "llvm/IR/VPIntrinsics.def"
553 }
554}
555
556bool ISD::isVPBinaryOp(unsigned Opcode) {
557 switch (Opcode) {
558 default:
559 break;
560#define BEGIN_REGISTER_VP_SDNODE(VPSD, ...) case ISD::VPSD:
561#define VP_PROPERTY_BINARYOP return true;
562#define END_REGISTER_VP_SDNODE(VPSD) break;
563#include "llvm/IR/VPIntrinsics.def"
564 }
565 return false;
566}
567
568bool ISD::isVPReduction(unsigned Opcode) {
569 switch (Opcode) {
570 default:
571 return false;
572 case ISD::VP_REDUCE_ADD:
573 case ISD::VP_REDUCE_MUL:
574 case ISD::VP_REDUCE_AND:
575 case ISD::VP_REDUCE_OR:
576 case ISD::VP_REDUCE_XOR:
577 case ISD::VP_REDUCE_SMAX:
578 case ISD::VP_REDUCE_SMIN:
579 case ISD::VP_REDUCE_UMAX:
580 case ISD::VP_REDUCE_UMIN:
581 case ISD::VP_REDUCE_FMAX:
582 case ISD::VP_REDUCE_FMIN:
583 case ISD::VP_REDUCE_FMAXIMUM:
584 case ISD::VP_REDUCE_FMINIMUM:
585 case ISD::VP_REDUCE_FADD:
586 case ISD::VP_REDUCE_FMUL:
587 case ISD::VP_REDUCE_SEQ_FADD:
588 case ISD::VP_REDUCE_SEQ_FMUL:
589 return true;
590 }
591}
592
593/// The operand position of the vector mask.
594std::optional<unsigned> ISD::getVPMaskIdx(unsigned Opcode) {
595 switch (Opcode) {
596 default:
597 return std::nullopt;
598#define BEGIN_REGISTER_VP_SDNODE(VPSD, LEGALPOS, TDNAME, MASKPOS, ...) \
599 case ISD::VPSD: \
600 return MASKPOS;
601#include "llvm/IR/VPIntrinsics.def"
602 }
603}
604
605/// The operand position of the explicit vector length parameter.
606std::optional<unsigned> ISD::getVPExplicitVectorLengthIdx(unsigned Opcode) {
607 switch (Opcode) {
608 default:
609 return std::nullopt;
610#define BEGIN_REGISTER_VP_SDNODE(VPSD, LEGALPOS, TDNAME, MASKPOS, EVLPOS) \
611 case ISD::VPSD: \
612 return EVLPOS;
613#include "llvm/IR/VPIntrinsics.def"
614 }
615}
616
617std::optional<unsigned> ISD::getBaseOpcodeForVP(unsigned VPOpcode,
618 bool hasFPExcept) {
619 // FIXME: Return strict opcodes in case of fp exceptions.
620 switch (VPOpcode) {
621 default:
622 return std::nullopt;
623#define BEGIN_REGISTER_VP_SDNODE(VPOPC, ...) case ISD::VPOPC:
624#define VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) return ISD::SDOPC;
625#define END_REGISTER_VP_SDNODE(VPOPC) break;
626#include "llvm/IR/VPIntrinsics.def"
627 }
628 return std::nullopt;
629}
630
631std::optional<unsigned> ISD::getVPForBaseOpcode(unsigned Opcode) {
632 switch (Opcode) {
633 default:
634 return std::nullopt;
635#define BEGIN_REGISTER_VP_SDNODE(VPOPC, ...) break;
636#define VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) case ISD::SDOPC:
637#define END_REGISTER_VP_SDNODE(VPOPC) return ISD::VPOPC;
638#include "llvm/IR/VPIntrinsics.def"
639 }
640}
641
643 switch (ExtType) {
644 case ISD::EXTLOAD:
645 return IsFP ? ISD::FP_EXTEND : ISD::ANY_EXTEND;
646 case ISD::SEXTLOAD:
647 return ISD::SIGN_EXTEND;
648 case ISD::ZEXTLOAD:
649 return ISD::ZERO_EXTEND;
650 default:
651 break;
652 }
653
654 llvm_unreachable("Invalid LoadExtType");
655}
656
658 // To perform this operation, we just need to swap the L and G bits of the
659 // operation.
660 unsigned OldL = (Operation >> 2) & 1;
661 unsigned OldG = (Operation >> 1) & 1;
662 return ISD::CondCode((Operation & ~6) | // Keep the N, U, E bits
663 (OldL << 1) | // New G bit
664 (OldG << 2)); // New L bit.
665}
666
668 unsigned Operation = Op;
669 if (isIntegerLike)
670 Operation ^= 7; // Flip L, G, E bits, but not U.
671 else
672 Operation ^= 15; // Flip all of the condition bits.
673
675 Operation &= ~8; // Don't let N and U bits get set.
676
677 return ISD::CondCode(Operation);
678}
679
683
685 bool isIntegerLike) {
686 return getSetCCInverseImpl(Op, isIntegerLike);
687}
688
689/// For an integer comparison, return 1 if the comparison is a signed operation
690/// and 2 if the result is an unsigned comparison. Return zero if the operation
691/// does not depend on the sign of the input (setne and seteq).
692static int isSignedOp(ISD::CondCode Opcode) {
693 switch (Opcode) {
694 default: llvm_unreachable("Illegal integer setcc operation!");
695 case ISD::SETEQ:
696 case ISD::SETNE: return 0;
697 case ISD::SETLT:
698 case ISD::SETLE:
699 case ISD::SETGT:
700 case ISD::SETGE: return 1;
701 case ISD::SETULT:
702 case ISD::SETULE:
703 case ISD::SETUGT:
704 case ISD::SETUGE: return 2;
705 }
706}
707
709 EVT Type) {
710 bool IsInteger = Type.isInteger();
711 if (IsInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
712 // Cannot fold a signed integer setcc with an unsigned integer setcc.
713 return ISD::SETCC_INVALID;
714
715 unsigned Op = Op1 | Op2; // Combine all of the condition bits.
716
717 // If the N and U bits get set, then the resultant comparison DOES suddenly
718 // care about orderedness, and it is true when ordered.
719 if (Op > ISD::SETTRUE2)
720 Op &= ~16; // Clear the U bit if the N bit is set.
721
722 // Canonicalize illegal integer setcc's.
723 if (IsInteger && Op == ISD::SETUNE) // e.g. SETUGT | SETULT
724 Op = ISD::SETNE;
725
726 return ISD::CondCode(Op);
727}
728
730 EVT Type) {
731 bool IsInteger = Type.isInteger();
732 if (IsInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
733 // Cannot fold a signed setcc with an unsigned setcc.
734 return ISD::SETCC_INVALID;
735
736 // Combine all of the condition bits.
737 ISD::CondCode Result = ISD::CondCode(Op1 & Op2);
738
739 // Canonicalize illegal integer setcc's.
740 if (IsInteger) {
741 switch (Result) {
742 default: break;
743 case ISD::SETUO : Result = ISD::SETFALSE; break; // SETUGT & SETULT
744 case ISD::SETOEQ: // SETEQ & SETU[LG]E
745 case ISD::SETUEQ: Result = ISD::SETEQ ; break; // SETUGE & SETULE
746 case ISD::SETOLT: Result = ISD::SETULT ; break; // SETULT & SETNE
747 case ISD::SETOGT: Result = ISD::SETUGT ; break; // SETUGT & SETNE
748 }
749 }
750
751 return Result;
752}
753
754//===----------------------------------------------------------------------===//
755// SDNode Key Support
756//===----------------------------------------------------------------------===//
757
758/// If this is an SDNode with special info, add this info to the NodeID data.
759/// MorphNodeTo passes the opcode \p N is becoming, so \p Opc may differ from
760/// N->getOpcode() and a case may only cast to a class \p N already is.
761static void AddNodeIDCustom(FoldingSetNodeID &ID, const SDNode *N,
762 unsigned Opc) {
763 // Machine nodes are uniqued by opcode, value types and operands alone, as in
764 // getMachineNode; MorphNodeTo's clearMemRefs overwrites the fields below.
766 return;
767
768 switch (Opc) {
771 case ISD::MCSymbol:
772 llvm_unreachable("Should only be used on nodes with operands");
773 default: break; // Normal nodes don't need extra info.
775 case ISD::Constant: {
777 ID.AddPointer(C->getConstantIntValue());
778 ID.AddBoolean(C->isOpaque());
779 break;
780 }
782 case ISD::ConstantFP:
783 ID.AddPointer(cast<ConstantFPSDNode>(N)->getConstantFPValue());
784 break;
790 ID.AddPointer(GA->getGlobal());
791 ID.AddInteger(GA->getOffset());
792 ID.AddInteger(GA->getTargetFlags());
793 break;
794 }
795 case ISD::BasicBlock:
796 ID.AddPointer(cast<BasicBlockSDNode>(N)->getBasicBlock());
797 break;
798 case ISD::EH_LABEL:
800 ID.AddPointer(cast<LabelSDNode>(N)->getLabel());
801 break;
803 ID.AddPointer(cast<DeactivationSymbolSDNode>(N)->getGlobal());
804 break;
805 case ISD::Register:
806 ID.AddInteger(cast<RegisterSDNode>(N)->getReg().id());
807 break;
809 ID.AddPointer(cast<RegisterMaskSDNode>(N)->getRegMask());
810 break;
811 case ISD::SRCVALUE:
812 ID.AddPointer(cast<SrcValueSDNode>(N)->getValue());
813 break;
814 case ISD::FrameIndex:
816 ID.AddInteger(cast<FrameIndexSDNode>(N)->getIndex());
817 break;
819 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getGuid());
820 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getIndex());
821 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getAttributes());
822 break;
823 case ISD::JumpTable:
825 ID.AddInteger(cast<JumpTableSDNode>(N)->getIndex());
826 ID.AddInteger(cast<JumpTableSDNode>(N)->getTargetFlags());
827 break;
831 ID.AddInteger(CP->getAlign().value());
832 ID.AddInteger(CP->getOffset());
835 else
836 ID.AddPointer(CP->getConstVal());
837 ID.AddInteger(CP->getTargetFlags());
838 break;
839 }
840 case ISD::TargetIndex: {
842 ID.AddInteger(TI->getIndex());
843 ID.AddInteger(TI->getOffset());
844 ID.AddInteger(TI->getTargetFlags());
845 break;
846 }
847 case ISD::LOAD: {
848 const LoadSDNode *LD = cast<LoadSDNode>(N);
849 ID.AddInteger(LD->getMemoryVT().getRawBits());
850 ID.AddInteger(LD->getRawSubclassData());
851 ID.AddInteger(LD->getPointerInfo().getAddrSpace());
852 ID.AddInteger(LD->getMemOperand()->getFlags());
853 break;
854 }
855 case ISD::STORE: {
856 const StoreSDNode *ST = cast<StoreSDNode>(N);
857 ID.AddInteger(ST->getMemoryVT().getRawBits());
858 ID.AddInteger(ST->getRawSubclassData());
859 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
860 ID.AddInteger(ST->getMemOperand()->getFlags());
861 break;
862 }
863 case ISD::VP_LOAD: {
864 const VPLoadSDNode *ELD = cast<VPLoadSDNode>(N);
865 ID.AddInteger(ELD->getMemoryVT().getRawBits());
866 ID.AddInteger(ELD->getRawSubclassData());
867 ID.AddInteger(ELD->getPointerInfo().getAddrSpace());
868 ID.AddInteger(ELD->getMemOperand()->getFlags());
869 break;
870 }
871 case ISD::VP_LOAD_FF: {
872 const auto *LD = cast<VPLoadFFSDNode>(N);
873 ID.AddInteger(LD->getMemoryVT().getRawBits());
874 ID.AddInteger(LD->getRawSubclassData());
875 ID.AddInteger(LD->getPointerInfo().getAddrSpace());
876 ID.AddInteger(LD->getMemOperand()->getFlags());
877 break;
878 }
879 case ISD::VP_STORE: {
880 const VPStoreSDNode *EST = cast<VPStoreSDNode>(N);
881 ID.AddInteger(EST->getMemoryVT().getRawBits());
882 ID.AddInteger(EST->getRawSubclassData());
883 ID.AddInteger(EST->getPointerInfo().getAddrSpace());
884 ID.AddInteger(EST->getMemOperand()->getFlags());
885 break;
886 }
887 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD: {
889 ID.AddInteger(SLD->getMemoryVT().getRawBits());
890 ID.AddInteger(SLD->getRawSubclassData());
891 ID.AddInteger(SLD->getPointerInfo().getAddrSpace());
892 break;
893 }
894 case ISD::EXPERIMENTAL_VP_STRIDED_STORE: {
896 ID.AddInteger(SST->getMemoryVT().getRawBits());
897 ID.AddInteger(SST->getRawSubclassData());
898 ID.AddInteger(SST->getPointerInfo().getAddrSpace());
899 break;
900 }
901 case ISD::VP_GATHER: {
903 ID.AddInteger(EG->getMemoryVT().getRawBits());
904 ID.AddInteger(EG->getRawSubclassData());
905 ID.AddInteger(EG->getPointerInfo().getAddrSpace());
906 ID.AddInteger(EG->getMemOperand()->getFlags());
907 break;
908 }
909 case ISD::VP_SCATTER: {
911 ID.AddInteger(ES->getMemoryVT().getRawBits());
912 ID.AddInteger(ES->getRawSubclassData());
913 ID.AddInteger(ES->getPointerInfo().getAddrSpace());
914 ID.AddInteger(ES->getMemOperand()->getFlags());
915 break;
916 }
917 case ISD::MLOAD: {
919 ID.AddInteger(MLD->getMemoryVT().getRawBits());
920 ID.AddInteger(MLD->getRawSubclassData());
921 ID.AddInteger(MLD->getPointerInfo().getAddrSpace());
922 ID.AddInteger(MLD->getMemOperand()->getFlags());
923 break;
924 }
925 case ISD::MSTORE: {
927 ID.AddInteger(MST->getMemoryVT().getRawBits());
928 ID.AddInteger(MST->getRawSubclassData());
929 ID.AddInteger(MST->getPointerInfo().getAddrSpace());
930 ID.AddInteger(MST->getMemOperand()->getFlags());
931 break;
932 }
933 case ISD::MGATHER: {
935 ID.AddInteger(MG->getMemoryVT().getRawBits());
936 ID.AddInteger(MG->getRawSubclassData());
937 ID.AddInteger(MG->getPointerInfo().getAddrSpace());
938 ID.AddInteger(MG->getMemOperand()->getFlags());
939 break;
940 }
941 case ISD::MSCATTER:
945 const MemSDNode *M = cast<MemSDNode>(N);
946 ID.AddInteger(M->getMemoryVT().getRawBits());
947 ID.AddInteger(M->getRawSubclassData());
948 ID.AddInteger(M->getPointerInfo().getAddrSpace());
949 ID.AddInteger(M->getMemOperand()->getFlags());
950 break;
951 }
952 case ISD::VECTOR_SHUFFLE: {
953 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(N)->getMask();
954 for (int M : Mask)
955 ID.AddInteger(M);
956 break;
957 }
958 case ISD::ADDRSPACECAST: {
960 ID.AddInteger(ASC->getSrcAddressSpace());
961 ID.AddInteger(ASC->getDestAddressSpace());
962 break;
963 }
965 case ISD::BlockAddress: {
967 ID.AddPointer(BA->getBlockAddress());
968 ID.AddInteger(BA->getOffset());
969 ID.AddInteger(BA->getTargetFlags());
970 break;
971 }
972 case ISD::AssertAlign:
973 ID.AddInteger(cast<AssertAlignSDNode>(N)->getAlign().value());
974 break;
975 case ISD::PREFETCH:
978 // Handled by MemIntrinsicSDNode check after the switch.
979 break;
981 ID.AddPointer(cast<MDNodeSDNode>(N)->getMD());
982 break;
983 } // end switch (Opc)
984
985 if (auto *AT = dyn_cast<AtomicSDNode>(N)) {
986 ID.AddInteger(AT->getMemoryVT().getRawBits());
987 ID.AddInteger(AT->getRawSubclassData());
988 ID.AddInteger(AT->getPointerInfo().getAddrSpace());
989 ID.AddInteger(AT->getMemOperand()->getFlags());
990 }
991
992 // MemIntrinsic nodes could also have subclass data, address spaces, and flags
993 // to check.
994 if (auto *MN = dyn_cast<MemIntrinsicSDNode>(N)) {
995 ID.AddInteger(MN->getRawSubclassData());
996 ID.AddInteger(MN->getMemoryVT().getRawBits());
997 for (const MachineMemOperand *MMO : MN->memoperands()) {
998 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
999 ID.AddInteger(MMO->getFlags());
1000 }
1001 }
1002}
1003
1005 : Opcode(N.getOpcode()), VTs(N.getVTList().VTs),
1006 OpStorage(N.op_begin(), N.op_end()) {
1007 Ops = OpStorage;
1008 AddNodeIDCustom(Tail, &N, N.getOpcode());
1009}
1010
1011#ifndef NDEBUG
1012/// Serialize a node the way SDNodes were uniqued before SDNodeKey, to
1013/// cross-check the typed comparison against. Deliberately reads the node
1014/// rather than going through SDNodeKey, so the key constructor is checked too
1015/// and not used as its own oracle.
1016static void AddNodeIDNode(FoldingSetNodeID &ID, const SDNode *N) {
1017 ID.AddInteger(N->getOpcode());
1018 ID.AddPointer(N->getVTList().VTs);
1019 for (const SDUse &Op : N->ops()) {
1020 ID.AddPointer(Op.getNode());
1021 ID.AddInteger(Op.getResNo());
1022 }
1023 AddNodeIDCustom(ID, N, N->getOpcode());
1024}
1025
1027 ID.AddInteger(Key.Opcode);
1028 ID.AddPointer(Key.VTs);
1029 for (const SDValue &Op : Key.Ops) {
1030 ID.AddPointer(Op.getNode());
1031 ID.AddInteger(Op.getResNo());
1032 }
1033 ID.AddNodeID(Key.Tail);
1034}
1035#endif
1036
1037static bool keyMatches(const SDNodeKey &Key, const SDNode &N) {
1038 if (N.getOpcode() != Key.Opcode || N.getVTList().VTs != Key.VTs)
1039 return false;
1040 if (!llvm::equal(N.ops(), Key.Ops))
1041 return false;
1042 // Build only what AddNodeIDCustom would have added, which is nothing for
1043 // most opcodes, rather than the whole profile.
1044 FoldingSetNodeID Tail;
1045 AddNodeIDCustom(Tail, &N, N.getOpcode());
1046 return Tail == Key.Tail;
1047}
1048
1050 bool Result = keyMatches(Key, N);
1051
1052#ifndef NDEBUG
1053 FoldingSetNodeID NodeProfile, KeyProfile;
1054 AddNodeIDNode(NodeProfile, &N);
1055 AddNodeIDNode(KeyProfile, Key);
1056 assert((NodeProfile == KeyProfile) == Result &&
1057 "SDNodeKey equality disagrees with profile");
1058#endif
1059 return Result;
1060}
1061
1062//===----------------------------------------------------------------------===//
1063// SelectionDAG Class
1064//===----------------------------------------------------------------------===//
1065
1066/// doNotCSE - Return true if CSE should not be performed for this node.
1067static bool doNotCSE(SDNode *N) {
1068 if (N->getValueType(0) == MVT::Glue)
1069 return true; // Never CSE anything that produces a glue result.
1070
1071 switch (N->getOpcode()) {
1072 default: break;
1073 case ISD::HANDLENODE:
1074 case ISD::EH_LABEL:
1075 return true; // Never CSE these nodes.
1076 }
1077
1078 // Check that remaining values produced are not flags.
1079 for (unsigned i = 1, e = N->getNumValues(); i != e; ++i)
1080 if (N->getValueType(i) == MVT::Glue)
1081 return true; // Never CSE anything that produces a glue result.
1082
1083 return false;
1084}
1085
1086/// Construct a DemandedElts mask which demands all elements of \p V.
1087/// If \p V is not a fixed-length vector, then this will return a single bit.
1089 EVT VT = V.getValueType();
1090 // Since the number of lanes in a scalable vector is unknown at compile time,
1091 // we track one bit which is implicitly broadcast to all lanes. This means
1092 // that all lanes in a scalable vector are considered demanded.
1094 : APInt(1, 1);
1095}
1096
1097/// RemoveDeadNodes - This method deletes all unreachable nodes in the
1098/// SelectionDAG.
1100 // Create a dummy node (which is not added to allnodes), that adds a reference
1101 // to the root node, preventing it from being deleted.
1102 HandleSDNode Dummy(getRoot());
1103
1104 SmallVector<SDNode*, 128> DeadNodes;
1105
1106 // Add all obviously-dead nodes to the DeadNodes worklist.
1107 for (SDNode &Node : allnodes())
1108 if (Node.use_empty())
1109 DeadNodes.push_back(&Node);
1110
1111 RemoveDeadNodes(DeadNodes);
1112
1113 // If the root changed (e.g. it was a dead load, update the root).
1114 setRoot(Dummy.getValue());
1115}
1116
1117/// RemoveDeadNodes - This method deletes the unreachable nodes in the
1118/// given list, and any nodes that become unreachable as a result.
1120
1121 // Process the worklist, deleting the nodes and adding their uses to the
1122 // worklist.
1123 while (!DeadNodes.empty()) {
1124 SDNode *N = DeadNodes.pop_back_val();
1125 // Skip to next node if we've already managed to delete the node. This could
1126 // happen if replacing a node causes a node previously added to the node to
1127 // be deleted.
1128 if (N->getOpcode() == ISD::DELETED_NODE)
1129 continue;
1130
1131 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1132 DUL->NodeDeleted(N, nullptr);
1133
1134 // Take the node out of the appropriate CSE map.
1135 RemoveNodeFromCSEMaps(N);
1136
1137 // Next, brutally remove the operand list. This is safe to do, as there are
1138 // no cycles in the graph.
1139 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
1140 SDUse &Use = *I++;
1141 SDNode *Operand = Use.getNode();
1142 Use.set(SDValue());
1143
1144 // Now that we removed this operand, see if there are no uses of it left.
1145 if (Operand->use_empty())
1146 DeadNodes.push_back(Operand);
1147 }
1148
1149 DeallocateNode(N);
1150 }
1151}
1152
1154 SmallVector<SDNode*, 16> DeadNodes(1, N);
1155
1156 // Create a dummy node that adds a reference to the root node, preventing
1157 // it from being deleted. (This matters if the root is an operand of the
1158 // dead node.)
1159 HandleSDNode Dummy(getRoot());
1160
1161 RemoveDeadNodes(DeadNodes);
1162}
1163
1165 // First take this out of the appropriate CSE map.
1166 RemoveNodeFromCSEMaps(N);
1167
1168 // Finally, remove uses due to operands of this node, remove from the
1169 // AllNodes list, and delete the node.
1170 DeleteNodeNotInCSEMaps(N);
1171}
1172
1173void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *N) {
1174 assert(N->getIterator() != AllNodes.begin() &&
1175 "Cannot delete the entry node!");
1176 assert(N->use_empty() && "Cannot delete a node that is not dead!");
1177
1178 // Drop all of the operands and decrement used node's use counts.
1179 N->DropOperands();
1180
1181 DeallocateNode(N);
1182}
1183
1184void SDDbgInfo::add(SDDbgValue *V, bool isParameter) {
1185 assert(!(V->isVariadic() && isParameter));
1186 if (isParameter)
1187 ByvalParmDbgValues.push_back(V);
1188 else
1189 DbgValues.push_back(V);
1190 for (const SDNode *Node : V->getSDNodes())
1191 if (Node)
1192 DbgValMap[Node].push_back(V);
1193}
1194
1196 DbgValMapType::iterator I = DbgValMap.find(Node);
1197 if (I == DbgValMap.end())
1198 return;
1199 for (auto &Val: I->second)
1200 Val->setIsInvalidated();
1201 DbgValMap.erase(I);
1202}
1203
1204void SelectionDAG::DeallocateNode(SDNode *N) {
1205 // If we have operands, deallocate them.
1207
1208 NodeAllocator.Deallocate(AllNodes.remove(N));
1209
1210 // Set the opcode to DELETED_NODE to help catch bugs when node
1211 // memory is reallocated.
1212 // FIXME: There are places in SDag that have grown a dependency on the opcode
1213 // value in the released node.
1214 __asan_unpoison_memory_region(&N->NodeType, sizeof(N->NodeType));
1215 N->NodeType = ISD::DELETED_NODE;
1216
1217 // If any of the SDDbgValue nodes refer to this SDNode, invalidate
1218 // them and forget about that node.
1219 DbgInfo->erase(N);
1220
1221 // Invalidate extra info.
1222 SDEI.erase(N);
1223}
1224
1225#ifndef NDEBUG
1226/// VerifySDNode - Check the given SDNode. Aborts if it is invalid.
1227void SelectionDAG::verifyNode(SDNode *N) const {
1228 switch (N->getOpcode()) {
1229 default:
1230 if (N->isTargetOpcode())
1232 break;
1233 case ISD::BUILD_PAIR: {
1234 EVT VT = N->getValueType(0);
1235 assert(N->getNumValues() == 1 && "Too many results!");
1236 assert(!VT.isVector() && (VT.isInteger() || VT.isFloatingPoint()) &&
1237 "Wrong return type!");
1238 assert(N->getNumOperands() == 2 && "Wrong number of operands!");
1239 assert(N->getOperand(0).getValueType() == N->getOperand(1).getValueType() &&
1240 "Mismatched operand types!");
1241 assert(N->getOperand(0).getValueType().isInteger() == VT.isInteger() &&
1242 "Wrong operand type!");
1243 assert(VT.getSizeInBits() == 2 * N->getOperand(0).getValueSizeInBits() &&
1244 "Wrong return type size");
1245 break;
1246 }
1247 case ISD::BUILD_VECTOR: {
1248 assert(N->getNumValues() == 1 && "Too many results!");
1249 assert(N->getValueType(0).isVector() && "Wrong return type!");
1250 assert(N->getNumOperands() == N->getValueType(0).getVectorNumElements() &&
1251 "Wrong number of operands!");
1252 EVT EltVT = N->getValueType(0).getVectorElementType();
1253 for (const SDUse &Op : N->ops()) {
1254 assert((Op.getValueType() == EltVT ||
1255 (EltVT.isInteger() && Op.getValueType().isInteger() &&
1256 EltVT.bitsLE(Op.getValueType()))) &&
1257 "Wrong operand type!");
1258 assert(Op.getValueType() == N->getOperand(0).getValueType() &&
1259 "Operands must all have the same type");
1260 }
1261 break;
1262 }
1263 case ISD::SADDO:
1264 case ISD::UADDO:
1265 case ISD::SSUBO:
1266 case ISD::USUBO:
1267 assert(N->getNumValues() == 2 && "Wrong number of results!");
1268 assert(N->getVTList().NumVTs == 2 && N->getNumOperands() == 2 &&
1269 "Invalid add/sub overflow op!");
1270 assert(N->getVTList().VTs[0].isInteger() &&
1271 N->getVTList().VTs[1].isInteger() &&
1272 N->getOperand(0).getValueType() == N->getOperand(1).getValueType() &&
1273 N->getOperand(0).getValueType() == N->getVTList().VTs[0] &&
1274 "Binary operator types must match!");
1275 break;
1276 }
1277}
1278#endif // NDEBUG
1279
1280/// Insert a newly allocated node into the DAG.
1281///
1282/// Handles insertion into the all nodes list and CSE map, as well as
1283/// verification and other common operations when a new node is allocated.
1284void SelectionDAG::InsertNode(SDNode *N) {
1285 AllNodes.push_back(N);
1286#ifndef NDEBUG
1287 N->PersistentId = NextPersistentId++;
1288 verifyNode(N);
1289#endif
1290 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1291 DUL->NodeInserted(N);
1292}
1293
1294/// RemoveNodeFromCSEMaps - Take the specified node out of the CSE map that
1295/// correspond to it. This is useful when we're about to delete or repurpose
1296/// the node. We don't want future request for structurally identical nodes
1297/// to return N anymore.
1298bool SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
1299 bool Erased = false;
1300 switch (N->getOpcode()) {
1301 case ISD::HANDLENODE: return false; // noop.
1302 case ISD::CONDCODE:
1303 assert(CondCodeNodes[cast<CondCodeSDNode>(N)->get()] &&
1304 "Cond code doesn't exist!");
1305 Erased = CondCodeNodes[cast<CondCodeSDNode>(N)->get()] != nullptr;
1306 CondCodeNodes[cast<CondCodeSDNode>(N)->get()] = nullptr;
1307 break;
1309 Erased = ExternalSymbols.erase(cast<ExternalSymbolSDNode>(N)->getSymbol());
1310 break;
1312 ExternalSymbolSDNode *ESN = cast<ExternalSymbolSDNode>(N);
1313 Erased = TargetExternalSymbols.erase(std::pair<std::string, unsigned>(
1314 ESN->getSymbol(), ESN->getTargetFlags()));
1315 break;
1316 }
1317 case ISD::MCSymbol: {
1318 auto *MCSN = cast<MCSymbolSDNode>(N);
1319 Erased = MCSymbols.erase(MCSN->getMCSymbol());
1320 break;
1321 }
1322 case ISD::VALUETYPE: {
1323 EVT VT = cast<VTSDNode>(N)->getVT();
1324 if (VT.isExtended()) {
1325 Erased = ExtendedValueTypeNodes.erase(VT);
1326 } else {
1327 Erased = ValueTypeNodes[VT.getSimpleVT().SimpleTy] != nullptr;
1328 ValueTypeNodes[VT.getSimpleVT().SimpleTy] = nullptr;
1329 }
1330 break;
1331 }
1332 default:
1333 // Remove it from the CSE Map.
1334 assert(N->getOpcode() != ISD::DELETED_NODE && "DELETED_NODE in CSEMap!");
1335 assert(N->getOpcode() != ISD::EntryToken && "EntryToken in CSEMap!");
1336 Erased = CSEMap.erase(N);
1337 break;
1338 }
1339#ifndef NDEBUG
1340 // Verify that the node was actually in one of the CSE maps, unless it has a
1341 // glue result (which cannot be CSE'd) or is one of the special cases that are
1342 // not subject to CSE.
1343 if (!Erased && N->getValueType(N->getNumValues()-1) != MVT::Glue &&
1344 !N->isMachineOpcode() && !doNotCSE(N)) {
1345 N->dump(this);
1346 dbgs() << "\n";
1347 llvm_unreachable("Node is not in map!");
1348 }
1349#endif
1350 return Erased;
1351}
1352
1353/// AddModifiedNodeToCSEMaps - The specified node has been removed from the CSE
1354/// maps and modified in place. Add it back to the CSE maps, unless an identical
1355/// node already exists, in which case transfer all its users to the existing
1356/// node. This transfer can potentially trigger recursive merging.
1357void
1358SelectionDAG::AddModifiedNodeToCSEMaps(SDNode *N) {
1359 // For node types that aren't CSE'd, just act as if no identical node
1360 // already exists.
1361 if (!doNotCSE(N)) {
1362 SDNode *Existing = CSEMap.getOrInsert(N);
1363 if (Existing != N) {
1364 // If there was already an existing matching node, use ReplaceAllUsesWith
1365 // to replace the dead one with the existing one. This can cause
1366 // recursive merging of other unrelated nodes down the line.
1367 Existing->intersectFlagsWith(N->getFlags());
1368 if (auto *MemNode = dyn_cast<MemSDNode>(Existing)) {
1370 cast<MemSDNode>(N)->memoperands();
1371 // Range and cache hint metadata are not part of the DAG CSE key because
1372 // we prefer to CSE even when metadata does not match. Merge potentially
1373 // differing metadata conservatively.
1374 MemNode->refineMMOMetadata(NewMMOs);
1375 }
1376 ReplaceAllUsesWith(N, Existing);
1377
1378 // N is now dead. Inform the listeners and delete it.
1379 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1380 DUL->NodeDeleted(N, Existing);
1381 DeleteNodeNotInCSEMaps(N);
1382 return;
1383 }
1384 }
1385
1386 // If the node doesn't already exist, we updated it. Inform listeners.
1387 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1388 DUL->NodeUpdated(N);
1389}
1390
1391/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1392/// were replaced with those specified. If this node is never memoized,
1393/// return null, otherwise return a pointer to the slot it would take. If a
1394/// node already exists with these operands, the slot will be non-null.
1395SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, SDValue Op,
1396 FoldingSetInsertToken &InsertToken) {
1397 if (doNotCSE(N))
1398 return nullptr;
1399
1400 SDValue Ops[] = { Op };
1401 SDNodeKey ID(N->getOpcode(), N->getVTList(), Ops);
1402 AddNodeIDCustom(ID.Tail, N, N->getOpcode());
1403 SDNode *Node = lookupNode(ID, SDLoc(N), InsertToken);
1404 if (Node)
1405 Node->intersectFlagsWith(N->getFlags());
1406 return Node;
1407}
1408
1409/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1410/// were replaced with those specified. If this node is never memoized,
1411/// return null, otherwise return a pointer to the slot it would take. If a
1412/// node already exists with these operands, the slot will be non-null.
1413SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, SDValue Op1, SDValue Op2,
1414 FoldingSetInsertToken &InsertToken) {
1415 if (doNotCSE(N))
1416 return nullptr;
1417
1418 SDValue Ops[] = { Op1, Op2 };
1419 SDNodeKey ID(N->getOpcode(), N->getVTList(), Ops);
1420 AddNodeIDCustom(ID.Tail, N, N->getOpcode());
1421 SDNode *Node = lookupNode(ID, SDLoc(N), InsertToken);
1422 if (Node)
1423 Node->intersectFlagsWith(N->getFlags());
1424 return Node;
1425}
1426
1427/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1428/// were replaced with those specified. If this node is never memoized,
1429/// return null, otherwise return a pointer to the slot it would take. If a
1430/// node already exists with these operands, the slot will be non-null.
1431SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, ArrayRef<SDValue> Ops,
1432 FoldingSetInsertToken &InsertToken) {
1433 if (doNotCSE(N))
1434 return nullptr;
1435
1436 SDNodeKey ID(N->getOpcode(), N->getVTList(), Ops);
1437 AddNodeIDCustom(ID.Tail, N, N->getOpcode());
1438 SDNode *Node = lookupNode(ID, SDLoc(N), InsertToken);
1439 if (Node)
1440 Node->intersectFlagsWith(N->getFlags());
1441 return Node;
1442}
1443
1445 Type *Ty = VT == MVT::iPTR ? PointerType::get(*getContext(), 0)
1446 : VT.getTypeForEVT(*getContext());
1447
1448 return getDataLayout().getABITypeAlign(Ty);
1449}
1450
1451// EntryNode could meaningfully have debug info if we can find it...
1453 : TM(tm), OptLevel(OL), EntryNode(ISD::EntryToken, 0, DebugLoc(),
1454 getVTList(MVT::Other, MVT::Glue)),
1455 Root(getEntryNode()) {
1456 InsertNode(&EntryNode);
1457 DbgInfo = new SDDbgInfo();
1458}
1459
1461 const TargetLibraryInfo *LibraryInfo,
1462 const LibcallLoweringInfo *LibcallsInfo,
1463 UniformityInfo *NewUA, ProfileSummaryInfo *PSIin,
1464 BlockFrequencyInfo *BFIin,
1465 FunctionVarLocs const *VarLocs) {
1466 MF = &NewMF;
1469 LibInfo = LibraryInfo;
1470 Libcalls = LibcallsInfo;
1471 Context = &MF->getFunction().getContext();
1472 UA = NewUA;
1473 PSI = PSIin;
1474 BFI = BFIin;
1475 FnVarLocs = VarLocs;
1476}
1477
1479 assert(!UpdateListeners && "Dangling registered DAGUpdateListeners");
1480 allnodes_clear();
1481 OperandRecycler.clear(OperandAllocator);
1482 delete DbgInfo;
1483}
1484
1486 return llvm::shouldOptimizeForSize(FLI->MBB->getBasicBlock(), PSI, BFI);
1487}
1488
1490 return FLI->MBB->getBasicBlock();
1491}
1492
1493void SelectionDAG::allnodes_clear() {
1494 assert(&*AllNodes.begin() == &EntryNode);
1495 AllNodes.remove(AllNodes.begin());
1496 while (!AllNodes.empty())
1497 DeallocateNode(&AllNodes.front());
1498#ifndef NDEBUG
1499 NextPersistentId = 0;
1500#endif
1501}
1502
1503SDNode *SelectionDAG::lookupNode(const SDNodeKey &Key,
1504 FoldingSetInsertToken &InsertToken) {
1505 SDNode *N = CSEMap.lookup(Key, InsertToken);
1506 if (N) {
1507 switch (N->getOpcode()) {
1508 default: break;
1509 case ISD::Constant:
1510 case ISD::ConstantFP:
1511 llvm_unreachable("Querying for Constant and ConstantFP nodes requires "
1512 "debug location. Use another overload.");
1513 }
1514 }
1515 return N;
1516}
1517
1518SDNode *SelectionDAG::lookupNode(const SDNodeKey &Key, const SDLoc &DL,
1519 FoldingSetInsertToken &InsertToken) {
1520 SDNode *N = CSEMap.lookup(Key, InsertToken);
1521 if (N) {
1522 switch (N->getOpcode()) {
1523 case ISD::Constant:
1524 case ISD::ConstantFP:
1525 // Erase debug location from the node if the node is used at several
1526 // different places. Do not propagate one location to all uses as it
1527 // will cause a worse single stepping debugging experience.
1528 if (N->getDebugLoc() != DL.getDebugLoc())
1529 N->setDebugLoc(DebugLoc());
1530 break;
1531 default:
1532 // When the node's point of use is located earlier in the instruction
1533 // sequence than its prior point of use, update its debug info to the
1534 // earlier location.
1535 if (DL.getIROrder() && DL.getIROrder() < N->getIROrder())
1536 N->setDebugLoc(DL.getDebugLoc());
1537 break;
1538 }
1539 }
1540 return N;
1541}
1542
1544 allnodes_clear();
1545 OperandRecycler.clear(OperandAllocator);
1546 OperandAllocator.Reset();
1547 CSEMap.clear();
1548
1549 ExtendedValueTypeNodes.clear();
1550 ExternalSymbols.clear();
1551 TargetExternalSymbols.clear();
1552 MCSymbols.clear();
1553 SDEI.clear();
1554 llvm::fill(CondCodeNodes, nullptr);
1555 llvm::fill(ValueTypeNodes, nullptr);
1556
1557 EntryNode.UseList = nullptr;
1558 InsertNode(&EntryNode);
1559 Root = getEntryNode();
1560 DbgInfo->clear();
1561}
1562
1564 return VT.bitsGT(Op.getValueType())
1565 ? getNode(ISD::FP_EXTEND, DL, VT, Op)
1566 : getNode(ISD::FP_ROUND, DL, VT, Op,
1567 getIntPtrConstant(0, DL, /*isTarget=*/true));
1568}
1569
1570std::pair<SDValue, SDValue>
1572 const SDLoc &DL, EVT VT) {
1573 assert(!VT.bitsEq(Op.getValueType()) &&
1574 "Strict no-op FP extend/round not allowed.");
1575 SDValue Res =
1576 VT.bitsGT(Op.getValueType())
1577 ? getNode(ISD::STRICT_FP_EXTEND, DL, {VT, MVT::Other}, {Chain, Op})
1578 : getNode(ISD::STRICT_FP_ROUND, DL, {VT, MVT::Other},
1579 {Chain, Op, getIntPtrConstant(0, DL, /*isTarget=*/true)});
1580
1581 return std::pair<SDValue, SDValue>(Res, SDValue(Res.getNode(), 1));
1582}
1583
1585 return VT.bitsGT(Op.getValueType()) ?
1586 getNode(ISD::ANY_EXTEND, DL, VT, Op) :
1587 getNode(ISD::TRUNCATE, DL, VT, Op);
1588}
1589
1591 return VT.bitsGT(Op.getValueType()) ?
1592 getNode(ISD::SIGN_EXTEND, DL, VT, Op) :
1593 getNode(ISD::TRUNCATE, DL, VT, Op);
1594}
1595
1597 return VT.bitsGT(Op.getValueType()) ?
1598 getNode(ISD::ZERO_EXTEND, DL, VT, Op) :
1599 getNode(ISD::TRUNCATE, DL, VT, Op);
1600}
1601
1603 EVT VT) {
1604 assert(!VT.isVector());
1605 auto Type = Op.getValueType();
1606 SDValue DestOp;
1607 if (Type == VT)
1608 return Op;
1609 auto Size = Op.getValueSizeInBits();
1610 DestOp = getBitcast(EVT::getIntegerVT(*Context, Size), Op);
1611 if (DestOp.getValueType() == VT)
1612 return DestOp;
1613
1614 return getAnyExtOrTrunc(DestOp, DL, VT);
1615}
1616
1618 EVT OpVT) {
1619 if (VT.bitsLE(Op.getValueType()))
1620 return getNode(ISD::TRUNCATE, SL, VT, Op);
1621
1622 TargetLowering::BooleanContent BType = TLI->getBooleanContents(OpVT);
1623 return getNode(TLI->getExtendForContent(BType), SL, VT, Op);
1624}
1625
1627 EVT OpVT = Op.getValueType();
1628 assert(VT.isInteger() && OpVT.isInteger() &&
1629 "Cannot getZeroExtendInReg FP types");
1630 assert(VT.isVector() == OpVT.isVector() &&
1631 "getZeroExtendInReg type should be vector iff the operand "
1632 "type is vector!");
1633 assert((!VT.isVector() ||
1635 "Vector element counts must match in getZeroExtendInReg");
1636 assert(VT.getScalarType().bitsLE(OpVT.getScalarType()) && "Not extending!");
1637 if (OpVT == VT)
1638 return Op;
1639 // TODO: Use computeKnownBits instead of AssertZext.
1640 if (Op.getOpcode() == ISD::AssertZext && cast<VTSDNode>(Op.getOperand(1))
1641 ->getVT()
1642 .getScalarType()
1643 .bitsLE(VT.getScalarType()))
1644 return Op;
1646 VT.getScalarSizeInBits());
1647 return getNode(ISD::AND, DL, OpVT, Op, getConstant(Imm, DL, OpVT));
1648}
1649
1651 // Only unsigned pointer semantics are supported right now. In the future this
1652 // might delegate to TLI to check pointer signedness.
1653 return getZExtOrTrunc(Op, DL, VT);
1654}
1655
1657 // Only unsigned pointer semantics are supported right now. In the future this
1658 // might delegate to TLI to check pointer signedness.
1659 return getZeroExtendInReg(Op, DL, VT);
1660}
1661
1663 return getNode(ISD::SUB, DL, VT, getConstant(0, DL, VT), Val);
1664}
1665
1666/// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
1668 return getNode(ISD::XOR, DL, VT, Val, getAllOnesConstant(DL, VT));
1669}
1670
1672 SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
1673 return getNode(ISD::XOR, DL, VT, Val, TrueValue);
1674}
1675
1677 EVT OpVT) {
1678 if (!V)
1679 return getConstant(0, DL, VT);
1680
1681 switch (TLI->getBooleanContents(OpVT)) {
1684 return getConstant(1, DL, VT);
1686 return getAllOnesConstant(DL, VT);
1687 }
1688 llvm_unreachable("Unexpected boolean content enum!");
1689}
1690
1692 bool isT, bool isO) {
1693 return getConstant(APInt(VT.getScalarSizeInBits(), Val, /*isSigned=*/false),
1694 DL, VT, isT, isO);
1695}
1696
1698 bool isT, bool isO) {
1699 return getConstant(*ConstantInt::get(*Context, Val), DL, VT, isT, isO);
1700}
1701
1703 EVT VT, bool isT, bool isO) {
1704 assert(VT.isInteger() && "Cannot create FP integer constant!");
1705
1706 EVT EltVT = VT.getScalarType();
1707 const ConstantInt *Elt = &Val;
1708
1709 // Vector splats are explicit within the DAG, with ConstantSDNode holding the
1710 // to-be-splatted scalar ConstantInt.
1711 if (isa<VectorType>(Elt->getType()))
1712 Elt = ConstantInt::get(*getContext(), Elt->getValue());
1713
1714 // In some cases the vector type is legal but the element type is illegal and
1715 // needs to be promoted, for example v8i8 on ARM. In this case, promote the
1716 // inserted value (the type does not need to match the vector element type).
1717 // Any extra bits introduced will be truncated away.
1718 if (VT.isVector() && TLI->getTypeAction(*getContext(), EltVT) ==
1720 EltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1721 APInt NewVal;
1722 if (TLI->isSExtCheaperThanZExt(VT.getScalarType(), EltVT))
1723 NewVal = Elt->getValue().sextOrTrunc(EltVT.getSizeInBits());
1724 else
1725 NewVal = Elt->getValue().zextOrTrunc(EltVT.getSizeInBits());
1726 Elt = ConstantInt::get(*getContext(), NewVal);
1727 }
1728 // In other cases the element type is illegal and needs to be expanded, for
1729 // example v2i64 on MIPS32. In this case, find the nearest legal type, split
1730 // the value into n parts and use a vector type with n-times the elements.
1731 // Then bitcast to the type requested.
1732 // Legalizing constants too early makes the DAGCombiner's job harder so we
1733 // only legalize if the DAG tells us we must produce legal types.
1734 else if (NewNodesMustHaveLegalTypes && VT.isVector() &&
1735 TLI->getTypeAction(*getContext(), EltVT) ==
1737 const APInt &NewVal = Elt->getValue();
1738 EVT ViaEltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1739 unsigned ViaEltSizeInBits = ViaEltVT.getSizeInBits();
1740
1741 // For scalable vectors, try to use a SPLAT_VECTOR_PARTS node.
1742 if (VT.isScalableVector() ||
1743 TLI->isOperationLegal(ISD::SPLAT_VECTOR, VT)) {
1744 assert(EltVT.getSizeInBits() % ViaEltSizeInBits == 0 &&
1745 "Can only handle an even split!");
1746 unsigned Parts = EltVT.getSizeInBits() / ViaEltSizeInBits;
1747
1748 SmallVector<SDValue, 2> ScalarParts;
1749 for (unsigned i = 0; i != Parts; ++i)
1750 ScalarParts.push_back(getConstant(
1751 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1752 ViaEltVT, isT, isO));
1753
1754 return getNode(ISD::SPLAT_VECTOR_PARTS, DL, VT, ScalarParts);
1755 }
1756
1757 unsigned ViaVecNumElts = VT.getSizeInBits() / ViaEltSizeInBits;
1758 EVT ViaVecVT = EVT::getVectorVT(*getContext(), ViaEltVT, ViaVecNumElts);
1759
1760 // Check the temporary vector is the correct size. If this fails then
1761 // getTypeToTransformTo() probably returned a type whose size (in bits)
1762 // isn't a power-of-2 factor of the requested type size.
1763 assert(ViaVecVT.getSizeInBits() == VT.getSizeInBits());
1764
1765 SmallVector<SDValue, 2> EltParts;
1766 for (unsigned i = 0; i < ViaVecNumElts / VT.getVectorNumElements(); ++i)
1767 EltParts.push_back(getConstant(
1768 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1769 ViaEltVT, isT, isO));
1770
1771 // EltParts is currently in little endian order. If we actually want
1772 // big-endian order then reverse it now.
1773 if (getDataLayout().isBigEndian())
1774 std::reverse(EltParts.begin(), EltParts.end());
1775
1776 // The elements must be reversed when the element order is different
1777 // to the endianness of the elements (because the BITCAST is itself a
1778 // vector shuffle in this situation). However, we do not need any code to
1779 // perform this reversal because getConstant() is producing a vector
1780 // splat.
1781 // This situation occurs in MIPS MSA.
1782
1784 for (unsigned i = 0, e = VT.getVectorNumElements(); i != e; ++i)
1785 llvm::append_range(Ops, EltParts);
1786
1787 SDValue V =
1788 getNode(ISD::BITCAST, DL, VT, getBuildVector(ViaVecVT, DL, Ops));
1789 return V;
1790 }
1791
1792 assert(Elt->getBitWidth() == EltVT.getSizeInBits() &&
1793 "APInt size does not match type size!");
1794 unsigned Opc = isT ? ISD::TargetConstant : ISD::Constant;
1795 SDVTList VTs = getVTList(EltVT);
1796 SDNodeKey ID(Opc, VTs, {});
1797 ID.AddPointer(Elt);
1798 ID.AddBoolean(isO);
1799 FoldingSetInsertToken InsertToken;
1800 SDNode *N = nullptr;
1801 if ((N = lookupNode(ID, DL, InsertToken)))
1802 if (!VT.isVector())
1803 return SDValue(N, 0);
1804
1805 if (!N) {
1806 N = newSDNode<ConstantSDNode>(isT, isO, Elt, VTs);
1807 if (!isT)
1808 N->setDebugLoc(DL.getDebugLoc());
1809 CSEMap.insert(N, InsertToken);
1810 InsertNode(N);
1811 NewSDValueDbgMsg(SDValue(N, 0), "Creating constant: ", this);
1812 }
1813
1814 SDValue Result(N, 0);
1815 if (VT.isVector())
1816 Result = getSplat(VT, DL, Result);
1817 return Result;
1818}
1819
1821 bool isT, bool isO) {
1822 unsigned Size = VT.getScalarSizeInBits();
1823 return getConstant(APInt(Size, Val, /*isSigned=*/true), DL, VT, isT, isO);
1824}
1825
1827 bool IsOpaque) {
1829 IsTarget, IsOpaque);
1830}
1831
1833 bool isTarget) {
1834 return getConstant(Val, DL, TLI->getPointerTy(getDataLayout()), isTarget);
1835}
1836
1838 const SDLoc &DL) {
1839 assert(VT.isInteger() && "Shift amount is not an integer type!");
1840 EVT ShiftVT = TLI->getShiftAmountTy(VT, getDataLayout());
1841 return getConstant(Val, DL, ShiftVT);
1842}
1843
1845 const SDLoc &DL) {
1846 assert(Val.ult(VT.getScalarSizeInBits()) && "Out of range shift");
1847 return getShiftAmountConstant(Val.getZExtValue(), VT, DL);
1848}
1849
1851 bool isTarget) {
1852 return getConstant(Val, DL, TLI->getVectorIdxTy(getDataLayout()), isTarget);
1853}
1854
1856 bool isTarget) {
1857 return getConstantFP(*ConstantFP::get(*getContext(), V), DL, VT, isTarget);
1858}
1859
1861 EVT VT, bool isTarget) {
1862 assert(VT.isFloatingPoint() && "Cannot create integer FP constant!");
1863
1864 EVT EltVT = VT.getScalarType();
1865 const ConstantFP *Elt = &V;
1866
1867 // Vector splats are explicit within the DAG, with ConstantFPSDNode holding
1868 // the to-be-splatted scalar ConstantFP.
1869 if (isa<VectorType>(Elt->getType()))
1870 Elt = ConstantFP::get(*getContext(), Elt->getValue());
1871
1872 // Do the map lookup using the actual bit pattern for the floating point
1873 // value, so that we don't have problems with 0.0 comparing equal to -0.0, and
1874 // we don't have issues with SNANs.
1875 unsigned Opc = isTarget ? ISD::TargetConstantFP : ISD::ConstantFP;
1876 SDVTList VTs = getVTList(EltVT);
1877 SDNodeKey ID(Opc, VTs, {});
1878 ID.AddPointer(Elt);
1879 FoldingSetInsertToken InsertToken;
1880 SDNode *N = nullptr;
1881 if ((N = lookupNode(ID, DL, InsertToken)))
1882 if (!VT.isVector())
1883 return SDValue(N, 0);
1884
1885 if (!N) {
1886 N = newSDNode<ConstantFPSDNode>(isTarget, Elt, VTs);
1887 CSEMap.insert(N, InsertToken);
1888 InsertNode(N);
1889 }
1890
1891 SDValue Result(N, 0);
1892 if (VT.isVector())
1893 Result = getSplat(VT, DL, Result);
1894 NewSDValueDbgMsg(Result, "Creating fp constant: ", this);
1895 return Result;
1896}
1897
1899 bool isTarget) {
1900 EVT EltVT = VT.getScalarType();
1901 if (EltVT == MVT::f32)
1902 return getConstantFP(APFloat((float)Val), DL, VT, isTarget);
1903 if (EltVT == MVT::f64)
1904 return getConstantFP(APFloat(Val), DL, VT, isTarget);
1905 if (EltVT == MVT::f80 || EltVT == MVT::f128 || EltVT == MVT::ppcf128 ||
1906 EltVT == MVT::f16 || EltVT == MVT::bf16) {
1907 bool Ignored;
1908 APFloat APF = APFloat(Val);
1910 &Ignored);
1911 return getConstantFP(APF, DL, VT, isTarget);
1912 }
1913 llvm_unreachable("Unsupported type in getConstantFP");
1914}
1915
1917 EVT VT, int64_t Offset, bool isTargetGA,
1918 unsigned TargetFlags) {
1919 assert((TargetFlags == 0 || isTargetGA) &&
1920 "Cannot set target flags on target-independent globals");
1921
1922 // Truncate (with sign-extension) the offset value to the pointer size.
1924 if (BitWidth < 64)
1926
1927 unsigned Opc;
1928 if (GV->isThreadLocal())
1930 else
1932
1933 SDVTList VTs = getVTList(VT);
1934 SDNodeKey ID(Opc, VTs, {});
1935 ID.AddPointer(GV);
1936 ID.AddInteger(Offset);
1937 ID.AddInteger(TargetFlags);
1938 FoldingSetInsertToken InsertToken;
1939 if (SDNode *E = lookupNode(ID, DL, InsertToken))
1940 return SDValue(E, 0);
1941
1942 auto *N = newSDNode<GlobalAddressSDNode>(
1943 Opc, DL.getIROrder(), DL.getDebugLoc(), GV, VTs, Offset, TargetFlags);
1944 CSEMap.insert(N, InsertToken);
1945 InsertNode(N);
1946 return SDValue(N, 0);
1947}
1948
1950 SDVTList VTs = getVTList(MVT::Untyped);
1952 ID.AddPointer(GV);
1953 FoldingSetInsertToken InsertToken;
1954 if (SDNode *E = lookupNode(ID, SDLoc(), InsertToken))
1955 return SDValue(E, 0);
1956
1957 auto *N = newSDNode<DeactivationSymbolSDNode>(GV, VTs);
1958 CSEMap.insert(N, InsertToken);
1959 InsertNode(N);
1960 return SDValue(N, 0);
1961}
1962
1963SDValue SelectionDAG::getFrameIndex(int FI, EVT VT, bool isTarget) {
1964 unsigned Opc = isTarget ? ISD::TargetFrameIndex : ISD::FrameIndex;
1965 SDVTList VTs = getVTList(VT);
1966 SDNodeKey ID(Opc, VTs, {});
1967 ID.AddInteger(FI);
1968 FoldingSetInsertToken InsertToken;
1969 if (SDNode *E = lookupNode(ID, InsertToken))
1970 return SDValue(E, 0);
1971
1972 auto *N = newSDNode<FrameIndexSDNode>(FI, VTs, isTarget);
1973 CSEMap.insert(N, InsertToken);
1974 InsertNode(N);
1975 return SDValue(N, 0);
1976}
1977
1978SDValue SelectionDAG::getJumpTable(int JTI, EVT VT, bool isTarget,
1979 unsigned TargetFlags) {
1980 assert((TargetFlags == 0 || isTarget) &&
1981 "Cannot set target flags on target-independent jump tables");
1982 unsigned Opc = isTarget ? ISD::TargetJumpTable : ISD::JumpTable;
1983 SDVTList VTs = getVTList(VT);
1984 SDNodeKey ID(Opc, VTs, {});
1985 ID.AddInteger(JTI);
1986 ID.AddInteger(TargetFlags);
1987 FoldingSetInsertToken InsertToken;
1988 if (SDNode *E = lookupNode(ID, InsertToken))
1989 return SDValue(E, 0);
1990
1991 auto *N = newSDNode<JumpTableSDNode>(JTI, VTs, isTarget, TargetFlags);
1992 CSEMap.insert(N, InsertToken);
1993 InsertNode(N);
1994 return SDValue(N, 0);
1995}
1996
1998 const SDLoc &DL) {
2000 return getNode(ISD::JUMP_TABLE_DEBUG_INFO, DL, MVT::Other, Chain,
2001 getTargetConstant(static_cast<uint64_t>(JTI), DL, PTy, true));
2002}
2003
2005 MaybeAlign Alignment, int Offset,
2006 bool isTarget, unsigned TargetFlags) {
2007 assert((TargetFlags == 0 || isTarget) &&
2008 "Cannot set target flags on target-independent globals");
2009 if (!Alignment)
2010 Alignment = shouldOptForSize()
2011 ? getDataLayout().getABITypeAlign(C->getType())
2012 : getDataLayout().getPrefTypeAlign(C->getType());
2013 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
2014 SDVTList VTs = getVTList(VT);
2015 SDNodeKey ID(Opc, VTs, {});
2016 ID.AddInteger(Alignment->value());
2017 ID.AddInteger(Offset);
2018 ID.AddPointer(C);
2019 ID.AddInteger(TargetFlags);
2020 FoldingSetInsertToken InsertToken;
2021 if (SDNode *E = lookupNode(ID, InsertToken))
2022 return SDValue(E, 0);
2023
2024 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
2025 TargetFlags);
2026 CSEMap.insert(N, InsertToken);
2027 InsertNode(N);
2028 SDValue V = SDValue(N, 0);
2029 NewSDValueDbgMsg(V, "Creating new constant pool: ", this);
2030 return V;
2031}
2032
2034 MaybeAlign Alignment, int Offset,
2035 bool isTarget, unsigned TargetFlags) {
2036 assert((TargetFlags == 0 || isTarget) &&
2037 "Cannot set target flags on target-independent globals");
2038 if (!Alignment)
2039 Alignment = getDataLayout().getPrefTypeAlign(C->getType());
2040 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
2041 SDVTList VTs = getVTList(VT);
2042 SDNodeKey ID(Opc, VTs, {});
2043 ID.AddInteger(Alignment->value());
2044 ID.AddInteger(Offset);
2045 C->addSelectionDAGCSEId(ID.Tail);
2046 ID.AddInteger(TargetFlags);
2047 FoldingSetInsertToken InsertToken;
2048 if (SDNode *E = lookupNode(ID, InsertToken))
2049 return SDValue(E, 0);
2050
2051 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
2052 TargetFlags);
2053 CSEMap.insert(N, InsertToken);
2054 InsertNode(N);
2055 return SDValue(N, 0);
2056}
2057
2059 SDNodeKey ID(ISD::BasicBlock, getVTList(MVT::Other), {});
2060 ID.AddPointer(MBB);
2061 FoldingSetInsertToken InsertToken;
2062 if (SDNode *E = lookupNode(ID, InsertToken))
2063 return SDValue(E, 0);
2064
2065 auto *N = newSDNode<BasicBlockSDNode>(MBB);
2066 CSEMap.insert(N, InsertToken);
2067 InsertNode(N);
2068 return SDValue(N, 0);
2069}
2070
2072 if (VT.isSimple() && (unsigned)VT.getSimpleVT().SimpleTy >=
2073 ValueTypeNodes.size())
2074 ValueTypeNodes.resize(VT.getSimpleVT().SimpleTy+1);
2075
2076 SDNode *&N = VT.isExtended() ?
2077 ExtendedValueTypeNodes[VT] : ValueTypeNodes[VT.getSimpleVT().SimpleTy];
2078
2079 if (N) return SDValue(N, 0);
2080 N = newSDNode<VTSDNode>(VT);
2081 InsertNode(N);
2082 return SDValue(N, 0);
2083}
2084
2086 SDNode *&N = ExternalSymbols[Sym];
2087 if (N) return SDValue(N, 0);
2088 N = newSDNode<ExternalSymbolSDNode>(false, Sym, 0, getVTList(VT));
2089 InsertNode(N);
2090 return SDValue(N, 0);
2091}
2092
2093SDValue SelectionDAG::getExternalSymbol(RTLIB::LibcallImpl Libcall, EVT VT) {
2095 return getExternalSymbol(SymName.data(), VT);
2096}
2097
2099 SDNode *&N = MCSymbols[Sym];
2100 if (N)
2101 return SDValue(N, 0);
2102 N = newSDNode<MCSymbolSDNode>(Sym, getVTList(VT));
2103 InsertNode(N);
2104 return SDValue(N, 0);
2105}
2106
2108 unsigned TargetFlags) {
2109 SDNode *&N =
2110 TargetExternalSymbols[std::pair<std::string, unsigned>(Sym, TargetFlags)];
2111 if (N) return SDValue(N, 0);
2112 N = newSDNode<ExternalSymbolSDNode>(true, Sym, TargetFlags, getVTList(VT));
2113 InsertNode(N);
2114 return SDValue(N, 0);
2115}
2116
2118 EVT VT, unsigned TargetFlags) {
2120 return getTargetExternalSymbol(SymName.data(), VT, TargetFlags);
2121}
2122
2124 if ((unsigned)Cond >= CondCodeNodes.size())
2125 CondCodeNodes.resize(Cond+1);
2126
2127 if (!CondCodeNodes[Cond]) {
2128 auto *N = newSDNode<CondCodeSDNode>(Cond);
2129 CondCodeNodes[Cond] = N;
2130 InsertNode(N);
2131 }
2132
2133 return SDValue(CondCodeNodes[Cond], 0);
2134}
2135
2137 assert(MulImm.getBitWidth() == VT.getSizeInBits() &&
2138 "APInt size does not match type size!");
2139
2140 if (MulImm == 0)
2141 return getConstant(0, DL, VT);
2142
2143 const MachineFunction &MF = getMachineFunction();
2144 const Function &F = MF.getFunction();
2145 ConstantRange CR = getVScaleRange(&F, 64);
2146 if (const APInt *C = CR.getSingleElement())
2147 return getConstant(MulImm * C->getZExtValue(), DL, VT);
2148
2149 return getNode(ISD::VSCALE, DL, VT, getConstant(MulImm, DL, VT));
2150}
2151
2152/// \returns a value of type \p VT that represents the runtime value of \p
2153/// Quantity, i.e. scaled by vscale if it's scalable, or a fixed constant
2154/// otherwise. Quantity should be a FixedOrScalableQuantity, i.e. ElementCount
2155/// or TypeSize.
2156template <typename Ty>
2158 EVT VT, Ty Quantity) {
2159 if (Quantity.isScalable())
2160 return DAG.getVScale(
2161 DL, VT, APInt(VT.getSizeInBits(), Quantity.getKnownMinValue()));
2162
2163 return DAG.getConstant(Quantity.getKnownMinValue(), DL, VT);
2164}
2165
2167 ElementCount EC) {
2168 return getFixedOrScalableQuantity(*this, DL, VT, EC);
2169}
2170
2172 return getFixedOrScalableQuantity(*this, DL, VT, TS);
2173}
2174
2176 ElementCount EC) {
2177 EVT IdxVT = TLI->getVectorIdxTy(getDataLayout());
2178 EVT MaskVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), DataVT);
2179 return getNode(ISD::GET_ACTIVE_LANE_MASK, DL, MaskVT,
2180 getConstant(0, DL, IdxVT), getElementCount(DL, IdxVT, EC));
2181}
2182
2184 APInt One(ResVT.getScalarSizeInBits(), 1);
2185 return getStepVector(DL, ResVT, One);
2186}
2187
2189 const APInt &StepVal) {
2190 assert(ResVT.getScalarSizeInBits() == StepVal.getBitWidth());
2191 if (ResVT.isScalableVector())
2192 return getNode(
2193 ISD::STEP_VECTOR, DL, ResVT,
2194 getTargetConstant(StepVal, DL, ResVT.getVectorElementType()));
2195
2196 SmallVector<SDValue, 16> OpsStepConstants;
2197 for (uint64_t i = 0; i < ResVT.getVectorNumElements(); i++)
2198 OpsStepConstants.push_back(
2199 getConstant(StepVal * i, DL, ResVT.getVectorElementType()));
2200 return getBuildVector(ResVT, DL, OpsStepConstants);
2201}
2202
2203/// Swaps the values of N1 and N2. Swaps all indices in the shuffle mask M that
2204/// point at N1 to point at N2 and indices that point at N2 to point at N1.
2209
2211 SDValue N2, ArrayRef<int> Mask) {
2212 assert(VT.getVectorNumElements() == Mask.size() &&
2213 "Must have the same number of vector elements as mask elements!");
2214 assert(VT == N1.getValueType() && VT == N2.getValueType() &&
2215 "Invalid VECTOR_SHUFFLE");
2216
2217 // Canonicalize shuffle undef, undef -> undef
2218 if (N1.isUndef() && N2.isUndef()) {
2219 if (N1.getOpcode() == ISD::POISON && N2.getOpcode() == ISD::POISON)
2220 return getPOISON(VT);
2221 return getUNDEF(VT);
2222 }
2223
2224 // Validate that all indices in Mask are within the range of the elements
2225 // input to the shuffle.
2226 int NElts = Mask.size();
2227 assert(llvm::all_of(Mask,
2228 [&](int M) { return M < (NElts * 2) && M >= -1; }) &&
2229 "Index out of range");
2230
2231 // Copy the mask so we can do any needed cleanup.
2232 SmallVector<int, 8> MaskVec(Mask);
2233
2234 // Canonicalize shuffle v, v -> v, poison
2235 if (N1 == N2) {
2236 N2 = getPOISON(VT);
2237 for (int i = 0; i != NElts; ++i)
2238 if (MaskVec[i] >= NElts) MaskVec[i] -= NElts;
2239 }
2240
2241 // Canonicalize shuffle undef, v -> v, undef. Commute the shuffle mask.
2242 if (N1.isUndef())
2243 commuteShuffle(N1, N2, MaskVec);
2244
2245 if (TLI->hasVectorBlend()) {
2246 // If shuffling a splat, try to blend the splat instead. We do this here so
2247 // that even when this arises during lowering we don't have to re-handle it.
2248 auto BlendSplat = [&](BuildVectorSDNode *BV, int Offset) {
2249 BitVector UndefElements;
2250 SDValue Splat = BV->getSplatValue(&UndefElements);
2251 if (!Splat)
2252 return;
2253
2254 for (int i = 0; i < NElts; ++i) {
2255 if (MaskVec[i] < Offset || MaskVec[i] >= (Offset + NElts))
2256 continue;
2257
2258 // If this input comes from undef, mark it as such.
2259 if (UndefElements[MaskVec[i] - Offset]) {
2260 MaskVec[i] = -1;
2261 continue;
2262 }
2263
2264 // If we can blend a non-undef lane, use that instead.
2265 if (!UndefElements[i])
2266 MaskVec[i] = i + Offset;
2267 }
2268 };
2269 if (auto *N1BV = dyn_cast<BuildVectorSDNode>(N1))
2270 BlendSplat(N1BV, 0);
2271 if (auto *N2BV = dyn_cast<BuildVectorSDNode>(N2))
2272 BlendSplat(N2BV, NElts);
2273 }
2274
2275 // Canonicalize all index into lhs, -> shuffle lhs, poison
2276 // Canonicalize all index into rhs, -> shuffle rhs, poison
2277 bool AllLHS = true, AllRHS = true;
2278 bool N2Undef = N2.isUndef();
2279 for (int i = 0; i != NElts; ++i) {
2280 if (MaskVec[i] >= NElts) {
2281 if (N2Undef)
2282 MaskVec[i] = -1;
2283 else
2284 AllLHS = false;
2285 } else if (MaskVec[i] >= 0) {
2286 AllRHS = false;
2287 }
2288 }
2289 if (AllLHS && AllRHS)
2290 return getPOISON(VT);
2291 if (AllLHS && !N2Undef)
2292 N2 = getPOISON(VT);
2293 if (AllRHS) {
2294 N1 = getPOISON(VT);
2295 commuteShuffle(N1, N2, MaskVec);
2296 }
2297 // Reset our undef status after accounting for the mask.
2298 N2Undef = N2.isUndef();
2299 // Re-check whether both sides ended up undef.
2300 if (N1.isUndef() && N2Undef) {
2301 if (N1.getOpcode() == ISD::POISON && N2.getOpcode() == ISD::POISON)
2302 return getPOISON(VT);
2303 return getUNDEF(VT);
2304 }
2305
2306 // If Identity shuffle return that node.
2307 bool Identity = true, AllSame = true;
2308 for (int i = 0; i != NElts; ++i) {
2309 if (MaskVec[i] >= 0 && MaskVec[i] != i) Identity = false;
2310 if (MaskVec[i] != MaskVec[0]) AllSame = false;
2311 }
2312 if (Identity && NElts)
2313 return N1;
2314
2315 // Shuffling a constant splat doesn't change the result.
2316 if (N2Undef) {
2317 SDValue V = N1;
2318
2319 // Look through any bitcasts. We check that these don't change the number
2320 // (and size) of elements and just changes their types.
2321 while (V.getOpcode() == ISD::BITCAST)
2322 V = V->getOperand(0);
2323
2324 // A splat should always show up as a build vector node.
2325 if (auto *BV = dyn_cast<BuildVectorSDNode>(V)) {
2326 BitVector UndefElements;
2327 SDValue Splat = BV->getSplatValue(&UndefElements);
2328 // If this is a splat of an undef, shuffling it is also undef.
2329 if (Splat && Splat.isUndef())
2330 return Splat.getOpcode() == ISD::POISON ? getPOISON(VT) : getUNDEF(VT);
2331
2332 bool SameNumElts =
2333 V.getValueType().getVectorNumElements() == VT.getVectorNumElements();
2334
2335 // We only have a splat which can skip shuffles if there is a splatted
2336 // value and no undef lanes rearranged by the shuffle.
2337 if (Splat && UndefElements.none()) {
2338 // Splat of <x, x, ..., x>, return <x, x, ..., x>, provided that the
2339 // number of elements match or the value splatted is a zero constant.
2340 if (SameNumElts || isNullConstant(Splat))
2341 return N1;
2342 }
2343
2344 // If the shuffle itself creates a splat, build the vector directly.
2345 if (AllSame && SameNumElts) {
2346 EVT BuildVT = BV->getValueType(0);
2347 const SDValue &Splatted = BV->getOperand(MaskVec[0]);
2348 SDValue NewBV = getSplatBuildVector(BuildVT, dl, Splatted);
2349
2350 // We may have jumped through bitcasts, so the type of the
2351 // BUILD_VECTOR may not match the type of the shuffle.
2352 if (BuildVT != VT)
2353 NewBV = getNode(ISD::BITCAST, dl, VT, NewBV);
2354 return NewBV;
2355 }
2356 }
2357 }
2358
2359 SDVTList VTs = getVTList(VT);
2360 SDValue Ops[2] = { N1, N2 };
2362 for (int i = 0; i != NElts; ++i)
2363 ID.AddInteger(MaskVec[i]);
2364
2365 FoldingSetInsertToken InsertToken;
2366 if (SDNode *E = lookupNode(ID, dl, InsertToken))
2367 return SDValue(E, 0);
2368
2369 // Allocate the mask array for the node out of the BumpPtrAllocator, since
2370 // SDNode doesn't have access to it. This memory will be "leaked" when
2371 // the node is deallocated, but recovered when the NodeAllocator is released.
2372 int *MaskAlloc = OperandAllocator.Allocate<int>(NElts);
2373 llvm::copy(MaskVec, MaskAlloc);
2374
2375 auto *N = newSDNode<ShuffleVectorSDNode>(VTs, dl.getIROrder(),
2376 dl.getDebugLoc(), MaskAlloc);
2377 createOperands(N, Ops);
2378
2379 CSEMap.insert(N, InsertToken);
2380 InsertNode(N);
2381 SDValue V = SDValue(N, 0);
2382 NewSDValueDbgMsg(V, "Creating new node: ", this);
2383 return V;
2384}
2385
2387 EVT VT = SV.getValueType(0);
2388 SmallVector<int, 8> MaskVec(SV.getMask());
2390
2391 SDValue Op0 = SV.getOperand(0);
2392 SDValue Op1 = SV.getOperand(1);
2393 return getVectorShuffle(VT, SDLoc(&SV), Op1, Op0, MaskVec);
2394}
2395
2397 SDVTList VTs = getVTList(VT);
2398 SDNodeKey ID(ISD::Register, VTs, {});
2399 ID.AddInteger(Reg.id());
2400 FoldingSetInsertToken InsertToken;
2401 if (SDNode *E = lookupNode(ID, InsertToken))
2402 return SDValue(E, 0);
2403
2404 auto *N = newSDNode<RegisterSDNode>(Reg, VTs);
2405 N->SDNodeBits.IsDivergent = TLI->isSDNodeSourceOfDivergence(N, FLI, UA);
2406 CSEMap.insert(N, InsertToken);
2407 InsertNode(N);
2408 return SDValue(N, 0);
2409}
2410
2412 SDNodeKey ID(ISD::RegisterMask, getVTList(MVT::Untyped), {});
2413 ID.AddPointer(RegMask);
2414 FoldingSetInsertToken InsertToken;
2415 if (SDNode *E = lookupNode(ID, InsertToken))
2416 return SDValue(E, 0);
2417
2418 auto *N = newSDNode<RegisterMaskSDNode>(RegMask);
2419 CSEMap.insert(N, InsertToken);
2420 InsertNode(N);
2421 return SDValue(N, 0);
2422}
2423
2425 MCSymbol *Label) {
2426 return getLabelNode(ISD::EH_LABEL, dl, Root, Label);
2427}
2428
2429SDValue SelectionDAG::getLabelNode(unsigned Opcode, const SDLoc &dl,
2430 SDValue Root, MCSymbol *Label) {
2431 SDValue Ops[] = { Root };
2432 SDNodeKey ID(Opcode, getVTList(MVT::Other), Ops);
2433 ID.AddPointer(Label);
2434 FoldingSetInsertToken InsertToken;
2435 if (SDNode *E = lookupNode(ID, InsertToken))
2436 return SDValue(E, 0);
2437
2438 auto *N =
2439 newSDNode<LabelSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), Label);
2440 createOperands(N, Ops);
2441
2442 CSEMap.insert(N, InsertToken);
2443 InsertNode(N);
2444 return SDValue(N, 0);
2445}
2446
2448 int64_t Offset, bool isTarget,
2449 unsigned TargetFlags) {
2450 unsigned Opc = isTarget ? ISD::TargetBlockAddress : ISD::BlockAddress;
2451 SDVTList VTs = getVTList(VT);
2452
2453 SDNodeKey ID(Opc, VTs, {});
2454 ID.AddPointer(BA);
2455 ID.AddInteger(Offset);
2456 ID.AddInteger(TargetFlags);
2457 FoldingSetInsertToken InsertToken;
2458 if (SDNode *E = lookupNode(ID, InsertToken))
2459 return SDValue(E, 0);
2460
2461 auto *N = newSDNode<BlockAddressSDNode>(Opc, VTs, BA, Offset, TargetFlags);
2462 CSEMap.insert(N, InsertToken);
2463 InsertNode(N);
2464 return SDValue(N, 0);
2465}
2466
2468 SDNodeKey ID(ISD::SRCVALUE, getVTList(MVT::Other), {});
2469 ID.AddPointer(V);
2470
2471 FoldingSetInsertToken InsertToken;
2472 if (SDNode *E = lookupNode(ID, InsertToken))
2473 return SDValue(E, 0);
2474
2475 auto *N = newSDNode<SrcValueSDNode>(V);
2476 CSEMap.insert(N, InsertToken);
2477 InsertNode(N);
2478 return SDValue(N, 0);
2479}
2480
2482 SDNodeKey ID(ISD::MDNODE_SDNODE, getVTList(MVT::Other), {});
2483 ID.AddPointer(MD);
2484
2485 FoldingSetInsertToken InsertToken;
2486 if (SDNode *E = lookupNode(ID, InsertToken))
2487 return SDValue(E, 0);
2488
2489 auto *N = newSDNode<MDNodeSDNode>(MD);
2490 CSEMap.insert(N, InsertToken);
2491 InsertNode(N);
2492 return SDValue(N, 0);
2493}
2494
2496 if (VT == V.getValueType())
2497 return V;
2498
2499 return getNode(ISD::BITCAST, SDLoc(V), VT, V);
2500}
2501
2503 unsigned SrcAS, unsigned DestAS,
2504 const SDNodeFlags Flags) {
2505 SDVTList VTs = getVTList(VT);
2506 SDValue Ops[] = {Ptr};
2508 ID.AddInteger(SrcAS);
2509 ID.AddInteger(DestAS);
2510
2511 FoldingSetInsertToken InsertToken;
2512 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
2513 E->intersectFlagsWith(Flags);
2514 return SDValue(E, 0);
2515 }
2516
2517 auto *N = newSDNode<AddrSpaceCastSDNode>(dl.getIROrder(), dl.getDebugLoc(),
2518 VTs, SrcAS, DestAS);
2519 N->setFlags(Flags);
2520 createOperands(N, Ops);
2521
2522 CSEMap.insert(N, InsertToken);
2523 InsertNode(N);
2524 return SDValue(N, 0);
2525}
2526
2528 return getNode(ISD::FREEZE, SDLoc(V), V.getValueType(), V);
2529}
2530
2532 UndefPoisonKind Kind) {
2533 if (isGuaranteedNotToBeUndefOrPoison(V, DemandedElts, Kind))
2534 return V;
2535 return getFreeze(V);
2536}
2537
2538/// getShiftAmountOperand - Return the specified value casted to
2539/// the target's desired shift amount type.
2541 EVT OpTy = Op.getValueType();
2542 EVT ShTy = TLI->getShiftAmountTy(LHSTy, getDataLayout());
2543 if (OpTy == ShTy || OpTy.isVector()) return Op;
2544
2545 return getZExtOrTrunc(Op, SDLoc(Op), ShTy);
2546}
2547
2549 SDLoc dl(Node);
2551 const Value *V = cast<SrcValueSDNode>(Node->getOperand(2))->getValue();
2552 EVT VT = Node->getValueType(0);
2553 SDValue Tmp1 = Node->getOperand(0);
2554 SDValue Tmp2 = Node->getOperand(1);
2555 const MaybeAlign MA(Node->getConstantOperandVal(3));
2556
2557 SDValue VAListLoad = getLoad(TLI.getPointerTy(getDataLayout()), dl, Tmp1,
2558 Tmp2, MachinePointerInfo(V));
2559 SDValue VAList = VAListLoad;
2560
2561 if (MA && *MA > TLI.getMinStackArgumentAlignment()) {
2562 VAList = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2563 getConstant(MA->value() - 1, dl, VAList.getValueType()));
2564
2565 VAList = getNode(
2566 ISD::AND, dl, VAList.getValueType(), VAList,
2567 getSignedConstant(-(int64_t)MA->value(), dl, VAList.getValueType()));
2568 }
2569
2570 // Increment the pointer, VAList, to the next vaarg
2571 Tmp1 = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2572 getConstant(getDataLayout().getTypeAllocSize(
2573 VT.getTypeForEVT(*getContext())),
2574 dl, VAList.getValueType()));
2575 // Store the incremented VAList to the legalized pointer
2576 Tmp1 =
2577 getStore(VAListLoad.getValue(1), dl, Tmp1, Tmp2, MachinePointerInfo(V));
2578 // Load the actual argument out of the pointer VAList
2579 return getLoad(VT, dl, Tmp1, VAList, MachinePointerInfo());
2580}
2581
2583 SDLoc dl(Node);
2585 // This defaults to loading a pointer from the input and storing it to the
2586 // output, returning the chain.
2587 const Value *VD = cast<SrcValueSDNode>(Node->getOperand(3))->getValue();
2588 const Value *VS = cast<SrcValueSDNode>(Node->getOperand(4))->getValue();
2589 SDValue Tmp1 =
2590 getLoad(TLI.getPointerTy(getDataLayout()), dl, Node->getOperand(0),
2591 Node->getOperand(2), MachinePointerInfo(VS));
2592 return getStore(Tmp1.getValue(1), dl, Tmp1, Node->getOperand(1),
2593 MachinePointerInfo(VD));
2594}
2595
2597 const DataLayout &DL = getDataLayout();
2598 Type *Ty = VT.getTypeForEVT(*getContext());
2599 Align RedAlign = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2600
2601 if (TLI->isTypeLegal(VT) || !VT.isVector())
2602 return RedAlign;
2603
2604 const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
2605 const Align StackAlign = TFI->getStackAlign();
2606
2607 // See if we can choose a smaller ABI alignment in cases where it's an
2608 // illegal vector type that will get broken down.
2609 if (RedAlign > StackAlign) {
2610 EVT IntermediateVT;
2611 MVT RegisterVT;
2612 unsigned NumIntermediates;
2613 TLI->getVectorTypeBreakdown(*getContext(), VT, IntermediateVT,
2614 NumIntermediates, RegisterVT);
2615 Ty = IntermediateVT.getTypeForEVT(*getContext());
2616 Align RedAlign2 = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2617 if (RedAlign2 < RedAlign)
2618 RedAlign = RedAlign2;
2619
2620 if (!getMachineFunction().getFrameInfo().isStackRealignable())
2621 // If the stack is not realignable, the alignment should be limited to the
2622 // StackAlignment
2623 RedAlign = std::min(RedAlign, StackAlign);
2624 }
2625
2626 return RedAlign;
2627}
2628
2630 MachineFrameInfo &MFI = MF->getFrameInfo();
2631 const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
2632 int StackID = 0;
2633 if (Bytes.isScalable())
2634 StackID = TFI->getStackIDForScalableVectors();
2635 // The stack id gives an indication of whether the object is scalable or
2636 // not, so it's safe to pass in the minimum size here.
2637 int FrameIdx = MFI.CreateStackObject(Bytes.getKnownMinValue(), Alignment,
2638 false, nullptr, StackID);
2639 return getFrameIndex(FrameIdx, TLI->getFrameIndexTy(getDataLayout()));
2640}
2641
2643 Type *Ty = VT.getTypeForEVT(*getContext());
2644 Align StackAlign =
2645 std::max(getDataLayout().getPrefTypeAlign(Ty), Align(minAlign));
2646 return CreateStackTemporary(VT.getStoreSize(), StackAlign);
2647}
2648
2650 TypeSize VT1Size = VT1.getStoreSize();
2651 TypeSize VT2Size = VT2.getStoreSize();
2652 assert(VT1Size.isScalable() == VT2Size.isScalable() &&
2653 "Don't know how to choose the maximum size when creating a stack "
2654 "temporary");
2655 TypeSize Bytes = VT1Size.getKnownMinValue() > VT2Size.getKnownMinValue()
2656 ? VT1Size
2657 : VT2Size;
2658
2659 Type *Ty1 = VT1.getTypeForEVT(*getContext());
2660 Type *Ty2 = VT2.getTypeForEVT(*getContext());
2661 const DataLayout &DL = getDataLayout();
2662 Align Align = std::max(DL.getPrefTypeAlign(Ty1), DL.getPrefTypeAlign(Ty2));
2663 return CreateStackTemporary(Bytes, Align);
2664}
2665
2667 const SDLoc &DL, SDValue Chain) {
2668 EVT SrcVT = SrcOp.getValueType();
2669 Type *DestType = DestVT.getTypeForEVT(*getContext());
2670 Align DestAlign = getDataLayout().getPrefTypeAlign(DestType);
2671
2672 // Create the stack frame object.
2673 Align SrcAlign =
2675 SDValue FIPtr = CreateStackTemporary(SlotVT.getStoreSize(), SrcAlign);
2676
2677 FrameIndexSDNode *StackPtrFI = cast<FrameIndexSDNode>(FIPtr);
2678 int SPFI = StackPtrFI->getIndex();
2679 MachinePointerInfo PtrInfo =
2681
2682 // Emit a store to the stack slot. Use a truncstore if the input value is
2683 // later than DestVT.
2684 SDValue Store;
2685
2686 if (SrcVT.bitsGT(SlotVT))
2687 Store = getTruncStore(Chain, DL, SrcOp, FIPtr, PtrInfo, SlotVT, SrcAlign);
2688 else {
2689 assert(SrcVT.bitsEq(SlotVT) && "Invalid store");
2690 Store = getStore(Chain, DL, SrcOp, FIPtr, PtrInfo, SrcAlign);
2691 }
2692
2693 // Result is a load from the stack slot.
2694 if (SlotVT.bitsEq(DestVT))
2695 return getLoad(DestVT, DL, Store, FIPtr, PtrInfo, DestAlign);
2696
2697 assert(SlotVT.bitsLT(DestVT) && "Unknown extension!");
2698 return getExtLoad(ISD::EXTLOAD, DL, DestVT, Store, FIPtr, PtrInfo, SlotVT,
2699 DestAlign);
2700}
2701
2703 ISD::CondCode Cond, const SDLoc &dl,
2704 SDNodeFlags Flags) {
2705 EVT OpVT = N1.getValueType();
2706
2707 auto GetUndefBooleanConstant = [&]() {
2708 if (VT.getScalarType() == MVT::i1 ||
2709 TLI->getBooleanContents(OpVT) ==
2711 return getUNDEF(VT);
2712 // ZeroOrOne / ZeroOrNegative require specific values for the high bits,
2713 // so we cannot use getUNDEF(). Return zero instead.
2714 return getConstant(0, dl, VT);
2715 };
2716
2717 // These setcc operations always fold.
2718 switch (Cond) {
2719 default: break;
2720 case ISD::SETFALSE:
2721 case ISD::SETFALSE2: return getBoolConstant(false, dl, VT, OpVT);
2722 case ISD::SETTRUE:
2723 case ISD::SETTRUE2: return getBoolConstant(true, dl, VT, OpVT);
2724
2725 case ISD::SETOEQ:
2726 case ISD::SETOGT:
2727 case ISD::SETOGE:
2728 case ISD::SETOLT:
2729 case ISD::SETOLE:
2730 case ISD::SETONE:
2731 case ISD::SETO:
2732 case ISD::SETUO:
2733 case ISD::SETUEQ:
2734 case ISD::SETUNE:
2735 assert(!OpVT.isInteger() && "Illegal setcc for integer!");
2736 break;
2737 }
2738
2739 if (OpVT.isInteger()) {
2740 // For EQ and NE, we can always pick a value for the undef to make the
2741 // predicate pass or fail, so we can return undef.
2742 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2743 // icmp eq/ne X, undef -> undef.
2744 if ((N1.isUndef() || N2.isUndef()) &&
2745 (Cond == ISD::SETEQ || Cond == ISD::SETNE))
2746 return GetUndefBooleanConstant();
2747
2748 // If both operands are undef, we can return undef for int comparison.
2749 // icmp undef, undef -> undef.
2750 if (N1.isUndef() && N2.isUndef())
2751 return GetUndefBooleanConstant();
2752
2753 // icmp X, X -> true/false
2754 // icmp X, undef -> true/false because undef could be X.
2755 if (N1.isUndef() || N2.isUndef() || N1 == N2)
2756 return getBoolConstant(ISD::isTrueWhenEqual(Cond), dl, VT, OpVT);
2757 }
2758
2759 if (ConstantSDNode *N2C = isConstOrConstSplat(N2)) {
2760 const APInt &C2 = N2C->getAPIntValue();
2761 if (ConstantSDNode *N1C = isConstOrConstSplat(N1)) {
2762 const APInt &C1 = N1C->getAPIntValue();
2763
2765 dl, VT, OpVT);
2766 }
2767 }
2768
2769 auto *N1CFP = dyn_cast<ConstantFPSDNode>(N1);
2770 auto *N2CFP = dyn_cast<ConstantFPSDNode>(N2);
2771
2772 if (N1CFP && N2CFP) {
2773 APFloat::cmpResult R = N1CFP->getValueAPF().compare(N2CFP->getValueAPF());
2774 switch (Cond) {
2775 default: break;
2776 case ISD::SETEQ: if (R==APFloat::cmpUnordered)
2777 return GetUndefBooleanConstant();
2778 [[fallthrough]];
2779 case ISD::SETOEQ: return getBoolConstant(R==APFloat::cmpEqual, dl, VT,
2780 OpVT);
2781 case ISD::SETNE: if (R==APFloat::cmpUnordered)
2782 return GetUndefBooleanConstant();
2783 [[fallthrough]];
2785 R==APFloat::cmpLessThan, dl, VT,
2786 OpVT);
2787 case ISD::SETLT: if (R==APFloat::cmpUnordered)
2788 return GetUndefBooleanConstant();
2789 [[fallthrough]];
2790 case ISD::SETOLT: return getBoolConstant(R==APFloat::cmpLessThan, dl, VT,
2791 OpVT);
2792 case ISD::SETGT: if (R==APFloat::cmpUnordered)
2793 return GetUndefBooleanConstant();
2794 [[fallthrough]];
2796 VT, OpVT);
2797 case ISD::SETLE: if (R==APFloat::cmpUnordered)
2798 return GetUndefBooleanConstant();
2799 [[fallthrough]];
2801 R==APFloat::cmpEqual, dl, VT,
2802 OpVT);
2803 case ISD::SETGE: if (R==APFloat::cmpUnordered)
2804 return GetUndefBooleanConstant();
2805 [[fallthrough]];
2807 R==APFloat::cmpEqual, dl, VT, OpVT);
2808 case ISD::SETO: return getBoolConstant(R!=APFloat::cmpUnordered, dl, VT,
2809 OpVT);
2810 case ISD::SETUO: return getBoolConstant(R==APFloat::cmpUnordered, dl, VT,
2811 OpVT);
2813 R==APFloat::cmpEqual, dl, VT,
2814 OpVT);
2815 case ISD::SETUNE: return getBoolConstant(R!=APFloat::cmpEqual, dl, VT,
2816 OpVT);
2818 R==APFloat::cmpLessThan, dl, VT,
2819 OpVT);
2821 R==APFloat::cmpUnordered, dl, VT,
2822 OpVT);
2824 VT, OpVT);
2825 case ISD::SETUGE: return getBoolConstant(R!=APFloat::cmpLessThan, dl, VT,
2826 OpVT);
2827 }
2828 } else if (N1CFP && OpVT.isSimple() && !N2.isUndef()) {
2829 // Ensure that the constant occurs on the RHS.
2831 if (!TLI->isCondCodeLegal(SwappedCond, OpVT.getSimpleVT()))
2832 return SDValue();
2833 return getSetCC(dl, VT, N2, N1, SwappedCond, /*Chain=*/{},
2834 /*IsSignaling=*/false, Flags);
2835 } else if ((N2CFP && N2CFP->getValueAPF().isNaN()) ||
2836 (OpVT.isFloatingPoint() && (N1.isUndef() || N2.isUndef()))) {
2837 // If an operand is known to be a nan (or undef that could be a nan), we can
2838 // fold it.
2839 // Choosing NaN for the undef will always make unordered comparison succeed
2840 // and ordered comparison fails.
2841 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2842 switch (ISD::getUnorderedFlavor(Cond)) {
2843 default:
2844 llvm_unreachable("Unknown flavor!");
2845 case 0: // Known false.
2846 return getBoolConstant(false, dl, VT, OpVT);
2847 case 1: // Known true.
2848 return getBoolConstant(true, dl, VT, OpVT);
2849 case 2: // Undefined.
2850 return GetUndefBooleanConstant();
2851 }
2852 }
2853
2854 // Could not fold it.
2855 return SDValue();
2856}
2857
2858/// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We
2859/// use this predicate to simplify operations downstream.
2861 unsigned BitWidth = Op.getScalarValueSizeInBits();
2863}
2864
2865// TODO: Should have argument to specify if sign bit of nan is ignorable.
2867 if (Depth >= MaxRecursionDepth)
2868 return false; // Limit search depth.
2869
2870 unsigned Opc = Op.getOpcode();
2871 switch (Opc) {
2872 case ISD::FABS:
2873 return true;
2874 case ISD::AssertNoFPClass: {
2875 FPClassTest NoFPClass =
2876 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
2877
2878 const FPClassTest TestMask = fcNan | fcNegative;
2879 return (NoFPClass & TestMask) == TestMask;
2880 }
2881 case ISD::ARITH_FENCE:
2882 return SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2883 case ISD::FEXP:
2884 case ISD::FEXP2:
2885 case ISD::FEXP10:
2886 return Op->getFlags().hasNoNaNs();
2887 case ISD::FMINNUM:
2888 case ISD::FMINNUM_IEEE:
2889 case ISD::FMINIMUM:
2890 case ISD::FMINIMUMNUM:
2891 return SignBitIsZeroFP(Op.getOperand(1), Depth + 1) &&
2892 SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2893 case ISD::FMAXNUM:
2894 case ISD::FMAXNUM_IEEE:
2895 case ISD::FMAXIMUM:
2896 case ISD::FMAXIMUMNUM:
2897 // TODO: If we can ignore the sign bit of nans, only one side being known 0
2898 // is sufficient.
2899 return SignBitIsZeroFP(Op.getOperand(1), Depth + 1) &&
2900 SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2901 default:
2902 return false;
2903 }
2904
2905 llvm_unreachable("covered opcode switch");
2906}
2907
2908/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero. We use
2909/// this predicate to simplify operations downstream. Mask is known to be zero
2910/// for bits that V cannot have.
2912 unsigned Depth) const {
2913 return Mask.isSubsetOf(computeKnownBits(V, Depth).Zero);
2914}
2915
2916/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero in
2917/// DemandedElts. We use this predicate to simplify operations downstream.
2918/// Mask is known to be zero for bits that V cannot have.
2920 const APInt &DemandedElts,
2921 unsigned Depth) const {
2922 return Mask.isSubsetOf(computeKnownBits(V, DemandedElts, Depth).Zero);
2923}
2924
2925/// MaskedVectorIsZero - Return true if 'Op' is known to be zero in
2926/// DemandedElts. We use this predicate to simplify operations downstream.
2928 unsigned Depth /* = 0 */) const {
2929 return computeKnownBits(V, DemandedElts, Depth).isZero();
2930}
2931
2932/// MaskedValueIsAllOnes - Return true if '(Op & Mask) == Mask'.
2934 unsigned Depth) const {
2935 return Mask.isSubsetOf(computeKnownBits(V, Depth).One);
2936}
2937
2939 const APInt &DemandedElts,
2940 unsigned Depth) const {
2941 EVT VT = Op.getValueType();
2942 assert(VT.isVector() && !VT.isScalableVector() && "Only for fixed vectors!");
2943
2944 unsigned NumElts = VT.getVectorNumElements();
2945 assert(DemandedElts.getBitWidth() == NumElts && "Unexpected demanded mask.");
2946
2947 APInt KnownZeroElements = APInt::getZero(NumElts);
2948 for (unsigned EltIdx = 0; EltIdx != NumElts; ++EltIdx) {
2949 if (!DemandedElts[EltIdx])
2950 continue; // Don't query elements that are not demanded.
2951 APInt Mask = APInt::getOneBitSet(NumElts, EltIdx);
2952 if (MaskedVectorIsZero(Op, Mask, Depth))
2953 KnownZeroElements.setBit(EltIdx);
2954 }
2955 return KnownZeroElements;
2956}
2957
2958/// isSplatValue - Return true if the vector V has the same value
2959/// across all DemandedElts. For scalable vectors, we don't know the
2960/// number of lanes at compile time. Instead, we use a 1 bit APInt
2961/// to represent a conservative value for all lanes; that is, that
2962/// one bit value is implicitly splatted across all lanes.
2963bool SelectionDAG::isSplatValue(SDValue V, const APInt &DemandedElts,
2964 APInt &UndefElts, unsigned Depth) const {
2965 unsigned Opcode = V.getOpcode();
2966 EVT VT = V.getValueType();
2967 assert(VT.isVector() && "Vector type expected");
2968 assert((!VT.isScalableVector() || DemandedElts.getBitWidth() == 1) &&
2969 "scalable demanded bits are ignored");
2970
2971 if (!DemandedElts)
2972 return false; // No demanded elts, better to assume we don't know anything.
2973
2974 if (Depth >= MaxRecursionDepth)
2975 return false; // Limit search depth.
2976
2977 // Deal with some common cases here that work for both fixed and scalable
2978 // vector types.
2979 switch (Opcode) {
2980 case ISD::SPLAT_VECTOR:
2981 UndefElts = V.getOperand(0).isUndef()
2982 ? APInt::getAllOnes(DemandedElts.getBitWidth())
2983 : APInt(DemandedElts.getBitWidth(), 0);
2984 return true;
2985 case ISD::ADD:
2986 case ISD::SUB:
2987 case ISD::AND:
2988 case ISD::XOR:
2989 case ISD::OR: {
2990 APInt UndefLHS, UndefRHS;
2991 SDValue LHS = V.getOperand(0);
2992 SDValue RHS = V.getOperand(1);
2993 // Only recognize splats with the same demanded undef elements for both
2994 // operands, otherwise we might fail to handle binop-specific undef
2995 // handling.
2996 // e.g. (and undef, 0) -> 0 etc.
2997 if (isSplatValue(LHS, DemandedElts, UndefLHS, Depth + 1) &&
2998 isSplatValue(RHS, DemandedElts, UndefRHS, Depth + 1) &&
2999 (DemandedElts & UndefLHS) == (DemandedElts & UndefRHS)) {
3000 UndefElts = UndefLHS | UndefRHS;
3001 return true;
3002 }
3003 return false;
3004 }
3005 case ISD::ABS:
3007 case ISD::TRUNCATE:
3008 case ISD::SIGN_EXTEND:
3009 case ISD::ZERO_EXTEND:
3010 return isSplatValue(V.getOperand(0), DemandedElts, UndefElts, Depth + 1);
3011 default:
3012 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
3013 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
3014 return TLI->isSplatValueForTargetNode(V, DemandedElts, UndefElts, *this,
3015 Depth);
3016 break;
3017 }
3018
3019 // We don't support other cases than those above for scalable vectors at
3020 // the moment.
3021 if (VT.isScalableVector())
3022 return false;
3023
3024 unsigned NumElts = VT.getVectorNumElements();
3025 assert(NumElts == DemandedElts.getBitWidth() && "Vector size mismatch");
3026 UndefElts = APInt::getZero(NumElts);
3027
3028 switch (Opcode) {
3029 case ISD::BUILD_VECTOR: {
3030 SDValue Scl;
3031 for (unsigned i = 0; i != NumElts; ++i) {
3032 SDValue Op = V.getOperand(i);
3033 if (Op.isUndef()) {
3034 UndefElts.setBit(i);
3035 continue;
3036 }
3037 if (!DemandedElts[i])
3038 continue;
3039 if (Scl && Scl != Op)
3040 return false;
3041 Scl = Op;
3042 }
3043 return true;
3044 }
3045 case ISD::VECTOR_SHUFFLE: {
3046 // Check if this is a shuffle node doing a splat or a shuffle of a splat.
3047 APInt DemandedLHS = APInt::getZero(NumElts);
3048 APInt DemandedRHS = APInt::getZero(NumElts);
3049 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(V)->getMask();
3050 for (int i = 0; i != (int)NumElts; ++i) {
3051 int M = Mask[i];
3052 if (M < 0) {
3053 UndefElts.setBit(i);
3054 continue;
3055 }
3056 if (!DemandedElts[i])
3057 continue;
3058 if (M < (int)NumElts)
3059 DemandedLHS.setBit(M);
3060 else
3061 DemandedRHS.setBit(M - NumElts);
3062 }
3063
3064 // If we aren't demanding either op, assume there's no splat.
3065 // If we are demanding both ops, assume there's no splat.
3066 if ((DemandedLHS.isZero() && DemandedRHS.isZero()) ||
3067 (!DemandedLHS.isZero() && !DemandedRHS.isZero()))
3068 return false;
3069
3070 // See if the demanded elts of the source op is a splat or we only demand
3071 // one element, which should always be a splat.
3072 // TODO: Handle source ops splats with undefs.
3073 auto CheckSplatSrc = [&](SDValue Src, const APInt &SrcElts) {
3074 APInt SrcUndefs;
3075 return (SrcElts.popcount() == 1) ||
3076 (isSplatValue(Src, SrcElts, SrcUndefs, Depth + 1) &&
3077 (SrcElts & SrcUndefs).isZero());
3078 };
3079 if (!DemandedLHS.isZero())
3080 return CheckSplatSrc(V.getOperand(0), DemandedLHS);
3081 return CheckSplatSrc(V.getOperand(1), DemandedRHS);
3082 }
3084 // Offset the demanded elts by the subvector index.
3085 SDValue Src = V.getOperand(0);
3086 // We don't support scalable vectors at the moment.
3087 if (Src.getValueType().isScalableVector())
3088 return false;
3089 uint64_t Idx = V.getConstantOperandVal(1);
3090 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3091 APInt UndefSrcElts;
3092 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3093 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3094 UndefElts = UndefSrcElts.extractBits(NumElts, Idx);
3095 return true;
3096 }
3097 break;
3098 }
3102 // Widen the demanded elts by the src element count.
3103 SDValue Src = V.getOperand(0);
3104 // We don't support scalable vectors at the moment.
3105 if (Src.getValueType().isScalableVector())
3106 return false;
3107 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3108 APInt UndefSrcElts;
3109 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts);
3110 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3111 UndefElts = UndefSrcElts.trunc(NumElts);
3112 return true;
3113 }
3114 break;
3115 }
3116 case ISD::BITCAST: {
3117 SDValue Src = V.getOperand(0);
3118 EVT SrcVT = Src.getValueType();
3119 unsigned SrcBitWidth = SrcVT.getScalarSizeInBits();
3120 unsigned BitWidth = VT.getScalarSizeInBits();
3121
3122 // Ignore bitcasts from unsupported types.
3123 // TODO: Add fp support?
3124 if (!SrcVT.isVector() || !SrcVT.isInteger() || !VT.isInteger())
3125 break;
3126
3127 // Bitcast 'small element' vector to 'large element' vector.
3128 if ((BitWidth % SrcBitWidth) == 0) {
3129 // See if each sub element is a splat.
3130 unsigned Scale = BitWidth / SrcBitWidth;
3131 unsigned NumSrcElts = SrcVT.getVectorNumElements();
3132 APInt ScaledDemandedElts =
3133 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
3134 for (unsigned I = 0; I != Scale; ++I) {
3135 APInt SubUndefElts;
3136 APInt SubDemandedElt = APInt::getOneBitSet(Scale, I);
3137 APInt SubDemandedElts = APInt::getSplat(NumSrcElts, SubDemandedElt);
3138 SubDemandedElts &= ScaledDemandedElts;
3139 if (!isSplatValue(Src, SubDemandedElts, SubUndefElts, Depth + 1))
3140 return false;
3141 // TODO: Add support for merging sub undef elements.
3142 if (!SubUndefElts.isZero())
3143 return false;
3144 }
3145 return true;
3146 }
3147 break;
3148 }
3149 }
3150
3151 return false;
3152}
3153
3154/// Helper wrapper to main isSplatValue function.
3155bool SelectionDAG::isSplatValue(SDValue V, bool AllowUndefs) const {
3156 EVT VT = V.getValueType();
3157 assert(VT.isVector() && "Vector type expected");
3158
3159 APInt UndefElts;
3160 // Since the number of lanes in a scalable vector is unknown at compile time,
3161 // we track one bit which is implicitly broadcast to all lanes. This means
3162 // that all lanes in a scalable vector are considered demanded.
3163 APInt DemandedElts
3165 return isSplatValue(V, DemandedElts, UndefElts) &&
3166 (AllowUndefs || !UndefElts);
3167}
3168
3171
3172 EVT VT = V.getValueType();
3173 unsigned Opcode = V.getOpcode();
3174 switch (Opcode) {
3175 default: {
3176 APInt UndefElts;
3177 // Since the number of lanes in a scalable vector is unknown at compile time,
3178 // we track one bit which is implicitly broadcast to all lanes. This means
3179 // that all lanes in a scalable vector are considered demanded.
3180 APInt DemandedElts
3182
3183 if (isSplatValue(V, DemandedElts, UndefElts)) {
3184 if (VT.isScalableVector()) {
3185 // DemandedElts and UndefElts are ignored for scalable vectors, since
3186 // the only supported cases are SPLAT_VECTOR nodes.
3187 SplatIdx = 0;
3188 } else {
3189 // Handle case where all demanded elements are UNDEF.
3190 if (DemandedElts.isSubsetOf(UndefElts)) {
3191 SplatIdx = 0;
3192 return getUNDEF(VT);
3193 }
3194 SplatIdx = (UndefElts & DemandedElts).countr_one();
3195 }
3196 return V;
3197 }
3198 break;
3199 }
3200 case ISD::SPLAT_VECTOR:
3201 SplatIdx = 0;
3202 return V;
3203 case ISD::VECTOR_SHUFFLE: {
3204 assert(!VT.isScalableVector());
3205 // Check if this is a shuffle node doing a splat.
3206 // TODO - remove this and rely purely on SelectionDAG::isSplatValue,
3207 // getTargetVShiftNode currently struggles without the splat source.
3208 auto *SVN = cast<ShuffleVectorSDNode>(V);
3209 if (!SVN->isSplat())
3210 break;
3211 int Idx = SVN->getSplatIndex();
3212 int NumElts = V.getValueType().getVectorNumElements();
3213 SplatIdx = Idx % NumElts;
3214 return V.getOperand(Idx / NumElts);
3215 }
3216 }
3217
3218 return SDValue();
3219}
3220
3222 int SplatIdx;
3223 if (SDValue SrcVector = getSplatSourceVector(V, SplatIdx)) {
3224 EVT SVT = SrcVector.getValueType().getScalarType();
3225 EVT LegalSVT = SVT;
3226 if (LegalTypes && !TLI->isTypeLegal(SVT)) {
3227 if (!SVT.isInteger())
3228 return SDValue();
3229 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
3230 if (LegalSVT.bitsLT(SVT))
3231 return SDValue();
3232 }
3233 return getExtractVectorElt(SDLoc(V), LegalSVT, SrcVector, SplatIdx);
3234 }
3235 return SDValue();
3236}
3237
3238std::optional<ConstantRange>
3240 unsigned Depth) const {
3241 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3242 V.getOpcode() == ISD::SRA) &&
3243 "Unknown shift node");
3244 // Shifting more than the bitwidth is not valid.
3245 unsigned BitWidth = V.getScalarValueSizeInBits();
3246
3247 if (auto *Cst = dyn_cast<ConstantSDNode>(V.getOperand(1))) {
3248 const APInt &ShAmt = Cst->getAPIntValue();
3249 if (ShAmt.uge(BitWidth))
3250 return std::nullopt;
3251 return ConstantRange(ShAmt);
3252 }
3253
3254 if (auto *BV = dyn_cast<BuildVectorSDNode>(V.getOperand(1))) {
3255 const APInt *MinAmt = nullptr, *MaxAmt = nullptr;
3256 for (unsigned i = 0, e = BV->getNumOperands(); i != e; ++i) {
3257 if (!DemandedElts[i])
3258 continue;
3259 auto *SA = dyn_cast<ConstantSDNode>(BV->getOperand(i));
3260 if (!SA) {
3261 MinAmt = MaxAmt = nullptr;
3262 break;
3263 }
3264 const APInt &ShAmt = SA->getAPIntValue();
3265 if (ShAmt.uge(BitWidth))
3266 return std::nullopt;
3267 if (!MinAmt || MinAmt->ugt(ShAmt))
3268 MinAmt = &ShAmt;
3269 if (!MaxAmt || MaxAmt->ult(ShAmt))
3270 MaxAmt = &ShAmt;
3271 }
3272 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
3273 "Failed to find matching min/max shift amounts");
3274 if (MinAmt && MaxAmt)
3275 return ConstantRange(*MinAmt, *MaxAmt + 1);
3276 }
3277
3278 // Use computeKnownBits to find a hidden constant/knownbits (usually type
3279 // legalized). e.g. Hidden behind multiple bitcasts/build_vector/casts etc.
3280 KnownBits KnownAmt = computeKnownBits(V.getOperand(1), DemandedElts, Depth);
3281 if (KnownAmt.getMaxValue().ult(BitWidth))
3282 return ConstantRange::fromKnownBits(KnownAmt, /*IsSigned=*/false);
3283
3284 return std::nullopt;
3285}
3286
3287std::optional<unsigned>
3289 unsigned Depth) const {
3290 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3291 V.getOpcode() == ISD::SRA) &&
3292 "Unknown shift node");
3293 if (std::optional<ConstantRange> AmtRange =
3294 getValidShiftAmountRange(V, DemandedElts, Depth))
3295 if (const APInt *ShAmt = AmtRange->getSingleElement())
3296 return ShAmt->getZExtValue();
3297 return std::nullopt;
3298}
3299
3300std::optional<unsigned>
3302 APInt DemandedElts = getDemandAllEltsMask(V);
3303 return getValidShiftAmount(V, DemandedElts, Depth);
3304}
3305
3306std::optional<unsigned>
3308 unsigned Depth) const {
3309 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3310 V.getOpcode() == ISD::SRA) &&
3311 "Unknown shift node");
3312 if (std::optional<ConstantRange> AmtRange =
3313 getValidShiftAmountRange(V, DemandedElts, Depth))
3314 return AmtRange->getUnsignedMin().getZExtValue();
3315 return std::nullopt;
3316}
3317
3318std::optional<unsigned>
3320 APInt DemandedElts = getDemandAllEltsMask(V);
3321 return getValidMinimumShiftAmount(V, DemandedElts, Depth);
3322}
3323
3324std::optional<unsigned>
3326 unsigned Depth) const {
3327 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3328 V.getOpcode() == ISD::SRA) &&
3329 "Unknown shift node");
3330 if (std::optional<ConstantRange> AmtRange =
3331 getValidShiftAmountRange(V, DemandedElts, Depth))
3332 return AmtRange->getUnsignedMax().getZExtValue();
3333 return std::nullopt;
3334}
3335
3336std::optional<unsigned>
3338 APInt DemandedElts = getDemandAllEltsMask(V);
3339 return getValidMaximumShiftAmount(V, DemandedElts, Depth);
3340}
3341
3342/// Determine which bits of Op are known to be either zero or one and return
3343/// them in Known. For vectors, the known bits are those that are shared by
3344/// every vector element.
3346 APInt DemandedElts = getDemandAllEltsMask(Op);
3347 return computeKnownBits(Op, DemandedElts, Depth);
3348}
3349
3350/// Determine which bits of Op are known to be either zero or one and return
3351/// them in Known. The DemandedElts argument allows us to only collect the known
3352/// bits that are shared by the requested vector elements.
3354 unsigned Depth) const {
3355 unsigned BitWidth = Op.getScalarValueSizeInBits();
3356
3357 KnownBits Known(BitWidth); // Don't know anything.
3358
3359 if (auto OptAPInt = Op->bitcastToAPInt()) {
3360 // We know all of the bits for a constant!
3361 APInt V = *std::move(OptAPInt);
3362
3363 // Swap the low-order and high-order double of a ppc_fp128 when casting to
3364 // i128, see #44482.
3365 //
3366 // A ppc_fp128 is two doubles, with the high-order double stored at the
3367 // lower address. Reading that as an integer therefore puts the high-order
3368 // double in the high 64 bits on big-endian targets and in the low 64 bits
3369 // on little-endian targets.
3370 //
3371 // But APFloat::bitcastToAPInt is endianness-agnostic and always places the
3372 // high-order double in the low 64 bits. Hence the two doubles must be
3373 // flipped on big-endian targets.
3374 if (getDataLayout().isBigEndian() && Op.getValueType() == MVT::ppcf128)
3375 V = V.rotl(64);
3376
3377 return KnownBits::makeConstant(V);
3378 }
3379
3380 if (Depth >= MaxRecursionDepth)
3381 return Known; // Limit search depth.
3382
3383 KnownBits Known2;
3384 unsigned NumElts = DemandedElts.getBitWidth();
3385 assert((!Op.getValueType().isScalableVector() || NumElts == 1) &&
3386 "DemandedElts for scalable vectors must be 1 to represent all lanes");
3387 assert((!Op.getValueType().isFixedLengthVector() ||
3388 NumElts == Op.getValueType().getVectorNumElements()) &&
3389 "Unexpected vector size");
3390
3391 if (!DemandedElts)
3392 return Known; // No demanded elts, better to assume we don't know anything.
3393
3394 unsigned Opcode = Op.getOpcode();
3395 switch (Opcode) {
3396 case ISD::FREEZE: {
3397 if (isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
3399 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3400 break;
3401 }
3402 case ISD::MERGE_VALUES:
3403 return computeKnownBits(Op.getOperand(Op.getResNo()), DemandedElts,
3404 Depth + 1);
3405 case ISD::SPLAT_VECTOR: {
3406 SDValue SrcOp = Op.getOperand(0);
3407 assert(SrcOp.getValueSizeInBits() >= BitWidth &&
3408 "Expected SPLAT_VECTOR implicit truncation");
3409 // Implicitly truncate the bits to match the official semantics of
3410 // SPLAT_VECTOR.
3412 break;
3413 }
3415 unsigned ScalarSize = Op.getOperand(0).getScalarValueSizeInBits();
3416 assert(ScalarSize * Op.getNumOperands() == BitWidth &&
3417 "Expected SPLAT_VECTOR_PARTS scalars to cover element width");
3418 for (auto [I, SrcOp] : enumerate(Op->ops())) {
3419 Known.insertBits(computeKnownBits(SrcOp, Depth + 1), ScalarSize * I);
3420 }
3421 break;
3422 }
3423 case ISD::STEP_VECTOR: {
3424 const APInt &Step = Op.getConstantOperandAPInt(0);
3425
3426 if (Step.isPowerOf2())
3427 Known.Zero.setLowBits(Step.logBase2());
3428
3430
3431 if (!isUIntN(BitWidth, Op.getValueType().getVectorMinNumElements()))
3432 break;
3433 const APInt MinNumElts =
3434 APInt(BitWidth, Op.getValueType().getVectorMinNumElements());
3435
3436 bool Overflow;
3437 const APInt MaxNumElts = getVScaleRange(&F, BitWidth)
3439 .umul_ov(MinNumElts, Overflow);
3440 if (Overflow)
3441 break;
3442
3443 const APInt MaxValue = (MaxNumElts - 1).umul_ov(Step, Overflow);
3444 if (Overflow)
3445 break;
3446
3447 Known.Zero.setHighBits(MaxValue.countl_zero());
3448 break;
3449 }
3450 case ISD::BUILD_VECTOR:
3451 assert(!Op.getValueType().isScalableVector());
3452 // Collect the known bits that are shared by every demanded vector element.
3453 Known.setAllConflict();
3454 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
3455 if (!DemandedElts[i])
3456 continue;
3457
3458 SDValue SrcOp = Op.getOperand(i);
3459 if (SrcOp.getOpcode() == ISD::POISON)
3460 continue;
3461
3462 Known2 = computeKnownBits(SrcOp, Depth + 1);
3463
3464 // BUILD_VECTOR can implicitly truncate sources, we must handle this.
3465 if (SrcOp.getValueSizeInBits() != BitWidth) {
3466 assert(SrcOp.getValueSizeInBits() > BitWidth &&
3467 "Expected BUILD_VECTOR implicit truncation");
3468 Known2 = Known2.trunc(BitWidth);
3469 }
3470
3471 // Known bits are the values that are shared by every demanded element.
3472 Known = Known.intersectWith(Known2);
3473
3474 // If we don't know any bits, early out.
3475 if (Known.isUnknown())
3476 break;
3477 }
3478
3479 // If every demanded element was poison, we know nothing.
3480 if (Known.hasConflict())
3481 Known.resetAll();
3482 break;
3483 case ISD::VECTOR_COMPRESS: {
3484 SDValue Vec = Op.getOperand(0);
3485 SDValue PassThru = Op.getOperand(2);
3486 Known = computeKnownBits(PassThru, DemandedElts, Depth + 1);
3487 // If we don't know any bits, early out.
3488 if (Known.isUnknown())
3489 break;
3490 Known2 = computeKnownBits(Vec, Depth + 1);
3491 Known = Known.intersectWith(Known2);
3492 break;
3493 }
3494 case ISD::VECTOR_SHUFFLE: {
3495 assert(!Op.getValueType().isScalableVector());
3496 // Collect the known bits that are shared by every vector element referenced
3497 // by the shuffle.
3498 APInt DemandedLHS, DemandedRHS;
3500 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
3501 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
3502 DemandedLHS, DemandedRHS))
3503 break;
3504
3505 // Known bits are the values that are shared by every demanded element.
3506 Known.setAllConflict();
3507 if (!!DemandedLHS) {
3508 SDValue LHS = Op.getOperand(0);
3509 Known2 = computeKnownBits(LHS, DemandedLHS, Depth + 1);
3510 Known = Known.intersectWith(Known2);
3511 }
3512 // If we don't know any bits, early out.
3513 if (Known.isUnknown())
3514 break;
3515 if (!!DemandedRHS) {
3516 SDValue RHS = Op.getOperand(1);
3517 Known2 = computeKnownBits(RHS, DemandedRHS, Depth + 1);
3518 Known = Known.intersectWith(Known2);
3519 }
3520 break;
3521 }
3522 case ISD::VSCALE: {
3524 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
3526 break;
3527 }
3528 case ISD::CONCAT_VECTORS: {
3529 if (Op.getValueType().isScalableVector())
3530 break;
3531 // Split DemandedElts and test each of the demanded subvectors.
3532 Known.setAllConflict();
3533 EVT SubVectorVT = Op.getOperand(0).getValueType();
3534 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
3535 unsigned NumSubVectors = Op.getNumOperands();
3536 for (unsigned i = 0; i != NumSubVectors; ++i) {
3537 APInt DemandedSub =
3538 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
3539 if (!!DemandedSub) {
3540 SDValue Sub = Op.getOperand(i);
3541 Known2 = computeKnownBits(Sub, DemandedSub, Depth + 1);
3542 Known = Known.intersectWith(Known2);
3543 }
3544 // If we don't know any bits, early out.
3545 if (Known.isUnknown())
3546 break;
3547 }
3548 break;
3549 }
3550 case ISD::INSERT_SUBVECTOR: {
3551 if (Op.getValueType().isScalableVector())
3552 break;
3553 // Demand any elements from the subvector and the remainder from the src its
3554 // inserted into.
3555 SDValue Src = Op.getOperand(0);
3556 SDValue Sub = Op.getOperand(1);
3557 uint64_t Idx = Op.getConstantOperandVal(2);
3558 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
3559 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
3560 APInt DemandedSrcElts = DemandedElts;
3561 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
3562
3563 Known.setAllConflict();
3564 if (!!DemandedSubElts) {
3565 Known = computeKnownBits(Sub, DemandedSubElts, Depth + 1);
3566 if (Known.isUnknown())
3567 break; // early-out.
3568 }
3569 if (!!DemandedSrcElts) {
3570 Known2 = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3571 Known = Known.intersectWith(Known2);
3572 }
3573 break;
3574 }
3576 // Offset the demanded elts by the subvector index.
3577 SDValue Src = Op.getOperand(0);
3578
3579 APInt DemandedSrcElts;
3580 if (Src.getValueType().isScalableVector())
3581 DemandedSrcElts = APInt(1, 1); // <=> 'demand all elements'
3582 else {
3583 uint64_t Idx = Op.getConstantOperandVal(1);
3584 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3585 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3586 }
3587 Known = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3588 break;
3589 }
3590 case ISD::SCALAR_TO_VECTOR: {
3591 if (Op.getValueType().isScalableVector())
3592 break;
3593 // We know about scalar_to_vector as much as we know about it source,
3594 // which becomes the first element of otherwise unknown vector.
3595 if (DemandedElts != 1)
3596 break;
3597
3598 SDValue N0 = Op.getOperand(0);
3599 Known = computeKnownBits(N0, Depth + 1);
3600 if (N0.getValueSizeInBits() != BitWidth)
3601 Known = Known.trunc(BitWidth);
3602
3603 break;
3604 }
3605 case ISD::BITCAST: {
3606 if (Op.getValueType().isScalableVector())
3607 break;
3608
3609 SDValue N0 = Op.getOperand(0);
3610 EVT SubVT = N0.getValueType();
3611 unsigned SubBitWidth = SubVT.getScalarSizeInBits();
3612
3613 // Ignore bitcasts from unsupported types.
3614 if (!(SubVT.isInteger() || SubVT.isFloatingPoint()))
3615 break;
3616
3617 // Fast handling of 'identity' bitcasts.
3618 if (BitWidth == SubBitWidth) {
3619 Known = computeKnownBits(N0, DemandedElts, Depth + 1);
3620 break;
3621 }
3622
3623 bool IsLE = getDataLayout().isLittleEndian();
3624
3625 // Bitcast 'small element' vector to 'large element' scalar/vector.
3626 if ((BitWidth % SubBitWidth) == 0) {
3627 assert(N0.getValueType().isVector() && "Expected bitcast from vector");
3628
3629 // Collect known bits for the (larger) output by collecting the known
3630 // bits from each set of sub elements and shift these into place.
3631 // We need to separately call computeKnownBits for each set of
3632 // sub elements as the knownbits for each is likely to be different.
3633 unsigned SubScale = BitWidth / SubBitWidth;
3634 APInt SubDemandedElts(NumElts * SubScale, 0);
3635 for (unsigned i = 0; i != NumElts; ++i)
3636 if (DemandedElts[i])
3637 SubDemandedElts.setBit(i * SubScale);
3638
3639 for (unsigned i = 0; i != SubScale; ++i) {
3640 Known2 = computeKnownBits(N0, SubDemandedElts.shl(i),
3641 Depth + 1);
3642 unsigned Shifts = IsLE ? i : SubScale - 1 - i;
3643 Known.insertBits(Known2, SubBitWidth * Shifts);
3644 }
3645 }
3646
3647 // Bitcast 'large element' scalar/vector to 'small element' vector.
3648 if ((SubBitWidth % BitWidth) == 0) {
3649 assert(Op.getValueType().isVector() && "Expected bitcast to vector");
3650
3651 // Collect known bits for the (smaller) output by collecting the known
3652 // bits from the overlapping larger input elements and extracting the
3653 // sub sections we actually care about.
3654 unsigned SubScale = SubBitWidth / BitWidth;
3655 APInt SubDemandedElts =
3656 APIntOps::ScaleBitMask(DemandedElts, NumElts / SubScale);
3657 Known2 = computeKnownBits(N0, SubDemandedElts, Depth + 1);
3658
3659 Known.setAllConflict();
3660 for (unsigned i = 0; i != NumElts; ++i)
3661 if (DemandedElts[i]) {
3662 unsigned Shifts = IsLE ? i : NumElts - 1 - i;
3663 unsigned Offset = (Shifts % SubScale) * BitWidth;
3664 Known = Known.intersectWith(Known2.extractBits(BitWidth, Offset));
3665 // If we don't know any bits, early out.
3666 if (Known.isUnknown())
3667 break;
3668 }
3669 }
3670 break;
3671 }
3672 case ISD::AND:
3673 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3674 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3675
3676 Known &= Known2;
3677 break;
3678 case ISD::OR:
3679 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3680 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3681
3682 Known |= Known2;
3683 break;
3684 case ISD::XOR:
3685 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3686 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3687
3688 Known ^= Known2;
3689 break;
3690 case ISD::MUL: {
3691 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3692 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3693 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3694 // TODO: SelfMultiply can be poison, but not undef.
3695 if (SelfMultiply)
3696 SelfMultiply &= isGuaranteedNotToBeUndefOrPoison(
3697 Op.getOperand(0), DemandedElts, UndefPoisonKind::UndefOrPoison,
3698 Depth + 1);
3699 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3700
3701 // If the multiplication is known not to overflow, the product of a number
3702 // with itself is non-negative. Only do this if we didn't already computed
3703 // the opposite value for the sign bit.
3704 if (Op->getFlags().hasNoSignedWrap() &&
3705 Op.getOperand(0) == Op.getOperand(1) &&
3706 !Known.isNegative())
3707 Known.makeNonNegative();
3708 break;
3709 }
3710 case ISD::MULHU: {
3711 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3712 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3713 Known = KnownBits::mulhu(Known, Known2);
3714 break;
3715 }
3716 case ISD::MULHS: {
3717 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3718 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3719 Known = KnownBits::mulhs(Known, Known2);
3720 break;
3721 }
3722 case ISD::ABDU: {
3723 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3724 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3725 Known = KnownBits::abdu(Known, Known2);
3726 break;
3727 }
3728 case ISD::ABDS: {
3729 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3730 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3731 Known = KnownBits::abds(Known, Known2);
3732 unsigned SignBits1 =
3733 ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
3734 if (SignBits1 == 1)
3735 break;
3736 unsigned SignBits0 =
3737 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
3738 Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
3739 break;
3740 }
3741 case ISD::UMUL_LOHI: {
3742 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3743 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3744 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3745 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3746 if (Op.getResNo() == 0)
3747 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3748 else
3749 Known = KnownBits::mulhu(Known, Known2);
3750 break;
3751 }
3752 case ISD::SMUL_LOHI: {
3753 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3754 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3755 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3756 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3757 if (Op.getResNo() == 0)
3758 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3759 else
3760 Known = KnownBits::mulhs(Known, Known2);
3761 break;
3762 }
3763 case ISD::AVGFLOORU: {
3764 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3765 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3766 Known = KnownBits::avgFloorU(Known, Known2);
3767 break;
3768 }
3769 case ISD::AVGCEILU: {
3770 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3771 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3772 Known = KnownBits::avgCeilU(Known, Known2);
3773 break;
3774 }
3775 case ISD::AVGFLOORS: {
3776 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3777 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3778 Known = KnownBits::avgFloorS(Known, Known2);
3779 break;
3780 }
3781 case ISD::AVGCEILS: {
3782 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3783 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3784 Known = KnownBits::avgCeilS(Known, Known2);
3785 break;
3786 }
3787 case ISD::SELECT:
3788 case ISD::VSELECT:
3789 Known = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3790 // If we don't know any bits, early out.
3791 if (Known.isUnknown())
3792 break;
3793 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth+1);
3794
3795 // Only known if known in both the LHS and RHS.
3796 Known = Known.intersectWith(Known2);
3797 break;
3798 case ISD::SELECT_CC:
3799 Known = computeKnownBits(Op.getOperand(3), DemandedElts, Depth+1);
3800 // If we don't know any bits, early out.
3801 if (Known.isUnknown())
3802 break;
3803 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3804
3805 // Only known if known in both the LHS and RHS.
3806 Known = Known.intersectWith(Known2);
3807 break;
3808 case ISD::SMULO:
3809 case ISD::UMULO:
3810 if (Op.getResNo() != 1)
3811 break;
3812 // The boolean result conforms to getBooleanContents.
3813 // If we know the result of a setcc has the top bits zero, use this info.
3814 // We know that we have an integer-based boolean since these operations
3815 // are only available for integer.
3816 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
3818 BitWidth > 1)
3819 Known.Zero.setBitsFrom(1);
3820 break;
3821 case ISD::SETCC:
3822 case ISD::SETCCCARRY:
3823 case ISD::STRICT_FSETCC:
3824 case ISD::STRICT_FSETCCS: {
3825 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
3826 // If we know the result of a setcc has the top bits zero, use this info.
3827 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
3829 BitWidth > 1)
3830 Known.Zero.setBitsFrom(1);
3831 break;
3832 }
3833 case ISD::SHL: {
3834 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3835 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3836
3837 bool NUW = Op->getFlags().hasNoUnsignedWrap();
3838 bool NSW = Op->getFlags().hasNoSignedWrap();
3839
3840 bool ShAmtNonZero = Known2.isNonZero();
3841
3842 Known = KnownBits::shl(Known, Known2, NUW, NSW, ShAmtNonZero);
3843
3844 // Minimum shift low bits are known zero.
3845 if (std::optional<unsigned> ShMinAmt =
3846 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
3847 Known.Zero.setLowBits(*ShMinAmt);
3848 break;
3849 }
3850 case ISD::SRL:
3851 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3852 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3853 Known = KnownBits::lshr(Known, Known2, /*ShAmtNonZero=*/false,
3854 Op->getFlags().hasExact());
3855
3856 // Minimum shift high bits are known zero.
3857 if (std::optional<unsigned> ShMinAmt =
3858 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
3859 Known.Zero.setHighBits(*ShMinAmt);
3860 break;
3861 case ISD::SRA:
3862 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3863 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3864 Known = KnownBits::ashr(Known, Known2, /*ShAmtNonZero=*/false,
3865 Op->getFlags().hasExact());
3866 break;
3867 case ISD::ROTL:
3868 case ISD::ROTR:
3869 if (ConstantSDNode *C =
3870 isConstOrConstSplat(Op.getOperand(1), DemandedElts)) {
3871 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3872
3873 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3874
3875 // Canonicalize to ROTR.
3876 if (Opcode == ISD::ROTL && Amt != 0)
3877 Amt = BitWidth - Amt;
3878
3879 Known.Zero = Known.Zero.rotr(Amt);
3880 Known.One = Known.One.rotr(Amt);
3881 }
3882 break;
3883 case ISD::FSHL:
3884 case ISD::FSHR:
3885 if (ConstantSDNode *C = isConstOrConstSplat(Op.getOperand(2), DemandedElts)) {
3886 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3887
3888 // For fshl, 0-shift returns the 1st arg.
3889 // For fshr, 0-shift returns the 2nd arg.
3890 if (Amt == 0) {
3891 Known = computeKnownBits(Op.getOperand(Opcode == ISD::FSHL ? 0 : 1),
3892 DemandedElts, Depth + 1);
3893 break;
3894 }
3895
3896 // fshl: (X << (Z % BW)) | (Y >> (BW - (Z % BW)))
3897 // fshr: (X << (BW - (Z % BW))) | (Y >> (Z % BW))
3898 const APInt ShAmt(BitWidth, Amt);
3899 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3900 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3901 Known = Opcode == ISD::FSHL ? KnownBits::fshl(Known, Known2, ShAmt)
3902 : KnownBits::fshr(Known, Known2, ShAmt);
3903 }
3904 break;
3905 case ISD::SHL_PARTS:
3906 case ISD::SRA_PARTS:
3907 case ISD::SRL_PARTS: {
3908 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3909
3910 // Collect lo/hi source values and concatenate.
3911 unsigned LoBits = Op.getOperand(0).getScalarValueSizeInBits();
3912 unsigned HiBits = Op.getOperand(1).getScalarValueSizeInBits();
3913 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3914 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3915 Known = Known2.concat(Known);
3916
3917 // Collect shift amount.
3918 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
3919
3920 if (Opcode == ISD::SHL_PARTS)
3921 Known = KnownBits::shl(Known, Known2);
3922 else if (Opcode == ISD::SRA_PARTS)
3923 Known = KnownBits::ashr(Known, Known2);
3924 else // if (Opcode == ISD::SRL_PARTS)
3925 Known = KnownBits::lshr(Known, Known2);
3926
3927 // TODO: Minimum shift low/high bits are known zero.
3928
3929 if (Op.getResNo() == 0)
3930 Known = Known.extractBits(LoBits, 0);
3931 else
3932 Known = Known.extractBits(HiBits, LoBits);
3933 break;
3934 }
3936 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3937 EVT EVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
3938 Known = Known.sextInReg(EVT.getScalarSizeInBits());
3939 break;
3940 }
3941 case ISD::CTTZ:
3942 case ISD::CTTZ_ZERO_POISON: {
3943 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3944 // If we have a known 1, its position is our upper bound.
3945 unsigned PossibleTZ = Known2.countMaxTrailingZeros();
3946 unsigned LowBits = llvm::bit_width(PossibleTZ);
3947 Known.Zero.setBitsFrom(LowBits);
3948 break;
3949 }
3950 case ISD::CTLZ:
3951 case ISD::CTLZ_ZERO_POISON: {
3952 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3953 // If we have a known 1, its position is our upper bound.
3954 unsigned PossibleLZ = Known2.countMaxLeadingZeros();
3955 unsigned LowBits = llvm::bit_width(PossibleLZ);
3956 Known.Zero.setBitsFrom(LowBits);
3957 break;
3958 }
3959 case ISD::CTLS: {
3960 unsigned MinRedundantSignBits =
3961 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1;
3962 ConstantRange Range(APInt(BitWidth, MinRedundantSignBits),
3964 Known = Range.toKnownBits();
3965 break;
3966 }
3967 case ISD::CTPOP: {
3968 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3969 // If we know some of the bits are zero, they can't be one.
3970 unsigned PossibleOnes = Known2.countMaxPopulation();
3971 Known.Zero.setBitsFrom(llvm::bit_width(PossibleOnes));
3972 break;
3973 }
3974 case ISD::PARITY: {
3975 // Parity returns 0 everywhere but the LSB.
3976 Known.Zero.setBitsFrom(1);
3977 break;
3978 }
3979 case ISD::PDEP: {
3980 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3981 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3982 Known = KnownBits::pdep(Known2, Known);
3983 break;
3984 }
3985 case ISD::PEXT: {
3986 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3987 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3988 Known = KnownBits::pext(Known2, Known);
3989 break;
3990 }
3991 case ISD::CLMUL: {
3992 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3993 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3994 Known = KnownBits::clmul(Known, Known2);
3995 break;
3996 }
3997 case ISD::MGATHER:
3998 case ISD::MLOAD: {
3999 ISD::LoadExtType ETy =
4000 (Opcode == ISD::MGATHER)
4001 ? cast<MaskedGatherSDNode>(Op)->getExtensionType()
4002 : cast<MaskedLoadSDNode>(Op)->getExtensionType();
4003 if (ETy == ISD::ZEXTLOAD) {
4004 EVT MemVT = cast<MemSDNode>(Op)->getMemoryVT();
4005 KnownBits Known0(MemVT.getScalarSizeInBits());
4006 return Known0.zext(BitWidth);
4007 }
4008 break;
4009 }
4010 case ISD::LOAD: {
4012 const Constant *Cst = TLI->getTargetConstantFromLoad(LD);
4013 if (ISD::isNON_EXTLoad(LD) && Cst) {
4014 // Determine any common known bits from the loaded constant pool value.
4015 Type *CstTy = Cst->getType();
4016 if ((NumElts * BitWidth) == CstTy->getPrimitiveSizeInBits() &&
4017 !Op.getValueType().isScalableVector()) {
4018 // If its a vector splat, then we can (quickly) reuse the scalar path.
4019 // NOTE: We assume all elements match and none are UNDEF.
4020 if (CstTy->isVectorTy()) {
4021 if (const Constant *Splat = Cst->getSplatValue()) {
4022 Cst = Splat;
4023 CstTy = Cst->getType();
4024 }
4025 }
4026 // TODO - do we need to handle different bitwidths?
4027 if (CstTy->isVectorTy() && BitWidth == CstTy->getScalarSizeInBits()) {
4028 // Iterate across all vector elements finding common known bits.
4029 Known.setAllConflict();
4030 for (unsigned i = 0; i != NumElts; ++i) {
4031 if (!DemandedElts[i])
4032 continue;
4033 if (Constant *Elt = Cst->getAggregateElement(i)) {
4034 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
4035 const APInt &Value = CInt->getValue();
4036 Known.One &= Value;
4037 Known.Zero &= ~Value;
4038 continue;
4039 }
4040 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
4041 APInt Value = CFP->getValueAPF().bitcastToAPInt();
4042 Known.One &= Value;
4043 Known.Zero &= ~Value;
4044 continue;
4045 }
4046 }
4047 Known.One.clearAllBits();
4048 Known.Zero.clearAllBits();
4049 break;
4050 }
4051 } else if (BitWidth == CstTy->getPrimitiveSizeInBits()) {
4052 if (auto *CInt = dyn_cast<ConstantInt>(Cst)) {
4053 Known = KnownBits::makeConstant(CInt->getValue());
4054 } else if (auto *CFP = dyn_cast<ConstantFP>(Cst)) {
4055 Known =
4056 KnownBits::makeConstant(CFP->getValueAPF().bitcastToAPInt());
4057 }
4058 }
4059 }
4060 } else if (Op.getResNo() == 0) {
4061 unsigned ScalarMemorySize = LD->getMemoryVT().getScalarSizeInBits();
4062 KnownBits KnownScalarMemory(ScalarMemorySize);
4063 if (const MDNode *MD = LD->getRanges())
4064 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4065
4066 // Extend the Known bits from memory to the size of the scalar result.
4067 if (ISD::isZEXTLoad(Op.getNode()))
4068 Known = KnownScalarMemory.zext(BitWidth);
4069 else if (ISD::isSEXTLoad(Op.getNode()))
4070 Known = KnownScalarMemory.sext(BitWidth);
4071 else if (ISD::isEXTLoad(Op.getNode()))
4072 Known = KnownScalarMemory.anyext(BitWidth);
4073 else
4074 Known = KnownScalarMemory;
4075 assert(Known.getBitWidth() == BitWidth);
4076 return Known;
4077 }
4078 break;
4079 }
4081 if (Op.getValueType().isScalableVector())
4082 break;
4083 EVT InVT = Op.getOperand(0).getValueType();
4084 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4085 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4086 Known = Known.zext(BitWidth);
4087 break;
4088 }
4089 case ISD::ZERO_EXTEND: {
4090 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4091 Known = Known.zext(BitWidth);
4092 break;
4093 }
4095 if (Op.getValueType().isScalableVector())
4096 break;
4097 EVT InVT = Op.getOperand(0).getValueType();
4098 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4099 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4100 // If the sign bit is known to be zero or one, then sext will extend
4101 // it to the top bits, else it will just zext.
4102 Known = Known.sext(BitWidth);
4103 break;
4104 }
4105 case ISD::SIGN_EXTEND: {
4106 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4107 // If the sign bit is known to be zero or one, then sext will extend
4108 // it to the top bits, else it will just zext.
4109 Known = Known.sext(BitWidth);
4110 break;
4111 }
4113 if (Op.getValueType().isScalableVector())
4114 break;
4115 EVT InVT = Op.getOperand(0).getValueType();
4116 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4117 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4118 Known = Known.anyext(BitWidth);
4119 break;
4120 }
4121 case ISD::ANY_EXTEND: {
4122 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4123 Known = Known.anyext(BitWidth);
4124 break;
4125 }
4126 case ISD::TRUNCATE: {
4127 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4128 Known = Known.trunc(BitWidth);
4129 break;
4130 }
4131 case ISD::TRUNCATE_SSAT_S: {
4132 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4133 Known = Known.truncSSat(BitWidth);
4134 break;
4135 }
4136 case ISD::TRUNCATE_SSAT_U: {
4137 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4138 Known = Known.truncSSatU(BitWidth);
4139 break;
4140 }
4141 case ISD::TRUNCATE_USAT_U: {
4142 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4143 Known = Known.truncUSat(BitWidth);
4144 break;
4145 }
4146 case ISD::AssertZext: {
4147 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4149 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4150 Known.Zero |= (~InMask);
4151 Known.One &= (~Known.Zero);
4152 break;
4153 }
4154 case ISD::AssertAlign: {
4155 unsigned LogOfAlign = Log2(cast<AssertAlignSDNode>(Op)->getAlign());
4156 assert(LogOfAlign != 0);
4157
4158 // TODO: Should use maximum with source
4159 // If a node is guaranteed to be aligned, set low zero bits accordingly as
4160 // well as clearing one bits.
4161 Known.Zero.setLowBits(LogOfAlign);
4162 Known.One.clearLowBits(LogOfAlign);
4163 break;
4164 }
4165 case ISD::AssertNoFPClass: {
4166 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4167
4168 FPClassTest NoFPClass =
4169 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
4170 const FPClassTest NegativeTestMask = fcNan | fcNegative;
4171 if ((NoFPClass & NegativeTestMask) == NegativeTestMask) {
4172 // Cannot be negative.
4173 Known.makeNonNegative();
4174 }
4175
4176 const FPClassTest PositiveTestMask = fcNan | fcPositive;
4177 if ((NoFPClass & PositiveTestMask) == PositiveTestMask) {
4178 // Cannot be positive.
4179 Known.makeNegative();
4180 }
4181
4182 break;
4183 }
4184 case ISD::FABS:
4185 // fabs clears the sign bit
4186 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4187 Known.Zero.setSignBit();
4188 Known.One.clearSignBit();
4189 break;
4190 case ISD::FGETSIGN:
4191 // All bits are zero except the low bit.
4192 Known.Zero.setBitsFrom(1);
4193 break;
4194 case ISD::ADD: {
4195 SDNodeFlags Flags = Op.getNode()->getFlags();
4196 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4197 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4198 bool SelfAdd = Op.getOperand(0) == Op.getOperand(1) &&
4200 Op.getOperand(0), DemandedElts,
4202 Known = KnownBits::add(Known, Known2, Flags.hasNoSignedWrap(),
4203 Flags.hasNoUnsignedWrap(), SelfAdd);
4204 break;
4205 }
4206 case ISD::SUB: {
4207 SDNodeFlags Flags = Op.getNode()->getFlags();
4208 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4209 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4210 Known = KnownBits::sub(Known, Known2, Flags.hasNoSignedWrap(),
4211 Flags.hasNoUnsignedWrap());
4212 break;
4213 }
4214 case ISD::USUBO:
4215 case ISD::SSUBO:
4216 case ISD::USUBO_CARRY:
4217 case ISD::SSUBO_CARRY:
4218 if (Op.getResNo() == 1) {
4219 // If we know the result of a setcc has the top bits zero, use this info.
4220 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4222 BitWidth > 1)
4223 Known.Zero.setBitsFrom(1);
4224 break;
4225 }
4226 [[fallthrough]];
4227 case ISD::SUBC: {
4228 assert(Op.getResNo() == 0 &&
4229 "We only compute knownbits for the difference here.");
4230
4231 // With USUBO_CARRY and SSUBO_CARRY a borrow bit may be added in.
4232 KnownBits Borrow(1);
4233 if (Opcode == ISD::USUBO_CARRY || Opcode == ISD::SSUBO_CARRY) {
4234 Borrow = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4235 // Borrow has bit width 1
4236 Borrow = Borrow.trunc(1);
4237 } else {
4238 Borrow.setAllZero();
4239 }
4240
4241 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4242 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4243 Known = KnownBits::computeForSubBorrow(Known, Known2, Borrow);
4244 break;
4245 }
4246 case ISD::UADDO:
4247 case ISD::SADDO:
4248 case ISD::UADDO_CARRY:
4249 case ISD::SADDO_CARRY:
4250 if (Op.getResNo() == 1) {
4251 // If we know the result of a setcc has the top bits zero, use this info.
4252 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4254 BitWidth > 1)
4255 Known.Zero.setBitsFrom(1);
4256 break;
4257 }
4258 [[fallthrough]];
4259 case ISD::ADDC:
4260 case ISD::ADDE: {
4261 assert(Op.getResNo() == 0 && "We only compute knownbits for the sum here.");
4262
4263 // With ADDE and UADDO_CARRY, a carry bit may be added in.
4264 KnownBits Carry(1);
4265 if (Opcode == ISD::ADDE)
4266 // Can't track carry from glue, set carry to unknown.
4267 Carry.resetAll();
4268 else if (Opcode == ISD::UADDO_CARRY || Opcode == ISD::SADDO_CARRY) {
4269 Carry = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4270 // Carry has bit width 1
4271 Carry = Carry.trunc(1);
4272 } else {
4273 Carry.setAllZero();
4274 }
4275
4276 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4277 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4278 Known = KnownBits::computeForAddCarry(Known, Known2, Carry);
4279 break;
4280 }
4281 case ISD::UDIV: {
4282 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4283 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4284 Known = KnownBits::udiv(Known, Known2, Op->getFlags().hasExact());
4285 break;
4286 }
4287 case ISD::SDIV: {
4288 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4289 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4290 Known = KnownBits::sdiv(Known, Known2, Op->getFlags().hasExact());
4291 break;
4292 }
4293 case ISD::SREM: {
4294 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4295 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4296 Known = KnownBits::srem(Known, Known2);
4297 break;
4298 }
4299 case ISD::UREM: {
4300 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4301 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4302 Known = KnownBits::urem(Known, Known2);
4303 break;
4304 }
4305 case ISD::EXTRACT_ELEMENT: {
4306 Known = computeKnownBits(Op.getOperand(0), Depth+1);
4307 const unsigned Index = Op.getConstantOperandVal(1);
4308 const unsigned EltBitWidth = Op.getValueSizeInBits();
4309
4310 Known = Known.extractBits(EltBitWidth, Index * EltBitWidth);
4311 break;
4312 }
4314 SDValue InVec = Op.getOperand(0);
4315 SDValue EltNo = Op.getOperand(1);
4316 EVT VecVT = InVec.getValueType();
4317 // computeKnownBits not yet implemented for scalable vectors.
4318 if (VecVT.isScalableVector())
4319 break;
4320 const unsigned EltBitWidth = VecVT.getScalarSizeInBits();
4321 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4322
4323 // If BitWidth > EltBitWidth the value is anyext:ed. So we do not know
4324 // anything about the extended bits.
4325 if (BitWidth > EltBitWidth)
4326 Known = Known.trunc(EltBitWidth);
4327
4328 // If we know the element index, just demand that vector element, else for
4329 // an unknown element index, ignore DemandedElts and demand them all.
4330 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
4331 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4332 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
4333 DemandedSrcElts =
4334 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
4335
4336 Known = computeKnownBits(InVec, DemandedSrcElts, Depth + 1);
4337 if (BitWidth > EltBitWidth)
4338 Known = Known.anyext(BitWidth);
4339 break;
4340 }
4341 case ISD::BUILD_PAIR: {
4342 // Operand 0 is the low half and operand 1 the high half,
4343 // KnownBits::concat places its argument in the low bits.
4344 Known = computeKnownBits(Op.getOperand(0), Depth + 1);
4345 Known2 = computeKnownBits(Op.getOperand(1), Depth + 1);
4346 Known = Known2.concat(Known);
4347 break;
4348 }
4350 if (Op.getValueType().isScalableVector())
4351 break;
4352
4353 // If we know the element index, split the demand between the
4354 // source vector and the inserted element, otherwise assume we need
4355 // the original demanded vector elements and the value.
4356 SDValue InVec = Op.getOperand(0);
4357 SDValue InVal = Op.getOperand(1);
4358 SDValue EltNo = Op.getOperand(2);
4359 bool DemandedVal = true;
4360 APInt DemandedVecElts = DemandedElts;
4361 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
4362 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
4363 unsigned EltIdx = CEltNo->getZExtValue();
4364 DemandedVal = !!DemandedElts[EltIdx];
4365 DemandedVecElts.clearBit(EltIdx);
4366 }
4367 Known.setAllConflict();
4368 if (DemandedVal) {
4369 Known2 = computeKnownBits(InVal, Depth + 1);
4370 Known = Known.intersectWith(Known2.zextOrTrunc(BitWidth));
4371 }
4372 if (!!DemandedVecElts) {
4373 Known2 = computeKnownBits(InVec, DemandedVecElts, Depth + 1);
4374 Known = Known.intersectWith(Known2);
4375 }
4376 break;
4377 }
4378 case ISD::BITREVERSE: {
4379 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4380 Known = Known2.reverseBits();
4381 break;
4382 }
4383 case ISD::BSWAP: {
4384 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4385 Known = Known2.byteSwap();
4386 break;
4387 }
4388 case ISD::ABS:
4389 case ISD::ABS_MIN_POISON: {
4390 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4391 Known = Known2.abs();
4392 Known.Zero.setHighBits(
4393 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1);
4394 break;
4395 }
4396 case ISD::USUBSAT: {
4397 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4398 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4399 Known = KnownBits::usub_sat(Known, Known2);
4400 break;
4401 }
4402 case ISD::UMIN: {
4403 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4404 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4405 Known = KnownBits::umin(Known, Known2);
4406 break;
4407 }
4408 case ISD::UMAX: {
4409 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4410 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4411 Known = KnownBits::umax(Known, Known2);
4412 break;
4413 }
4414 case ISD::SMIN:
4415 case ISD::SMAX: {
4416 // If we have a clamp pattern, we know that the number of sign bits will be
4417 // the minimum of the clamp min/max range.
4418 bool IsMax = (Opcode == ISD::SMAX);
4419 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
4420 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
4421 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
4422 CstHigh =
4423 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
4424 if (CstLow && CstHigh) {
4425 if (!IsMax)
4426 std::swap(CstLow, CstHigh);
4427
4428 const APInt &ValueLow = CstLow->getAPIntValue();
4429 const APInt &ValueHigh = CstHigh->getAPIntValue();
4430 if (ValueLow.sle(ValueHigh)) {
4431 unsigned LowSignBits = ValueLow.getNumSignBits();
4432 unsigned HighSignBits = ValueHigh.getNumSignBits();
4433 unsigned MinSignBits = std::min(LowSignBits, HighSignBits);
4434 if (ValueLow.isNegative() && ValueHigh.isNegative()) {
4435 Known.One.setHighBits(MinSignBits);
4436 break;
4437 }
4438 if (ValueLow.isNonNegative() && ValueHigh.isNonNegative()) {
4439 Known.Zero.setHighBits(MinSignBits);
4440 break;
4441 }
4442 }
4443 }
4444
4445 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4446 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4447 if (IsMax)
4448 Known = KnownBits::smax(Known, Known2);
4449 else
4450 Known = KnownBits::smin(Known, Known2);
4451
4452 // For SMAX, if CstLow is non-negative we know the result will be
4453 // non-negative and thus all sign bits are 0.
4454 // TODO: There's an equivalent of this for smin with negative constant for
4455 // known ones.
4456 if (IsMax && CstLow) {
4457 const APInt &ValueLow = CstLow->getAPIntValue();
4458 if (ValueLow.isNonNegative()) {
4459 unsigned SignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4460 Known.Zero.setHighBits(std::min(SignBits, ValueLow.getNumSignBits()));
4461 }
4462 }
4463
4464 break;
4465 }
4466 case ISD::UINT_TO_FP: {
4467 Known.makeNonNegative();
4468 break;
4469 }
4470 case ISD::SINT_TO_FP: {
4471 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4472 if (Known2.isNonNegative())
4473 Known.makeNonNegative();
4474 else if (Known2.isNegative())
4475 Known.makeNegative();
4476 break;
4477 }
4478 case ISD::FP_TO_UINT_SAT: {
4479 // FP_TO_UINT_SAT produces an unsigned value that fits in the saturating VT.
4480 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4482 break;
4483 }
4484 case ISD::ATOMIC_LOAD: {
4485 // If we are looking at the loaded value.
4486 if (Op.getResNo() == 0) {
4487 auto *AT = cast<AtomicSDNode>(Op);
4488 unsigned ScalarMemorySize = AT->getMemoryVT().getScalarSizeInBits();
4489 KnownBits KnownScalarMemory(ScalarMemorySize);
4490 if (const MDNode *MD = AT->getRanges())
4491 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4492
4493 switch (AT->getExtensionType()) {
4494 case ISD::ZEXTLOAD:
4495 Known = KnownScalarMemory.zext(BitWidth);
4496 break;
4497 case ISD::SEXTLOAD:
4498 Known = KnownScalarMemory.sext(BitWidth);
4499 break;
4500 case ISD::EXTLOAD:
4501 switch (TLI->getExtendForAtomicOps()) {
4502 case ISD::ZERO_EXTEND:
4503 Known = KnownScalarMemory.zext(BitWidth);
4504 break;
4505 case ISD::SIGN_EXTEND:
4506 Known = KnownScalarMemory.sext(BitWidth);
4507 break;
4508 default:
4509 Known = KnownScalarMemory.anyext(BitWidth);
4510 break;
4511 }
4512 break;
4513 case ISD::NON_EXTLOAD:
4514 Known = KnownScalarMemory;
4515 break;
4516 }
4517 assert(Known.getBitWidth() == BitWidth);
4518 }
4519 break;
4520 }
4522 if (Op.getResNo() == 1) {
4523 // The boolean result conforms to getBooleanContents.
4524 // If we know the result of a setcc has the top bits zero, use this info.
4525 // We know that we have an integer-based boolean since these operations
4526 // are only available for integer.
4527 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
4529 BitWidth > 1)
4530 Known.Zero.setBitsFrom(1);
4531 break;
4532 }
4533 [[fallthrough]];
4535 case ISD::ATOMIC_SWAP:
4546 case ISD::ATOMIC_LOAD_UMAX: {
4547 // If we are looking at the loaded value.
4548 if (Op.getResNo() == 0) {
4549 auto *AT = cast<AtomicSDNode>(Op);
4550 unsigned MemBits = AT->getMemoryVT().getScalarSizeInBits();
4551
4552 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
4553 Known.Zero.setBitsFrom(MemBits);
4554 }
4555 break;
4556 }
4557 case ISD::FrameIndex:
4558 case ISD::TargetFrameIndex: {
4559 const MachineFunction &MF = getMachineFunction();
4560 int FrameIdx = cast<FrameIndexSDNode>(Op)->getIndex();
4561 TLI->computeKnownBitsForStackObjectPointer(
4562 Known, MF, MF.getFrameInfo().getObjectAlign(FrameIdx));
4563 break;
4564 }
4565 case ISD::VP_LOAD_FF: {
4566 if (Op.getResNo() != 1)
4567 break;
4568 // The second result of vp.load.ff is an unsigned value that is less than or
4569 // equal to the EVL operand.
4570 KnownBits VLKB =
4571 computeKnownBits(Op.getOperand(3), DemandedElts, Depth + 1);
4572 // The new VL is also bounded by the largest vector length.
4573 EVT ResVT = Op->getValueType(0);
4574 auto ResKB = KnownBits::makeConstant(
4576 if (ResVT.isScalableVector()) {
4578 ResKB = KnownBits::mul(getVScaleRange(&F, BitWidth).toKnownBits(), ResKB);
4579 }
4580 Known.Zero.setHighBits(KnownBits::umin(VLKB, ResKB).countMinLeadingZeros());
4581 break;
4582 }
4583
4584 default:
4585 if (Opcode < ISD::BUILTIN_OP_END)
4586 break;
4587 [[fallthrough]];
4591 // Allow the target to implement this method for its nodes.
4592 TLI->computeKnownBitsForTargetNode(Op, Known, DemandedElts, *this, Depth);
4593 break;
4594 }
4595
4596 return Known;
4597}
4598
4599/// Convert ConstantRange OverflowResult into SelectionDAG::OverflowKind.
4612
4615 // X + 0 never overflow
4616 if (isNullConstant(N1))
4617 return OFK_Never;
4618
4619 // If both operands each have at least two sign bits, the addition
4620 // cannot overflow.
4621 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4622 return OFK_Never;
4623
4624 // TODO: Add ConstantRange::signedAddMayOverflow handling.
4625 return OFK_Sometime;
4626}
4627
4630 // X + 0 never overflow
4631 if (isNullConstant(N1))
4632 return OFK_Never;
4633
4634 // mulhi + 1 never overflow
4635 KnownBits N1Known = computeKnownBits(N1);
4636 if (N0.getOpcode() == ISD::UMUL_LOHI && N0.getResNo() == 1 &&
4637 N1Known.getMaxValue().ult(2))
4638 return OFK_Never;
4639
4640 KnownBits N0Known = computeKnownBits(N0);
4641 if (N1.getOpcode() == ISD::UMUL_LOHI && N1.getResNo() == 1 &&
4642 N0Known.getMaxValue().ult(2))
4643 return OFK_Never;
4644
4645 // Fallback to ConstantRange::unsignedAddMayOverflow handling.
4646 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4647 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4648 return mapOverflowResult(N0Range.unsignedAddMayOverflow(N1Range));
4649}
4650
4653 // X - 0 never overflow
4654 if (isNullConstant(N1))
4655 return OFK_Never;
4656
4657 // If both operands each have at least two sign bits, the subtraction
4658 // cannot overflow.
4659 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4660 return OFK_Never;
4661
4662 KnownBits N0Known = computeKnownBits(N0);
4663 KnownBits N1Known = computeKnownBits(N1);
4664 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, true);
4665 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, true);
4666 return mapOverflowResult(N0Range.signedSubMayOverflow(N1Range));
4667}
4668
4671 // X - 0 never overflow
4672 if (isNullConstant(N1))
4673 return OFK_Never;
4674
4675 ConstantRange N0Range =
4676 computeConstantRangeIncludingKnownBits(N0, /*ForSigned=*/false);
4677 ConstantRange N1Range =
4678 computeConstantRangeIncludingKnownBits(N1, /*ForSigned=*/false);
4679 return mapOverflowResult(N0Range.unsignedSubMayOverflow(N1Range));
4680}
4681
4684 // X * 0 and X * 1 never overflow.
4685 if (isNullConstant(N1) || isOneConstant(N1))
4686 return OFK_Never;
4687
4690 return mapOverflowResult(N0Range.unsignedMulMayOverflow(N1Range));
4691}
4692
4695 // X * 0 and X * 1 never overflow.
4696 if (isNullConstant(N1) || isOneConstant(N1))
4697 return OFK_Never;
4698
4699 // Get the size of the result.
4700 unsigned BitWidth = N0.getScalarValueSizeInBits();
4701
4702 // Sum of the sign bits.
4703 unsigned SignBits = ComputeNumSignBits(N0) + ComputeNumSignBits(N1);
4704
4705 // If we have enough sign bits, then there's no overflow.
4706 if (SignBits > BitWidth + 1)
4707 return OFK_Never;
4708
4709 if (SignBits == BitWidth + 1) {
4710 // The overflow occurs when the true multiplication of the
4711 // the operands is the minimum negative number.
4712 KnownBits N0Known = computeKnownBits(N0);
4713 KnownBits N1Known = computeKnownBits(N1);
4714 // If one of the operands is non-negative, then there's no
4715 // overflow.
4716 if (N0Known.isNonNegative() || N1Known.isNonNegative())
4717 return OFK_Never;
4718 }
4719
4720 return OFK_Sometime;
4721}
4722
4724 unsigned Depth) const {
4725 APInt DemandedElts = getDemandAllEltsMask(Op);
4726 return computeConstantRange(Op, DemandedElts, ForSigned, Depth);
4727}
4728
4730 const APInt &DemandedElts,
4731 bool ForSigned,
4732 unsigned Depth) const {
4733 EVT VT = Op.getValueType();
4734 unsigned BitWidth = VT.getScalarSizeInBits();
4735
4736 if (Depth >= MaxRecursionDepth)
4737 return ConstantRange::getFull(BitWidth);
4738
4739 if (ConstantSDNode *C = isConstOrConstSplat(Op, DemandedElts))
4740 return ConstantRange(C->getAPIntValue());
4741
4742 unsigned Opcode = Op.getOpcode();
4743 switch (Opcode) {
4744 case ISD::VSCALE: {
4746 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
4747 return getVScaleRange(&F, BitWidth).multiply(Multiplier);
4748 }
4749 default:
4750 break;
4751 }
4752
4753 return ConstantRange::getFull(BitWidth);
4754}
4755
4758 unsigned Depth) const {
4759 APInt DemandedElts = getDemandAllEltsMask(Op);
4760 return computeConstantRangeIncludingKnownBits(Op, DemandedElts, ForSigned,
4761 Depth);
4762}
4763
4765 SDValue Op, const APInt &DemandedElts, bool ForSigned,
4766 unsigned Depth) const {
4767 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
4769 ConstantRange CR2 = computeConstantRange(Op, DemandedElts, ForSigned, Depth);
4772 return CR1.intersectWith(CR2, RangeType);
4773}
4774
4776 unsigned Depth) const {
4777 APInt DemandedElts = getDemandAllEltsMask(Val);
4778 return isKnownToBeAPowerOfTwo(Val, DemandedElts, OrZero, Depth);
4779}
4780
4782 const APInt &DemandedElts,
4783 bool OrZero, unsigned Depth) const {
4784 if (Depth >= MaxRecursionDepth)
4785 return false; // Limit search depth.
4786
4787 EVT OpVT = Val.getValueType();
4788 unsigned BitWidth = OpVT.getScalarSizeInBits();
4789 [[maybe_unused]] unsigned NumElts = DemandedElts.getBitWidth();
4790 assert((!OpVT.isScalableVector() || NumElts == 1) &&
4791 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4792 assert(
4793 (!OpVT.isFixedLengthVector() || NumElts == OpVT.getVectorNumElements()) &&
4794 "Unexpected vector size");
4795
4796 auto IsPowerOfTwoOrZero = [BitWidth, OrZero](const ConstantSDNode *C) {
4797 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
4798 return (OrZero && V.isZero()) || V.isPowerOf2();
4799 };
4800
4801 // Is the constant a known power of 2 or zero?
4802 if (ISD::matchUnaryPredicate(Val, DemandedElts, IsPowerOfTwoOrZero,
4803 /*AllowUndefs=*/false, /*AllowTruncation=*/true))
4804 return true;
4805
4806 switch (Val.getOpcode()) {
4808 SDValue InVec = Val.getOperand(0);
4809 SDValue EltNo = Val.getOperand(1);
4810 EVT VecVT = InVec.getValueType();
4811
4812 // Skip scalable vectors or implicit extensions.
4813 if (VecVT.isScalableVector() ||
4814 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
4815 break;
4816
4817 // If we know the element index, just demand that vector element, else for
4818 // an unknown element index, ignore DemandedElts and demand them all.
4819 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4820 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4821 APInt DemandedSrcElts =
4822 ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts)
4823 ? APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue())
4824 : APInt::getAllOnes(NumSrcElts);
4825 return isKnownToBeAPowerOfTwo(InVec, DemandedSrcElts, OrZero, Depth + 1);
4826 }
4827
4828 case ISD::AND: {
4829 // Looking for `x & -x` pattern:
4830 // If x == 0:
4831 // x & -x -> 0
4832 // If x != 0:
4833 // x & -x -> non-zero pow2
4834 // so if we find the pattern return whether we know `x` is non-zero.
4835 SDValue X, Z;
4836 if (sd_match(Val, m_And(m_Value(X), m_Neg(m_Deferred(X)))) ||
4837 (sd_match(Val, m_And(m_Value(X), m_Sub(m_Value(Z), m_Deferred(X)))) &&
4838 MaskedVectorIsZero(Z, DemandedElts, Depth + 1)))
4839 return OrZero || isKnownNeverZero(X, DemandedElts, Depth);
4840 break;
4841 }
4842
4843 case ISD::SHL: {
4844 // A left-shift of a constant one will have exactly one bit set because
4845 // shifting the bit off the end is undefined.
4846 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4847 if (C && C->getAPIntValue() == 1)
4848 return true;
4849 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4850 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4851 Depth + 1);
4852 }
4853
4854 case ISD::SRL: {
4855 // A logical right-shift of a constant sign-bit will have exactly
4856 // one bit set.
4857 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4858 if (C && C->getAPIntValue().isSignMask())
4859 return true;
4860 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4861 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4862 Depth + 1);
4863 }
4864
4865 case ISD::TRUNCATE:
4866 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4867 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4868 Depth + 1);
4869
4870 case ISD::ROTL:
4871 case ISD::ROTR:
4872 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4873 Depth + 1);
4874 case ISD::BSWAP:
4875 case ISD::BITREVERSE:
4876 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4877 Depth + 1);
4878
4879 case ISD::SMIN:
4880 case ISD::SMAX:
4881 case ISD::UMIN:
4882 case ISD::UMAX:
4883 return isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4884 Depth + 1) &&
4885 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4886 Depth + 1);
4887
4888 case ISD::SELECT:
4889 case ISD::VSELECT:
4890 return isKnownToBeAPowerOfTwo(Val.getOperand(2), DemandedElts, OrZero,
4891 Depth + 1) &&
4892 isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4893 Depth + 1);
4894
4895 case ISD::ZERO_EXTEND:
4896 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4897 Depth + 1);
4898
4899 case ISD::VSCALE:
4900 // vscale(power-of-two) is a power-of-two
4901 return isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4902 Depth + 1);
4903
4904 case ISD::VECTOR_SHUFFLE: {
4906 // Demanded elements with undef shuffle mask elements are unknown
4907 // - we cannot guarantee they are a power of two, so return false.
4908 APInt DemandedLHS, DemandedRHS;
4910 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
4911 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
4912 DemandedLHS, DemandedRHS))
4913 return false;
4914
4915 // All demanded elements from LHS must be known power of two.
4916 if (!!DemandedLHS && !isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedLHS,
4917 OrZero, Depth + 1))
4918 return false;
4919
4920 // All demanded elements from RHS must be known power of two.
4921 if (!!DemandedRHS && !isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedRHS,
4922 OrZero, Depth + 1))
4923 return false;
4924
4925 return true;
4926 }
4927 }
4928
4929 // More could be done here, though the above checks are enough
4930 // to handle some common cases.
4931 return false;
4932}
4933
4935 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Val, true))
4936 return C1->getValueAPF().getExactLog2Abs() >= 0;
4937
4938 if (Val.getOpcode() == ISD::UINT_TO_FP || Val.getOpcode() == ISD::SINT_TO_FP)
4939 return isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth + 1);
4940
4941 return false;
4942}
4943
4945 APInt DemandedElts = getDemandAllEltsMask(Op);
4946 return ComputeNumSignBits(Op, DemandedElts, Depth);
4947}
4948
4949unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
4950 unsigned Depth) const {
4951 EVT VT = Op.getValueType();
4952 assert((VT.isInteger() || VT.isFloatingPoint()) && "Invalid VT!");
4953 unsigned VTBits = VT.getScalarSizeInBits();
4954 unsigned NumElts = DemandedElts.getBitWidth();
4955 unsigned Tmp, Tmp2;
4956 unsigned FirstAnswer = 1;
4957
4958 assert((!VT.isScalableVector() || NumElts == 1) &&
4959 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4960
4961 if (auto *C = dyn_cast<ConstantSDNode>(Op)) {
4962 const APInt &Val = C->getAPIntValue();
4963 return Val.getNumSignBits();
4964 }
4965
4966 if (Depth >= MaxRecursionDepth)
4967 return 1; // Limit search depth.
4968
4969 if (!DemandedElts)
4970 return 1; // No demanded elts, better to assume we don't know anything.
4971
4972 unsigned Opcode = Op.getOpcode();
4973 switch (Opcode) {
4974 default: break;
4975 case ISD::AssertSext:
4976 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4977 return VTBits-Tmp+1;
4978 case ISD::AssertZext:
4979 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4980 return VTBits-Tmp;
4981 case ISD::FREEZE:
4982 if (isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
4984 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4985 break;
4986 case ISD::MERGE_VALUES:
4987 return ComputeNumSignBits(Op.getOperand(Op.getResNo()), DemandedElts,
4988 Depth + 1);
4989 case ISD::SPLAT_VECTOR: {
4990 // Check if the sign bits of source go down as far as the truncated value.
4991 unsigned NumSrcBits = Op.getOperand(0).getValueSizeInBits();
4992 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4993 if (NumSrcSignBits > (NumSrcBits - VTBits))
4994 return NumSrcSignBits - (NumSrcBits - VTBits);
4995 break;
4996 }
4997 case ISD::BUILD_VECTOR:
4998 assert(!VT.isScalableVector());
4999 Tmp = VTBits;
5000 for (unsigned i = 0, e = Op.getNumOperands(); (i < e) && (Tmp > 1); ++i) {
5001 if (!DemandedElts[i])
5002 continue;
5003
5004 SDValue SrcOp = Op.getOperand(i);
5005 // BUILD_VECTOR can implicitly truncate sources, we handle this specially
5006 // for constant nodes to ensure we only look at the sign bits.
5008 APInt T = C->getAPIntValue().trunc(VTBits);
5009 Tmp2 = T.getNumSignBits();
5010 } else if (SrcOp.getOpcode() == ISD::EXTRACT_VECTOR_ELT &&
5011 SrcOp.getOperand(0).getScalarValueSizeInBits() >= VTBits) {
5012 // EXTRACT_VECTOR_ELT can extend the value with high bits undefined. If
5013 // this BUILD_VECTOR truncates those undefined bits we can just look
5014 // through the SrcOp and query the vector directly.
5015 SDValue InVec = SrcOp.getOperand(0);
5016 EVT InVecVT = InVec.getValueType();
5017
5018 APInt DemandedSrcElts;
5019 if (InVecVT.isScalableVector())
5020 // Demand all elements.
5021 DemandedSrcElts = APInt(1, 1);
5022 else {
5023 unsigned NumSrcElts = InVecVT.getVectorNumElements();
5024 auto *ConstEltNo = dyn_cast<ConstantSDNode>(SrcOp.getOperand(1));
5025 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
5026 DemandedSrcElts =
5027 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
5028 else
5029 DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
5030 }
5031
5032 Tmp2 = ComputeNumSignBits(InVec, DemandedSrcElts, Depth + 1);
5033 unsigned ExtraBits = InVec.getScalarValueSizeInBits() - VTBits;
5034 if (ExtraBits)
5035 Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1);
5036 } else {
5037 Tmp2 = ComputeNumSignBits(SrcOp, Depth + 1);
5038
5039 if (SrcOp.getValueSizeInBits() != VTBits) {
5040 assert(SrcOp.getValueSizeInBits() > VTBits &&
5041 "Expected BUILD_VECTOR implicit truncation");
5042 unsigned ExtraBits = SrcOp.getValueSizeInBits() - VTBits;
5043 Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1);
5044 }
5045 }
5046 Tmp = std::min(Tmp, Tmp2);
5047 }
5048 return Tmp;
5049
5050 case ISD::VECTOR_COMPRESS: {
5051 SDValue Vec = Op.getOperand(0);
5052 SDValue PassThru = Op.getOperand(2);
5053 Tmp = ComputeNumSignBits(PassThru, DemandedElts, Depth + 1);
5054 if (Tmp == 1)
5055 return 1;
5056 Tmp2 = ComputeNumSignBits(Vec, Depth + 1);
5057 Tmp = std::min(Tmp, Tmp2);
5058 return Tmp;
5059 }
5060
5061 case ISD::VECTOR_SHUFFLE: {
5062 // Collect the minimum number of sign bits that are shared by every vector
5063 // element referenced by the shuffle.
5064 APInt DemandedLHS, DemandedRHS;
5066 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
5067 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
5068 DemandedLHS, DemandedRHS))
5069 return 1;
5070
5071 Tmp = std::numeric_limits<unsigned>::max();
5072 if (!!DemandedLHS)
5073 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedLHS, Depth + 1);
5074 if (!!DemandedRHS) {
5075 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedRHS, Depth + 1);
5076 Tmp = std::min(Tmp, Tmp2);
5077 }
5078 // If we don't know anything, early out and try computeKnownBits fall-back.
5079 if (Tmp == 1)
5080 break;
5081 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5082 return Tmp;
5083 }
5084
5085 case ISD::BITCAST: {
5086 if (VT.isScalableVector())
5087 break;
5088 SDValue N0 = Op.getOperand(0);
5089 EVT SrcVT = N0.getValueType();
5090 unsigned SrcBits = SrcVT.getScalarSizeInBits();
5091
5092 // Ignore bitcasts from unsupported types..
5093 if (!(SrcVT.isInteger() || SrcVT.isFloatingPoint()))
5094 break;
5095
5096 // Fast handling of 'identity' bitcasts.
5097 if (VTBits == SrcBits)
5098 return ComputeNumSignBits(N0, DemandedElts, Depth + 1);
5099
5100 bool IsLE = getDataLayout().isLittleEndian();
5101
5102 // Bitcast 'large element' scalar/vector to 'small element' vector.
5103 if ((SrcBits % VTBits) == 0) {
5104 assert(VT.isVector() && "Expected bitcast to vector");
5105
5106 unsigned Scale = SrcBits / VTBits;
5107 APInt SrcDemandedElts =
5108 APIntOps::ScaleBitMask(DemandedElts, NumElts / Scale);
5109
5110 // Fast case - sign splat can be simply split across the small elements.
5111 Tmp = ComputeNumSignBits(N0, SrcDemandedElts, Depth + 1);
5112 if (Tmp == SrcBits)
5113 return VTBits;
5114
5115 // Slow case - determine how far the sign extends into each sub-element.
5116 Tmp2 = VTBits;
5117 for (unsigned i = 0; i != NumElts; ++i)
5118 if (DemandedElts[i]) {
5119 unsigned SubOffset = i % Scale;
5120 SubOffset = (IsLE ? ((Scale - 1) - SubOffset) : SubOffset);
5121 SubOffset = SubOffset * VTBits;
5122 if (Tmp <= SubOffset)
5123 return 1;
5124 Tmp2 = std::min(Tmp2, Tmp - SubOffset);
5125 }
5126 return Tmp2;
5127 }
5128 break;
5129 }
5130
5132 // FP_TO_SINT_SAT produces a signed value that fits in the saturating VT.
5133 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
5134 return VTBits - Tmp + 1;
5135 case ISD::SIGN_EXTEND:
5136 Tmp = VTBits - Op.getOperand(0).getScalarValueSizeInBits();
5137 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1) + Tmp;
5139 // Max of the input and what this extends.
5140 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
5141 Tmp = VTBits-Tmp+1;
5142 Tmp2 = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5143 return std::max(Tmp, Tmp2);
5145 if (VT.isScalableVector())
5146 break;
5147 SDValue Src = Op.getOperand(0);
5148 EVT SrcVT = Src.getValueType();
5149 APInt DemandedSrcElts = DemandedElts.zext(SrcVT.getVectorNumElements());
5150 Tmp = VTBits - SrcVT.getScalarSizeInBits();
5151 return ComputeNumSignBits(Src, DemandedSrcElts, Depth+1) + Tmp;
5152 }
5153 case ISD::SRA:
5154 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5155 // SRA X, C -> adds C sign bits.
5156 if (std::optional<unsigned> ShAmt =
5157 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
5158 Tmp = std::min(Tmp + *ShAmt, VTBits);
5159 return Tmp;
5160 case ISD::SHL:
5161 if (std::optional<ConstantRange> ShAmtRange =
5162 getValidShiftAmountRange(Op, DemandedElts, Depth + 1)) {
5163 unsigned MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
5164 unsigned MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
5165 // Try to look through ZERO/SIGN/ANY_EXTEND. If all extended bits are
5166 // shifted out, then we can compute the number of sign bits for the
5167 // operand being extended. A future improvement could be to pass along the
5168 // "shifted left by" information in the recursive calls to
5169 // ComputeKnownSignBits. Allowing us to handle this more generically.
5170 if (ISD::isExtOpcode(Op.getOperand(0).getOpcode())) {
5171 SDValue Ext = Op.getOperand(0);
5172 EVT ExtVT = Ext.getValueType();
5173 SDValue Extendee = Ext.getOperand(0);
5174 EVT ExtendeeVT = Extendee.getValueType();
5175 unsigned SizeDifference =
5176 ExtVT.getScalarSizeInBits() - ExtendeeVT.getScalarSizeInBits();
5177 if (SizeDifference <= MinShAmt) {
5178 Tmp = SizeDifference +
5179 ComputeNumSignBits(Extendee, DemandedElts, Depth + 1);
5180 if (MaxShAmt < Tmp)
5181 return Tmp - MaxShAmt;
5182 }
5183 }
5184 // shl destroys sign bits, ensure it doesn't shift out all sign bits.
5185 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5186 if (MaxShAmt < Tmp)
5187 return Tmp - MaxShAmt;
5188 }
5189 break;
5190 case ISD::AND:
5191 case ISD::OR:
5192 case ISD::XOR: // NOT is handled here.
5193 // Logical binary ops preserve the number of sign bits at the worst.
5194 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5195 if (Tmp != 1) {
5196 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5197 FirstAnswer = std::min(Tmp, Tmp2);
5198 // We computed what we know about the sign bits as our first
5199 // answer. Now proceed to the generic code that uses
5200 // computeKnownBits, and pick whichever answer is better.
5201 }
5202 break;
5203
5204 case ISD::SELECT:
5205 case ISD::VSELECT:
5206 Tmp = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5207 if (Tmp == 1) return 1; // Early out.
5208 Tmp2 = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5209 return std::min(Tmp, Tmp2);
5210 case ISD::SELECT_CC:
5211 Tmp = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5212 if (Tmp == 1) return 1; // Early out.
5213 Tmp2 = ComputeNumSignBits(Op.getOperand(3), DemandedElts, Depth+1);
5214 return std::min(Tmp, Tmp2);
5215
5216 case ISD::SMIN:
5217 case ISD::SMAX: {
5218 // If we have a clamp pattern, we know that the number of sign bits will be
5219 // the minimum of the clamp min/max range.
5220 bool IsMax = (Opcode == ISD::SMAX);
5221 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
5222 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
5223 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
5224 CstHigh =
5225 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
5226 if (CstLow && CstHigh) {
5227 if (!IsMax)
5228 std::swap(CstLow, CstHigh);
5229 if (CstLow->getAPIntValue().sle(CstHigh->getAPIntValue())) {
5230 Tmp = CstLow->getAPIntValue().getNumSignBits();
5231 Tmp2 = CstHigh->getAPIntValue().getNumSignBits();
5232 return std::min(Tmp, Tmp2);
5233 }
5234 }
5235
5236 // Fallback - just get the minimum number of sign bits of the operands.
5237 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5238 if (Tmp == 1)
5239 return 1; // Early out.
5240 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5241 return std::min(Tmp, Tmp2);
5242 }
5243 case ISD::UMIN:
5244 case ISD::UMAX:
5245 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5246 if (Tmp == 1)
5247 return 1; // Early out.
5248 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5249 return std::min(Tmp, Tmp2);
5250 case ISD::SSUBO_CARRY:
5251 case ISD::USUBO_CARRY:
5252 // sub_carry(x,x,c) -> 0/-1 (sext carry)
5253 if (Op.getResNo() == 0 && Op.getOperand(0) == Op.getOperand(1))
5254 return VTBits;
5255 [[fallthrough]];
5256 case ISD::SADDO:
5257 case ISD::UADDO:
5258 case ISD::SADDO_CARRY:
5259 case ISD::UADDO_CARRY:
5260 case ISD::SSUBO:
5261 case ISD::USUBO:
5262 case ISD::SMULO:
5263 case ISD::UMULO:
5264 if (Op.getResNo() != 1)
5265 break;
5266 // The boolean result conforms to getBooleanContents. Fall through.
5267 // If setcc returns 0/-1, all bits are sign bits.
5268 // We know that we have an integer-based boolean since these operations
5269 // are only available for integer.
5270 if (TLI->getBooleanContents(VT.isVector(), false) ==
5272 return VTBits;
5273 break;
5274 case ISD::SETCC:
5275 case ISD::SETCCCARRY:
5276 case ISD::STRICT_FSETCC:
5277 case ISD::STRICT_FSETCCS: {
5278 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
5279 // If setcc returns 0/-1, all bits are sign bits.
5280 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
5282 return VTBits;
5283 break;
5284 }
5286 // Semantically similar to icmp ult.
5287 if (TLI->getBooleanContents(VT.isVector(), /*isFloat=*/false) ==
5289 return VTBits;
5290 break;
5291 case ISD::ROTL:
5292 case ISD::ROTR: {
5293 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5294 ConstantSDNode *C = isConstOrConstSplat(Op.getOperand(1), DemandedElts);
5295 FirstAnswer = SignBitsOps::rot(
5296 Tmp, VTBits, C ? std::optional(C->getAPIntValue()) : std::nullopt,
5297 Opcode == ISD::ROTR);
5298 break;
5299 }
5300 case ISD::ADD:
5301 case ISD::ADDC:
5302 // TODO: Move Operand 1 check before Operand 0 check
5303 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5304 if (Tmp == 1) return 1; // Early out.
5305
5306 // Special case decrementing a value (ADD X, -1):
5307 if (ConstantSDNode *CRHS =
5308 isConstOrConstSplat(Op.getOperand(1), DemandedElts))
5309 if (CRHS->isAllOnes()) {
5311 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
5312
5313 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5314 // sign bits set.
5315 if ((Known.Zero | 1).isAllOnes())
5316 return VTBits;
5317
5318 // If we are subtracting one from a positive number, there is no carry
5319 // out of the result.
5320 if (Known.isNonNegative())
5321 return Tmp;
5322 }
5323
5324 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5325 if (Tmp2 == 1) return 1; // Early out.
5326
5327 // Add can have at most one carry bit. Thus we know that the output
5328 // is, at worst, one more bit than the inputs.
5329 return std::min(Tmp, Tmp2) - 1;
5330 case ISD::SUB:
5331 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5332 if (Tmp2 == 1) return 1; // Early out.
5333
5334 // Handle NEG.
5335 if (ConstantSDNode *CLHS =
5336 isConstOrConstSplat(Op.getOperand(0), DemandedElts))
5337 if (CLHS->isZero()) {
5339 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
5340 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5341 // sign bits set.
5342 if ((Known.Zero | 1).isAllOnes())
5343 return VTBits;
5344
5345 // If the input is known to be positive (the sign bit is known clear),
5346 // the output of the NEG has the same number of sign bits as the input.
5347 if (Known.isNonNegative())
5348 return Tmp2;
5349
5350 // Otherwise, we treat this like a SUB.
5351 }
5352
5353 // Sub can have at most one carry bit. Thus we know that the output
5354 // is, at worst, one more bit than the inputs.
5355 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5356 if (Tmp == 1) return 1; // Early out.
5357 return std::min(Tmp, Tmp2) - 1;
5358 case ISD::MUL: {
5359 // The output of the Mul can be at most twice the valid bits in the inputs.
5360 unsigned SignBitsOp0 =
5361 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5362 if (SignBitsOp0 == 1)
5363 break;
5364 unsigned SignBitsOp1 =
5365 ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5366 if (SignBitsOp1 == 1)
5367 break;
5368 unsigned OutValidBits =
5369 (VTBits - SignBitsOp0 + 1) + (VTBits - SignBitsOp1 + 1);
5370 return OutValidBits > VTBits ? 1 : VTBits - OutValidBits + 1;
5371 }
5372 case ISD::AVGCEILS:
5373 case ISD::AVGFLOORS:
5374 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5375 if (Tmp == 1)
5376 return 1; // Early out.
5377 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5378 return std::min(Tmp, Tmp2);
5379 case ISD::SREM:
5380 // The sign bit is the LHS's sign bit, except when the result of the
5381 // remainder is zero. The magnitude of the result should be less than or
5382 // equal to the magnitude of the LHS. Therefore, the result should have
5383 // at least as many sign bits as the left hand side.
5384 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5385 case ISD::TRUNCATE: {
5386 // Check if the sign bits of source go down as far as the truncated value.
5387 unsigned NumSrcBits = Op.getOperand(0).getScalarValueSizeInBits();
5388 unsigned NumSrcSignBits =
5389 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5390 if (NumSrcSignBits > (NumSrcBits - VTBits))
5391 return NumSrcSignBits - (NumSrcBits - VTBits);
5392 break;
5393 }
5394 case ISD::EXTRACT_ELEMENT: {
5395 if (VT.isScalableVector())
5396 break;
5397 const int KnownSign = ComputeNumSignBits(Op.getOperand(0), Depth+1);
5398 const int BitWidth = Op.getValueSizeInBits();
5399 const int Items = Op.getOperand(0).getValueSizeInBits() / BitWidth;
5400
5401 // Get reverse index (starting from 1), Op1 value indexes elements from
5402 // little end. Sign starts at big end.
5403 const int rIndex = Items - 1 - Op.getConstantOperandVal(1);
5404
5405 // If the sign portion ends in our element the subtraction gives correct
5406 // result. Otherwise it gives either negative or > bitwidth result
5407 return std::clamp(KnownSign - rIndex * BitWidth, 1, BitWidth);
5408 }
5410 if (VT.isScalableVector())
5411 break;
5412 // If we know the element index, split the demand between the
5413 // source vector and the inserted element, otherwise assume we need
5414 // the original demanded vector elements and the value.
5415 SDValue InVec = Op.getOperand(0);
5416 SDValue InVal = Op.getOperand(1);
5417 SDValue EltNo = Op.getOperand(2);
5418 bool DemandedVal = true;
5419 APInt DemandedVecElts = DemandedElts;
5420 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
5421 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
5422 unsigned EltIdx = CEltNo->getZExtValue();
5423 DemandedVal = !!DemandedElts[EltIdx];
5424 DemandedVecElts.clearBit(EltIdx);
5425 }
5426 Tmp = std::numeric_limits<unsigned>::max();
5427 if (DemandedVal) {
5428 // TODO - handle implicit truncation of inserted elements.
5429 if (InVal.getScalarValueSizeInBits() != VTBits)
5430 break;
5431 Tmp2 = ComputeNumSignBits(InVal, Depth + 1);
5432 Tmp = std::min(Tmp, Tmp2);
5433 }
5434 if (!!DemandedVecElts) {
5435 Tmp2 = ComputeNumSignBits(InVec, DemandedVecElts, Depth + 1);
5436 Tmp = std::min(Tmp, Tmp2);
5437 }
5438 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5439 return Tmp;
5440 }
5442 SDValue InVec = Op.getOperand(0);
5443 SDValue EltNo = Op.getOperand(1);
5444 EVT VecVT = InVec.getValueType();
5445 // ComputeNumSignBits not yet implemented for scalable vectors.
5446 if (VecVT.isScalableVector())
5447 break;
5448 const unsigned BitWidth = Op.getValueSizeInBits();
5449 const unsigned EltBitWidth = Op.getOperand(0).getScalarValueSizeInBits();
5450 const unsigned NumSrcElts = VecVT.getVectorNumElements();
5451
5452 // If BitWidth > EltBitWidth the value is anyext:ed, and we do not know
5453 // anything about sign bits. But if the sizes match we can derive knowledge
5454 // about sign bits from the vector operand.
5455 if (BitWidth != EltBitWidth)
5456 break;
5457
5458 // If we know the element index, just demand that vector element, else for
5459 // an unknown element index, ignore DemandedElts and demand them all.
5460 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
5461 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
5462 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
5463 DemandedSrcElts =
5464 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
5465
5466 return ComputeNumSignBits(InVec, DemandedSrcElts, Depth + 1);
5467 }
5469 // Offset the demanded elts by the subvector index.
5470 SDValue Src = Op.getOperand(0);
5471
5472 APInt DemandedSrcElts;
5473 if (Src.getValueType().isScalableVector())
5474 DemandedSrcElts = APInt(1, 1);
5475 else {
5476 uint64_t Idx = Op.getConstantOperandVal(1);
5477 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5478 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5479 }
5480 return ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5481 }
5482 case ISD::CONCAT_VECTORS: {
5483 if (VT.isScalableVector())
5484 break;
5485 // Determine the minimum number of sign bits across all demanded
5486 // elts of the input vectors. Early out if the result is already 1.
5487 Tmp = std::numeric_limits<unsigned>::max();
5488 EVT SubVectorVT = Op.getOperand(0).getValueType();
5489 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
5490 unsigned NumSubVectors = Op.getNumOperands();
5491 for (unsigned i = 0; (i < NumSubVectors) && (Tmp > 1); ++i) {
5492 APInt DemandedSub =
5493 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
5494 if (!DemandedSub)
5495 continue;
5496 Tmp2 = ComputeNumSignBits(Op.getOperand(i), DemandedSub, Depth + 1);
5497 Tmp = std::min(Tmp, Tmp2);
5498 }
5499 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5500 return Tmp;
5501 }
5502 case ISD::INSERT_SUBVECTOR: {
5503 SDValue Src = Op.getOperand(0);
5504 SDValue Sub = Op.getOperand(1);
5505 if (VT.isScalableVector()) {
5506 Tmp = ComputeNumSignBits(Sub, Depth + 1);
5507 Tmp = std::min(Tmp, ComputeNumSignBits(Src, Depth + 1));
5508 return Tmp;
5509 }
5510 // Demand any elements from the subvector and the remainder from the src its
5511 // inserted into.
5512 uint64_t Idx = Op.getConstantOperandVal(2);
5513 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5514 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5515 APInt DemandedSrcElts = DemandedElts;
5516 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5517
5518 Tmp = std::numeric_limits<unsigned>::max();
5519 if (!!DemandedSubElts) {
5520 Tmp = ComputeNumSignBits(Sub, DemandedSubElts, Depth + 1);
5521 if (Tmp == 1)
5522 return 1; // early-out
5523 }
5524 if (!!DemandedSrcElts) {
5525 Tmp2 = ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5526 Tmp = std::min(Tmp, Tmp2);
5527 }
5528 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5529 return Tmp;
5530 }
5531 case ISD::LOAD: {
5532 // If we are looking at the loaded value of the SDNode.
5533 if (Op.getResNo() != 0)
5534 break;
5535
5537 if (const MDNode *Ranges = LD->getRanges()) {
5538 if (DemandedElts != 1)
5539 break;
5540
5542 if (VTBits > CR.getBitWidth()) {
5543 switch (LD->getExtensionType()) {
5544 case ISD::SEXTLOAD:
5545 CR = CR.signExtend(VTBits);
5546 break;
5547 case ISD::ZEXTLOAD:
5548 CR = CR.zeroExtend(VTBits);
5549 break;
5550 default:
5551 break;
5552 }
5553 }
5554
5555 if (VTBits != CR.getBitWidth())
5556 break;
5557 return std::min(CR.getSignedMin().getNumSignBits(),
5559 }
5560
5561 unsigned ExtType = LD->getExtensionType();
5562 switch (ExtType) {
5563 default:
5564 break;
5565 case ISD::SEXTLOAD: // e.g. i16->i32 = '17' bits known.
5566 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5567 return VTBits - Tmp + 1;
5568 case ISD::ZEXTLOAD: // e.g. i16->i32 = '16' bits known.
5569 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5570 return VTBits - Tmp;
5571 case ISD::NON_EXTLOAD:
5572 if (const Constant *Cst = TLI->getTargetConstantFromLoad(LD)) {
5573 // We only need to handle vectors - computeKnownBits should handle
5574 // scalar cases.
5575 Type *CstTy = Cst->getType();
5576 if (CstTy->isVectorTy() && !VT.isScalableVector() &&
5577 (NumElts * VTBits) == CstTy->getPrimitiveSizeInBits() &&
5578 VTBits == CstTy->getScalarSizeInBits()) {
5579 Tmp = VTBits;
5580 for (unsigned i = 0; i != NumElts; ++i) {
5581 if (!DemandedElts[i])
5582 continue;
5583 if (Constant *Elt = Cst->getAggregateElement(i)) {
5584 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
5585 const APInt &Value = CInt->getValue();
5586 Tmp = std::min(Tmp, Value.getNumSignBits());
5587 continue;
5588 }
5589 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
5590 APInt Value = CFP->getValueAPF().bitcastToAPInt();
5591 Tmp = std::min(Tmp, Value.getNumSignBits());
5592 continue;
5593 }
5594 }
5595 // Unknown type. Conservatively assume no bits match sign bit.
5596 return 1;
5597 }
5598 return Tmp;
5599 }
5600 }
5601 break;
5602 }
5603
5604 break;
5605 }
5608 case ISD::ATOMIC_SWAP:
5620 case ISD::ATOMIC_LOAD: {
5621 auto *AT = cast<AtomicSDNode>(Op);
5622 // If we are looking at the loaded value.
5623 if (Op.getResNo() == 0) {
5624 Tmp = AT->getMemoryVT().getScalarSizeInBits();
5625 if (Tmp == VTBits)
5626 return 1; // early-out
5627
5628 // For atomic_load, prefer to use the extension type.
5629 if (Op->getOpcode() == ISD::ATOMIC_LOAD) {
5630 switch (AT->getExtensionType()) {
5631 default:
5632 break;
5633 case ISD::SEXTLOAD:
5634 return VTBits - Tmp + 1;
5635 case ISD::ZEXTLOAD:
5636 return VTBits - Tmp;
5637 }
5638 }
5639
5640 if (TLI->getExtendForAtomicOps() == ISD::SIGN_EXTEND)
5641 return VTBits - Tmp + 1;
5642 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
5643 return VTBits - Tmp;
5644 }
5645 break;
5646 }
5647 }
5648
5649 // Allow the target to implement this method for its nodes.
5650 if (Opcode >= ISD::BUILTIN_OP_END ||
5651 Opcode == ISD::INTRINSIC_WO_CHAIN ||
5652 Opcode == ISD::INTRINSIC_W_CHAIN ||
5653 Opcode == ISD::INTRINSIC_VOID) {
5654 // TODO: This can probably be removed once target code is audited. This
5655 // is here purely to reduce patch size and review complexity.
5656 if (!VT.isScalableVector()) {
5657 unsigned NumBits =
5658 TLI->ComputeNumSignBitsForTargetNode(Op, DemandedElts, *this, Depth);
5659 if (NumBits > 1)
5660 FirstAnswer = std::max(FirstAnswer, NumBits);
5661 }
5662 }
5663
5664 // Finally, if we can prove that the top bits of the result are 0's or 1's,
5665 // use this information.
5666 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
5667 return std::max(FirstAnswer, Known.countMinSignBits());
5668}
5669
5671 unsigned Depth) const {
5672 unsigned SignBits = ComputeNumSignBits(Op, Depth);
5673 return Op.getScalarValueSizeInBits() - SignBits + 1;
5674}
5675
5677 const APInt &DemandedElts,
5678 unsigned Depth) const {
5679 unsigned SignBits = ComputeNumSignBits(Op, DemandedElts, Depth);
5680 return Op.getScalarValueSizeInBits() - SignBits + 1;
5681}
5682
5684 UndefPoisonKind Kind,
5685 unsigned Depth) const {
5686 // Early out for FREEZE.
5687 if (Op.getOpcode() == ISD::FREEZE)
5688 return true;
5689
5690 APInt DemandedElts = getDemandAllEltsMask(Op);
5691 return isGuaranteedNotToBeUndefOrPoison(Op, DemandedElts, Kind, Depth);
5692}
5693
5695 const APInt &DemandedElts,
5696 UndefPoisonKind Kind,
5697 unsigned Depth) const {
5698 unsigned Opcode = Op.getOpcode();
5699
5700 // Early out for FREEZE.
5701 if (Opcode == ISD::FREEZE)
5702 return true;
5703
5704 if (Depth >= MaxRecursionDepth)
5705 return false; // Limit search depth.
5706
5707 if (isIntOrFPConstant(Op))
5708 return true;
5709
5710 switch (Opcode) {
5711 case ISD::CONDCODE:
5712 case ISD::VALUETYPE:
5713 case ISD::FrameIndex:
5715 case ISD::CopyFromReg:
5716 return true;
5717
5718 case ISD::POISON:
5719 return !includesPoison(Kind);
5720
5721 case ISD::UNDEF:
5722 return !includesUndef(Kind);
5723
5724 case ISD::BITCAST: {
5725 SDValue Src = Op.getOperand(0);
5726 EVT SrcVT = Src.getValueType();
5727 EVT DstVT = Op.getValueType();
5728
5729 if (!SrcVT.isVector() || !DstVT.isVector())
5730 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5731
5732 unsigned SrcEltBits = SrcVT.getScalarSizeInBits();
5733 unsigned DstEltBits = DstVT.getScalarSizeInBits();
5734 ElementCount NumSrcElts = SrcVT.getVectorElementCount();
5735 [[maybe_unused]] ElementCount NumDstElts = DstVT.getVectorElementCount();
5736
5737 if (SrcEltBits == DstEltBits)
5738 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedElts, Kind,
5739 Depth + 1);
5740
5741 if (SrcEltBits < DstEltBits) {
5742 if (DstEltBits % SrcEltBits != 0)
5743 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5744
5745 assert(NumSrcElts == NumDstElts * (DstEltBits / SrcEltBits) &&
5746 "Unexpected vector bitcast");
5747 APInt DemandedSrcElts =
5748 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts.getKnownMinValue());
5749 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5750 Depth + 1);
5751 }
5752
5753 if (SrcEltBits % DstEltBits != 0)
5754 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5755
5756 assert(NumDstElts == NumSrcElts * (SrcEltBits / DstEltBits) &&
5757 "Unexpected vector bitcast");
5758 APInt DemandedSrcElts =
5759 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts.getKnownMinValue());
5760 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5761 Depth + 1);
5762 }
5763
5764 case ISD::BUILD_VECTOR:
5765 // NOTE: BUILD_VECTOR has implicit truncation of wider scalar elements -
5766 // this shouldn't affect the result.
5767 for (unsigned i = 0, e = Op.getNumOperands(); i < e; ++i) {
5768 if (!DemandedElts[i])
5769 continue;
5770 if (!isGuaranteedNotToBeUndefOrPoison(Op.getOperand(i), Kind, Depth + 1))
5771 return false;
5772 }
5773 return true;
5774
5775 case ISD::CONCAT_VECTORS: {
5776 EVT VT = Op.getValueType();
5777 if (!VT.isFixedLengthVector())
5778 break;
5779
5780 EVT SubVT = Op.getOperand(0).getValueType();
5781 unsigned NumSubElts = SubVT.getVectorNumElements();
5782 for (unsigned I = 0, E = Op.getNumOperands(); I != E; ++I) {
5783 APInt DemandedSubElts =
5784 DemandedElts.extractBits(NumSubElts, I * NumSubElts);
5785 if (!!DemandedSubElts &&
5786 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(I), DemandedSubElts,
5787 Kind, Depth + 1))
5788 return false;
5789 }
5790 return true;
5791 }
5792
5794 SDValue Src = Op.getOperand(0);
5795 if (Src.getValueType().isScalableVector())
5796 break;
5797 uint64_t Idx = Op.getConstantOperandVal(1);
5798 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5799 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5800 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5801 Depth + 1);
5802 }
5803
5804 case ISD::INSERT_SUBVECTOR: {
5805 if (Op.getValueType().isScalableVector())
5806 break;
5807 SDValue Src = Op.getOperand(0);
5808 SDValue Sub = Op.getOperand(1);
5809 uint64_t Idx = Op.getConstantOperandVal(2);
5810 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5811 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5812 APInt DemandedSrcElts = DemandedElts;
5813 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5814
5815 if (!!DemandedSubElts && !isGuaranteedNotToBeUndefOrPoison(
5816 Sub, DemandedSubElts, Kind, Depth + 1))
5817 return false;
5818 if (!!DemandedSrcElts && !isGuaranteedNotToBeUndefOrPoison(
5819 Src, DemandedSrcElts, Kind, Depth + 1))
5820 return false;
5821 return true;
5822 }
5823
5825 SDValue Src = Op.getOperand(0);
5826 auto *IndexC = dyn_cast<ConstantSDNode>(Op.getOperand(1));
5827 EVT SrcVT = Src.getValueType();
5828 if (SrcVT.isFixedLengthVector() && IndexC &&
5829 IndexC->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
5830 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
5831 IndexC->getZExtValue());
5832 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5833 Depth + 1);
5834 }
5835 break;
5836 }
5837
5839 SDValue InVec = Op.getOperand(0);
5840 SDValue InVal = Op.getOperand(1);
5841 SDValue EltNo = Op.getOperand(2);
5842 EVT VT = InVec.getValueType();
5843 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
5844 if (IndexC && VT.isFixedLengthVector() &&
5845 IndexC->getAPIntValue().ult(VT.getVectorNumElements())) {
5846 if (DemandedElts[IndexC->getZExtValue()] &&
5847 !isGuaranteedNotToBeUndefOrPoison(InVal, Kind, Depth + 1))
5848 return false;
5849 APInt InVecDemandedElts = DemandedElts;
5850 InVecDemandedElts.clearBit(IndexC->getZExtValue());
5851 if (!!InVecDemandedElts &&
5853 peekThroughInsertVectorElt(InVec, InVecDemandedElts),
5854 InVecDemandedElts, Kind, Depth + 1))
5855 return false;
5856 return true;
5857 }
5858 break;
5859 }
5860
5862 // Check upper (known poison) elements.
5863 if (DemandedElts.ugt(1) && includesPoison(Kind))
5864 return false;
5865 // Check element zero.
5866 if (DemandedElts[0] &&
5867 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind, Depth + 1))
5868 return false;
5869 return true;
5870
5871 case ISD::SPLAT_VECTOR:
5872 return isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind, Depth + 1);
5873
5874 case ISD::SELECT: {
5875 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5876 /*ConsiderFlags*/ true, Depth) &&
5877 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind,
5878 Depth + 1) &&
5879 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(1), DemandedElts,
5880 Kind, Depth + 1) &&
5881 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(2), DemandedElts,
5882 Kind, Depth + 1);
5883 }
5884
5885 case ISD::VECTOR_SHUFFLE: {
5886 APInt DemandedLHS, DemandedRHS;
5887 auto *SVN = cast<ShuffleVectorSDNode>(Op);
5888 if (!getShuffleDemandedElts(DemandedElts.getBitWidth(), SVN->getMask(),
5889 DemandedElts, DemandedLHS, DemandedRHS,
5890 /*AllowUndefElts=*/false))
5891 return false;
5892 if (!DemandedLHS.isZero() &&
5893 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedLHS, Kind,
5894 Depth + 1))
5895 return false;
5896 if (!DemandedRHS.isZero() &&
5897 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(1), DemandedRHS, Kind,
5898 Depth + 1))
5899 return false;
5900 return true;
5901 }
5902
5903 case ISD::SHL:
5904 case ISD::SRL:
5905 case ISD::SRA:
5906 // Shift amount operand is checked by canCreateUndefOrPoison. So it is
5907 // enough to check operand 0 if Op can't create undef/poison.
5908 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5909 /*ConsiderFlags*/ true, Depth) &&
5910 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
5911 Kind, Depth + 1);
5912
5913 case ISD::BSWAP:
5914 case ISD::CTPOP:
5915 case ISD::BITREVERSE:
5916 case ISD::AND:
5917 case ISD::OR:
5918 case ISD::XOR:
5919 case ISD::ADD:
5920 case ISD::SUB:
5921 case ISD::MUL:
5922 case ISD::SADDSAT:
5923 case ISD::UADDSAT:
5924 case ISD::SSUBSAT:
5925 case ISD::USUBSAT:
5926 case ISD::SSHLSAT:
5927 case ISD::USHLSAT:
5928 case ISD::SMIN:
5929 case ISD::SMAX:
5930 case ISD::UMIN:
5931 case ISD::UMAX:
5932 case ISD::ZERO_EXTEND:
5933 case ISD::SIGN_EXTEND:
5934 case ISD::ANY_EXTEND:
5935 case ISD::TRUNCATE:
5936 case ISD::VSELECT: {
5937 // If Op can't create undef/poison and none of its operands are undef/poison
5938 // then Op is never undef/poison. A difference from the more common check
5939 // below, outside the switch, is that we handle elementwise operations for
5940 // which the DemandedElts mask is valid for all operands here.
5941 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5942 /*ConsiderFlags*/ true, Depth) &&
5943 all_of(Op->ops(), [&](SDValue V) {
5944 return isGuaranteedNotToBeUndefOrPoison(V, DemandedElts, Kind,
5945 Depth + 1);
5946 });
5947 }
5948
5949 // TODO: Search for noundef attributes from library functions.
5950
5951 // TODO: Pointers dereferenced by ISD::LOAD/STORE ops are noundef.
5952
5953 default:
5954 // Allow the target to implement this method for its nodes.
5955 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
5956 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
5957 return TLI->isGuaranteedNotToBeUndefOrPoisonForTargetNode(
5958 Op, DemandedElts, *this, Kind, Depth);
5959 break;
5960 }
5961
5962 // If Op can't create undef/poison and none of its operands are undef/poison
5963 // then Op is never undef/poison.
5964 // NOTE: TargetNodes can handle this in themselves in
5965 // isGuaranteedNotToBeUndefOrPoisonForTargetNode or let
5966 // TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode handle it.
5967 return !canCreateUndefOrPoison(Op, Kind, /*ConsiderFlags*/ true, Depth) &&
5968 all_of(Op->ops(), [&](SDValue V) {
5969 return isGuaranteedNotToBeUndefOrPoison(V, Kind, Depth + 1);
5970 });
5971}
5972
5974 bool ConsiderFlags,
5975 unsigned Depth) const {
5976 APInt DemandedElts = getDemandAllEltsMask(Op);
5977 return canCreateUndefOrPoison(Op, DemandedElts, Kind, ConsiderFlags, Depth);
5978}
5979
5981 UndefPoisonKind Kind,
5982 bool ConsiderFlags,
5983 unsigned Depth) const {
5984 if (ConsiderFlags && includesPoison(Kind) && Op->hasPoisonGeneratingFlags())
5985 return true;
5986
5987 unsigned Opcode = Op.getOpcode();
5988 switch (Opcode) {
5989 case ISD::AssertSext:
5990 case ISD::AssertZext:
5991 case ISD::AssertAlign:
5993 // Assertion nodes can create poison if the assertion fails.
5994 return includesPoison(Kind);
5995
5996 case ISD::FREEZE:
6000 case ISD::SADDSAT:
6001 case ISD::UADDSAT:
6002 case ISD::SSUBSAT:
6003 case ISD::USUBSAT:
6004 case ISD::MULHU:
6005 case ISD::MULHS:
6006 case ISD::AVGFLOORS:
6007 case ISD::AVGFLOORU:
6008 case ISD::AVGCEILS:
6009 case ISD::AVGCEILU:
6010 case ISD::ABDU:
6011 case ISD::ABDS:
6012 case ISD::SMIN:
6013 case ISD::SMAX:
6014 case ISD::SCMP:
6015 case ISD::UMIN:
6016 case ISD::UMAX:
6017 case ISD::UCMP:
6018 case ISD::AND:
6019 case ISD::XOR:
6020 case ISD::ROTL:
6021 case ISD::ROTR:
6022 case ISD::FSHL:
6023 case ISD::FSHR:
6024 case ISD::BSWAP:
6025 case ISD::CTTZ:
6026 case ISD::CTLZ:
6027 case ISD::CTLS:
6028 case ISD::CTPOP:
6029 case ISD::BITREVERSE:
6030 case ISD::PARITY:
6031 case ISD::SIGN_EXTEND:
6032 case ISD::TRUNCATE:
6036 case ISD::BITCAST:
6037 case ISD::BUILD_VECTOR:
6038 case ISD::BUILD_PAIR:
6039 case ISD::SPLAT_VECTOR:
6040 case ISD::FABS:
6041 case ISD::FCEIL:
6042 case ISD::FFLOOR:
6043 case ISD::FTRUNC:
6044 case ISD::FRINT:
6045 case ISD::FNEARBYINT:
6046 case ISD::FROUND:
6047 case ISD::FROUNDEVEN:
6048 return false;
6049
6050 case ISD::ABS:
6051 // ISD::ABS defines abs(INT_MIN) -> INT_MIN and never generates poison.
6052 // Different to Intrinsic::abs.
6053 return false;
6055 // ABS_MIN_POISON may produce poison if the input is INT_MIN.
6056 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) <= 1;
6057
6058 case ISD::ADDC:
6059 case ISD::SUBC:
6060 case ISD::ADDE:
6061 case ISD::SUBE:
6062 case ISD::SADDO:
6063 case ISD::SSUBO:
6064 case ISD::SMULO:
6065 case ISD::SADDO_CARRY:
6066 case ISD::SSUBO_CARRY:
6067 case ISD::UADDO:
6068 case ISD::USUBO:
6069 case ISD::UMULO:
6070 case ISD::UADDO_CARRY:
6071 case ISD::USUBO_CARRY:
6072 // No poison on result or overflow flags.
6073 return false;
6074
6075 case ISD::SELECT_CC:
6076 case ISD::SETCC: {
6077 // Integer setcc cannot create undef or poison.
6078 if (Op.getOperand(0).getValueType().isInteger())
6079 return false;
6080
6081 // FP compares are more complicated. They can create poison for nan/infinity
6082 // based on options and flags. The options and flags also cause special
6083 // nonan condition codes to be used. Those condition codes may be preserved
6084 // even if the nonan flag is dropped somewhere.
6085 unsigned CCOp = Opcode == ISD::SETCC ? 2 : 4;
6086 ISD::CondCode CCCode = cast<CondCodeSDNode>(Op.getOperand(CCOp))->get();
6087 return (unsigned)CCCode & 0x10U;
6088 }
6089
6090 case ISD::OR:
6091 case ISD::ZERO_EXTEND:
6092 case ISD::SELECT:
6093 case ISD::VSELECT:
6094 case ISD::ADD:
6095 case ISD::SUB:
6096 case ISD::MUL:
6097 case ISD::FNEG:
6098 case ISD::FADD:
6099 case ISD::FSUB:
6100 case ISD::FMUL:
6101 case ISD::FDIV:
6102 case ISD::FREM:
6103 case ISD::FCOPYSIGN:
6104 case ISD::FMA:
6105 case ISD::FMAD:
6106 case ISD::FMULADD:
6107 case ISD::FP_EXTEND:
6108 case ISD::FMINNUM:
6109 case ISD::FMAXNUM:
6110 case ISD::FMINNUM_IEEE:
6111 case ISD::FMAXNUM_IEEE:
6112 case ISD::FMINIMUM:
6113 case ISD::FMAXIMUM:
6114 case ISD::FMINIMUMNUM:
6115 case ISD::FMAXIMUMNUM:
6121 // No poison except from flags (which is handled above)
6122 return false;
6123
6124 case ISD::SHL:
6125 case ISD::SRL:
6126 case ISD::SRA:
6127 // If the max shift amount isn't in range, then the shift can
6128 // create poison.
6129 return includesPoison(Kind) &&
6130 !getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1);
6131
6134 // If the amount is zero then the result will be poison.
6135 // TODO: Add isKnownNeverZero DemandedElts handling.
6136 return includesPoison(Kind) &&
6137 !isKnownNeverZero(Op.getOperand(0), Depth + 1);
6138
6140 // Check if we demand any upper (poison) elements.
6141 return includesPoison(Kind) && DemandedElts.ugt(1);
6142
6145 // Ensure that the element index is in bounds.
6146 if (includesPoison(Kind)) {
6147 EVT VecVT = Op.getOperand(0).getValueType();
6148 SDValue Idx = Op.getOperand(Opcode == ISD::INSERT_VECTOR_ELT ? 2 : 1);
6149 KnownBits KnownIdx = computeKnownBits(Idx, Depth + 1);
6150 return KnownIdx.getMaxValue().uge(VecVT.getVectorMinNumElements());
6151 }
6152 return false;
6153 }
6154
6155 case ISD::VECTOR_SHUFFLE: {
6156 // Check for any demanded shuffle element that is undef.
6157 auto *SVN = cast<ShuffleVectorSDNode>(Op);
6158 for (auto [Idx, Elt] : enumerate(SVN->getMask()))
6159 if (Elt < 0 && DemandedElts[Idx])
6160 return true;
6161 return false;
6162 }
6163
6165 return false;
6166
6167 default:
6168 // Allow the target to implement this method for its nodes.
6169 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6170 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
6171 return TLI->canCreateUndefOrPoisonForTargetNode(
6172 Op, DemandedElts, *this, Kind, ConsiderFlags, Depth);
6173 break;
6174 }
6175
6176 // Be conservative and return true.
6177 return true;
6178}
6179
6180bool SelectionDAG::isADDLike(SDValue Op, bool NoWrap) const {
6181 unsigned Opcode = Op.getOpcode();
6182 if (Opcode == ISD::OR)
6183 return Op->getFlags().hasDisjoint() ||
6184 haveNoCommonBitsSet(Op.getOperand(0), Op.getOperand(1));
6185 if (Opcode == ISD::XOR)
6186 return !NoWrap && isMinSignedConstant(Op.getOperand(1));
6187 return false;
6188}
6189
6191 return Op.getNumOperands() == 2 && isa<ConstantSDNode>(Op.getOperand(1)) &&
6192 (Op.isAnyAdd() || isADDLike(Op));
6193}
6194
6196 FPClassTest InterestedClasses,
6197 unsigned Depth) const {
6198 APInt DemandedElts = getDemandAllEltsMask(Op);
6199 return computeKnownFPClass(Op, DemandedElts, InterestedClasses, Depth);
6200}
6201
6203 const APInt &DemandedElts,
6204 FPClassTest InterestedClasses,
6205 unsigned Depth) const {
6207
6208 if (const auto *CFP = dyn_cast<ConstantFPSDNode>(Op))
6209 return KnownFPClass(CFP->getValueAPF());
6210
6211 if (Depth >= MaxRecursionDepth)
6212 return Known;
6213
6214 if (Op.getOpcode() == ISD::UNDEF)
6215 return Known;
6216
6217 EVT VT = Op.getValueType();
6218 assert(VT.isFloatingPoint() && "Computing KnownFPClass on non-FP op!");
6219 assert((!VT.isFixedLengthVector() ||
6220 DemandedElts.getBitWidth() == VT.getVectorNumElements()) &&
6221 "Unexpected vector size");
6222
6223 if (!DemandedElts)
6224 return Known;
6225
6226 unsigned Opcode = Op.getOpcode();
6227 switch (Opcode) {
6228 case ISD::POISON: {
6229 Known.setKnownFPClasses(fcNone);
6230 Known.setSignBit(false);
6231 break;
6232 }
6233 case ISD::FNEG: {
6234 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6235 InterestedClasses, Depth + 1);
6236 Known.fneg();
6237 break;
6238 }
6239 case ISD::BUILD_VECTOR: {
6240 assert(!VT.isScalableVector());
6241 bool First = true;
6242 for (unsigned I = 0, E = Op.getNumOperands(); I != E; ++I) {
6243 if (!DemandedElts[I])
6244 continue;
6245
6246 if (First) {
6247 Known =
6248 computeKnownFPClass(Op.getOperand(I), InterestedClasses, Depth + 1);
6249 First = false;
6250 } else {
6251 Known |=
6252 computeKnownFPClass(Op.getOperand(I), InterestedClasses, Depth + 1);
6253 }
6254
6255 if (Known.isUnknown())
6256 break;
6257 }
6258 break;
6259 }
6261 SDValue Src = Op.getOperand(0);
6262 auto *CIdx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6263 EVT SrcVT = Src.getValueType();
6264 if (SrcVT.isFixedLengthVector() && CIdx) {
6265 if (CIdx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6266 APInt DemandedSrcElts = APInt::getOneBitSet(
6267 SrcVT.getVectorNumElements(), CIdx->getZExtValue());
6268 Known = computeKnownFPClass(Src, DemandedSrcElts, InterestedClasses,
6269 Depth + 1);
6270 } else {
6271 // Out of bounds index is poison.
6272 Known.setKnownFPClasses(fcNone);
6273 }
6274 } else {
6275 Known = computeKnownFPClass(Src, InterestedClasses, Depth + 1);
6276 }
6277 break;
6278 }
6279 case ISD::SPLAT_VECTOR: {
6280 Known = computeKnownFPClass(Op.getOperand(0), InterestedClasses, Depth + 1);
6281 break;
6282 }
6283 case ISD::BITCAST: {
6284 // FIXME: It should not be necessary to check for an elementwise bitcast.
6285 // If a bitcast is not elementwise between vector / scalar types,
6286 // computeKnownBits already splices the known bits of the source elements
6287 // appropriately so as to line up with the bits of the result's demanded
6288 // elements.
6289 EVT SrcVT = Op.getOperand(0).getValueType();
6290 if (VT.isScalableVector() || SrcVT.isScalableVector())
6291 break;
6292 unsigned VTNumElts = VT.isVector() ? VT.getVectorNumElements() : 1;
6293 unsigned SrcVTNumElts = SrcVT.isVector() ? SrcVT.getVectorNumElements() : 1;
6294 if (VTNumElts != SrcVTNumElts)
6295 break;
6296
6297 KnownBits Bits = computeKnownBits(Op, DemandedElts, Depth + 1);
6299 break;
6300 }
6301 case ISD::FABS: {
6302 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6303 InterestedClasses, Depth + 1);
6304 Known.fabs();
6305 break;
6306 }
6307 case ISD::FCOPYSIGN: {
6308 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6309 InterestedClasses, Depth + 1);
6310 KnownFPClass KnownSign = computeKnownFPClass(Op.getOperand(1), DemandedElts,
6311 InterestedClasses, Depth + 1);
6312 Known.copysign(KnownSign);
6313 break;
6314 }
6315 case ISD::AssertNoFPClass: {
6316 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6317 InterestedClasses, Depth + 1);
6318 FPClassTest AssertedClasses =
6319 static_cast<FPClassTest>(Op->getConstantOperandVal(1));
6320 Known.setKnownFPClasses(Known.getKnownFPClasses() & ~AssertedClasses);
6321 break;
6322 }
6324 SDValue Src = Op.getOperand(0);
6325 EVT SrcVT = Src.getValueType();
6326 if (SrcVT.isFixedLengthVector()) {
6327 unsigned Idx = Op.getConstantOperandVal(1);
6328 unsigned NumSrcElts = SrcVT.getVectorNumElements();
6329
6330 APInt DemandedSrcElts = DemandedElts.zextOrTrunc(NumSrcElts).shl(Idx);
6331 Known = computeKnownFPClass(Src, DemandedSrcElts, InterestedClasses,
6332 Depth + 1);
6333 } else {
6334 Known = computeKnownFPClass(Src, InterestedClasses, Depth + 1);
6335 }
6336 break;
6337 }
6338 case ISD::INSERT_SUBVECTOR: {
6339 SDValue BaseVector = Op.getOperand(0);
6340 SDValue SubVector = Op.getOperand(1);
6341 EVT BaseVT = BaseVector.getValueType();
6342 if (BaseVT.isFixedLengthVector()) {
6343 unsigned Idx = Op.getConstantOperandVal(2);
6344 unsigned NumBaseElts = BaseVT.getVectorNumElements();
6345 unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
6346
6347 APInt DemandedMask =
6348 APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
6349 APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
6350 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
6351
6352 if (!DemandedSrcElts.isZero())
6353 Known = computeKnownFPClass(BaseVector, DemandedSrcElts,
6354 InterestedClasses, Depth + 1);
6355 if (!DemandedSubElts.isZero()) {
6357 SubVector, DemandedSubElts, InterestedClasses, Depth + 1);
6358 Known = DemandedSrcElts.isZero() ? SubKnown : (Known | SubKnown);
6359 }
6360 } else {
6361 Known = computeKnownFPClass(SubVector, InterestedClasses, Depth + 1);
6362 if (!Known.isUnknown())
6363 Known |= computeKnownFPClass(BaseVector, InterestedClasses, Depth + 1);
6364 }
6365 break;
6366 }
6367 case ISD::SELECT:
6368 case ISD::VSELECT: {
6369 // TODO: Add adjustKnownFPClassForSelectArm clamp recognition as in
6370 // IR-level ValueTracking.
6371 KnownFPClass KnownFalseClass = computeKnownFPClass(
6372 Op.getOperand(2), DemandedElts, InterestedClasses, Depth + 1);
6373 if (KnownFalseClass.isUnknown())
6374 break;
6375 KnownFPClass KnownTrueClass = computeKnownFPClass(
6376 Op.getOperand(1), DemandedElts, InterestedClasses, Depth + 1);
6377 Known = KnownTrueClass.intersectWith(KnownFalseClass);
6378 break;
6379 }
6380 default:
6381 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6382 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
6383 TLI->computeKnownFPClassForTargetNode(Op, Known, DemandedElts, *this,
6384 Depth);
6385 }
6386 break;
6387 }
6388
6389 return Known;
6390}
6391
6393 unsigned Depth) const {
6394 APInt DemandedElts = getDemandAllEltsMask(Op);
6395 return isKnownNeverNaN(Op, DemandedElts, SNaN, Depth);
6396}
6397
6399 bool SNaN, unsigned Depth) const {
6400 assert(!DemandedElts.isZero() && "No demanded elements");
6401
6402 // If we're told that NaNs won't happen, assume they won't.
6403 if (Op->getFlags().hasNoNaNs())
6404 return true;
6405
6406 if (Depth >= MaxRecursionDepth)
6407 return false; // Limit search depth.
6408
6409 unsigned Opcode = Op.getOpcode();
6410 switch (Opcode) {
6411 case ISD::FADD:
6412 case ISD::FSUB:
6413 case ISD::FMUL:
6414 case ISD::FDIV:
6415 case ISD::FREM:
6416 case ISD::FSIN:
6417 case ISD::FCOS:
6418 case ISD::FTAN:
6419 case ISD::FASIN:
6420 case ISD::FACOS:
6421 case ISD::FATAN:
6422 case ISD::FATAN2:
6423 case ISD::FSINH:
6424 case ISD::FCOSH:
6425 case ISD::FTANH:
6426 case ISD::FMA:
6427 case ISD::FMULADD:
6428 case ISD::FMAD: {
6429 if (SNaN)
6430 return true;
6431 // TODO: Need isKnownNeverInfinity
6432 return false;
6433 }
6434 case ISD::FCANONICALIZE:
6435 case ISD::FEXP:
6436 case ISD::FEXP2:
6437 case ISD::FEXP10:
6438 case ISD::FTRUNC:
6439 case ISD::FFLOOR:
6440 case ISD::FCEIL:
6441 case ISD::FROUND:
6442 case ISD::FROUNDEVEN:
6443 case ISD::LROUND:
6444 case ISD::LLROUND:
6445 case ISD::FRINT:
6446 case ISD::LRINT:
6447 case ISD::LLRINT:
6448 case ISD::FNEARBYINT:
6449 case ISD::FLDEXP: {
6450 if (SNaN)
6451 return true;
6452 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6453 }
6454 case ISD::FABS:
6455 case ISD::FNEG:
6456 case ISD::FCOPYSIGN: {
6457 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6458 }
6459 case ISD::SELECT:
6460 return isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1) &&
6461 isKnownNeverNaN(Op.getOperand(2), DemandedElts, SNaN, Depth + 1);
6462 case ISD::FP_EXTEND:
6463 case ISD::FP_ROUND: {
6464 if (SNaN)
6465 return true;
6466 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6467 }
6468 case ISD::SINT_TO_FP:
6469 case ISD::UINT_TO_FP:
6470 return true;
6471 case ISD::FSQRT: // Need is known positive
6472 case ISD::FLOG:
6473 case ISD::FLOG2:
6474 case ISD::FLOG10:
6475 case ISD::FPOWI:
6476 case ISD::FPOW: {
6477 if (SNaN)
6478 return true;
6479 // TODO: Refine on operand
6480 return false;
6481 }
6482 case ISD::FMINNUM:
6483 case ISD::FMAXNUM:
6484 case ISD::FMINIMUMNUM:
6485 case ISD::FMAXIMUMNUM: {
6486 // Only one needs to be known not-nan, since it will be returned if the
6487 // other ends up being one.
6488 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) ||
6489 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6490 }
6491 case ISD::FMINNUM_IEEE:
6492 case ISD::FMAXNUM_IEEE: {
6493 if (SNaN)
6494 return true;
6495 // This can return a NaN if either operand is an sNaN, or if both operands
6496 // are NaN.
6497 return (isKnownNeverNaN(Op.getOperand(0), DemandedElts, false, Depth + 1) &&
6498 isKnownNeverSNaN(Op.getOperand(1), DemandedElts, Depth + 1)) ||
6499 (isKnownNeverNaN(Op.getOperand(1), DemandedElts, false, Depth + 1) &&
6500 isKnownNeverSNaN(Op.getOperand(0), DemandedElts, Depth + 1));
6501 }
6502 case ISD::FMINIMUM:
6503 case ISD::FMAXIMUM: {
6504 // TODO: Does this quiet or return the origina NaN as-is?
6505 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) &&
6506 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6507 }
6509 SDValue Src = Op.getOperand(0);
6510 auto *Idx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6511 EVT SrcVT = Src.getValueType();
6512 if (SrcVT.isFixedLengthVector() && Idx &&
6513 Idx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6514 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
6515 Idx->getZExtValue());
6516 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6517 }
6518 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6519 }
6521 SDValue Src = Op.getOperand(0);
6522 if (Src.getValueType().isFixedLengthVector()) {
6523 unsigned Idx = Op.getConstantOperandVal(1);
6524 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
6525 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
6526 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6527 }
6528 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6529 }
6530 case ISD::INSERT_SUBVECTOR: {
6531 SDValue BaseVector = Op.getOperand(0);
6532 SDValue SubVector = Op.getOperand(1);
6533 EVT BaseVectorVT = BaseVector.getValueType();
6534 if (BaseVectorVT.isFixedLengthVector()) {
6535 unsigned Idx = Op.getConstantOperandVal(2);
6536 unsigned NumBaseElts = BaseVectorVT.getVectorNumElements();
6537 unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
6538
6539 // Clear/Extract the bits at the position where the subvector will be
6540 // inserted.
6541 APInt DemandedMask =
6542 APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
6543 APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
6544 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
6545
6546 bool NeverNaN = true;
6547 if (!DemandedSrcElts.isZero())
6548 NeverNaN &=
6549 isKnownNeverNaN(BaseVector, DemandedSrcElts, SNaN, Depth + 1);
6550 if (NeverNaN && !DemandedSubElts.isZero())
6551 NeverNaN &=
6552 isKnownNeverNaN(SubVector, DemandedSubElts, SNaN, Depth + 1);
6553 return NeverNaN;
6554 }
6555 return isKnownNeverNaN(BaseVector, SNaN, Depth + 1) &&
6556 isKnownNeverNaN(SubVector, SNaN, Depth + 1);
6557 }
6558 case ISD::BUILD_VECTOR: {
6559 unsigned NumElts = Op.getNumOperands();
6560 for (unsigned I = 0; I != NumElts; ++I)
6561 if (DemandedElts[I] &&
6562 !isKnownNeverNaN(Op.getOperand(I), SNaN, Depth + 1))
6563 return false;
6564 return true;
6565 }
6566 case ISD::SPLAT_VECTOR:
6567 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
6568 case ISD::AssertNoFPClass: {
6569 FPClassTest NoFPClass =
6570 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
6571 if ((NoFPClass & fcNan) == fcNan)
6572 return true;
6573 if (SNaN && (NoFPClass & fcSNan) == fcSNan)
6574 return true;
6575 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6576 }
6577 default:
6578 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6579 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
6580 return TLI->isKnownNeverNaNForTargetNode(Op, DemandedElts, *this, SNaN,
6581 Depth);
6582 }
6583 break;
6584 }
6585
6586 FPClassTest NanMask = SNaN ? fcSNan : fcNan;
6587 KnownFPClass Known = computeKnownFPClass(Op, DemandedElts, NanMask, Depth);
6588 return Known.isKnownNever(NanMask);
6589}
6590
6592 APInt DemandedElts = getDemandAllEltsMask(Op);
6593 return isKnownNeverLogicalZero(Op, DemandedElts, Depth);
6594}
6595
6597 const APInt &DemandedElts,
6598 unsigned Depth) const {
6599 assert(!DemandedElts.isZero() && "No demanded elements");
6600 EVT VT = Op.getValueType();
6602 computeKnownFPClass(Op, DemandedElts, fcZero | fcSubnormal, Depth);
6603 return Known.isKnownNeverLogicalZero(getDenormalMode(VT));
6604}
6605
6607 APInt DemandedElts = getDemandAllEltsMask(Op);
6608 return isKnownNeverZero(Op, DemandedElts, Depth);
6609}
6610
6612 unsigned Depth) const {
6613 if (Depth >= MaxRecursionDepth)
6614 return false; // Limit search depth.
6615
6616 EVT OpVT = Op.getValueType();
6617 unsigned BitWidth = OpVT.getScalarSizeInBits();
6618
6619 assert(!Op.getValueType().isFloatingPoint() &&
6620 "Floating point types unsupported - use isKnownNeverLogicalZero");
6621
6622 // If the value is a constant, we can obviously see if it is a zero or not.
6623 auto IsNeverZero = [BitWidth](const ConstantSDNode *C) {
6624 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
6625 return !V.isZero();
6626 };
6627
6628 if (ISD::matchUnaryPredicate(Op, DemandedElts, IsNeverZero,
6629 /*AllowUndefs=*/false, /*AllowTruncation=*/true))
6630 return true;
6631
6632 // TODO: Recognize more cases here. Most of the cases are also incomplete to
6633 // some degree.
6634 switch (Op.getOpcode()) {
6635 default:
6636 break;
6637
6639 SDValue InVec = Op.getOperand(0);
6640 SDValue EltNo = Op.getOperand(1);
6641 EVT VecVT = InVec.getValueType();
6642
6643 // Skip scalable vectors or implicit extensions.
6644 if (VecVT.isScalableVector() ||
6645 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
6646 break;
6647
6648 // If we know the element index, just demand that vector element, else for
6649 // an unknown element index, ignore DemandedElts and demand them all.
6650 const unsigned NumSrcElts = VecVT.getVectorNumElements();
6651 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
6652 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
6653 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
6654 DemandedSrcElts =
6655 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
6656
6657 return isKnownNeverZero(InVec, DemandedSrcElts, Depth + 1);
6658 }
6659
6660 case ISD::OR:
6661 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6662 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6663
6664 case ISD::VSELECT:
6665 case ISD::SELECT:
6666 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6667 isKnownNeverZero(Op.getOperand(2), DemandedElts, Depth + 1);
6668
6669 case ISD::SHL: {
6670 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6671 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6672 KnownBits ValKnown =
6673 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6674 // 1 << X is never zero.
6675 if (ValKnown.One[0])
6676 return true;
6677 // If max shift cnt of known ones is non-zero, result is non-zero.
6678 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6679 .getMaxValue();
6680 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6681 !ValKnown.One.shl(MaxCnt).isZero())
6682 return true;
6683 break;
6684 }
6685
6686 case ISD::VECTOR_SHUFFLE: {
6687 if (Op.getValueType().isScalableVector())
6688 return false;
6689
6690 unsigned NumElts = DemandedElts.getBitWidth();
6691
6692 // All demanded elements from LHS and RHS must be known non-zero.
6693 // Demanded elements with undef shuffle mask elements are unknown.
6694
6695 APInt DemandedLHS, DemandedRHS;
6696 auto *SVN = cast<ShuffleVectorSDNode>(Op);
6697 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
6698 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
6699 DemandedLHS, DemandedRHS))
6700 return false;
6701
6702 return (!DemandedLHS ||
6703 isKnownNeverZero(Op.getOperand(0), DemandedLHS, Depth + 1)) &&
6704 (!DemandedRHS ||
6705 isKnownNeverZero(Op.getOperand(1), DemandedRHS, Depth + 1));
6706 }
6707
6708 case ISD::UADDSAT:
6709 case ISD::UMAX:
6710 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6711 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6712
6713 case ISD::UMIN:
6714 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6715 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6716
6717 // For smin/smax: If either operand is known negative/positive
6718 // respectively we don't need the other to be known at all.
6719 case ISD::SMAX: {
6720 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6721 if (Op1.isStrictlyPositive())
6722 return true;
6723
6724 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6725 if (Op0.isStrictlyPositive())
6726 return true;
6727
6728 if (Op1.isNonZero() && Op0.isNonZero())
6729 return true;
6730
6731 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6732 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6733 }
6734 case ISD::SMIN: {
6735 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6736 if (Op1.isNegative())
6737 return true;
6738
6739 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6740 if (Op0.isNegative())
6741 return true;
6742
6743 if (Op1.isNonZero() && Op0.isNonZero())
6744 return true;
6745
6746 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6747 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6748 }
6749
6750 case ISD::ROTL:
6751 case ISD::ROTR:
6752 case ISD::BITREVERSE:
6753 case ISD::BSWAP:
6754 case ISD::CTPOP:
6755 case ISD::ABS:
6757 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6758
6759 case ISD::SRA:
6760 case ISD::SRL: {
6761 if (Op->getFlags().hasExact())
6762 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6763 KnownBits ValKnown =
6764 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6765 if (ValKnown.isNegative())
6766 return true;
6767 // If max shift cnt of known ones is non-zero, result is non-zero.
6768 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6769 .getMaxValue();
6770 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6771 !ValKnown.One.lshr(MaxCnt).isZero())
6772 return true;
6773 break;
6774 }
6775 case ISD::UDIV:
6776 case ISD::SDIV:
6777 // div exact can only produce a zero if the dividend is zero.
6778 // TODO: For udiv this is also true if Op1 u<= Op0
6779 if (Op->getFlags().hasExact())
6780 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6781 break;
6782
6783 case ISD::ADD:
6784 if (Op->getFlags().hasNoUnsignedWrap())
6785 if (isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6786 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1))
6787 return true;
6788 // TODO: There are a lot more cases we can prove for add.
6789 break;
6790
6791 case ISD::SUB: {
6792 if (isNullConstant(Op.getOperand(0)))
6793 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1);
6794
6795 std::optional<bool> ne = KnownBits::ne(
6796 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1),
6797 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1));
6798 return ne && *ne;
6799 }
6800
6801 case ISD::MUL:
6802 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6803 if (isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
6804 isKnownNeverZero(Op.getOperand(0), Depth + 1))
6805 return true;
6806 break;
6807
6808 case ISD::ZERO_EXTEND:
6809 case ISD::SIGN_EXTEND:
6810 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6811 case ISD::VSCALE: {
6813 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
6814 ConstantRange CR =
6815 getVScaleRange(&F, Op.getScalarValueSizeInBits()).multiply(Multiplier);
6816 if (!CR.contains(APInt(CR.getBitWidth(), 0)))
6817 return true;
6818 break;
6819 }
6820 }
6821
6822 return computeKnownBits(Op, DemandedElts, Depth).isNonZero();
6823}
6824
6826 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Op, true))
6827 return !C1->isNegative();
6828
6829 switch (Op.getOpcode()) {
6830 case ISD::FABS:
6831 case ISD::FEXP:
6832 case ISD::FEXP2:
6833 case ISD::FEXP10:
6834 return true;
6835 default:
6836 return false;
6837 }
6838
6839 llvm_unreachable("covered opcode switch");
6840}
6841
6843 assert(Use.getValueType().isFloatingPoint());
6844 const SDNode *User = Use.getUser();
6845 if (User->getFlags().hasNoSignedZeros())
6846 return true;
6847
6848 unsigned OperandNo = Use.getOperandNo();
6849 // Check if this use is insensitive to the sign of zero
6850 switch (User->getOpcode()) {
6851 case ISD::SETCC:
6852 // Comparisons: IEEE-754 specifies +0.0 == -0.0.
6853 case ISD::FABS:
6854 // fabs always produces +0.0.
6855 return true;
6856 case ISD::FCOPYSIGN:
6857 // copysign overwrites the sign bit of the first operand.
6858 return OperandNo == 0;
6859 case ISD::FADD:
6860 case ISD::FSUB: {
6861 // Arithmetic with non-zero constants fixes the uncertainty around the
6862 // sign bit.
6863 SDValue Other = User->getOperand(1 - OperandNo);
6865 }
6866 case ISD::FP_TO_SINT:
6867 case ISD::FP_TO_UINT:
6868 // fp-to-int conversions normalize signed zeros.
6869 return true;
6870 default:
6871 return false;
6872 }
6873}
6874
6876 if (Op->getFlags().hasNoSignedZeros())
6877 return true;
6878 // FIXME: Limit the amount of checked uses to not introduce a compile-time
6879 // regression. Ideally, this should be implemented as a demanded-bits
6880 // optimization that stems from the users.
6881 if (Op->use_size() > 2)
6882 return false;
6883 return all_of(Op->uses(),
6884 [&](const SDUse &Use) { return canIgnoreSignBitOfZero(Use); });
6885}
6886
6888 // Check the obvious case.
6889 if (A == B) return true;
6890
6891 // For negative and positive zero.
6894 if (CA->isZero() && CB->isZero()) return true;
6895
6896 // Otherwise they may not be equal.
6897 return false;
6898}
6899
6900// Only bits set in Mask must be negated, other bits may be arbitrary.
6902 if (isBitwiseNot(V, AllowUndefs))
6903 return V.getOperand(0);
6904
6905 // Handle any_extend (not (truncate X)) pattern, where Mask only sets
6906 // bits in the non-extended part.
6907 ConstantSDNode *MaskC = isConstOrConstSplat(Mask);
6908 if (!MaskC || V.getOpcode() != ISD::ANY_EXTEND)
6909 return SDValue();
6910 SDValue ExtArg = V.getOperand(0);
6911 if (ExtArg.getScalarValueSizeInBits() >=
6912 MaskC->getAPIntValue().getActiveBits() &&
6913 isBitwiseNot(ExtArg, AllowUndefs) &&
6914 ExtArg.getOperand(0).getOpcode() == ISD::TRUNCATE &&
6915 ExtArg.getOperand(0).getOperand(0).getValueType() == V.getValueType())
6916 return ExtArg.getOperand(0).getOperand(0);
6917 return SDValue();
6918}
6919
6921 // Match masked merge pattern (X & ~M) op (Y & M)
6922 // Including degenerate case (X & ~M) op M
6923 auto MatchNoCommonBitsPattern = [&](SDValue Not, SDValue Mask,
6924 SDValue Other) {
6925 if (SDValue NotOperand =
6926 getBitwiseNotOperand(Not, Mask, /* AllowUndefs */ true)) {
6927 if (NotOperand->getOpcode() == ISD::ZERO_EXTEND ||
6928 NotOperand->getOpcode() == ISD::TRUNCATE)
6929 NotOperand = NotOperand->getOperand(0);
6930
6931 if (Other == NotOperand)
6932 return true;
6933 if (Other->getOpcode() == ISD::AND)
6934 return NotOperand == Other->getOperand(0) ||
6935 NotOperand == Other->getOperand(1);
6936 }
6937 return false;
6938 };
6939
6940 if (A->getOpcode() == ISD::ZERO_EXTEND || A->getOpcode() == ISD::TRUNCATE)
6941 A = A->getOperand(0);
6942
6943 if (B->getOpcode() == ISD::ZERO_EXTEND || B->getOpcode() == ISD::TRUNCATE)
6944 B = B->getOperand(0);
6945
6946 if (A->getOpcode() == ISD::AND)
6947 return MatchNoCommonBitsPattern(A->getOperand(0), A->getOperand(1), B) ||
6948 MatchNoCommonBitsPattern(A->getOperand(1), A->getOperand(0), B);
6949 return false;
6950}
6951
6952// FIXME: unify with llvm::haveNoCommonBitsSet.
6954 assert(A.getValueType() == B.getValueType() &&
6955 "Values must have the same type");
6958 return true;
6961}
6962
6963static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step,
6964 SelectionDAG &DAG) {
6965 if (cast<ConstantSDNode>(Step)->isZero())
6966 return DAG.getConstant(0, DL, VT);
6967
6968 return SDValue();
6969}
6970
6973 SelectionDAG &DAG) {
6974 int NumOps = Ops.size();
6975 assert(NumOps != 0 && "Can't build an empty vector!");
6976 assert(!VT.isScalableVector() &&
6977 "BUILD_VECTOR cannot be used with scalable types");
6978 assert(VT.getVectorNumElements() == (unsigned)NumOps &&
6979 "Incorrect element count in BUILD_VECTOR!");
6980
6981 // BUILD_VECTOR of UNDEFs is UNDEF.
6982 bool AllPoison = true;
6983 if (llvm::all_of(Ops, [&AllPoison](SDValue Op) {
6984 AllPoison &= Op.getOpcode() == ISD::POISON;
6985 return Op.isUndef();
6986 }))
6987 return AllPoison ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
6988
6989 // BUILD_VECTOR of seq extract/insert from the same vector + type is Identity.
6990 SDValue IdentitySrc;
6991 bool IsIdentity = true;
6992 for (int i = 0; i != NumOps; ++i) {
6993 if (Ops[i].getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
6994 Ops[i].getOperand(0).getValueType() != VT ||
6995 (IdentitySrc && Ops[i].getOperand(0) != IdentitySrc) ||
6996 !isa<ConstantSDNode>(Ops[i].getOperand(1)) ||
6997 Ops[i].getConstantOperandAPInt(1) != i) {
6998 IsIdentity = false;
6999 break;
7000 }
7001 IdentitySrc = Ops[i].getOperand(0);
7002 }
7003 if (IsIdentity)
7004 return IdentitySrc;
7005
7006 return SDValue();
7007}
7008
7009/// Try to simplify vector concatenation to an input value, undef, or build
7010/// vector.
7013 SelectionDAG &DAG) {
7014 assert(!Ops.empty() && "Can't concatenate an empty list of vectors!");
7016 [Ops](SDValue Op) {
7017 return Ops[0].getValueType() == Op.getValueType();
7018 }) &&
7019 "Concatenation of vectors with inconsistent value types!");
7020 assert((Ops[0].getValueType().getVectorElementCount() * Ops.size()) ==
7021 VT.getVectorElementCount() &&
7022 "Incorrect element count in vector concatenation!");
7023
7024 if (Ops.size() == 1)
7025 return Ops[0];
7026
7027 // Concat of UNDEFs is UNDEF.
7028 bool AllPoison = true;
7029 if (llvm::all_of(Ops, [&AllPoison](SDValue Op) {
7030 AllPoison &= Op.getOpcode() == ISD::POISON;
7031 return Op.isUndef();
7032 }))
7033 return AllPoison ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
7034
7035 // Scan the operands and look for extract operations from a single source
7036 // that correspond to insertion at the same location via this concatenation:
7037 // concat (extract X, 0*subvec_elts), (extract X, 1*subvec_elts), ...
7038 SDValue IdentitySrc;
7039 bool IsIdentity = true;
7040 for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
7041 SDValue Op = Ops[i];
7042 unsigned IdentityIndex = i * Op.getValueType().getVectorMinNumElements();
7043 if (Op.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
7044 Op.getOperand(0).getValueType() != VT ||
7045 (IdentitySrc && Op.getOperand(0) != IdentitySrc) ||
7046 Op.getConstantOperandVal(1) != IdentityIndex) {
7047 IsIdentity = false;
7048 break;
7049 }
7050 assert((!IdentitySrc || IdentitySrc == Op.getOperand(0)) &&
7051 "Unexpected identity source vector for concat of extracts");
7052 IdentitySrc = Op.getOperand(0);
7053 }
7054 if (IsIdentity) {
7055 assert(IdentitySrc && "Failed to set source vector of extracts");
7056 return IdentitySrc;
7057 }
7058
7059 // The code below this point is only designed to work for fixed width
7060 // vectors, so we bail out for now.
7061 if (VT.isScalableVector())
7062 return SDValue();
7063
7064 // A CONCAT_VECTOR of scalar sources, such as UNDEF, BUILD_VECTOR and
7065 // single-element INSERT_VECTOR_ELT operands can be simplified to one big
7066 // BUILD_VECTOR.
7067 // FIXME: Add support for SCALAR_TO_VECTOR as well.
7068 EVT SVT = VT.getScalarType();
7070 for (SDValue Op : Ops) {
7071 EVT OpVT = Op.getValueType();
7072 if (Op.getOpcode() == ISD::POISON)
7073 Elts.append(OpVT.getVectorNumElements(), DAG.getPOISON(SVT));
7074 else if (Op.getOpcode() == ISD::UNDEF)
7075 Elts.append(OpVT.getVectorNumElements(), DAG.getUNDEF(SVT));
7076 else if (Op.getOpcode() == ISD::BUILD_VECTOR)
7077 Elts.append(Op->op_begin(), Op->op_end());
7078 else if (Op.getOpcode() == ISD::INSERT_VECTOR_ELT &&
7079 OpVT.getVectorNumElements() == 1 &&
7080 isNullConstant(Op.getOperand(2)))
7081 Elts.push_back(Op.getOperand(1));
7082 else
7083 return SDValue();
7084 }
7085
7086 // BUILD_VECTOR requires all inputs to be of the same type, find the
7087 // maximum type and extend them all.
7088 for (SDValue Op : Elts)
7089 SVT = (SVT.bitsLT(Op.getValueType()) ? Op.getValueType() : SVT);
7090
7091 if (SVT.bitsGT(VT.getScalarType())) {
7092 for (SDValue &Op : Elts) {
7093 if (Op.getOpcode() == ISD::POISON)
7094 Op = DAG.getPOISON(SVT);
7095 else if (Op.getOpcode() == ISD::UNDEF)
7096 Op = DAG.getUNDEF(SVT);
7097 else
7098 Op = DAG.getTargetLoweringInfo().isZExtFree(Op.getValueType(), SVT)
7099 ? DAG.getZExtOrTrunc(Op, DL, SVT)
7100 : DAG.getSExtOrTrunc(Op, DL, SVT);
7101 }
7102 }
7103
7104 SDValue V = DAG.getBuildVector(VT, DL, Elts);
7105 NewSDValueDbgMsg(V, "New node fold concat vectors: ", &DAG);
7106 return V;
7107}
7108
7109/// Gets or creates the specified node.
7110SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT) {
7111 SDVTList VTs = getVTList(VT);
7112 SDNodeKey ID(Opcode, VTs, {});
7113 FoldingSetInsertToken InsertToken;
7114 if (SDNode *E = lookupNode(ID, DL, InsertToken))
7115 return SDValue(E, 0);
7116
7117 auto *N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7118 CSEMap.insert(N, InsertToken);
7119
7120 InsertNode(N);
7121 SDValue V = SDValue(N, 0);
7122 NewSDValueDbgMsg(V, "Creating new node: ", this);
7123 return V;
7124}
7125
7126SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7127 SDValue N1) {
7128 SDNodeFlags Flags;
7129 if (Inserter)
7130 Flags = Inserter->getFlags();
7131 return getNode(Opcode, DL, VT, N1, Flags);
7132}
7133
7134SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7135 SDValue N1, const SDNodeFlags Flags) {
7136 assert(N1.getOpcode() != ISD::DELETED_NODE && "Operand is DELETED_NODE!");
7137
7138 // Constant fold unary operations with a vector integer or float operand.
7139 switch (Opcode) {
7140 default:
7141 // FIXME: Entirely reasonable to perform folding of other unary
7142 // operations here as the need arises.
7143 break;
7144 case ISD::FNEG:
7145 case ISD::FABS:
7146 case ISD::FCEIL:
7147 case ISD::FTRUNC:
7148 case ISD::FFLOOR:
7149 case ISD::FP_EXTEND:
7150 case ISD::FP_TO_SINT:
7151 case ISD::FP_TO_UINT:
7152 case ISD::FP_TO_FP16:
7153 case ISD::FP_TO_BF16:
7154 case ISD::TRUNCATE:
7155 case ISD::ANY_EXTEND:
7156 case ISD::ZERO_EXTEND:
7157 case ISD::SIGN_EXTEND:
7158 case ISD::UINT_TO_FP:
7159 case ISD::SINT_TO_FP:
7160 case ISD::FP16_TO_FP:
7161 case ISD::BF16_TO_FP:
7162 case ISD::BITCAST:
7163 case ISD::ABS:
7165 case ISD::BITREVERSE:
7166 case ISD::BSWAP:
7167 case ISD::CTLZ:
7169 case ISD::CTTZ:
7171 case ISD::CTPOP:
7172 case ISD::PARITY:
7173 case ISD::CTLS:
7174 case ISD::VECREDUCE_ADD:
7179 case ISD::VECREDUCE_MUL:
7180 case ISD::VECREDUCE_AND:
7181 case ISD::VECREDUCE_OR:
7182 case ISD::VECREDUCE_XOR:
7183 case ISD::STEP_VECTOR: {
7184 SDValue Ops = {N1};
7185 if (SDValue Fold = FoldConstantArithmetic(Opcode, DL, VT, Ops))
7186 return Fold;
7187 }
7188 }
7189
7190 unsigned OpOpcode = N1.getNode()->getOpcode();
7191 switch (Opcode) {
7192 case ISD::STEP_VECTOR:
7193 assert(VT.isScalableVector() &&
7194 "STEP_VECTOR can only be used with scalable types");
7195 assert(OpOpcode == ISD::TargetConstant &&
7196 VT.getVectorElementType() == N1.getValueType() &&
7197 "Unexpected step operand");
7198 break;
7199 case ISD::FREEZE:
7200 assert(VT == N1.getValueType() && "Unexpected VT!");
7202 return N1;
7203 break;
7204 case ISD::TokenFactor:
7205 case ISD::MERGE_VALUES:
7207 return N1; // Factor, merge or concat of one node? No need.
7208 case ISD::BUILD_VECTOR: {
7209 // Attempt to simplify BUILD_VECTOR.
7210 SDValue Ops[] = {N1};
7211 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
7212 return V;
7213 break;
7214 }
7215 case ISD::FP_ROUND: llvm_unreachable("Invalid method to make FP_ROUND node");
7216 case ISD::FP_EXTEND:
7218 "Invalid FP cast!");
7219 if (N1.getValueType() == VT) return N1; // noop conversion.
7220 assert((!VT.isVector() || VT.getVectorElementCount() ==
7222 "Vector element count mismatch!");
7223 assert(N1.getValueType().bitsLT(VT) && "Invalid fpext node, dst < src!");
7224 if (N1.isUndef())
7225 return getUNDEF(VT);
7226 break;
7227 case ISD::FP_TO_SINT:
7228 case ISD::FP_TO_UINT:
7229 if (N1.isUndef())
7230 return getUNDEF(VT);
7231 break;
7232 case ISD::SINT_TO_FP:
7233 case ISD::UINT_TO_FP:
7234 // [us]itofp(undef) = 0, because the result value is bounded.
7235 if (N1.isUndef())
7236 return getConstantFP(0.0, DL, VT);
7237 break;
7238 case ISD::SIGN_EXTEND:
7239 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7240 "Invalid SIGN_EXTEND!");
7241 assert(VT.isVector() == N1.getValueType().isVector() &&
7242 "SIGN_EXTEND result type type should be vector iff the operand "
7243 "type is vector!");
7244 if (N1.getValueType() == VT) return N1; // noop extension
7245 assert((!VT.isVector() || VT.getVectorElementCount() ==
7247 "Vector element count mismatch!");
7248 assert(N1.getValueType().bitsLT(VT) && "Invalid sext node, dst < src!");
7249 if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND) {
7250 SDNodeFlags Flags;
7251 if (OpOpcode == ISD::ZERO_EXTEND)
7252 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7253 SDValue NewVal = getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7254 transferDbgValues(N1, NewVal);
7255 return NewVal;
7256 }
7257
7258 if (OpOpcode == ISD::POISON)
7259 return getPOISON(VT);
7260
7261 if (N1.isUndef())
7262 // sext(undef) = 0, because the top bits will all be the same.
7263 return getConstant(0, DL, VT);
7264
7265 // Skip unnecessary sext_inreg pattern:
7266 // (sext (trunc x)) -> x iff the upper bits are all signbits.
7267 if (OpOpcode == ISD::TRUNCATE) {
7268 SDValue OpOp = N1.getOperand(0);
7269 if (OpOp.getValueType() == VT) {
7270 unsigned NumSignExtBits =
7272 if (ComputeNumSignBits(OpOp) > NumSignExtBits) {
7273 transferDbgValues(N1, OpOp);
7274 return OpOp;
7275 }
7276 }
7277 }
7278 break;
7279 case ISD::ZERO_EXTEND:
7280 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7281 "Invalid ZERO_EXTEND!");
7282 assert(VT.isVector() == N1.getValueType().isVector() &&
7283 "ZERO_EXTEND result type type should be vector iff the operand "
7284 "type is vector!");
7285 if (N1.getValueType() == VT) return N1; // noop extension
7286 assert((!VT.isVector() || VT.getVectorElementCount() ==
7288 "Vector element count mismatch!");
7289 assert(N1.getValueType().bitsLT(VT) && "Invalid zext node, dst < src!");
7290 if (OpOpcode == ISD::ZERO_EXTEND) { // (zext (zext x)) -> (zext x)
7291 SDNodeFlags Flags;
7292 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7293 SDValue NewVal =
7294 getNode(ISD::ZERO_EXTEND, DL, VT, N1.getOperand(0), Flags);
7295 transferDbgValues(N1, NewVal);
7296 return NewVal;
7297 }
7298
7299 if (OpOpcode == ISD::POISON)
7300 return getPOISON(VT);
7301
7302 if (N1.isUndef())
7303 // zext(undef) = 0, because the top bits will be zero.
7304 return getConstant(0, DL, VT);
7305
7306 // Skip unnecessary zext_inreg pattern:
7307 // (zext (trunc x)) -> x iff the upper bits are known zero.
7308 // TODO: Remove (zext (trunc (and x, c))) exception which some targets
7309 // use to recognise zext_inreg patterns.
7310 if (OpOpcode == ISD::TRUNCATE) {
7311 SDValue OpOp = N1.getOperand(0);
7312 if (OpOp.getValueType() == VT) {
7313 if (OpOp.getOpcode() != ISD::AND) {
7316 if (MaskedValueIsZero(OpOp, HiBits)) {
7317 transferDbgValues(N1, OpOp);
7318 return OpOp;
7319 }
7320 }
7321 }
7322 }
7323 break;
7324 case ISD::ANY_EXTEND:
7325 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7326 "Invalid ANY_EXTEND!");
7327 assert(VT.isVector() == N1.getValueType().isVector() &&
7328 "ANY_EXTEND result type type should be vector iff the operand "
7329 "type is vector!");
7330 if (N1.getValueType() == VT) return N1; // noop extension
7331 assert((!VT.isVector() || VT.getVectorElementCount() ==
7333 "Vector element count mismatch!");
7334 assert(N1.getValueType().bitsLT(VT) && "Invalid anyext node, dst < src!");
7335
7336 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7337 OpOpcode == ISD::ANY_EXTEND) {
7338 SDNodeFlags Flags;
7339 if (OpOpcode == ISD::ZERO_EXTEND)
7340 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7341 // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x)
7342 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7343 }
7344 if (N1.isUndef())
7345 return getUNDEF(VT);
7346
7347 // (ext (trunc x)) -> x
7348 if (OpOpcode == ISD::TRUNCATE) {
7349 SDValue OpOp = N1.getOperand(0);
7350 if (OpOp.getValueType() == VT) {
7351 transferDbgValues(N1, OpOp);
7352 return OpOp;
7353 }
7354 }
7355 break;
7356 case ISD::TRUNCATE:
7357 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7358 "Invalid TRUNCATE!");
7359 assert(VT.isVector() == N1.getValueType().isVector() &&
7360 "TRUNCATE result type type should be vector iff the operand "
7361 "type is vector!");
7362 if (N1.getValueType() == VT) return N1; // noop truncate
7363 assert((!VT.isVector() || VT.getVectorElementCount() ==
7365 "Vector element count mismatch!");
7366 assert(N1.getValueType().bitsGT(VT) && "Invalid truncate node, src < dst!");
7367 if (OpOpcode == ISD::TRUNCATE)
7368 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7369 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7370 OpOpcode == ISD::ANY_EXTEND) {
7371 // If the source is smaller than the dest, we still need an extend.
7373 VT.getScalarType())) {
7374 SDNodeFlags Flags;
7375 if (OpOpcode == ISD::ZERO_EXTEND)
7376 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7377 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7378 }
7379 if (N1.getOperand(0).getValueType().bitsGT(VT))
7380 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7381 return N1.getOperand(0);
7382 }
7383 if (N1.isUndef())
7384 return getUNDEF(VT);
7385 if (OpOpcode == ISD::VSCALE && !NewNodesMustHaveLegalTypes)
7386 return getVScale(DL, VT,
7388 break;
7392 assert(VT.isVector() && "This DAG node is restricted to vector types.");
7393 assert(N1.getValueType().bitsLE(VT) &&
7394 "The input must be the same size or smaller than the result.");
7397 "The destination vector type must have fewer lanes than the input.");
7398 break;
7399 case ISD::ABS:
7400 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid ABS!");
7401 if (N1.isUndef())
7402 return getConstant(0, DL, VT);
7403 break;
7405 assert(VT.isInteger() && VT == N1.getValueType() &&
7406 "Invalid ABS_MIN_POISON!");
7407 if (N1.isUndef())
7408 return getConstant(0, DL, VT);
7409 break;
7410 case ISD::BSWAP:
7411 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BSWAP!");
7412 assert((VT.getScalarSizeInBits() % 16 == 0) &&
7413 "BSWAP types must be a multiple of 16 bits!");
7414 if (N1.isUndef())
7415 return getUNDEF(VT);
7416 // bswap(bswap(X)) -> X.
7417 if (OpOpcode == ISD::BSWAP)
7418 return N1.getOperand(0);
7419 break;
7420 case ISD::BITREVERSE:
7421 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BITREVERSE!");
7422 if (N1.isUndef())
7423 return getUNDEF(VT);
7424 break;
7425 case ISD::BITCAST:
7427 "Cannot BITCAST between types of different sizes!");
7428 if (VT == N1.getValueType()) return N1; // noop conversion.
7429 if (OpOpcode == ISD::BITCAST) // bitconv(bitconv(x)) -> bitconv(x)
7430 return getNode(ISD::BITCAST, DL, VT, N1.getOperand(0));
7431 if (N1.isUndef())
7432 return getUNDEF(VT);
7433 break;
7435 assert(VT.isVector() && !N1.getValueType().isVector() &&
7436 (VT.getVectorElementType() == N1.getValueType() ||
7438 N1.getValueType().isInteger() &&
7440 "Illegal SCALAR_TO_VECTOR node!");
7441 if (N1.isUndef())
7442 return getUNDEF(VT);
7443 // scalar_to_vector(extract_vector_elt V, 0) -> V, top bits are undefined.
7444 if (OpOpcode == ISD::EXTRACT_VECTOR_ELT &&
7446 N1.getConstantOperandVal(1) == 0 &&
7447 N1.getOperand(0).getValueType() == VT)
7448 return N1.getOperand(0);
7449 break;
7450 case ISD::FNEG:
7451 // Negation of an unknown bag of bits is still completely undefined.
7452 if (N1.isUndef())
7453 return getUNDEF(VT);
7454
7455 if (OpOpcode == ISD::FNEG) // --X -> X
7456 return N1.getOperand(0);
7457 break;
7458 case ISD::FABS:
7459 if (OpOpcode == ISD::FNEG) // abs(-X) -> abs(X)
7460 return getNode(ISD::FABS, DL, VT, N1.getOperand(0));
7461 break;
7462 case ISD::VSCALE:
7463 assert(VT == N1.getValueType() && "Unexpected VT!");
7464 break;
7465 case ISD::CTPOP:
7466 if (N1.getValueType().getScalarType() == MVT::i1)
7467 return N1;
7468 break;
7469 case ISD::CTLZ:
7470 case ISD::CTTZ:
7471 if (N1.getValueType().getScalarType() == MVT::i1)
7472 return getNOT(DL, N1, N1.getValueType());
7473 break;
7474 case ISD::CTLS:
7475 if (N1.getValueType().getScalarType() == MVT::i1)
7476 return getConstant(0, DL, VT);
7477 break;
7478 case ISD::VECREDUCE_ADD:
7479 if (N1.getValueType().getScalarType() == MVT::i1)
7480 return getNode(ISD::VECREDUCE_XOR, DL, VT, N1);
7481 break;
7484 if (N1.getValueType().getScalarType() == MVT::i1)
7485 return getNode(ISD::VECREDUCE_OR, DL, VT, N1);
7486 break;
7489 if (N1.getValueType().getScalarType() == MVT::i1)
7490 return getNode(ISD::VECREDUCE_AND, DL, VT, N1);
7491 break;
7493 // With a single lane, the result is true iff that lane is false.
7495 return getLogicalNOT(DL, N1, VT);
7496 break;
7497 case ISD::VECTOR_REPEAT:
7499 "VECTOR_REPEAT requires a fixed-length vector operand");
7500 assert(VT.isScalableVector() &&
7501 "VECTOR_REPEAT requires a scalable vector result");
7504 "VECTOR_REPEAT operand and result element counts must match");
7505 if (VT.getVectorMinNumElements() == 1)
7506 return getSplatVector(
7507 VT, DL, getExtractVectorElt(DL, VT.getVectorElementType(), N1, 0));
7508 break;
7509 case ISD::SPLAT_VECTOR:
7510 assert(VT.isVector() && "Wrong return type!");
7511 // FIXME: Hexagon uses i32 scalar for a floating point zero vector so allow
7512 // that for now.
7514 (VT.isFloatingPoint() && N1.getValueType() == MVT::i32) ||
7516 N1.getValueType().isInteger() &&
7518 "Wrong operand type!");
7519 break;
7520 }
7521
7522 SDNode *N;
7523 SDVTList VTs = getVTList(VT);
7524 SDValue Ops[] = {N1};
7525 if (VT != MVT::Glue) { // Don't CSE glue producing nodes
7526 SDNodeKey ID(Opcode, VTs, Ops);
7527 FoldingSetInsertToken InsertToken;
7528 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
7529 E->intersectFlagsWith(Flags);
7530 return SDValue(E, 0);
7531 }
7532
7533 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7534 N->setFlags(Flags);
7535 createOperands(N, Ops);
7536 CSEMap.insert(N, InsertToken);
7537 } else {
7538 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7539 createOperands(N, Ops);
7540 }
7541
7542 InsertNode(N);
7543 SDValue V = SDValue(N, 0);
7544 NewSDValueDbgMsg(V, "Creating new node: ", this);
7545 return V;
7546}
7547
7548static APInt getIntegerIdentity(unsigned Opcode, unsigned BitWidth) {
7549 switch (Opcode) {
7550 default:
7551 llvm_unreachable("Unexpected integer identity opcode");
7552 case ISD::ADD:
7553 case ISD::OR:
7554 case ISD::XOR:
7555 case ISD::UMAX:
7556 return APInt::getZero(BitWidth);
7557 case ISD::MUL:
7558 return APInt(BitWidth, 1);
7559 case ISD::AND:
7560 case ISD::UMIN:
7562 case ISD::SMAX:
7564 case ISD::SMIN:
7566 }
7567}
7568
7569static std::optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
7570 const APInt &C2) {
7571 switch (Opcode) {
7572 case ISD::ADD: return C1 + C2;
7573 case ISD::SUB: return C1 - C2;
7574 case ISD::MUL: return C1 * C2;
7575 case ISD::AND: return C1 & C2;
7576 case ISD::OR: return C1 | C2;
7577 case ISD::XOR: return C1 ^ C2;
7578 case ISD::SHL: return C1 << C2;
7579 case ISD::SRL: return C1.lshr(C2);
7580 case ISD::SRA: return C1.ashr(C2);
7581 case ISD::ROTL: return C1.rotl(C2);
7582 case ISD::ROTR: return C1.rotr(C2);
7583 case ISD::SMIN: return C1.sle(C2) ? C1 : C2;
7584 case ISD::SMAX: return C1.sge(C2) ? C1 : C2;
7585 case ISD::UMIN: return C1.ule(C2) ? C1 : C2;
7586 case ISD::UMAX: return C1.uge(C2) ? C1 : C2;
7587 case ISD::SADDSAT: return C1.sadd_sat(C2);
7588 case ISD::UADDSAT: return C1.uadd_sat(C2);
7589 case ISD::SSUBSAT: return C1.ssub_sat(C2);
7590 case ISD::USUBSAT: return C1.usub_sat(C2);
7591 case ISD::SSHLSAT: return C1.sshl_sat(C2);
7592 case ISD::USHLSAT: return C1.ushl_sat(C2);
7593 case ISD::UDIV:
7594 if (!C2.getBoolValue())
7595 break;
7596 return C1.udiv(C2);
7597 case ISD::UREM:
7598 if (!C2.getBoolValue())
7599 break;
7600 return C1.urem(C2);
7601 case ISD::SDIV:
7602 if (!C2.getBoolValue())
7603 break;
7604 return C1.sdiv(C2);
7605 case ISD::SREM:
7606 if (!C2.getBoolValue())
7607 break;
7608 return C1.srem(C2);
7609 case ISD::AVGFLOORS:
7610 return APIntOps::avgFloorS(C1, C2);
7611 case ISD::AVGFLOORU:
7612 return APIntOps::avgFloorU(C1, C2);
7613 case ISD::AVGCEILS:
7614 return APIntOps::avgCeilS(C1, C2);
7615 case ISD::AVGCEILU:
7616 return APIntOps::avgCeilU(C1, C2);
7617 case ISD::ABDS:
7618 return APIntOps::abds(C1, C2);
7619 case ISD::ABDU:
7620 return APIntOps::abdu(C1, C2);
7621 case ISD::MULHS:
7622 return APIntOps::mulhs(C1, C2);
7623 case ISD::MULHU:
7624 return APIntOps::mulhu(C1, C2);
7625 case ISD::CLMUL:
7626 return APIntOps::clmul(C1, C2);
7627 case ISD::CLMULR:
7628 return APIntOps::clmulr(C1, C2);
7629 case ISD::CLMULH:
7630 return APIntOps::clmulh(C1, C2);
7631 case ISD::PEXT:
7632 return APIntOps::pext(C1, C2);
7633 case ISD::PDEP:
7634 return APIntOps::pdep(C1, C2);
7635 }
7636 return std::nullopt;
7637}
7638// Handle constant folding with UNDEF.
7639// TODO: Handle more cases.
7640static std::optional<APInt> FoldValueWithUndef(unsigned Opcode, const APInt &C1,
7641 bool IsUndef1, const APInt &C2,
7642 bool IsUndef2) {
7643 if (!(IsUndef1 || IsUndef2))
7644 return FoldValue(Opcode, C1, C2);
7645
7646 // Fold and(x, undef) -> 0
7647 // Fold mul(x, undef) -> 0
7648 if (Opcode == ISD::AND || Opcode == ISD::MUL)
7649 return APInt::getZero(C1.getBitWidth());
7650
7651 return std::nullopt;
7652}
7653
7655 const GlobalAddressSDNode *GA,
7656 const SDNode *N2) {
7657 if (GA->getOpcode() != ISD::GlobalAddress)
7658 return SDValue();
7659 if (!TLI->isOffsetFoldingLegal(GA))
7660 return SDValue();
7661 auto *C2 = dyn_cast<ConstantSDNode>(N2);
7662 if (!C2)
7663 return SDValue();
7664 int64_t Offset = C2->getSExtValue();
7665 switch (Opcode) {
7666 case ISD::ADD:
7667 case ISD::PTRADD:
7668 break;
7669 case ISD::SUB: Offset = -uint64_t(Offset); break;
7670 default: return SDValue();
7671 }
7672 return getGlobalAddress(GA->getGlobal(), SDLoc(C2), VT,
7673 GA->getOffset() + uint64_t(Offset));
7674}
7675
7677 switch (Opcode) {
7678 case ISD::SDIV:
7679 case ISD::UDIV:
7680 case ISD::SREM:
7681 case ISD::UREM: {
7682 // If a divisor is zero/undef or any element of a divisor vector is
7683 // zero/undef, the whole op is undef.
7684 assert(Ops.size() == 2 && "Div/rem should have 2 operands");
7685 SDValue Divisor = Ops[1];
7686 if (Divisor.isUndef() || isNullConstant(Divisor))
7687 return true;
7688
7689 return ISD::isBuildVectorOfConstantSDNodes(Divisor.getNode()) &&
7690 llvm::any_of(Divisor->op_values(),
7691 [](SDValue V) { return V.isUndef() ||
7692 isNullConstant(V); });
7693 // TODO: Handle signed overflow.
7694 }
7695 // TODO: Handle oversized shifts.
7696 default:
7697 return false;
7698 }
7699}
7700
7703 SDNodeFlags Flags) {
7704 // If the opcode is a target-specific ISD node, there's nothing we can
7705 // do here and the operand rules may not line up with the below, so
7706 // bail early.
7707 // We can't create a scalar CONCAT_VECTORS so skip it. It will break
7708 // for concats involving SPLAT_VECTOR. Concats of BUILD_VECTORS are handled by
7709 // foldCONCAT_VECTORS in getNode before this is called.
7710 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::CONCAT_VECTORS)
7711 return SDValue();
7712
7713 unsigned NumOps = Ops.size();
7714 if (NumOps == 0)
7715 return SDValue();
7716
7717 if (isUndef(Opcode, Ops))
7718 return getUNDEF(VT);
7719
7720 // Handle unary special cases.
7721 if (NumOps == 1) {
7722 SDValue N1 = Ops[0];
7723
7724 // Constant fold unary operations with an integer constant operand. Even
7725 // opaque constant will be folded, because the folding of unary operations
7726 // doesn't create new constants with different values. Nevertheless, the
7727 // opaque flag is preserved during folding to prevent future folding with
7728 // other constants.
7729 if (auto *C = dyn_cast<ConstantSDNode>(N1)) {
7730 const APInt &Val = C->getAPIntValue();
7731 switch (Opcode) {
7732 case ISD::SIGN_EXTEND:
7733 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7734 C->isTargetOpcode(), C->isOpaque());
7735 case ISD::TRUNCATE:
7736 if (C->isOpaque())
7737 break;
7738 [[fallthrough]];
7739 case ISD::ZERO_EXTEND:
7740 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7741 C->isTargetOpcode(), C->isOpaque());
7742 case ISD::ANY_EXTEND:
7743 // Some targets like RISCV prefer to sign extend some types.
7744 if (TLI->isSExtCheaperThanZExt(N1.getValueType(), VT))
7745 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7746 C->isTargetOpcode(), C->isOpaque());
7747 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7748 C->isTargetOpcode(), C->isOpaque());
7749 case ISD::ABS:
7750 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7751 C->isOpaque());
7753 if (Val.isMinSignedValue())
7754 return getPOISON(VT);
7755 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7756 C->isOpaque());
7757 case ISD::BITREVERSE:
7758 return getConstant(Val.reverseBits(), DL, VT, C->isTargetOpcode(),
7759 C->isOpaque());
7760 case ISD::BSWAP:
7761 return getConstant(Val.byteSwap(), DL, VT, C->isTargetOpcode(),
7762 C->isOpaque());
7763 case ISD::CTPOP:
7764 return getConstant(Val.popcount(), DL, VT, C->isTargetOpcode(),
7765 C->isOpaque());
7766 case ISD::PARITY:
7767 return getConstant(Val.popcount() & 1, DL, VT, C->isTargetOpcode(),
7768 C->isOpaque());
7769 case ISD::CTLZ:
7771 return getConstant(Val.countl_zero(), DL, VT, C->isTargetOpcode(),
7772 C->isOpaque());
7773 case ISD::CTTZ:
7775 return getConstant(Val.countr_zero(), DL, VT, C->isTargetOpcode(),
7776 C->isOpaque());
7777 case ISD::CTLS:
7778 // CTLS returns the number of extra sign bits so subtract one.
7779 return getConstant(Val.getNumSignBits() - 1, DL, VT,
7780 C->isTargetOpcode(), C->isOpaque());
7781 case ISD::UINT_TO_FP:
7782 case ISD::SINT_TO_FP: {
7784 (void)FPV.convertFromAPInt(Val, Opcode == ISD::SINT_TO_FP,
7786 return getConstantFP(FPV, DL, VT);
7787 }
7788 case ISD::FP16_TO_FP:
7789 case ISD::BF16_TO_FP: {
7790 bool Ignored;
7791 APFloat FPV(Opcode == ISD::FP16_TO_FP ? APFloat::IEEEhalf()
7792 : APFloat::BFloat(),
7793 (Val.getBitWidth() == 16) ? Val : Val.trunc(16));
7794
7795 // This can return overflow, underflow, or inexact; we don't care.
7796 // FIXME need to be more flexible about rounding mode.
7798 &Ignored);
7799 return getConstantFP(FPV, DL, VT);
7800 }
7801 case ISD::STEP_VECTOR:
7802 if (SDValue V = FoldSTEP_VECTOR(DL, VT, N1, *this))
7803 return V;
7804 break;
7805 case ISD::BITCAST:
7806 if (VT == MVT::f16 && C->getValueType(0) == MVT::i16)
7807 return getConstantFP(APFloat(APFloat::IEEEhalf(), Val), DL, VT);
7808 if (VT == MVT::f32 && C->getValueType(0) == MVT::i32)
7809 return getConstantFP(APFloat(APFloat::IEEEsingle(), Val), DL, VT);
7810 if (VT == MVT::f64 && C->getValueType(0) == MVT::i64)
7811 return getConstantFP(APFloat(APFloat::IEEEdouble(), Val), DL, VT);
7812 if (VT == MVT::f128 && C->getValueType(0) == MVT::i128)
7813 return getConstantFP(APFloat(APFloat::IEEEquad(), Val), DL, VT);
7814 break;
7815 }
7816 }
7817
7818 // Constant fold unary operations with a floating point constant operand.
7819 if (auto *C = dyn_cast<ConstantFPSDNode>(N1)) {
7820 APFloat V = C->getValueAPF(); // make copy
7821 switch (Opcode) {
7822 case ISD::FNEG:
7823 V.changeSign();
7824 return getConstantFP(V, DL, VT);
7825 case ISD::FABS:
7826 V.clearSign();
7827 return getConstantFP(V, DL, VT);
7828 case ISD::FCEIL: {
7829 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardPositive);
7831 return getConstantFP(V, DL, VT);
7832 return SDValue();
7833 }
7834 case ISD::FTRUNC: {
7835 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardZero);
7837 return getConstantFP(V, DL, VT);
7838 return SDValue();
7839 }
7840 case ISD::FFLOOR: {
7841 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardNegative);
7843 return getConstantFP(V, DL, VT);
7844 return SDValue();
7845 }
7846 case ISD::FP_EXTEND: {
7847 bool ignored;
7848 // This can return overflow, underflow, or inexact; we don't care.
7849 // FIXME need to be more flexible about rounding mode.
7850 (void)V.convert(VT.getFltSemantics(), APFloat::rmNearestTiesToEven,
7851 &ignored);
7852 return getConstantFP(V, DL, VT);
7853 }
7854 case ISD::FP_TO_SINT:
7855 case ISD::FP_TO_UINT: {
7856 bool ignored;
7857 APSInt IntVal(VT.getSizeInBits(), Opcode == ISD::FP_TO_UINT);
7858 // FIXME need to be more flexible about rounding mode.
7860 V.convertToInteger(IntVal, APFloat::rmTowardZero, &ignored);
7861 if (s == APFloat::opInvalidOp) // inexact is OK, in fact usual
7862 break;
7863 return getConstant(IntVal, DL, VT);
7864 }
7865 case ISD::FP_TO_FP16:
7866 case ISD::FP_TO_BF16: {
7867 bool Ignored;
7868 // This can return overflow, underflow, or inexact; we don't care.
7869 // FIXME need to be more flexible about rounding mode.
7870 (void)V.convert(Opcode == ISD::FP_TO_FP16 ? APFloat::IEEEhalf()
7871 : APFloat::BFloat(),
7873 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7874 }
7875 case ISD::BITCAST:
7876 if (VT == MVT::i16 && C->getValueType(0) == MVT::f16)
7877 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7878 VT);
7879 if (VT == MVT::i16 && C->getValueType(0) == MVT::bf16)
7880 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7881 VT);
7882 if (VT == MVT::i32 && C->getValueType(0) == MVT::f32)
7883 return getConstant((uint32_t)V.bitcastToAPInt().getZExtValue(), DL,
7884 VT);
7885 if (VT == MVT::i64 && C->getValueType(0) == MVT::f64)
7886 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7887 break;
7888 }
7889 }
7890
7891 // Early-out if we failed to constant fold a bitcast.
7892 if (Opcode == ISD::BITCAST)
7893 return SDValue();
7894
7895 // Constant fold integer vector reductions with constant BUILD_VECTORs.
7896 if ((Opcode == ISD::VECREDUCE_ADD || Opcode == ISD::VECREDUCE_SMAX ||
7897 Opcode == ISD::VECREDUCE_SMIN || Opcode == ISD::VECREDUCE_UMAX ||
7898 Opcode == ISD::VECREDUCE_UMIN || Opcode == ISD::VECREDUCE_MUL ||
7899 Opcode == ISD::VECREDUCE_OR || Opcode == ISD::VECREDUCE_XOR ||
7900 Opcode == ISD::VECREDUCE_AND) &&
7902 unsigned EltBits = N1.getValueType().getScalarSizeInBits();
7903 unsigned BaseOpcode = ISD::getVecReduceBaseOpcode(Opcode);
7904 APInt Acc = getIntegerIdentity(BaseOpcode, EltBits);
7905 for (SDValue Elt : N1->op_values()) {
7906 if (Elt.getOpcode() == ISD::POISON)
7907 return getPOISON(VT);
7908 if (Elt.isUndef() || cast<ConstantSDNode>(Elt)->isOpaque())
7909 return SDValue();
7910 APInt Value = cast<ConstantSDNode>(Elt)->getAPIntValue().trunc(EltBits);
7911 std::optional<APInt> Folded = FoldValue(BaseOpcode, Acc, Value);
7912 assert(Folded &&
7913 "Expected vector reduction base opcode to be foldable");
7914 Acc = *Folded;
7915 }
7916 EVT EltVT = N1.getValueType().getScalarType();
7917 return getAnyExtOrTrunc(getConstant(Acc, DL, EltVT), DL, VT);
7918 }
7919 }
7920
7921 // Handle binops special cases.
7922 if (NumOps == 2) {
7923 if (SDValue CFP = foldConstantFPMath(Opcode, DL, VT, Ops))
7924 return CFP;
7925
7926 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7927 if (auto *C2 = dyn_cast<ConstantSDNode>(Ops[1])) {
7928 if (C1->isOpaque() || C2->isOpaque())
7929 return SDValue();
7930
7931 std::optional<APInt> FoldAttempt =
7932 FoldValue(Opcode, C1->getAPIntValue(), C2->getAPIntValue());
7933 if (!FoldAttempt)
7934 return SDValue();
7935
7936 SDValue Folded = getConstant(*FoldAttempt, DL, VT);
7937 assert((!Folded || !VT.isVector()) &&
7938 "Can't fold vectors ops with scalar operands");
7939 return Folded;
7940 }
7941 }
7942
7943 // fold (add Sym, c) -> Sym+c
7945 return FoldSymbolOffset(Opcode, VT, GA, Ops[1].getNode());
7946 if (TLI->isCommutativeBinOp(Opcode))
7948 return FoldSymbolOffset(Opcode, VT, GA, Ops[0].getNode());
7949
7950 // fold (sext_in_reg c1) -> c2
7951 if (Opcode == ISD::SIGN_EXTEND_INREG) {
7952 EVT EVT = cast<VTSDNode>(Ops[1])->getVT();
7953
7954 auto SignExtendInReg = [&](APInt Val, llvm::EVT ConstantVT) {
7955 unsigned FromBits = EVT.getScalarSizeInBits();
7956 Val <<= Val.getBitWidth() - FromBits;
7957 Val.ashrInPlace(Val.getBitWidth() - FromBits);
7958 return getConstant(Val, DL, ConstantVT);
7959 };
7960
7961 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7962 const APInt &Val = C1->getAPIntValue();
7963 return SignExtendInReg(Val, VT);
7964 }
7965
7967 SmallVector<SDValue, 8> ScalarOps;
7968 llvm::EVT OpVT = Ops[0].getOperand(0).getValueType();
7969 for (int I = 0, E = VT.getVectorNumElements(); I != E; ++I) {
7970 SDValue Op = Ops[0].getOperand(I);
7971 if (Op.isUndef()) {
7972 ScalarOps.push_back(getUNDEF(OpVT));
7973 continue;
7974 }
7975 const APInt &Val = cast<ConstantSDNode>(Op)->getAPIntValue();
7976 ScalarOps.push_back(SignExtendInReg(Val, OpVT));
7977 }
7978 return getBuildVector(VT, DL, ScalarOps);
7979 }
7980
7981 if (Ops[0].getOpcode() == ISD::SPLAT_VECTOR &&
7982 isa<ConstantSDNode>(Ops[0].getOperand(0)))
7983 return getNode(ISD::SPLAT_VECTOR, DL, VT,
7984 SignExtendInReg(Ops[0].getConstantOperandAPInt(0),
7985 Ops[0].getOperand(0).getValueType()));
7986 }
7987 }
7988
7989 // Handle fshl/fshr special cases.
7990 if (Opcode == ISD::FSHL || Opcode == ISD::FSHR) {
7991 auto *C1 = dyn_cast<ConstantSDNode>(Ops[0]);
7992 auto *C2 = dyn_cast<ConstantSDNode>(Ops[1]);
7993 auto *C3 = dyn_cast<ConstantSDNode>(Ops[2]);
7994
7995 if (C1 && C2 && C3) {
7996 if (C1->isOpaque() || C2->isOpaque() || C3->isOpaque())
7997 return SDValue();
7998 const APInt &V1 = C1->getAPIntValue(), &V2 = C2->getAPIntValue(),
7999 &V3 = C3->getAPIntValue();
8000
8001 APInt FoldedVal = Opcode == ISD::FSHL ? APIntOps::fshl(V1, V2, V3)
8002 : APIntOps::fshr(V1, V2, V3);
8003 return getConstant(FoldedVal, DL, VT);
8004 }
8005 }
8006
8007 // Handle fma/fmad special cases.
8008 if (Opcode == ISD::FMA || Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
8009 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
8010 assert(Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
8011 Ops[2].getValueType() == VT && "FMA types must match!");
8015 if (C1 && C2 && C3) {
8016 APFloat V1 = C1->getValueAPF();
8017 const APFloat &V2 = C2->getValueAPF();
8018 const APFloat &V3 = C3->getValueAPF();
8019 if (Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
8020 V1.multiply(V2, APFloat::rmNearestTiesToEven);
8022 } else
8023 V1.fusedMultiplyAdd(V2, V3, APFloat::rmNearestTiesToEven);
8024 return getConstantFP(V1, DL, VT);
8025 }
8026 }
8027
8028 // This is for vector folding only from here on.
8029 if (!VT.isVector())
8030 return SDValue();
8031
8032 // Constant fold integer partial reductions with constant BUILD_VECTOR
8033 // operands. The reduction order is deliberately unspecified. Use the same
8034 // subvector layout as TargetLowering::expandPartialReduceMLA(), where input
8035 // lane I contributes to accumulator lane I % NumAccElts.
8036 if (Opcode == ISD::PARTIAL_REDUCE_SMLA ||
8037 Opcode == ISD::PARTIAL_REDUCE_UMLA ||
8038 Opcode == ISD::PARTIAL_REDUCE_SUMLA) {
8039 // These nodes have no scalar form, so unsupported cases must not fall
8040 // through to generic per-lane vector folding.
8041 if (!llvm::all_of(Ops, [](SDValue Op) {
8042 return ISD::isBuildVectorOfConstantSDNodes(Op.getNode());
8043 }))
8044 return SDValue();
8045
8046 unsigned AccEltBits = VT.getScalarSizeInBits();
8047 unsigned InputEltBits = Ops[1].getScalarValueSizeInBits();
8048 unsigned NumAccElts = VT.getVectorNumElements();
8049 unsigned NumInputElts = Ops[1].getValueType().getVectorNumElements();
8050 SmallVector<APInt, 8> Results(NumAccElts, APInt::getZero(AccEltBits));
8051 BitVector PoisonElts(NumAccElts);
8052
8053 for (unsigned I = 0; I != NumAccElts; ++I) {
8054 SDValue Elt = Ops[0].getOperand(I);
8055 if (Elt.getOpcode() == ISD::POISON) {
8056 PoisonElts.set(I);
8057 continue;
8058 }
8059 auto *C = dyn_cast<ConstantSDNode>(Elt);
8060 if (!C || C->isOpaque())
8061 return SDValue();
8062 Results[I] = C->getAPIntValue().trunc(AccEltBits);
8063 }
8064
8065 bool IsLHSSigned = Opcode != ISD::PARTIAL_REDUCE_UMLA;
8066 bool IsRHSSigned = Opcode == ISD::PARTIAL_REDUCE_SMLA;
8067 for (unsigned I = 0; I != NumInputElts; ++I) {
8068 const unsigned AccIdx = I % NumAccElts;
8069 SDValue LHSElt = Ops[1].getOperand(I);
8070 SDValue RHSElt = Ops[2].getOperand(I);
8071 if (LHSElt.getOpcode() == ISD::POISON ||
8072 RHSElt.getOpcode() == ISD::POISON) {
8073 PoisonElts.set(AccIdx);
8074 continue;
8075 }
8076
8077 auto *LHS = dyn_cast<ConstantSDNode>(LHSElt);
8078 auto *RHS = dyn_cast<ConstantSDNode>(RHSElt);
8079 if (!LHS || !RHS || LHS->isOpaque() || RHS->isOpaque())
8080 return SDValue();
8081
8082 APInt LHSVal = LHS->getAPIntValue().trunc(InputEltBits);
8083 APInt RHSVal = RHS->getAPIntValue().trunc(InputEltBits);
8084 LHSVal = IsLHSSigned ? LHSVal.sext(AccEltBits) : LHSVal.zext(AccEltBits);
8085 RHSVal = IsRHSSigned ? RHSVal.sext(AccEltBits) : RHSVal.zext(AccEltBits);
8086 Results[AccIdx] += LHSVal * RHSVal;
8087 }
8088
8089 // After type legalization the vector element type may not be a legal
8090 // scalar type (e.g. i16 on AArch64). Create the folded constants in the
8091 // promoted legal scalar type instead, matching the generic per-lane path
8092 // below. Bail out if legalization would narrow the type, since the lane
8093 // value would not fit.
8094 EVT AccEltVT = VT.getVectorElementType();
8095 EVT LegalSVT = AccEltVT;
8096 if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
8097 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
8098 if (LegalSVT.bitsLT(AccEltVT))
8099 return SDValue();
8100 }
8101
8102 SmallVector<SDValue, 8> ResultOps;
8103 for (unsigned I = 0; I != NumAccElts; ++I)
8104 ResultOps.push_back(
8105 PoisonElts[I] ? getPOISON(LegalSVT)
8106 : getConstant(Results[I].sext(LegalSVT.getSizeInBits()),
8107 DL, LegalSVT));
8108 return getBuildVector(VT, DL, ResultOps);
8109 }
8110
8111 ElementCount NumElts = VT.getVectorElementCount();
8112
8113 // See if we can fold through any bitcasted integer ops.
8114 if (NumOps == 2 && VT.isFixedLengthVector() && VT.isInteger() &&
8115 Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
8116 (Ops[0].getOpcode() == ISD::BITCAST ||
8117 Ops[1].getOpcode() == ISD::BITCAST)) {
8120 auto *BV1 = dyn_cast<BuildVectorSDNode>(N1);
8121 auto *BV2 = dyn_cast<BuildVectorSDNode>(N2);
8122 if (BV1 && BV2 && N1.getValueType().isInteger() &&
8123 N2.getValueType().isInteger()) {
8124 bool IsLE = getDataLayout().isLittleEndian();
8125 unsigned EltBits = VT.getScalarSizeInBits();
8126 SmallVector<APInt> RawBits1, RawBits2;
8127 BitVector UndefElts1, UndefElts2;
8128 if (BV1->getConstantRawBits(IsLE, EltBits, RawBits1, UndefElts1) &&
8129 BV2->getConstantRawBits(IsLE, EltBits, RawBits2, UndefElts2)) {
8130 SmallVector<APInt> RawBits;
8131 for (unsigned I = 0, E = NumElts.getFixedValue(); I != E; ++I) {
8132 std::optional<APInt> Fold = FoldValueWithUndef(
8133 Opcode, RawBits1[I], UndefElts1[I], RawBits2[I], UndefElts2[I]);
8134 if (!Fold)
8135 break;
8136 RawBits.push_back(*Fold);
8137 }
8138 if (RawBits.size() == NumElts.getFixedValue()) {
8139 // We have constant folded, but we might need to cast this again back
8140 // to the original (possibly legalized) type.
8141 EVT BVVT, BVEltVT;
8142 if (N1.getValueType() == VT) {
8143 BVVT = N1.getValueType();
8144 BVEltVT = BV1->getOperand(0).getValueType();
8145 } else {
8146 BVVT = N2.getValueType();
8147 BVEltVT = BV2->getOperand(0).getValueType();
8148 }
8149 unsigned BVEltBits = BVEltVT.getSizeInBits();
8150 SmallVector<APInt> DstBits;
8151 BitVector DstUndefs;
8153 DstBits, RawBits, DstUndefs,
8154 BitVector(RawBits.size(), false));
8155 SmallVector<SDValue> Ops(DstBits.size(), getUNDEF(BVEltVT));
8156 for (unsigned I = 0, E = DstBits.size(); I != E; ++I) {
8157 if (DstUndefs[I])
8158 continue;
8159 Ops[I] = getConstant(DstBits[I].sext(BVEltBits), DL, BVEltVT);
8160 }
8161 return getBitcast(VT, getBuildVector(BVVT, DL, Ops));
8162 }
8163 }
8164 }
8165 // Logic ops can be folded from raw integer bits - mainly for AVX512 masks.
8166 if (ISD::isBitwiseLogicOp(Opcode) && isa<ConstantSDNode>(N1) &&
8167 isa<ConstantSDNode>(N2)) {
8168 if (SDValue Res = FoldConstantArithmetic(Opcode, DL, N1.getValueType(),
8169 {N1, N2}, Flags))
8170 return getBitcast(VT, Res);
8171 }
8172 }
8173
8174 // Fold (mul step_vector(C0), C1) to (step_vector(C0 * C1)).
8175 // (shl step_vector(C0), C1) -> (step_vector(C0 << C1))
8176 if ((Opcode == ISD::MUL || Opcode == ISD::SHL) &&
8177 Ops[0].getOpcode() == ISD::STEP_VECTOR) {
8178 APInt RHSVal;
8179 if (ISD::isConstantSplatVector(Ops[1].getNode(), RHSVal)) {
8180 APInt NewStep = Opcode == ISD::MUL
8181 ? Ops[0].getConstantOperandAPInt(0) * RHSVal
8182 : Ops[0].getConstantOperandAPInt(0) << RHSVal;
8183 return getStepVector(DL, VT, NewStep);
8184 }
8185 }
8186
8187 auto IsScalarOrSameVectorSize = [NumElts](const SDValue &Op) {
8188 return !Op.getValueType().isVector() ||
8189 Op.getValueType().getVectorElementCount() == NumElts;
8190 };
8191
8192 auto IsBuildVectorSplatVectorOrUndef = [](const SDValue &Op) {
8193 return Op.isUndef() || Op.getOpcode() == ISD::CONDCODE ||
8194 Op.getOpcode() == ISD::BUILD_VECTOR ||
8195 Op.getOpcode() == ISD::SPLAT_VECTOR;
8196 };
8197
8198 // All operands must be vector types with the same number of elements as
8199 // the result type and must be either UNDEF or a build/splat vector
8200 // or UNDEF scalars.
8201 if (!llvm::all_of(Ops, IsBuildVectorSplatVectorOrUndef) ||
8202 !llvm::all_of(Ops, IsScalarOrSameVectorSize))
8203 return SDValue();
8204
8205 // If we are comparing vectors, then the result needs to be a i1 boolean that
8206 // is then extended back to the legal result type depending on how booleans
8207 // are represented.
8208 EVT SVT = (Opcode == ISD::SETCC ? MVT::i1 : VT.getScalarType());
8209 ISD::NodeType ExtendCode =
8210 (Opcode == ISD::SETCC && SVT != VT.getScalarType())
8211 ? TargetLowering::getExtendForContent(TLI->getBooleanContents(VT))
8213
8214 // Find legal integer scalar type for constant promotion and
8215 // ensure that its scalar size is at least as large as source.
8216 EVT LegalSVT = VT.getScalarType();
8217 if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
8218 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
8219 if (LegalSVT.bitsLT(VT.getScalarType()))
8220 return SDValue();
8221 }
8222
8223 // For scalable vector types we know we're dealing with SPLAT_VECTORs. We
8224 // only have one operand to check. For fixed-length vector types we may have
8225 // a combination of BUILD_VECTOR and SPLAT_VECTOR.
8226 unsigned NumVectorElts = NumElts.isScalable() ? 1 : NumElts.getFixedValue();
8227
8228 // Constant fold each scalar lane separately.
8229 SmallVector<SDValue, 4> ScalarResults;
8230 for (unsigned I = 0; I != NumVectorElts; I++) {
8231 SmallVector<SDValue, 4> ScalarOps;
8232 for (SDValue Op : Ops) {
8233 EVT InSVT = Op.getValueType().getScalarType();
8234 if (Op.getOpcode() != ISD::BUILD_VECTOR &&
8235 Op.getOpcode() != ISD::SPLAT_VECTOR) {
8236 if (Op.isUndef())
8237 ScalarOps.push_back(getUNDEF(InSVT));
8238 else
8239 ScalarOps.push_back(Op);
8240 continue;
8241 }
8242
8243 SDValue ScalarOp =
8244 Op.getOperand(Op.getOpcode() == ISD::SPLAT_VECTOR ? 0 : I);
8245 EVT ScalarVT = ScalarOp.getValueType();
8246
8247 // Build vector (integer) scalar operands may need implicit
8248 // truncation - do this before constant folding.
8249 if (ScalarVT.isInteger() && ScalarVT.bitsGT(InSVT)) {
8250 // Don't create illegally-typed nodes unless they're constants or undef
8251 // - if we fail to constant fold we can't guarantee the (dead) nodes
8252 // we're creating will be cleaned up before being visited for
8253 // legalization.
8254 if (NewNodesMustHaveLegalTypes && !ScalarOp.isUndef() &&
8255 !isa<ConstantSDNode>(ScalarOp) &&
8256 TLI->getTypeAction(*getContext(), InSVT) !=
8258 return SDValue();
8259 ScalarOp = getNode(ISD::TRUNCATE, DL, InSVT, ScalarOp);
8260 }
8261
8262 ScalarOps.push_back(ScalarOp);
8263 }
8264
8265 // Constant fold the scalar operands.
8266 SDValue ScalarResult = getNode(Opcode, DL, SVT, ScalarOps, Flags);
8267
8268 // Scalar folding only succeeded if the result is a constant or UNDEF.
8269 if (!ScalarResult.isUndef() && ScalarResult.getOpcode() != ISD::Constant &&
8270 ScalarResult.getOpcode() != ISD::ConstantFP)
8271 return SDValue();
8272
8273 // Legalize the (integer) scalar constant if necessary. We only do
8274 // this once we know the folding succeeded, since otherwise we would
8275 // get a node with illegal type which has a user.
8276 if (LegalSVT != SVT)
8277 ScalarResult = getNode(ExtendCode, DL, LegalSVT, ScalarResult);
8278
8279 ScalarResults.push_back(ScalarResult);
8280 }
8281
8282 SDValue V = NumElts.isScalable() ? getSplatVector(VT, DL, ScalarResults[0])
8283 : getBuildVector(VT, DL, ScalarResults);
8284 NewSDValueDbgMsg(V, "New node fold constant vector: ", this);
8285 return V;
8286}
8287
8289 SDVTList VTList,
8291 SDNodeFlags Flags) {
8292 if (VTList.NumVTs == 1)
8293 return FoldConstantArithmetic(Opcode, DL, VTList.VTs[0], Ops, Flags);
8294
8295 switch (Opcode) {
8296 case ISD::SADDO:
8297 case ISD::UADDO:
8298 case ISD::SSUBO:
8299 case ISD::USUBO:
8300 case ISD::SMULO:
8301 case ISD::UMULO: {
8302 // TODO: Support non-splat vector constants.
8305 if (!C1 || !C2 || C1->isOpaque() || C2->isOpaque())
8306 return SDValue();
8307
8308 const APInt &V1 = C1->getAPIntValue(), &V2 = C2->getAPIntValue();
8309 bool Overflow;
8310 APInt Result;
8311 switch (Opcode) {
8312 default:
8313 llvm_unreachable("Unexpected overflow opcode");
8314 case ISD::SADDO:
8315 Result = V1.sadd_ov(V2, Overflow);
8316 break;
8317 case ISD::UADDO:
8318 Result = V1.uadd_ov(V2, Overflow);
8319 break;
8320 case ISD::SSUBO:
8321 Result = V1.ssub_ov(V2, Overflow);
8322 break;
8323 case ISD::USUBO:
8324 Result = V1.usub_ov(V2, Overflow);
8325 break;
8326 case ISD::SMULO:
8327 Result = V1.smul_ov(V2, Overflow);
8328 break;
8329 case ISD::UMULO:
8330 Result = V1.umul_ov(V2, Overflow);
8331 break;
8332 }
8333
8334 EVT VT = VTList.VTs[0];
8335 return getNode(ISD::MERGE_VALUES, DL, VTList,
8336 {getConstant(Result, DL, VT),
8337 getBoolConstant(Overflow, DL, VTList.VTs[1], VT)},
8338 Flags);
8339 }
8340 }
8341 return SDValue();
8342}
8343
8346 // TODO: Add support for unary/ternary fp opcodes.
8347 if (Ops.size() != 2)
8348 return SDValue();
8349
8350 // TODO: We don't do any constant folding for strict FP opcodes here, but we
8351 // should. That will require dealing with a potentially non-default
8352 // rounding mode, checking the "opStatus" return value from the APFloat
8353 // math calculations, and possibly other variations.
8354 SDValue N1 = Ops[0];
8355 SDValue N2 = Ops[1];
8356 ConstantFPSDNode *N1CFP = isConstOrConstSplatFP(N1, /*AllowUndefs*/ false);
8357 ConstantFPSDNode *N2CFP = isConstOrConstSplatFP(N2, /*AllowUndefs*/ false);
8358 if (N1CFP && N2CFP) {
8359 APFloat C1 = N1CFP->getValueAPF(); // make copy
8360 const APFloat &C2 = N2CFP->getValueAPF();
8361 switch (Opcode) {
8362 case ISD::FADD:
8364 return getConstantFP(C1, DL, VT);
8365 case ISD::FSUB:
8367 return getConstantFP(C1, DL, VT);
8368 case ISD::FMUL:
8370 return getConstantFP(C1, DL, VT);
8371 case ISD::FDIV:
8373 return getConstantFP(C1, DL, VT);
8374 case ISD::FREM:
8375 C1.mod(C2);
8376 return getConstantFP(C1, DL, VT);
8377 case ISD::FCOPYSIGN:
8378 C1.copySign(C2);
8379 return getConstantFP(C1, DL, VT);
8380 case ISD::FMINNUM:
8381 return getConstantFP(minnum(C1, C2), DL, VT);
8382 case ISD::FMAXNUM:
8383 return getConstantFP(maxnum(C1, C2), DL, VT);
8384 case ISD::FMINIMUM:
8385 return getConstantFP(minimum(C1, C2), DL, VT);
8386 case ISD::FMAXIMUM:
8387 return getConstantFP(maximum(C1, C2), DL, VT);
8388 case ISD::FMINIMUMNUM:
8389 return getConstantFP(minimumnum(C1, C2), DL, VT);
8390 case ISD::FMAXIMUMNUM:
8391 return getConstantFP(maximumnum(C1, C2), DL, VT);
8392 default: break;
8393 }
8394 }
8395 if (N1CFP && Opcode == ISD::FP_ROUND) {
8396 APFloat C1 = N1CFP->getValueAPF(); // make copy
8397 bool Unused;
8398 // This can return overflow, underflow, or inexact; we don't care.
8399 // FIXME need to be more flexible about rounding mode.
8401 &Unused);
8402 return getConstantFP(C1, DL, VT);
8403 }
8404
8405 switch (Opcode) {
8406 case ISD::FSUB:
8407 // -0.0 - undef --> undef (consistent with "fneg undef")
8408 if (ConstantFPSDNode *N1C = isConstOrConstSplatFP(N1, /*AllowUndefs*/ true))
8409 if (N1C && N1C->getValueAPF().isNegZero() && N2.isUndef())
8410 return getUNDEF(VT);
8411 [[fallthrough]];
8412
8413 case ISD::FADD:
8414 case ISD::FMUL:
8415 case ISD::FDIV:
8416 case ISD::FREM:
8417 // If both operands are undef, the result is undef. If 1 operand is undef,
8418 // the result is NaN. This should match the behavior of the IR optimizer.
8419 if (N1.isUndef() && N2.isUndef())
8420 return getUNDEF(VT);
8421 if (N1.isUndef() || N2.isUndef())
8423 }
8424 return SDValue();
8425}
8426
8428 const SDLoc &DL, EVT DstEltVT) {
8429 EVT SrcEltVT = BV->getValueType(0).getVectorElementType();
8430
8431 // If this is already the right type, we're done.
8432 if (SrcEltVT == DstEltVT)
8433 return SDValue(BV, 0);
8434
8435 unsigned SrcBitSize = SrcEltVT.getSizeInBits();
8436 unsigned DstBitSize = DstEltVT.getSizeInBits();
8437
8438 // If this is a conversion of N elements of one type to N elements of another
8439 // type, convert each element. This handles FP<->INT cases.
8440 if (SrcBitSize == DstBitSize) {
8442 for (SDValue Op : BV->op_values()) {
8443 // If the vector element type is not legal, the BUILD_VECTOR operands
8444 // are promoted and implicitly truncated. Make that explicit here.
8445 if (Op.getValueType() != SrcEltVT)
8446 Op = getNode(ISD::TRUNCATE, DL, SrcEltVT, Op);
8447 Ops.push_back(getBitcast(DstEltVT, Op));
8448 }
8449 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT,
8451 return getBuildVector(VT, DL, Ops);
8452 }
8453
8454 // Otherwise, we're growing or shrinking the elements. To avoid having to
8455 // handle annoying details of growing/shrinking FP values, we convert them to
8456 // int first.
8457 if (SrcEltVT.isFloatingPoint()) {
8458 // Convert the input float vector to a int vector where the elements are the
8459 // same sizes.
8460 EVT IntEltVT = EVT::getIntegerVT(*getContext(), SrcEltVT.getSizeInBits());
8461 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8463 DstEltVT);
8464 return SDValue();
8465 }
8466
8467 // Now we know the input is an integer vector. If the output is a FP type,
8468 // convert to integer first, then to FP of the right size.
8469 if (DstEltVT.isFloatingPoint()) {
8470 EVT IntEltVT = EVT::getIntegerVT(*getContext(), DstEltVT.getSizeInBits());
8471 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8473 DstEltVT);
8474 return SDValue();
8475 }
8476
8477 // Okay, we know the src/dst types are both integers of differing types.
8478 assert(SrcEltVT.isInteger() && DstEltVT.isInteger());
8479
8480 // Extract the constant raw bit data.
8481 BitVector UndefElements;
8482 SmallVector<APInt> RawBits;
8483 bool IsLE = getDataLayout().isLittleEndian();
8484 if (!BV->getConstantRawBits(IsLE, DstBitSize, RawBits, UndefElements))
8485 return SDValue();
8486
8488 for (unsigned I = 0, E = RawBits.size(); I != E; ++I) {
8489 if (UndefElements[I])
8490 Ops.push_back(getUNDEF(DstEltVT));
8491 else
8492 Ops.push_back(getConstant(RawBits[I], DL, DstEltVT));
8493 }
8494
8495 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT, Ops.size());
8496 return getBuildVector(VT, DL, Ops);
8497}
8498
8500 assert(Val.getValueType().isInteger() && "Invalid AssertAlign!");
8501
8502 // There's no need to assert on a byte-aligned pointer. All pointers are at
8503 // least byte aligned.
8504 if (A == Align(1))
8505 return Val;
8506
8507 SDVTList VTs = getVTList(Val.getValueType());
8508 SDValue Ops[] = {Val};
8509 SDNodeKey ID(ISD::AssertAlign, VTs, Ops);
8510 ID.AddInteger(A.value());
8511
8512 FoldingSetInsertToken InsertToken;
8513 if (SDNode *E = lookupNode(ID, DL, InsertToken))
8514 return SDValue(E, 0);
8515
8516 auto *N =
8517 newSDNode<AssertAlignSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, A);
8518 createOperands(N, {Val});
8519
8520 CSEMap.insert(N, InsertToken);
8521 InsertNode(N);
8522
8523 SDValue V(N, 0);
8524 NewSDValueDbgMsg(V, "Creating new node: ", this);
8525 return V;
8526}
8527
8528SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8529 SDValue N1, SDValue N2) {
8530 SDNodeFlags Flags;
8531 if (Inserter)
8532 Flags = Inserter->getFlags();
8533 return getNode(Opcode, DL, VT, N1, N2, Flags);
8534}
8535
8537 SDValue &N2) const {
8538 if (!TLI->isCommutativeBinOp(Opcode))
8539 return;
8540
8541 // Canonicalize:
8542 // binop(const, nonconst) -> binop(nonconst, const)
8545 bool N1CFP = isConstantFPBuildVectorOrConstantFP(N1);
8546 bool N2CFP = isConstantFPBuildVectorOrConstantFP(N2);
8547 if ((N1C && !N2C) || (N1CFP && !N2CFP))
8548 std::swap(N1, N2);
8549
8550 // Canonicalize:
8551 // binop(splat(x), step_vector) -> binop(step_vector, splat(x))
8552 else if (N1.getOpcode() == ISD::SPLAT_VECTOR &&
8554 std::swap(N1, N2);
8555}
8556
8557SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8558 SDValue N1, SDValue N2, const SDNodeFlags Flags) {
8560 N2.getOpcode() != ISD::DELETED_NODE &&
8561 "Operand is DELETED_NODE!");
8562
8563 canonicalizeCommutativeBinop(Opcode, N1, N2);
8564
8565 auto *N1C = dyn_cast<ConstantSDNode>(N1);
8566 auto *N2C = dyn_cast<ConstantSDNode>(N2);
8567
8568 // Don't allow undefs in vector splats - we might be returning N2 when folding
8569 // to zero etc.
8570 ConstantSDNode *N2CV =
8571 isConstOrConstSplat(N2, /*AllowUndefs*/ false, /*AllowTruncation*/ true);
8572
8573 switch (Opcode) {
8574 default: break;
8575 case ISD::TokenFactor:
8576 assert(VT == MVT::Other && N1.getValueType() == MVT::Other &&
8577 N2.getValueType() == MVT::Other && "Invalid token factor!");
8578 // Fold trivial token factors.
8579 if (N1.getOpcode() == ISD::EntryToken) return N2;
8580 if (N2.getOpcode() == ISD::EntryToken) return N1;
8581 if (N1 == N2) return N1;
8582 break;
8583 case ISD::BUILD_VECTOR: {
8584 // Attempt to simplify BUILD_VECTOR.
8585 SDValue Ops[] = {N1, N2};
8586 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
8587 return V;
8588 break;
8589 }
8590 case ISD::CONCAT_VECTORS: {
8591 SDValue Ops[] = {N1, N2};
8592 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
8593 return V;
8594 break;
8595 }
8596 case ISD::AND:
8597 assert(VT.isInteger() && "This operator does not apply to FP types!");
8598 assert(N1.getValueType() == N2.getValueType() &&
8599 N1.getValueType() == VT && "Binary operator types must match!");
8600 // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's
8601 // worth handling here.
8602 if (N2CV && N2CV->isZero())
8603 return N2;
8604 if (N2CV && N2CV->isAllOnes()) // X & -1 -> X
8605 return N1;
8606 break;
8607 case ISD::OR:
8608 case ISD::XOR:
8609 case ISD::ADD:
8610 case ISD::PTRADD:
8611 case ISD::SUB:
8612 assert(VT.isInteger() && "This operator does not apply to FP types!");
8613 assert(N1.getValueType() == N2.getValueType() &&
8614 N1.getValueType() == VT && "Binary operator types must match!");
8615 // The equal operand types requirement is unnecessarily strong for PTRADD.
8616 // However, the SelectionDAGBuilder does not generate PTRADDs with different
8617 // operand types, and we'd need to re-implement GEP's non-standard wrapping
8618 // logic everywhere where PTRADDs may be folded or combined to properly
8619 // support them. If/when we introduce pointer types to the SDAG, we will
8620 // need to relax this constraint.
8621
8622 // (X ^|+- 0) -> X. This commonly occurs when legalizing i64 values, so
8623 // it's worth handling here.
8624 if (N2CV && N2CV->isZero())
8625 return N1;
8626 if ((Opcode == ISD::ADD || Opcode == ISD::SUB) &&
8627 VT.getScalarType() == MVT::i1)
8628 return getNode(ISD::XOR, DL, VT, N1, N2);
8629 // Fold (add (vscale * C0), (vscale * C1)) to (vscale * (C0 + C1)).
8630 if (Opcode == ISD::ADD && N1.getOpcode() == ISD::VSCALE &&
8631 N2.getOpcode() == ISD::VSCALE) {
8632 const APInt &C1 = N1->getConstantOperandAPInt(0);
8633 const APInt &C2 = N2->getConstantOperandAPInt(0);
8634 return getVScale(DL, VT, C1 + C2);
8635 }
8636 break;
8637 case ISD::MUL:
8638 assert(VT.isInteger() && "This operator does not apply to FP types!");
8639 assert(N1.getValueType() == N2.getValueType() &&
8640 N1.getValueType() == VT && "Binary operator types must match!");
8641 if (VT.getScalarType() == MVT::i1)
8642 return getNode(ISD::AND, DL, VT, N1, N2);
8643 if (N2CV && N2CV->isZero())
8644 return N2;
8645 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8646 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8647 const APInt &N2CImm = N2C->getAPIntValue();
8648 return getVScale(DL, VT, MulImm * N2CImm);
8649 }
8650 break;
8651 case ISD::UDIV:
8652 case ISD::UREM:
8653 case ISD::MULHU:
8654 case ISD::MULHS:
8655 case ISD::SDIV:
8656 case ISD::SREM:
8657 case ISD::SADDSAT:
8658 case ISD::SSUBSAT:
8659 case ISD::UADDSAT:
8660 case ISD::USUBSAT:
8661 assert(VT.isInteger() && "This operator does not apply to FP types!");
8662 assert(N1.getValueType() == N2.getValueType() &&
8663 N1.getValueType() == VT && "Binary operator types must match!");
8664 if (VT.getScalarType() == MVT::i1) {
8665 // fold (add_sat x, y) -> (or x, y) for bool types.
8666 if (Opcode == ISD::SADDSAT || Opcode == ISD::UADDSAT)
8667 return getNode(ISD::OR, DL, VT, N1, N2);
8668 // fold (sub_sat x, y) -> (and x, ~y) for bool types.
8669 if (Opcode == ISD::SSUBSAT || Opcode == ISD::USUBSAT)
8670 return getNode(ISD::AND, DL, VT, N1, getNOT(DL, N2, VT));
8671 }
8672 break;
8673 case ISD::SCMP:
8674 case ISD::UCMP:
8675 assert(N1.getValueType() == N2.getValueType() &&
8676 "Types of operands of UCMP/SCMP must match");
8677 assert(N1.getValueType().isVector() == VT.isVector() &&
8678 "Operands and return type of must both be scalars or vectors");
8679 if (VT.isVector())
8682 "Result and operands must have the same number of elements");
8683 break;
8684 case ISD::AVGFLOORS:
8685 case ISD::AVGFLOORU:
8686 case ISD::AVGCEILS:
8687 case ISD::AVGCEILU:
8688 assert(VT.isInteger() && "This operator does not apply to FP types!");
8689 assert(N1.getValueType() == N2.getValueType() &&
8690 N1.getValueType() == VT && "Binary operator types must match!");
8691 break;
8692 case ISD::ABDS:
8693 case ISD::ABDU:
8694 assert(VT.isInteger() && "This operator does not apply to FP types!");
8695 assert(N1.getValueType() == N2.getValueType() &&
8696 N1.getValueType() == VT && "Binary operator types must match!");
8697 if (VT.getScalarType() == MVT::i1)
8698 return getNode(ISD::XOR, DL, VT, N1, N2);
8699 break;
8700 case ISD::SMIN:
8701 case ISD::UMAX:
8702 assert(VT.isInteger() && "This operator does not apply to FP types!");
8703 assert(N1.getValueType() == N2.getValueType() &&
8704 N1.getValueType() == VT && "Binary operator types must match!");
8705 if (VT.getScalarType() == MVT::i1)
8706 return getNode(ISD::OR, DL, VT, N1, N2);
8707 break;
8708 case ISD::SMAX:
8709 case ISD::UMIN:
8710 assert(VT.isInteger() && "This operator does not apply to FP types!");
8711 assert(N1.getValueType() == N2.getValueType() &&
8712 N1.getValueType() == VT && "Binary operator types must match!");
8713 if (VT.getScalarType() == MVT::i1)
8714 return getNode(ISD::AND, DL, VT, N1, N2);
8715 break;
8716 case ISD::FADD:
8717 case ISD::FSUB:
8718 case ISD::FMUL:
8719 case ISD::FDIV:
8720 case ISD::FREM:
8721 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
8722 assert(N1.getValueType() == N2.getValueType() &&
8723 N1.getValueType() == VT && "Binary operator types must match!");
8724 if (SDValue V = simplifyFPBinop(Opcode, N1, N2, Flags))
8725 return V;
8726 break;
8727 case ISD::FCOPYSIGN: // N1 and result must match. N1/N2 need not match.
8728 assert(N1.getValueType() == VT &&
8731 "Invalid FCOPYSIGN!");
8732 break;
8733 case ISD::SHL:
8734 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8735 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8736 const APInt &ShiftImm = N2C->getAPIntValue();
8737 return getVScale(DL, VT, MulImm << ShiftImm);
8738 }
8739 [[fallthrough]];
8740 case ISD::SRA:
8741 case ISD::SRL:
8742 if (SDValue V = simplifyShift(N1, N2))
8743 return V;
8744 [[fallthrough]];
8745 case ISD::ROTL:
8746 case ISD::ROTR:
8747 case ISD::SSHLSAT:
8748 case ISD::USHLSAT:
8749 assert(VT == N1.getValueType() &&
8750 "Shift operators return type must be the same as their first arg");
8751 assert(VT.isInteger() && N2.getValueType().isInteger() &&
8752 "Shifts only work on integers");
8753 assert((!VT.isVector() || VT == N2.getValueType()) &&
8754 "Vector shift amounts must be in the same as their first arg");
8755 // Verify that the shift amount VT is big enough to hold valid shift
8756 // amounts. This catches things like trying to shift an i1024 value by an
8757 // i8, which is easy to fall into in generic code that uses
8758 // TLI.getShiftAmount().
8761 "Invalid use of small shift amount with oversized value!");
8762
8763 // Always fold shifts of i1 values so the code generator doesn't need to
8764 // handle them. Since we know the size of the shift has to be less than the
8765 // size of the value, the shift/rotate count is guaranteed to be zero.
8766 if (VT == MVT::i1)
8767 return N1;
8768 if (N2CV && N2CV->isZero())
8769 return N1;
8770 break;
8771 case ISD::FP_ROUND:
8773 VT.bitsLE(N1.getValueType()) && N2C &&
8774 (N2C->getZExtValue() == 0 || N2C->getZExtValue() == 1) &&
8775 N2.getOpcode() == ISD::TargetConstant && "Invalid FP_ROUND!");
8776 if (N1.getValueType() == VT) return N1; // noop conversion.
8777 break;
8778 case ISD::IS_FPCLASS: {
8780 "IS_FPCLASS is used for a non-floating type");
8781 assert(isa<ConstantSDNode>(N2) && "FPClassTest is not Constant");
8782 // is.fpclass(poison, mask) -> poison
8783 if (N1.getOpcode() == ISD::POISON)
8784 return getPOISON(VT);
8785 FPClassTest Mask = static_cast<FPClassTest>(N2->getAsZExtVal());
8786 // If all tests are made, it doesn't matter what the value is.
8787 if ((Mask & fcAllFlags) == fcAllFlags)
8788 return getBoolConstant(true, DL, VT, N1.getValueType());
8789 if ((Mask & fcAllFlags) == 0)
8790 return getBoolConstant(false, DL, VT, N1.getValueType());
8791 break;
8792 }
8793 case ISD::AssertNoFPClass: {
8795 "AssertNoFPClass is used for a non-floating type");
8796 assert(isa<ConstantSDNode>(N2) && "NoFPClass is not Constant");
8797 FPClassTest NoFPClass = static_cast<FPClassTest>(N2->getAsZExtVal());
8798 assert(llvm::to_underlying(NoFPClass) <=
8800 "FPClassTest value too large");
8801 (void)NoFPClass;
8802 break;
8803 }
8804 case ISD::AssertSext:
8805 case ISD::AssertZext: {
8806 EVT EVT = cast<VTSDNode>(N2)->getVT();
8807 assert(VT == N1.getValueType() && "Not an inreg extend!");
8808 assert(VT.isInteger() && EVT.isInteger() &&
8809 "Cannot *_EXTEND_INREG FP types");
8810 assert(!EVT.isVector() &&
8811 "AssertSExt/AssertZExt type should be the vector element type "
8812 "rather than the vector type!");
8813 assert(EVT.bitsLE(VT.getScalarType()) && "Not extending!");
8814 if (VT.getScalarType() == EVT) return N1; // noop assertion.
8815 break;
8816 }
8818 EVT EVT = cast<VTSDNode>(N2)->getVT();
8819 assert(VT == N1.getValueType() && "Not an inreg extend!");
8820 assert(VT.isInteger() && EVT.isInteger() &&
8821 "Cannot *_EXTEND_INREG FP types");
8822 assert(EVT.isVector() == VT.isVector() &&
8823 "SIGN_EXTEND_INREG type should be vector iff the operand "
8824 "type is vector!");
8825 assert((!EVT.isVector() ||
8827 "Vector element counts must match in SIGN_EXTEND_INREG");
8828 assert(EVT.getScalarType().bitsLE(VT.getScalarType()) && "Not extending!");
8829 if (EVT == VT) return N1; // Not actually extending
8830 break;
8831 }
8833 case ISD::FP_TO_UINT_SAT: {
8834 assert(VT.isInteger() && cast<VTSDNode>(N2)->getVT().isInteger() &&
8835 N1.getValueType().isFloatingPoint() && "Invalid FP_TO_*INT_SAT");
8836 assert(N1.getValueType().isVector() == VT.isVector() &&
8837 "FP_TO_*INT_SAT type should be vector iff the operand type is "
8838 "vector!");
8839 assert((!VT.isVector() || VT.getVectorElementCount() ==
8841 "Vector element counts must match in FP_TO_*INT_SAT");
8842 assert(!cast<VTSDNode>(N2)->getVT().isVector() &&
8843 "Type to saturate to must be a scalar.");
8844 assert(cast<VTSDNode>(N2)->getVT().bitsLE(VT.getScalarType()) &&
8845 "Not extending!");
8846 break;
8847 }
8850 "The result of EXTRACT_VECTOR_ELT must be at least as wide as the \
8851 element type of the vector.");
8852
8853 // Extract from an undefined value or using an undefined index is undefined.
8854 if (N1.isUndef() || N2.isUndef())
8855 return getUNDEF(VT);
8856
8857 // EXTRACT_VECTOR_ELT of out-of-bounds element is POISON for fixed length
8858 // vectors. For scalable vectors we will provide appropriate support for
8859 // dealing with arbitrary indices.
8860 if (N2C && N1.getValueType().isFixedLengthVector() &&
8861 N2C->getAPIntValue().uge(N1.getValueType().getVectorNumElements()))
8862 return getPOISON(VT);
8863
8864 // EXTRACT_VECTOR_ELT of CONCAT_VECTORS is often formed while lowering is
8865 // expanding copies of large vectors from registers. This only works for
8866 // fixed length vectors, since we need to know the exact number of
8867 // elements.
8868 if (N2C && N1.getOpcode() == ISD::CONCAT_VECTORS &&
8870 unsigned Factor = N1.getOperand(0).getValueType().getVectorNumElements();
8871 return getExtractVectorElt(DL, VT,
8872 N1.getOperand(N2C->getZExtValue() / Factor),
8873 N2C->getZExtValue() % Factor);
8874 }
8875
8876 // EXTRACT_VECTOR_ELT of BUILD_VECTOR or SPLAT_VECTOR is often formed while
8877 // lowering is expanding large vector constants.
8878 if (N2C && (N1.getOpcode() == ISD::BUILD_VECTOR ||
8879 N1.getOpcode() == ISD::SPLAT_VECTOR)) {
8882 "BUILD_VECTOR used for scalable vectors");
8883 unsigned Index =
8884 N1.getOpcode() == ISD::BUILD_VECTOR ? N2C->getZExtValue() : 0;
8885 SDValue Elt = N1.getOperand(Index);
8886
8887 if (VT != Elt.getValueType())
8888 // If the vector element type is not legal, the BUILD_VECTOR operands
8889 // are promoted and implicitly truncated, and the result implicitly
8890 // extended. Make that explicit here.
8891 Elt = getAnyExtOrTrunc(Elt, DL, VT);
8892
8893 return Elt;
8894 }
8895
8896 // EXTRACT_VECTOR_ELT of INSERT_VECTOR_ELT is often formed when vector
8897 // operations are lowered to scalars.
8898 if (N1.getOpcode() == ISD::INSERT_VECTOR_ELT) {
8899 // If the indices are the same, return the inserted element else
8900 // if the indices are known different, extract the element from
8901 // the original vector.
8902 SDValue N1Op2 = N1.getOperand(2);
8904
8905 if (N1Op2C && N2C) {
8906 if (N1Op2C->getZExtValue() == N2C->getZExtValue()) {
8907 if (VT == N1.getOperand(1).getValueType())
8908 return N1.getOperand(1);
8909 if (VT.isFloatingPoint()) {
8911 return getFPExtendOrRound(N1.getOperand(1), DL, VT);
8912 }
8913 return getSExtOrTrunc(N1.getOperand(1), DL, VT);
8914 }
8915 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0), N2);
8916 }
8917 }
8918
8919 // EXTRACT_VECTOR_ELT of v1iX EXTRACT_SUBVECTOR could be formed
8920 // when vector types are scalarized and v1iX is legal.
8921 // vextract (v1iX extract_subvector(vNiX, Idx)) -> vextract(vNiX,Idx).
8922 // Here we are completely ignoring the extract element index (N2),
8923 // which is fine for fixed width vectors, since any index other than 0
8924 // is undefined anyway. However, this cannot be ignored for scalable
8925 // vectors - in theory we could support this, but we don't want to do this
8926 // without a profitability check.
8927 if (N1.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
8929 N1.getValueType().getVectorNumElements() == 1) {
8930 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0),
8931 N1.getOperand(1));
8932 }
8933 break;
8935 assert(N2C && (unsigned)N2C->getZExtValue() < 2 && "Bad EXTRACT_ELEMENT!");
8936 assert(!N1.getValueType().isVector() && !VT.isVector() &&
8937 (N1.getValueType().isInteger() == VT.isInteger()) &&
8938 N1.getValueType() != VT &&
8939 "Wrong types for EXTRACT_ELEMENT!");
8940
8941 // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding
8942 // 64-bit integers into 32-bit parts. Instead of building the extract of
8943 // the BUILD_PAIR, only to have legalize rip it apart, just do it now.
8944 if (N1.getOpcode() == ISD::BUILD_PAIR)
8945 return N1.getOperand(N2C->getZExtValue());
8946
8947 // EXTRACT_ELEMENT of a constant int is also very common.
8948 if (N1C) {
8949 unsigned ElementSize = VT.getSizeInBits();
8950 unsigned Shift = ElementSize * N2C->getZExtValue();
8951 const APInt &Val = N1C->getAPIntValue();
8952 return getConstant(Val.extractBits(ElementSize, Shift), DL, VT);
8953 }
8954 break;
8956 EVT N1VT = N1.getValueType();
8957 assert(VT.isVector() && N1VT.isVector() &&
8958 "Extract subvector VTs must be vectors!");
8960 "Extract subvector VTs must have the same element type!");
8961 assert((VT.isFixedLengthVector() || N1VT.isScalableVector()) &&
8962 "Cannot extract a scalable vector from a fixed length vector!");
8963 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8965 "Extract subvector must be from larger vector to smaller vector!");
8966 assert(N2C && "Extract subvector index must be a constant");
8967 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8968 (VT.getVectorMinNumElements() + N2C->getZExtValue()) <=
8969 N1VT.getVectorMinNumElements()) &&
8970 "Extract subvector overflow!");
8971 assert(N2C->getAPIntValue().getBitWidth() ==
8972 TLI->getVectorIdxWidth(getDataLayout()) &&
8973 "Constant index for EXTRACT_SUBVECTOR has an invalid size");
8974 assert(N2C->getZExtValue() % VT.getVectorMinNumElements() == 0 &&
8975 "Extract index is not a multiple of the output vector length");
8976
8977 // Trivial extraction.
8978 if (VT == N1VT)
8979 return N1;
8980
8981 // EXTRACT_SUBVECTOR of an UNDEF is an UNDEF.
8982 if (N1.isUndef())
8983 return getUNDEF(VT);
8984
8985 // EXTRACT_SUBVECTOR of CONCAT_VECTOR can be simplified if the pieces of
8986 // the concat have the same type as the extract.
8987 if (N1.getOpcode() == ISD::CONCAT_VECTORS &&
8988 VT == N1.getOperand(0).getValueType()) {
8989 unsigned Factor = VT.getVectorMinNumElements();
8990 return N1.getOperand(N2C->getZExtValue() / Factor);
8991 }
8992
8993 // EXTRACT_SUBVECTOR of INSERT_SUBVECTOR is often created
8994 // during shuffle legalization.
8995 if (N1.getOpcode() == ISD::INSERT_SUBVECTOR && N2 == N1.getOperand(2) &&
8996 VT == N1.getOperand(1).getValueType())
8997 return N1.getOperand(1);
8998 break;
8999 }
9000 }
9001
9002 if (N1.getOpcode() == ISD::POISON || N2.getOpcode() == ISD::POISON) {
9003 switch (Opcode) {
9004 case ISD::XOR:
9005 case ISD::ADD:
9006 case ISD::PTRADD:
9007 case ISD::SUB:
9009 case ISD::UDIV:
9010 case ISD::SDIV:
9011 case ISD::UREM:
9012 case ISD::SREM:
9013 case ISD::MUL:
9014 case ISD::AND:
9015 case ISD::SSUBSAT:
9016 case ISD::USUBSAT:
9017 case ISD::UMIN:
9018 case ISD::OR:
9019 case ISD::SADDSAT:
9020 case ISD::UADDSAT:
9021 case ISD::UMAX:
9022 case ISD::SMAX:
9023 case ISD::SMIN:
9024 // fold op(arg1, poison) -> poison, fold op(poison, arg2) -> poison.
9025 return N2.getOpcode() == ISD::POISON ? N2 : N1;
9026 }
9027 }
9028
9029 // Canonicalize an UNDEF to the RHS, even over a constant.
9030 if (N1.getOpcode() == ISD::UNDEF && N2.getOpcode() != ISD::UNDEF) {
9031 if (TLI->isCommutativeBinOp(Opcode)) {
9032 std::swap(N1, N2);
9033 } else {
9034 switch (Opcode) {
9035 case ISD::PTRADD:
9036 case ISD::SUB:
9037 // fold op(undef, non_undef_arg2) -> undef.
9038 return N1;
9040 case ISD::UDIV:
9041 case ISD::SDIV:
9042 case ISD::UREM:
9043 case ISD::SREM:
9044 case ISD::SSUBSAT:
9045 case ISD::USUBSAT:
9046 // fold op(undef, non_undef_arg2) -> 0.
9047 return getConstant(0, DL, VT);
9048 }
9049 }
9050 }
9051
9052 // Fold a bunch of operators when the RHS is undef.
9053 if (N2.getOpcode() == ISD::UNDEF) {
9054 switch (Opcode) {
9055 case ISD::XOR:
9056 if (N1.getOpcode() == ISD::UNDEF)
9057 // Handle undef ^ undef -> 0 special case. This is a common
9058 // idiom (misuse).
9059 return getConstant(0, DL, VT);
9060 [[fallthrough]];
9061 case ISD::ADD:
9062 case ISD::PTRADD:
9063 case ISD::SUB:
9064 // fold op(arg1, undef) -> undef.
9065 return N2;
9066 case ISD::UDIV:
9067 case ISD::SDIV:
9068 case ISD::UREM:
9069 case ISD::SREM:
9070 // fold op(arg1, undef) -> poison.
9071 return getPOISON(VT);
9072 case ISD::MUL:
9073 case ISD::AND:
9074 case ISD::SSUBSAT:
9075 case ISD::USUBSAT:
9076 case ISD::UMIN:
9077 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> 0.
9078 return N1.getOpcode() == ISD::UNDEF ? N2 : getConstant(0, DL, VT);
9079 case ISD::OR:
9080 case ISD::SADDSAT:
9081 case ISD::UADDSAT:
9082 case ISD::UMAX:
9083 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> -1.
9084 return N1.getOpcode() == ISD::UNDEF ? N2 : getAllOnesConstant(DL, VT);
9085 case ISD::SMAX:
9086 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MAX_INT.
9087 return N1.getOpcode() == ISD::UNDEF
9088 ? N2
9089 : getConstant(
9091 VT);
9092 case ISD::SMIN:
9093 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MIN_INT.
9094 return N1.getOpcode() == ISD::UNDEF
9095 ? N2
9096 : getConstant(
9098 VT);
9099 }
9100 }
9101
9102 // Perform trivial constant folding.
9103 if (SDValue SV = FoldConstantArithmetic(Opcode, DL, VT, {N1, N2}, Flags))
9104 return SV;
9105
9106 // Memoize this node if possible.
9107 SDNode *N;
9108 SDVTList VTs = getVTList(VT);
9109 SDValue Ops[] = {N1, N2};
9110 if (VT != MVT::Glue) {
9111 SDNodeKey ID(Opcode, VTs, Ops);
9112 FoldingSetInsertToken InsertToken;
9113 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
9114 E->intersectFlagsWith(Flags);
9115 return SDValue(E, 0);
9116 }
9117
9118 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9119 N->setFlags(Flags);
9120 createOperands(N, Ops);
9121 CSEMap.insert(N, InsertToken);
9122 } else {
9123 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9124 createOperands(N, Ops);
9125 }
9126
9127 InsertNode(N);
9128 SDValue V = SDValue(N, 0);
9129 NewSDValueDbgMsg(V, "Creating new node: ", this);
9130 return V;
9131}
9132
9133SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9134 SDValue N1, SDValue N2, SDValue N3) {
9135 SDNodeFlags Flags;
9136 if (Inserter)
9137 Flags = Inserter->getFlags();
9138 return getNode(Opcode, DL, VT, N1, N2, N3, Flags);
9139}
9140
9141SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9142 SDValue N1, SDValue N2, SDValue N3,
9143 const SDNodeFlags Flags) {
9145 N2.getOpcode() != ISD::DELETED_NODE &&
9146 N3.getOpcode() != ISD::DELETED_NODE &&
9147 "Operand is DELETED_NODE!");
9148 // Perform various simplifications.
9149 switch (Opcode) {
9150 case ISD::BUILD_VECTOR: {
9151 // Attempt to simplify BUILD_VECTOR.
9152 SDValue Ops[] = {N1, N2, N3};
9153 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
9154 return V;
9155 break;
9156 }
9157 case ISD::CONCAT_VECTORS: {
9158 SDValue Ops[] = {N1, N2, N3};
9159 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
9160 return V;
9161 break;
9162 }
9163 case ISD::SETCC: {
9164 assert(VT.isInteger() && "SETCC result type must be an integer!");
9165 assert(N1.getValueType() == N2.getValueType() &&
9166 "SETCC operands must have the same type!");
9167 assert(VT.isVector() == N1.getValueType().isVector() &&
9168 "SETCC type should be vector iff the operand type is vector!");
9169 assert((!VT.isVector() || VT.getVectorElementCount() ==
9171 "SETCC vector element counts must match!");
9172 // Use FoldSetCC to simplify SETCC's.
9173 if (SDValue V =
9174 FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get(), DL, Flags))
9175 return V;
9176 break;
9177 }
9178 case ISD::SELECT:
9179 case ISD::VSELECT:
9180 if (SDValue V = simplifySelect(N1, N2, N3))
9181 return V;
9182 break;
9184 llvm_unreachable("should use getVectorShuffle constructor!");
9186 if (isNullConstant(N3))
9187 return N1;
9188 break;
9190 if (isNullConstant(N3))
9191 return N2;
9192 break;
9194 assert(VT.isVector() && VT == N1.getValueType() &&
9195 "INSERT_VECTOR_ELT vector type mismatch");
9197 "INSERT_VECTOR_ELT scalar fp/int mismatch");
9198 assert((!VT.isFloatingPoint() ||
9199 VT.getVectorElementType() == N2.getValueType()) &&
9200 "INSERT_VECTOR_ELT fp scalar type mismatch");
9201 assert((!VT.isInteger() ||
9203 "INSERT_VECTOR_ELT int scalar size mismatch");
9204
9205 auto *N3C = dyn_cast<ConstantSDNode>(N3);
9206 // INSERT_VECTOR_ELT into out-of-bounds element is an UNDEF, except
9207 // for scalable vectors where we will generate appropriate code to
9208 // deal with out-of-bounds cases correctly.
9209 if (N3C && VT.isFixedLengthVector() &&
9210 N3C->getZExtValue() >= VT.getVectorNumElements())
9211 return getUNDEF(VT);
9212
9213 // Undefined index can be assumed out-of-bounds, so that's UNDEF too.
9214 if (N3.isUndef())
9215 return getUNDEF(VT);
9216
9217 // If inserting poison, just use the input vector.
9218 if (N2.getOpcode() == ISD::POISON)
9219 return N1;
9220
9221 // Inserting undef into undef/poison is still undef.
9222 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
9223 return getUNDEF(VT);
9224
9225 // If the inserted element is an UNDEF, just use the input vector.
9226 // But not if skipping the insert could make the result more poisonous.
9227 if (N2.isUndef()) {
9228 if (N3C && VT.isFixedLengthVector()) {
9229 APInt EltMask =
9230 APInt::getOneBitSet(VT.getVectorNumElements(), N3C->getZExtValue());
9231 if (isGuaranteedNotToBePoison(N1, EltMask))
9232 return N1;
9233 } else if (isGuaranteedNotToBePoison(N1))
9234 return N1;
9235 }
9236 break;
9237 }
9238 case ISD::INSERT_SUBVECTOR: {
9239 // If inserting poison, just use the input vector,
9240 if (N2.getOpcode() == ISD::POISON)
9241 return N1;
9242
9243 // Inserting undef into undef/poison is still undef.
9244 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
9245 return getUNDEF(VT);
9246
9247 EVT N2VT = N2.getValueType();
9248 assert(VT == N1.getValueType() &&
9249 "Dest and insert subvector source types must match!");
9250 assert(VT.isVector() && N2VT.isVector() &&
9251 "Insert subvector VTs must be vectors!");
9253 "Insert subvector VTs must have the same element type!");
9254 assert((VT.isScalableVector() || N2VT.isFixedLengthVector()) &&
9255 "Cannot insert a scalable vector into a fixed length vector!");
9256 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
9258 "Insert subvector must be from smaller vector to larger vector!");
9260 "Insert subvector index must be constant");
9261 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
9262 (N2VT.getVectorMinNumElements() + N3->getAsZExtVal()) <=
9264 "Insert subvector overflow!");
9266 TLI->getVectorIdxWidth(getDataLayout()) &&
9267 "Constant index for INSERT_SUBVECTOR has an invalid size");
9268
9269 // Trivial insertion.
9270 if (VT == N2VT)
9271 return N2;
9272
9273 // If this is an insert of an extracted vector into an undef/poison vector,
9274 // we can just use the input to the extract. But not if skipping the
9275 // extract+insert could make the result more poisonous.
9276 if (N1.isUndef() && N2.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
9277 N2.getOperand(1) == N3 && N2.getOperand(0).getValueType() == VT) {
9278 if (N1.getOpcode() == ISD::POISON)
9279 return N2.getOperand(0);
9280 if (VT.isFixedLengthVector() && N2VT.isFixedLengthVector()) {
9281 unsigned LoBit = N3->getAsZExtVal();
9282 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
9283 APInt EltMask =
9284 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
9285 if (isGuaranteedNotToBePoison(N2.getOperand(0), ~EltMask))
9286 return N2.getOperand(0);
9287 } else if (isGuaranteedNotToBePoison(N2.getOperand(0)))
9288 return N2.getOperand(0);
9289 }
9290
9291 // If the inserted subvector is UNDEF, just use the input vector.
9292 // But not if skipping the insert could make the result more poisonous.
9293 if (N2.isUndef()) {
9294 if (VT.isFixedLengthVector()) {
9295 unsigned LoBit = N3->getAsZExtVal();
9296 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
9297 APInt EltMask =
9298 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
9299 if (isGuaranteedNotToBePoison(N1, EltMask))
9300 return N1;
9301 } else if (isGuaranteedNotToBePoison(N1))
9302 return N1;
9303 }
9304 break;
9305 }
9306 case ISD::BITCAST:
9307 // Fold bit_convert nodes from a type to themselves.
9308 if (N1.getValueType() == VT)
9309 return N1;
9310 break;
9311 case ISD::VECTOR_COMPRESS: {
9312 [[maybe_unused]] EVT VecVT = N1.getValueType();
9313 [[maybe_unused]] EVT MaskVT = N2.getValueType();
9314 [[maybe_unused]] EVT PassthruVT = N3.getValueType();
9315 assert(VT == VecVT && "Vector and result type don't match.");
9316 assert(VecVT.isVector() && MaskVT.isVector() && PassthruVT.isVector() &&
9317 "All inputs must be vectors.");
9318 assert(VecVT == PassthruVT && "Vector and passthru types don't match.");
9320 "Vector and mask must have same number of elements.");
9321
9322 if (N1.isUndef() || N2.isUndef())
9323 return N3;
9324
9325 break;
9326 }
9331 [[maybe_unused]] EVT AccVT = N1.getValueType();
9332 [[maybe_unused]] EVT Input1VT = N2.getValueType();
9333 [[maybe_unused]] EVT Input2VT = N3.getValueType();
9334 assert(Input1VT.isVector() && Input1VT == Input2VT &&
9335 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
9336 "node to have the same type!");
9337 assert(VT.isVector() && VT == AccVT &&
9338 "Expected the first operand of the PARTIAL_REDUCE_MLA node to have "
9339 "the same type as its result!");
9341 AccVT.getVectorElementCount()) &&
9342 "Expected the element count of the second and third operands of the "
9343 "PARTIAL_REDUCE_MLA node to be a positive integer multiple of the "
9344 "element count of the first operand and the result!");
9346 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
9347 "node to have an element type which is the same as or smaller than "
9348 "the element type of the first operand and result!");
9349 break;
9350 }
9351 }
9352
9353 // Perform trivial constant folding for arithmetic operators.
9354 switch (Opcode) {
9358 case ISD::FMA:
9359 case ISD::FMAD:
9360 case ISD::SETCC:
9361 case ISD::FSHL:
9362 case ISD::FSHR:
9363 if (SDValue SV =
9364 FoldConstantArithmetic(Opcode, DL, VT, {N1, N2, N3}, Flags))
9365 return SV;
9366 break;
9367 }
9368
9369 // Memoize node if it doesn't produce a glue result.
9370 SDNode *N;
9371 SDVTList VTs = getVTList(VT);
9372 SDValue Ops[] = {N1, N2, N3};
9373 if (VT != MVT::Glue) {
9374 SDNodeKey ID(Opcode, VTs, Ops);
9375 FoldingSetInsertToken InsertToken;
9376 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
9377 E->intersectFlagsWith(Flags);
9378 return SDValue(E, 0);
9379 }
9380
9381 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9382 N->setFlags(Flags);
9383 createOperands(N, Ops);
9384 CSEMap.insert(N, InsertToken);
9385 } else {
9386 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9387 createOperands(N, Ops);
9388 }
9389
9390 InsertNode(N);
9391 SDValue V = SDValue(N, 0);
9392 NewSDValueDbgMsg(V, "Creating new node: ", this);
9393 return V;
9394}
9395
9396SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9397 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9398 const SDNodeFlags Flags) {
9399 SDValue Ops[] = { N1, N2, N3, N4 };
9400 return getNode(Opcode, DL, VT, Ops, Flags);
9401}
9402
9403SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9404 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
9405 SDNodeFlags Flags;
9406 if (Inserter)
9407 Flags = Inserter->getFlags();
9408 return getNode(Opcode, DL, VT, N1, N2, N3, N4, Flags);
9409}
9410
9411SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9412 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9413 SDValue N5, const SDNodeFlags Flags) {
9414 SDValue Ops[] = { N1, N2, N3, N4, N5 };
9415 return getNode(Opcode, DL, VT, Ops, Flags);
9416}
9417
9418SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9419 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9420 SDValue N5) {
9421 SDNodeFlags Flags;
9422 if (Inserter)
9423 Flags = Inserter->getFlags();
9424 return getNode(Opcode, DL, VT, N1, N2, N3, N4, N5, Flags);
9425}
9426
9427/// getStackArgumentTokenFactor - Compute a TokenFactor to force all
9428/// the incoming stack arguments to be loaded from the stack.
9430 SmallVector<SDValue, 8> ArgChains;
9431
9432 // Include the original chain at the beginning of the list. When this is
9433 // used by target LowerCall hooks, this helps legalize find the
9434 // CALLSEQ_BEGIN node.
9435 ArgChains.push_back(Chain);
9436
9437 // Add a chain value for each stack argument.
9438 for (SDNode *U : getEntryNode().getNode()->users())
9439 if (LoadSDNode *L = dyn_cast<LoadSDNode>(U))
9440 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(L->getBasePtr()))
9441 if (FI->getIndex() < 0)
9442 ArgChains.push_back(SDValue(L, 1));
9443
9444 // Build a tokenfactor for all the chains.
9445 return getNode(ISD::TokenFactor, SDLoc(Chain), MVT::Other, ArgChains);
9446}
9447
9448/// getMemsetValue - Vectorized representation of the memset value
9449/// operand.
9451 const SDLoc &dl) {
9452 assert(!Value.isUndef());
9453
9454 unsigned NumBits = VT.getScalarSizeInBits();
9456 assert(C->getAPIntValue().getBitWidth() == 8);
9457 APInt Val = APInt::getSplat(NumBits, C->getAPIntValue());
9458 if (VT.isInteger()) {
9459 bool IsOpaque = VT.getSizeInBits() > 64 ||
9460 !DAG.getTargetLoweringInfo().isLegalStoreImmediate(C->getSExtValue());
9461 return DAG.getConstant(Val, dl, VT, false, IsOpaque);
9462 }
9463 return DAG.getConstantFP(APFloat(VT.getFltSemantics(), Val), dl, VT);
9464 }
9465
9466 assert(Value.getValueType() == MVT::i8 && "memset with non-byte fill value?");
9467 EVT IntVT = VT.getScalarType();
9468 if (!IntVT.isInteger())
9469 IntVT = EVT::getIntegerVT(*DAG.getContext(), IntVT.getSizeInBits());
9470
9471 Value = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, Value);
9472 if (NumBits > 8) {
9473 // Use a multiplication with 0x010101... to extend the input to the
9474 // required length.
9475 APInt Magic = APInt::getSplat(NumBits, APInt(8, 0x01));
9476 Value = DAG.getNode(ISD::MUL, dl, IntVT, Value,
9477 DAG.getConstant(Magic, dl, IntVT));
9478 }
9479
9480 if (VT != Value.getValueType() && !VT.isInteger())
9481 Value = DAG.getBitcast(VT.getScalarType(), Value);
9482 if (VT != Value.getValueType())
9483 Value = DAG.getSplatBuildVector(VT, dl, Value);
9484
9485 return Value;
9486}
9487
9488/// getMemsetStringVal - Similar to getMemsetValue. Except this is only
9489/// used when a memcpy is turned into a memset when the source is a constant
9490/// string ptr.
9492 const TargetLowering &TLI,
9493 const ConstantDataArraySlice &Slice) {
9494 // Handle vector with all elements zero.
9495 if (Slice.Array == nullptr) {
9496 if (VT.isInteger())
9497 return DAG.getConstant(0, dl, VT);
9498 return DAG.getNode(ISD::BITCAST, dl, VT,
9499 DAG.getConstant(0, dl, VT.changeTypeToInteger()));
9500 }
9501
9502 assert(!VT.isVector() && "Can't handle vector type here!");
9503 unsigned NumVTBits = VT.getSizeInBits();
9504 unsigned NumVTBytes = NumVTBits / 8;
9505 unsigned NumBytes = std::min(NumVTBytes, unsigned(Slice.Length));
9506
9507 APInt Val(NumVTBits, 0);
9508 if (DAG.getDataLayout().isLittleEndian()) {
9509 for (unsigned i = 0; i != NumBytes; ++i)
9510 Val |= (uint64_t)(unsigned char)Slice[i] << i*8;
9511 } else {
9512 for (unsigned i = 0; i != NumBytes; ++i)
9513 Val |= (uint64_t)(unsigned char)Slice[i] << (NumVTBytes-i-1)*8;
9514 }
9515
9516 // If the "cost" of materializing the integer immediate is less than the cost
9517 // of a load, then it is cost effective to turn the load into the immediate.
9518 Type *Ty = VT.getTypeForEVT(*DAG.getContext());
9519 if (TLI.shouldConvertConstantLoadToIntImm(Val, Ty))
9520 return DAG.getConstant(Val, dl, VT);
9521 return SDValue();
9522}
9523
9525 const SDLoc &DL,
9526 const SDNodeFlags Flags) {
9527 SDValue Index = getTypeSize(DL, Base.getValueType(), Offset);
9528 return getMemBasePlusOffset(Base, Index, DL, Flags);
9529}
9530
9532 const SDLoc &DL,
9533 const SDNodeFlags Flags) {
9534 assert(Offset.getValueType().isInteger());
9535 EVT BasePtrVT = Ptr.getValueType();
9536 if (TLI->shouldPreservePtrArith(this->getMachineFunction().getFunction(),
9537 BasePtrVT))
9538 return getNode(ISD::PTRADD, DL, BasePtrVT, Ptr, Offset, Flags);
9539 // InBounds only applies to PTRADD, don't set it if we generate ADD.
9540 SDNodeFlags AddFlags = Flags;
9541 AddFlags.setInBounds(false);
9542 return getNode(ISD::ADD, DL, BasePtrVT, Ptr, Offset, AddFlags);
9543}
9544
9545/// Returns true if memcpy source is constant data.
9547 uint64_t SrcDelta = 0;
9548 GlobalAddressSDNode *G = nullptr;
9549 if (Src.getOpcode() == ISD::GlobalAddress)
9551 else if (Src->isAnyAdd() &&
9552 Src.getOperand(0).getOpcode() == ISD::GlobalAddress &&
9553 Src.getOperand(1).getOpcode() == ISD::Constant) {
9554 G = cast<GlobalAddressSDNode>(Src.getOperand(0));
9555 SrcDelta = Src.getConstantOperandVal(1);
9556 }
9557 if (!G)
9558 return false;
9559
9560 return getConstantDataArrayInfo(G->getGlobal(), Slice, 8,
9561 SrcDelta + G->getOffset());
9562}
9563
9565 SelectionDAG &DAG) {
9566 // On Darwin, -Os means optimize for size without hurting performance, so
9567 // only really optimize for size when -Oz (MinSize) is used.
9569 return MF.getFunction().hasMinSize();
9570 return DAG.shouldOptForSize();
9571}
9572
9574 SmallVector<SDValue, 32> &OutChains, unsigned From,
9575 unsigned To, SmallVector<SDValue, 16> &OutLoadChains,
9576 SmallVector<SDValue, 16> &OutStoreChains) {
9577 assert(OutLoadChains.size() && "Missing loads in memcpy inlining");
9578 assert(OutStoreChains.size() && "Missing stores in memcpy inlining");
9579 SmallVector<SDValue, 16> GluedLoadChains;
9580 for (unsigned i = From; i < To; ++i) {
9581 OutChains.push_back(OutLoadChains[i]);
9582 GluedLoadChains.push_back(OutLoadChains[i]);
9583 }
9584
9585 // Chain for all loads.
9586 SDValue LoadToken = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
9587 GluedLoadChains);
9588
9589 for (unsigned i = From; i < To; ++i) {
9590 StoreSDNode *ST = dyn_cast<StoreSDNode>(OutStoreChains[i]);
9591 SDValue NewStore = DAG.getTruncStore(LoadToken, dl, ST->getValue(),
9592 ST->getBasePtr(), ST->getMemoryVT(),
9593 ST->getMemOperand());
9594 OutChains.push_back(NewStore);
9595 }
9596}
9597
9598static SDValue
9600 SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign,
9601 Align SrcAlign, bool isVol, bool AlwaysInline,
9602 MachinePointerInfo DstPtrInfo,
9603 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo,
9604 BatchAAResults *BatchAA, const MDNode *DstMemCacheHint,
9605 const MDNode *SrcMemCacheHint) {
9606 // Turn a memcpy of undef to nop.
9607 // FIXME: We need to honor volatile even is Src is undef.
9608 if (Src.isUndef())
9609 return Chain;
9610
9611 // Expand memcpy to a series of load and store ops if the size operand falls
9612 // below a certain threshold.
9613 // TODO: In the AlwaysInline case, if the size is big then generate a loop
9614 // rather than maybe a humongous number of loads and stores.
9615 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9616 const DataLayout &DL = DAG.getDataLayout();
9617 LLVMContext &C = *DAG.getContext();
9618 std::vector<EVT> MemOps;
9619 bool DstAlignCanChange = false;
9621 MachineFrameInfo &MFI = MF.getFrameInfo();
9622 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9624 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9625 DstAlignCanChange = true;
9626 SrcAlign = std::max(SrcAlign, DAG.InferPtrAlign(Src).valueOrOne());
9628 // If marked as volatile, perform a copy even when marked as constant.
9629 bool CopyFromConstant = !isVol && isMemSrcFromConstant(Src, Slice);
9630 bool isZeroConstant = CopyFromConstant && Slice.Array == nullptr;
9631 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemcpy(OptSize);
9632 const MemOp Op = isZeroConstant
9633 ? MemOp::Set(Size, DstAlignCanChange, DstAlign,
9634 /*IsZeroMemset*/ true, isVol)
9635 : MemOp::Copy(Size, DstAlignCanChange, DstAlign,
9636 SrcAlign, isVol, CopyFromConstant);
9637 if (!TLI.findOptimalMemOpLowering(
9638 C, MemOps, Limit, Op, DstPtrInfo.getAddrSpace(),
9639 SrcPtrInfo.getAddrSpace(), MF.getFunction().getAttributes(), nullptr))
9640 return SDValue();
9641
9642 if (DstAlignCanChange) {
9643 Type *Ty = MemOps[0].getTypeForEVT(C);
9644 Align NewDstAlign = DL.getABITypeAlign(Ty);
9645
9646 // Don't promote to an alignment that would require dynamic stack
9647 // realignment which may conflict with optimizations such as tail call
9648 // optimization.
9650 if (!TRI->hasStackRealignment(MF))
9651 if (MaybeAlign StackAlign = DL.getStackAlignment())
9652 NewDstAlign = std::min(NewDstAlign, *StackAlign);
9653
9654 if (NewDstAlign > DstAlign) {
9655 // Give the stack frame object a larger alignment if needed.
9656 if (MFI.getObjectAlign(FI->getIndex()) < NewDstAlign)
9657 MFI.setObjectAlignment(FI->getIndex(), NewDstAlign);
9658 DstAlign = NewDstAlign;
9659 }
9660 }
9661
9662 // Prepare AAInfo for loads/stores after lowering this memcpy.
9663 AAMDNodes NewAAInfo = AAInfo;
9664 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9665
9666 const Value *SrcVal = dyn_cast_if_present<const Value *>(SrcPtrInfo.V);
9667 bool isConstant =
9668 BatchAA && SrcVal &&
9669 BatchAA->pointsToConstantMemory(MemoryLocation(SrcVal, Size, AAInfo));
9670
9671 MachineMemOperand::Flags MMOFlags =
9673 SmallVector<SDValue, 16> OutLoadChains;
9674 SmallVector<SDValue, 16> OutStoreChains;
9675 SmallVector<SDValue, 32> OutChains;
9676 unsigned NumMemOps = MemOps.size();
9677 uint64_t SrcOff = 0, DstOff = 0;
9678 for (unsigned i = 0; i != NumMemOps; ++i) {
9679 EVT VT = MemOps[i];
9680 unsigned VTSize = VT.getSizeInBits() / 8;
9682
9683 if (VTSize > Size) {
9684 // Issuing an unaligned load / store pair that overlaps with the previous
9685 // pair. Adjust the offset accordingly.
9686 assert(i == NumMemOps-1 && i != 0);
9687 SrcOff -= VTSize - Size;
9688 DstOff -= VTSize - Size;
9689 }
9690
9691 if (CopyFromConstant &&
9692 (isZeroConstant || (VT.isInteger() && !VT.isVector()))) {
9693 // It's unlikely a store of a vector immediate can be done in a single
9694 // instruction. It would require a load from a constantpool first.
9695 // We only handle zero vectors here.
9696 // FIXME: Handle other cases where store of vector immediate is done in
9697 // a single instruction.
9698 ConstantDataArraySlice SubSlice;
9699 if (SrcOff < Slice.Length) {
9700 SubSlice = Slice;
9701 SubSlice.move(SrcOff);
9702 } else {
9703 // This is an out-of-bounds access and hence UB. Pretend we read zero.
9704 SubSlice.Array = nullptr;
9705 SubSlice.Offset = 0;
9706 SubSlice.Length = VTSize;
9707 }
9708 Value = getMemsetStringVal(VT, dl, DAG, TLI, SubSlice);
9709 if (Value.getNode()) {
9710 Store = DAG.getStore(
9711 Chain, dl, Value,
9712 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9713 DstPtrInfo.getWithOffset(DstOff), DstAlign, MMOFlags,
9714 MMOMetadata(NewAAInfo, /*Ranges=*/nullptr, DstMemCacheHint));
9715 OutChains.push_back(Store);
9716 }
9717 }
9718
9719 if (!Store.getNode()) {
9720 // The type might not be legal for the target. This should only happen
9721 // if the type is smaller than a legal type, as on PPC, so the right
9722 // thing to do is generate a LoadExt/StoreTrunc pair. These simplify
9723 // to Load/Store if NVT==VT.
9724 // FIXME does the case above also need this?
9725 EVT NVT = TLI.getTypeToTransformTo(C, VT);
9726 assert(NVT.bitsGE(VT));
9727
9728 bool isDereferenceable =
9729 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9730 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9731 if (isDereferenceable)
9733 if (isConstant)
9734 SrcMMOFlags |= MachineMemOperand::MOInvariant;
9735
9736 Value = DAG.getExtLoad(
9737 ISD::EXTLOAD, dl, NVT, Chain,
9738 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9739 SrcPtrInfo.getWithOffset(SrcOff), VT,
9740 commonAlignment(SrcAlign, SrcOff), SrcMMOFlags,
9741 MMOMetadata(NewAAInfo, /*Ranges=*/nullptr, SrcMemCacheHint));
9742 OutLoadChains.push_back(Value.getValue(1));
9743
9744 Store = DAG.getTruncStore(
9745 Chain, dl, Value,
9746 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9747 DstPtrInfo.getWithOffset(DstOff), VT, DstAlign, MMOFlags,
9748 MMOMetadata(NewAAInfo, /*Ranges=*/nullptr, DstMemCacheHint));
9749 OutStoreChains.push_back(Store);
9750 }
9751 SrcOff += VTSize;
9752 DstOff += VTSize;
9753 Size -= VTSize;
9754 }
9755
9756 unsigned GluedLdStLimit = MaxLdStGlue == 0 ?
9758 unsigned NumLdStInMemcpy = OutStoreChains.size();
9759
9760 if (NumLdStInMemcpy) {
9761 // It may be that memcpy might be converted to memset if it's memcpy
9762 // of constants. In such a case, we won't have loads and stores, but
9763 // just stores. In the absence of loads, there is nothing to gang up.
9764 if ((GluedLdStLimit <= 1) || !EnableMemCpyDAGOpt) {
9765 // If target does not care, just leave as it.
9766 for (unsigned i = 0; i < NumLdStInMemcpy; ++i) {
9767 OutChains.push_back(OutLoadChains[i]);
9768 OutChains.push_back(OutStoreChains[i]);
9769 }
9770 } else {
9771 // Ld/St less than/equal limit set by target.
9772 if (NumLdStInMemcpy <= GluedLdStLimit) {
9773 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, 0,
9774 NumLdStInMemcpy, OutLoadChains,
9775 OutStoreChains);
9776 } else {
9777 unsigned NumberLdChain = NumLdStInMemcpy / GluedLdStLimit;
9778 unsigned RemainingLdStInMemcpy = NumLdStInMemcpy % GluedLdStLimit;
9779 unsigned GlueIter = 0;
9780
9781 // Residual ld/st.
9782 if (RemainingLdStInMemcpy) {
9784 DAG, dl, OutChains, NumLdStInMemcpy - RemainingLdStInMemcpy,
9785 NumLdStInMemcpy, OutLoadChains, OutStoreChains);
9786 }
9787
9788 for (unsigned cnt = 0; cnt < NumberLdChain; ++cnt) {
9789 unsigned IndexFrom = NumLdStInMemcpy - RemainingLdStInMemcpy -
9790 GlueIter - GluedLdStLimit;
9791 unsigned IndexTo = NumLdStInMemcpy - RemainingLdStInMemcpy - GlueIter;
9792 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, IndexFrom, IndexTo,
9793 OutLoadChains, OutStoreChains);
9794 GlueIter += GluedLdStLimit;
9795 }
9796 }
9797 }
9798 }
9799 return DAG.getTokenFactor(dl, OutChains);
9800}
9801
9803 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
9804 uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol,
9805 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9806 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo) {
9807 // Turn a memmove of undef to nop.
9808 // FIXME: We need to honor volatile even is Src is undef.
9809 if (Src.isUndef())
9810 return Chain;
9811
9812 // Expand memmove to a series of load and store ops if the size operand falls
9813 // below a certain threshold.
9814 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9815 const DataLayout &DL = DAG.getDataLayout();
9816 LLVMContext &C = *DAG.getContext();
9817 std::vector<EVT> MemOps;
9818 bool DstAlignCanChange = false;
9820 MachineFrameInfo &MFI = MF.getFrameInfo();
9821 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9823 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9824 DstAlignCanChange = true;
9825 SrcAlign = std::max(SrcAlign, DAG.InferPtrAlign(Src).valueOrOne());
9826 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemmove(OptSize);
9827 if (!TLI.findOptimalMemOpLowering(
9828 C, MemOps, Limit,
9829 MemOp::Move(Size, DstAlignCanChange, DstAlign, SrcAlign, isVol),
9830 DstPtrInfo.getAddrSpace(), SrcPtrInfo.getAddrSpace(),
9831 MF.getFunction().getAttributes(), nullptr))
9832 return SDValue();
9833
9834 if (DstAlignCanChange) {
9835 Type *Ty = MemOps[0].getTypeForEVT(C);
9836 Align NewDstAlign = DL.getABITypeAlign(Ty);
9837
9838 // Don't promote to an alignment that would require dynamic stack
9839 // realignment which may conflict with optimizations such as tail call
9840 // optimization.
9842 if (!TRI->hasStackRealignment(MF))
9843 if (MaybeAlign StackAlign = DL.getStackAlignment())
9844 NewDstAlign = std::min(NewDstAlign, *StackAlign);
9845
9846 if (NewDstAlign > DstAlign) {
9847 // Give the stack frame object a larger alignment if needed.
9848 if (MFI.getObjectAlign(FI->getIndex()) < NewDstAlign)
9849 MFI.setObjectAlignment(FI->getIndex(), NewDstAlign);
9850 DstAlign = NewDstAlign;
9851 }
9852 }
9853
9854 // Prepare AAInfo for loads/stores after lowering this memmove.
9855 AAMDNodes NewAAInfo = AAInfo;
9856 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9857
9858 MachineMemOperand::Flags MMOFlags =
9860 uint64_t SrcOff = 0;
9861 SmallVector<SDValue, 8> LoadValues;
9862 SmallVector<SDValue, 8> LoadChains;
9863 SmallVector<SDValue, 8> OutChains;
9864 unsigned NumMemOps = MemOps.size();
9865 for (unsigned i = 0; i < NumMemOps; i++) {
9866 EVT VT = MemOps[i];
9867 unsigned VTSize = VT.getSizeInBits() / 8;
9868 SDValue Value;
9869 bool IsOverlapping = false;
9870
9871 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - SrcOff) {
9872 // Issuing an unaligned load / store pair that overlaps with the previous
9873 // pair. Adjust the offset accordingly.
9874 SrcOff = Size - VTSize;
9875 IsOverlapping = true;
9876 }
9877
9878 // Calculate the actual alignment at the current offset. The alignment at
9879 // SrcOff may be lower than the base alignment, especially when using
9880 // overlapping loads.
9881 Align SrcAlignAtOffset = commonAlignment(SrcAlign, SrcOff);
9882 if (IsOverlapping) {
9883 // Verify that the target allows misaligned memory accesses at the
9884 // adjusted offset when using overlapping loads.
9885 unsigned Fast;
9886 if (!TLI.allowsMisalignedMemoryAccesses(VT, SrcPtrInfo.getAddrSpace(),
9887 SrcAlignAtOffset, MMOFlags,
9888 &Fast) ||
9889 !Fast) {
9890 // This should have been caught by findOptimalMemOpLowering, but verify
9891 // here for safety.
9892 return SDValue();
9893 }
9894 }
9895
9896 bool isDereferenceable =
9897 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9898 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9899 if (isDereferenceable)
9901 Value =
9902 DAG.getLoad(VT, dl, Chain,
9903 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9904 SrcPtrInfo.getWithOffset(SrcOff), SrcAlignAtOffset,
9905 SrcMMOFlags, NewAAInfo);
9906 LoadValues.push_back(Value);
9907 LoadChains.push_back(Value.getValue(1));
9908 SrcOff += VTSize;
9909 }
9910 Chain = DAG.getTokenFactor(dl, LoadChains);
9911 OutChains.clear();
9912 uint64_t DstOff = 0;
9913 for (unsigned i = 0; i < NumMemOps; i++) {
9914 EVT VT = MemOps[i];
9915 unsigned VTSize = VT.getSizeInBits() / 8;
9916 SDValue Store;
9917 bool IsOverlapping = false;
9918
9919 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - DstOff) {
9920 // Issuing an unaligned load / store pair that overlaps with the previous
9921 // pair. Adjust the offset accordingly.
9922 DstOff = Size - VTSize;
9923 IsOverlapping = true;
9924 }
9925
9926 // Calculate the actual alignment at the current offset. The alignment at
9927 // DstOff may be lower than the base alignment, especially when using
9928 // overlapping stores.
9929 Align DstAlignAtOffset = commonAlignment(DstAlign, DstOff);
9930 if (IsOverlapping) {
9931 // Verify that the target allows misaligned memory accesses at the
9932 // adjusted offset when using overlapping stores.
9933 unsigned Fast;
9934 if (!TLI.allowsMisalignedMemoryAccesses(VT, DstPtrInfo.getAddrSpace(),
9935 DstAlignAtOffset, MMOFlags,
9936 &Fast) ||
9937 !Fast) {
9938 // This should have been caught by findOptimalMemOpLowering, but verify
9939 // here for safety.
9940 return SDValue();
9941 }
9942 }
9943 Store = DAG.getStore(
9944 Chain, dl, LoadValues[i],
9945 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9946 DstPtrInfo.getWithOffset(DstOff), DstAlignAtOffset, MMOFlags,
9947 NewAAInfo);
9948 OutChains.push_back(Store);
9949 DstOff += VTSize;
9950 }
9951
9952 return DAG.getTokenFactor(dl, OutChains);
9953}
9954
9955/// Lower the call to 'memset' intrinsic function into a series of store
9956/// operations.
9957///
9958/// \param DAG Selection DAG where lowered code is placed.
9959/// \param dl Link to corresponding IR location.
9960/// \param Chain Control flow dependency.
9961/// \param Dst Pointer to destination memory location.
9962/// \param Src Value of byte to write into the memory.
9963/// \param Size Number of bytes to write.
9964/// \param Alignment Alignment of the destination in bytes.
9965/// \param isVol True if destination is volatile.
9966/// \param AlwaysInline Makes sure no function call is generated.
9967/// \param DstPtrInfo IR information on the memory pointer.
9968/// \returns New head in the control flow, if lowering was successful, empty
9969/// SDValue otherwise.
9970///
9971/// The function tries to replace 'llvm.memset' intrinsic with several store
9972/// operations and value calculation code. This is usually profitable for small
9973/// memory size or when the semantic requires inlining.
9975 SDValue Chain, SDValue Dst, SDValue Src,
9976 uint64_t Size, Align Alignment, bool isVol,
9977 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9978 const AAMDNodes &AAInfo) {
9979 // Turn a memset of undef to nop.
9980 // FIXME: We need to honor volatile even is Src is undef.
9981 if (Src.isUndef())
9982 return Chain;
9983
9984 // Expand memset to a series of load/store ops if the size operand
9985 // falls below a certain threshold.
9986 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9987 std::vector<EVT> MemOps;
9988 bool DstAlignCanChange = false;
9989 LLVMContext &C = *DAG.getContext();
9991 MachineFrameInfo &MFI = MF.getFrameInfo();
9992 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9994 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9995 DstAlignCanChange = true;
9996 bool IsZeroVal = isNullConstant(Src);
9997 unsigned Limit = AlwaysInline ? ~0 : TLI.getMaxStoresPerMemset(OptSize);
9998
9999 EVT LargestVT;
10000 if (!TLI.findOptimalMemOpLowering(
10001 C, MemOps, Limit,
10002 MemOp::Set(Size, DstAlignCanChange, Alignment, IsZeroVal, isVol),
10003 DstPtrInfo.getAddrSpace(), ~0u, MF.getFunction().getAttributes(),
10004 &LargestVT))
10005 return SDValue();
10006
10007 if (DstAlignCanChange) {
10008 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext());
10009 const DataLayout &DL = DAG.getDataLayout();
10010 Align NewAlign = DL.getABITypeAlign(Ty);
10011
10012 // Don't promote to an alignment that would require dynamic stack
10013 // realignment which may conflict with optimizations such as tail call
10014 // optimization.
10016 if (!TRI->hasStackRealignment(MF))
10017 if (MaybeAlign StackAlign = DL.getStackAlignment())
10018 NewAlign = std::min(NewAlign, *StackAlign);
10019
10020 if (NewAlign > Alignment) {
10021 // Give the stack frame object a larger alignment if needed.
10022 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
10023 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
10024 Alignment = NewAlign;
10025 }
10026 }
10027
10028 SmallVector<SDValue, 8> OutChains;
10029 uint64_t DstOff = 0;
10030 unsigned NumMemOps = MemOps.size();
10031
10032 // Find the largest store and generate the bit pattern for it.
10033 // If target didn't set LargestVT, compute it from MemOps.
10034 if (!LargestVT.isSimple()) {
10035 LargestVT = MemOps[0];
10036 for (unsigned i = 1; i < NumMemOps; i++)
10037 if (MemOps[i].bitsGT(LargestVT))
10038 LargestVT = MemOps[i];
10039 }
10040 SDValue MemSetValue = getMemsetValue(Src, LargestVT, DAG, dl);
10041
10042 // Prepare AAInfo for loads/stores after lowering this memset.
10043 AAMDNodes NewAAInfo = AAInfo;
10044 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
10045
10046 for (unsigned i = 0; i < NumMemOps; i++) {
10047 EVT VT = MemOps[i];
10048 unsigned VTSize = VT.getSizeInBits() / 8;
10049 // The target should specify store types that exactly cover the memset size
10050 // (with the last store potentially being oversized for overlapping stores).
10051 assert(Size > 0 && "Target specified more stores than needed in "
10052 "findOptimalMemOpLowering");
10053 if (VTSize > Size) {
10054 // Issuing an unaligned load / store pair that overlaps with the previous
10055 // pair. Adjust the offset accordingly.
10056 assert(i == NumMemOps-1 && i != 0);
10057 DstOff -= VTSize - Size;
10058 }
10059
10060 // If this store is smaller than the largest store see whether we can get
10061 // the smaller value for free with a truncate or extract vector element and
10062 // then store.
10063 SDValue Value = MemSetValue;
10064 if (VT.bitsLT(LargestVT)) {
10065 unsigned Index;
10066 unsigned NElts = LargestVT.getSizeInBits() / VT.getSizeInBits();
10067 EVT SVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(), NElts);
10068 if (!LargestVT.isVector() && !VT.isVector() &&
10069 TLI.isTruncateFree(LargestVT, VT))
10070 Value = DAG.getNode(ISD::TRUNCATE, dl, VT, MemSetValue);
10071 else if (LargestVT.isVector() && !VT.isVector() &&
10073 LargestVT.getTypeForEVT(*DAG.getContext()),
10074 VT.getSizeInBits(), Index) &&
10075 TLI.isTypeLegal(SVT) &&
10076 LargestVT.getSizeInBits() == SVT.getSizeInBits()) {
10077 // Target which can combine store(extractelement VectorTy, Idx) can get
10078 // the smaller value for free.
10079 SDValue TailValue = DAG.getNode(ISD::BITCAST, dl, SVT, MemSetValue);
10080 Value = DAG.getExtractVectorElt(dl, VT, TailValue, Index);
10081 } else
10082 Value = getMemsetValue(Src, VT, DAG, dl);
10083 }
10084 assert(Value.getValueType() == VT && "Value with wrong type.");
10085 SDValue Store = DAG.getStore(
10086 Chain, dl, Value,
10087 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
10088 DstPtrInfo.getWithOffset(DstOff), Alignment,
10090 NewAAInfo);
10091 OutChains.push_back(Store);
10092 DstOff += VT.getSizeInBits() / 8;
10093 // For oversized overlapping stores, only subtract the remaining bytes.
10094 // For normal stores, subtract the full store size.
10095 if (VTSize > Size) {
10096 Size = 0;
10097 } else {
10098 Size -= VTSize;
10099 }
10100 }
10101
10102 // After processing all stores, Size should be exactly 0. Any remaining bytes
10103 // indicate a bug in the target's findOptimalMemOpLowering implementation.
10104 assert(Size == 0 && "Target's findOptimalMemOpLowering did not specify "
10105 "stores that exactly cover the memset size");
10106
10107 return DAG.getTokenFactor(dl, OutChains);
10108}
10109
10111 const DataLayout &DL, unsigned AS) {
10112 // Lowering memcpy / memset / memmove intrinsics to calls is only valid if all
10113 // pointer operands can be losslessly bitcasted to pointers of address space 0
10114 if (AS != 0 && !TLI->getTargetMachine().isNoopAddrSpaceCast(DL, AS, 0)) {
10115 report_fatal_error("cannot lower memory intrinsic in address space " +
10116 Twine(AS));
10117 }
10118}
10119
10120/// The length of a memory intrinsic (e.g. number of bytes to copy) is unsigned
10121/// and may have any integer type. We zero-extend or truncate it to the pointer
10122/// type of the narrower address space being accessed.
10124 SDValue Size, unsigned DstAS,
10125 unsigned SrcAS) {
10126 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
10127 MVT DstVT = TLI.getPointerTy(DAG.getDataLayout(), DstAS);
10128 MVT SrcVT = TLI.getPointerTy(DAG.getDataLayout(), SrcAS);
10129 return DAG.getZExtOrTrunc(Size, dl, DstVT.bitsLT(SrcVT) ? DstVT : SrcVT);
10130}
10131
10133 const SelectionDAG *SelDAG,
10134 bool AllowReturnsFirstArg) {
10135 if (!CI || !CI->isTailCall())
10136 return false;
10137 // TODO: Fix "returns-first-arg" determination so it doesn't depend on which
10138 // helper symbol we lower to.
10139 return isInTailCallPosition(*CI, SelDAG->getTarget(),
10140 AllowReturnsFirstArg &&
10142}
10143
10144static std::pair<SDValue, SDValue>
10147 const CallInst *CI, RTLIB::Libcall Call,
10148 SelectionDAG *DAG, const TargetLowering *TLI) {
10149 RTLIB::LibcallImpl LCImpl = DAG->getLibcalls().getLibcallImpl(Call);
10150
10151 if (LCImpl == RTLIB::Unsupported)
10152 return {};
10153
10155 bool IsTailCall =
10156 isInTailCallPositionWrapper(CI, DAG, /*AllowReturnsFirstArg=*/true) &&
10157 // Lowering doesn't support tail calling inside a function with
10158 // a swifterror argument yet.
10159 !DAG->hasSwiftErrorArg();
10160 SDValue Callee =
10161 DAG->getExternalSymbol(LCImpl, TLI->getPointerTy(DAG->getDataLayout()));
10162
10163 CLI.setDebugLoc(dl)
10164 .setChain(Chain)
10166 CI->getType(), Callee, std::move(Args))
10167 .setTailCall(IsTailCall);
10168
10169 return TLI->LowerCallTo(CLI);
10170}
10171
10172std::pair<SDValue, SDValue> SelectionDAG::getStrcmp(SDValue Chain,
10173 const SDLoc &dl, SDValue S1,
10174 SDValue S2,
10175 const CallInst *CI) {
10177 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
10178 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10179 RTLIB::STRCMP, this, TLI);
10180}
10181
10182std::pair<SDValue, SDValue> SelectionDAG::getStrstr(SDValue Chain,
10183 const SDLoc &dl, SDValue S1,
10184 SDValue S2,
10185 const CallInst *CI) {
10187 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
10188 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10189 RTLIB::STRSTR, this, TLI);
10190}
10191
10192std::pair<SDValue, SDValue> SelectionDAG::getMemccpy(SDValue Chain,
10193 const SDLoc &dl,
10194 SDValue Dst, SDValue Src,
10196 const CallInst *CI) {
10198
10200 {Dst, PT},
10201 {Src, PT},
10204 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10205 RTLIB::MEMCCPY, this, TLI);
10206}
10207
10208std::pair<SDValue, SDValue>
10210 SDValue Mem1, SDValue Size, const CallInst *CI) {
10213 {Mem0, PT},
10214 {Mem1, PT},
10216 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10217 RTLIB::MEMCMP, this, TLI);
10218}
10219
10220std::pair<SDValue, SDValue> SelectionDAG::getStrcpy(SDValue Chain,
10221 const SDLoc &dl,
10222 SDValue Dst, SDValue Src,
10223 const CallInst *CI) {
10225 TargetLowering::ArgListTy Args = {{Dst, PT}, {Src, PT}};
10226 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10227 RTLIB::STRCPY, this, TLI);
10228}
10229
10230std::pair<SDValue, SDValue> SelectionDAG::getStrlen(SDValue Chain,
10231 const SDLoc &dl,
10232 SDValue Src,
10233 const CallInst *CI) {
10234 // Emit a library call.
10237 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10238 RTLIB::STRLEN, this, TLI);
10239}
10240
10242 return TLI->supportSwiftError() &&
10243 MF->getFunction().getAttributes().hasAttrSomewhere(
10244 Attribute::SwiftError);
10245}
10246
10248 SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size,
10249 Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline,
10250 const CallInst *CI, std::optional<bool> OverrideTailCall,
10251 MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo,
10252 const AAMDNodes &AAInfo, BatchAAResults *BatchAA) {
10253 Size = getMemIntrinsicSize(*this, dl, Size, DstPtrInfo.getAddrSpace(),
10254 SrcPtrInfo.getAddrSpace());
10255 // Check to see if we should lower the memcpy to loads and stores first.
10256 // For cases within the target-specified limits, this is the best choice.
10257 const MDNode *DstMemCacheHint =
10258 CI ? getMemCacheHintMetadata(*CI, /*OperandNo=*/0) : nullptr;
10259 const MDNode *SrcMemCacheHint =
10260 CI ? getMemCacheHintMetadata(*CI, /*OperandNo=*/1) : nullptr;
10261
10263 if (ConstantSize) {
10264 // Memcpy with size zero? Just return the original chain.
10265 if (ConstantSize->isZero())
10266 return Chain;
10267
10269 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10270 SrcAlign, isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA,
10271 DstMemCacheHint, SrcMemCacheHint);
10272 if (Result.getNode())
10273 return Result;
10274 }
10275
10276 // Then check to see if we should lower the memcpy with target-specific
10277 // code. If the target chooses to do this, this is the next best.
10278 if (TSI) {
10279 SDValue Result = TSI->EmitTargetCodeForMemcpy(
10280 *this, dl, Chain, Dst, Src, Size, DstAlign, SrcAlign, isVol,
10281 AlwaysInline, DstPtrInfo, SrcPtrInfo);
10282 if (Result.getNode())
10283 return Result;
10284 }
10285
10286 // If we really need inline code and the target declined to provide it,
10287 // use a (potentially long) sequence of loads and stores.
10288 if (AlwaysInline) {
10289 assert(ConstantSize && "AlwaysInline requires a constant size!");
10291 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10292 SrcAlign, isVol, true, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA,
10293 DstMemCacheHint, SrcMemCacheHint);
10294 }
10295
10297 DstPtrInfo.getAddrSpace());
10299 SrcPtrInfo.getAddrSpace());
10300
10301 // FIXME: If the memcpy is volatile (isVol), lowering it to a plain libc
10302 // memcpy is not guaranteed to be safe. libc memcpys aren't required to
10303 // respect volatile, so they may do things like read or write memory
10304 // beyond the given memory regions. But fixing this isn't easy, and most
10305 // people don't care.
10306
10307 // Emit a library call.
10310 Args.emplace_back(Dst, PtrTy);
10311 Args.emplace_back(Src, PtrTy);
10312 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
10313 // FIXME: pass in SDLoc
10315 bool IsTailCall = false;
10316 RTLIB::LibcallImpl MemCpyImpl = TLI->getMemcpyImpl();
10317
10318 if (OverrideTailCall.has_value()) {
10319 IsTailCall = *OverrideTailCall;
10320 } else {
10321 bool LowersToMemcpy = MemCpyImpl == RTLIB::impl_memcpy;
10322 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemcpy);
10323 }
10324 // Lowering doesn't support tail calling inside a function with a
10325 // swifterror argument yet.
10326 IsTailCall &= !hasSwiftErrorArg();
10327
10328 CLI.setDebugLoc(dl)
10329 .setChain(Chain)
10330 .setLibCallee(
10331 Libcalls->getLibcallImplCallingConv(MemCpyImpl),
10332 Dst.getValueType().getTypeForEVT(*getContext()),
10333 getExternalSymbol(MemCpyImpl, TLI->getPointerTy(getDataLayout())),
10334 std::move(Args))
10336 .setTailCall(IsTailCall);
10337
10338 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
10339 return CallResult.second;
10340}
10341
10343 SDValue Dst, SDValue Src, SDValue Size,
10344 Type *SizeTy, unsigned ElemSz,
10345 bool isTailCall,
10346 MachinePointerInfo DstPtrInfo,
10347 MachinePointerInfo SrcPtrInfo) {
10348 // Lowering doesn't support tail calling inside a function with a
10349 // swifterror argument yet.
10350 isTailCall &= !hasSwiftErrorArg();
10351
10352 // Emit a library call.
10355 Args.emplace_back(Dst, ArgTy);
10356 Args.emplace_back(Src, ArgTy);
10357 Args.emplace_back(Size, SizeTy);
10358
10359 RTLIB::Libcall LibraryCall =
10361 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10362 if (LibcallImpl == RTLIB::Unsupported)
10363 report_fatal_error("Unsupported element size");
10364
10366 CLI.setDebugLoc(dl)
10367 .setChain(Chain)
10368 .setLibCallee(
10369 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10371 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10372 std::move(Args))
10374 .setTailCall(isTailCall);
10375
10376 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10377 return CallResult.second;
10378}
10379
10381 SDValue Src, SDValue Size, Align DstAlign,
10382 Align SrcAlign, bool isVol, const CallInst *CI,
10383 std::optional<bool> OverrideTailCall,
10384 MachinePointerInfo DstPtrInfo,
10385 MachinePointerInfo SrcPtrInfo,
10386 const AAMDNodes &AAInfo,
10387 BatchAAResults *BatchAA) {
10388 Size = getMemIntrinsicSize(*this, dl, Size, DstPtrInfo.getAddrSpace(),
10389 SrcPtrInfo.getAddrSpace());
10390 // Check to see if we should lower the memmove to loads and stores first.
10391 // For cases within the target-specified limits, this is the best choice.
10393 if (ConstantSize) {
10394 // Memmove with size zero? Just return the original chain.
10395 if (ConstantSize->isZero())
10396 return Chain;
10397
10399 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10400 SrcAlign, isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo);
10401 if (Result.getNode())
10402 return Result;
10403 }
10404
10405 // Then check to see if we should lower the memmove with target-specific
10406 // code. If the target chooses to do this, this is the next best.
10407 if (TSI) {
10408 SDValue Result = TSI->EmitTargetCodeForMemmove(
10409 *this, dl, Chain, Dst, Src, Size, DstAlign, SrcAlign, isVol, DstPtrInfo,
10410 SrcPtrInfo);
10411 if (Result.getNode())
10412 return Result;
10413 }
10414
10416 DstPtrInfo.getAddrSpace());
10418 SrcPtrInfo.getAddrSpace());
10419
10420 // FIXME: If the memmove is volatile, lowering it to plain libc memmove may
10421 // not be safe. See memcpy above for more details.
10422
10423 // Emit a library call.
10426 Args.emplace_back(Dst, PtrTy);
10427 Args.emplace_back(Src, PtrTy);
10428 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
10429 // FIXME: pass in SDLoc
10431
10432 RTLIB::LibcallImpl MemmoveImpl = Libcalls->getLibcallImpl(RTLIB::MEMMOVE);
10433
10434 bool IsTailCall = false;
10435 if (OverrideTailCall.has_value()) {
10436 IsTailCall = *OverrideTailCall;
10437 } else {
10438 bool LowersToMemmove = MemmoveImpl == RTLIB::impl_memmove;
10439 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemmove);
10440 }
10441 // Lowering doesn't support tail calling inside a function with a
10442 // swifterror argument yet.
10443 IsTailCall &= !hasSwiftErrorArg();
10444
10445 CLI.setDebugLoc(dl)
10446 .setChain(Chain)
10447 .setLibCallee(
10448 Libcalls->getLibcallImplCallingConv(MemmoveImpl),
10449 Dst.getValueType().getTypeForEVT(*getContext()),
10450 getExternalSymbol(MemmoveImpl, TLI->getPointerTy(getDataLayout())),
10451 std::move(Args))
10453 .setTailCall(IsTailCall);
10454
10455 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
10456 return CallResult.second;
10457}
10458
10460 SDValue Dst, SDValue Src, SDValue Size,
10461 Type *SizeTy, unsigned ElemSz,
10462 bool isTailCall,
10463 MachinePointerInfo DstPtrInfo,
10464 MachinePointerInfo SrcPtrInfo) {
10465 // Lowering doesn't support tail calling inside a function with a
10466 // swifterror argument yet.
10467 isTailCall &= !hasSwiftErrorArg();
10468
10469 // Emit a library call.
10472 Args.emplace_back(Dst, IntPtrTy);
10473 Args.emplace_back(Src, IntPtrTy);
10474 Args.emplace_back(Size, SizeTy);
10475
10476 RTLIB::Libcall LibraryCall =
10478 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10479 if (LibcallImpl == RTLIB::Unsupported)
10480 report_fatal_error("Unsupported element size");
10481
10483 CLI.setDebugLoc(dl)
10484 .setChain(Chain)
10485 .setLibCallee(
10486 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10488 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10489 std::move(Args))
10491 .setTailCall(isTailCall);
10492
10493 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10494 return CallResult.second;
10495}
10496
10498 SDValue Src, SDValue Size, Align Alignment,
10499 bool isVol, bool AlwaysInline,
10500 const CallInst *CI,
10501 MachinePointerInfo DstPtrInfo,
10502 const AAMDNodes &AAInfo) {
10503 Size = getMemIntrinsicSize(*this, dl, Size, DstPtrInfo.getAddrSpace(),
10504 DstPtrInfo.getAddrSpace());
10505 // Check to see if we should lower the memset to stores first.
10506 // For cases within the target-specified limits, this is the best choice.
10508 if (ConstantSize) {
10509 // Memset with size zero? Just return the original chain.
10510 if (ConstantSize->isZero())
10511 return Chain;
10512
10513 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10514 ConstantSize->getZExtValue(), Alignment,
10515 isVol, false, DstPtrInfo, AAInfo);
10516
10517 if (Result.getNode())
10518 return Result;
10519 }
10520
10521 // Then check to see if we should lower the memset with target-specific
10522 // code. If the target chooses to do this, this is the next best.
10523 if (TSI) {
10524 SDValue Result = TSI->EmitTargetCodeForMemset(
10525 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline, DstPtrInfo);
10526 if (Result.getNode())
10527 return Result;
10528 }
10529
10530 // If we really need inline code and the target declined to provide it,
10531 // use a (potentially long) sequence of loads and stores.
10532 if (AlwaysInline) {
10533 assert(ConstantSize && "AlwaysInline requires a constant size!");
10534 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10535 ConstantSize->getZExtValue(), Alignment,
10536 isVol, true, DstPtrInfo, AAInfo);
10537 assert(Result &&
10538 "getMemsetStores must return a valid sequence when AlwaysInline");
10539 return Result;
10540 }
10541
10543 DstPtrInfo.getAddrSpace());
10544
10545 // Emit a library call.
10546 auto &Ctx = *getContext();
10547 const auto& DL = getDataLayout();
10548
10550 // FIXME: pass in SDLoc
10551 CLI.setDebugLoc(dl).setChain(Chain);
10552
10553 RTLIB::LibcallImpl BzeroImpl = Libcalls->getLibcallImpl(RTLIB::BZERO);
10554 bool UseBZero = BzeroImpl != RTLIB::Unsupported && isNullConstant(Src);
10555
10556 // If zeroing out and bzero is present, use it.
10557 if (UseBZero) {
10559 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10560 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10561 CLI.setLibCallee(
10562 Libcalls->getLibcallImplCallingConv(BzeroImpl), Type::getVoidTy(Ctx),
10563 getExternalSymbol(BzeroImpl, TLI->getPointerTy(DL)), std::move(Args));
10564 } else {
10565 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10566
10567 MVT IntVT = MVT::getIntegerVT(LibInfo->getIntSize());
10569 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10570 Args.emplace_back(getAnyExtOrTrunc(Src, dl, IntVT),
10571 Type::getIntNTy(Ctx, LibInfo->getIntSize()),
10572 LibInfo->getExtAttrForI32Param());
10573 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10574
10575 CLI.setLibCallee(Libcalls->getLibcallImplCallingConv(MemsetImpl),
10576 Dst.getValueType().getTypeForEVT(Ctx),
10577 getExternalSymbol(MemsetImpl, TLI->getPointerTy(DL)),
10578 std::move(Args));
10579 }
10580
10581 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10582 bool LowersToMemset = MemsetImpl == RTLIB::impl_memset;
10583
10584 // If we're going to use bzero, make sure not to tail call unless the
10585 // subsequent return doesn't need a value, as bzero doesn't return the first
10586 // arg unlike memset.
10587 bool ReturnsFirstArg = CI && funcReturnsFirstArgOfCall(*CI) && !UseBZero;
10588 bool IsTailCall = CI && CI->isTailCall() &&
10590 ReturnsFirstArg && LowersToMemset) &&
10591 // Lowering doesn't support tail calling inside a function
10592 // with a swifterror argument yet.
10594 CLI.setDiscardResult().setTailCall(IsTailCall);
10595
10596 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10597 return CallResult.second;
10598}
10599
10602 Type *SizeTy, unsigned ElemSz,
10603 bool isTailCall,
10604 MachinePointerInfo DstPtrInfo) {
10605 // Lowering doesn't support tail calling inside a function with a
10606 // swifterror argument yet.
10607 isTailCall &= !hasSwiftErrorArg();
10608
10609 // Emit a library call.
10611 Args.emplace_back(Dst, getDataLayout().getIntPtrType(*getContext()));
10612 Args.emplace_back(Value, Type::getInt8Ty(*getContext()));
10613 Args.emplace_back(Size, SizeTy);
10614
10615 RTLIB::Libcall LibraryCall =
10617 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10618 if (LibcallImpl == RTLIB::Unsupported)
10619 report_fatal_error("Unsupported element size");
10620
10622 CLI.setDebugLoc(dl)
10623 .setChain(Chain)
10624 .setLibCallee(
10625 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10627 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10628 std::move(Args))
10630 .setTailCall(isTailCall);
10631
10632 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10633 return CallResult.second;
10634}
10635
10636SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10638 MachineMemOperand *MMO,
10639 ISD::LoadExtType ExtType) {
10640 SDNodeKey ID(Opcode, VTList, Ops);
10641 ID.AddInteger(MemVT.getRawBits());
10642 ID.AddInteger(getSyntheticNodeSubclassData<AtomicSDNode>(
10643 dl.getIROrder(), Opcode, VTList, MemVT, MMO, ExtType));
10644 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10645 ID.AddInteger(MMO->getFlags());
10646 FoldingSetInsertToken InsertToken;
10647 if (auto *E = cast_or_null<AtomicSDNode>(lookupNode(ID, dl, InsertToken))) {
10648 E->refineAlignment(MMO);
10649 E->refineMMOMetadata(MMO);
10650 return SDValue(E, 0);
10651 }
10652
10653 auto *N = newSDNode<AtomicSDNode>(dl.getIROrder(), dl.getDebugLoc(), Opcode,
10654 VTList, MemVT, MMO, ExtType);
10655 createOperands(N, Ops);
10656
10657 CSEMap.insert(N, InsertToken);
10658 InsertNode(N);
10659 SDValue V(N, 0);
10660 NewSDValueDbgMsg(V, "Creating new node: ", this);
10661 return V;
10662}
10663
10665 EVT MemVT, SDVTList VTs, SDValue Chain,
10666 SDValue Ptr, SDValue Cmp, SDValue Swp,
10667 MachineMemOperand *MMO) {
10668 assert(Opcode == ISD::ATOMIC_CMP_SWAP ||
10670 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types");
10671
10672 SDValue Ops[] = {Chain, Ptr, Cmp, Swp};
10673 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10674}
10675
10676SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10677 SDValue Chain, SDValue Ptr, SDValue Val,
10678 MachineMemOperand *MMO) {
10679 assert((Opcode == ISD::ATOMIC_LOAD_ADD || Opcode == ISD::ATOMIC_LOAD_SUB ||
10680 Opcode == ISD::ATOMIC_LOAD_AND || Opcode == ISD::ATOMIC_LOAD_CLR ||
10681 Opcode == ISD::ATOMIC_LOAD_OR || Opcode == ISD::ATOMIC_LOAD_XOR ||
10682 Opcode == ISD::ATOMIC_LOAD_NAND || Opcode == ISD::ATOMIC_LOAD_MIN ||
10683 Opcode == ISD::ATOMIC_LOAD_MAX || Opcode == ISD::ATOMIC_LOAD_UMIN ||
10684 Opcode == ISD::ATOMIC_LOAD_UMAX || Opcode == ISD::ATOMIC_LOAD_FADD ||
10685 Opcode == ISD::ATOMIC_LOAD_FSUB || Opcode == ISD::ATOMIC_LOAD_FMAX ||
10686 Opcode == ISD::ATOMIC_LOAD_FMIN ||
10687 Opcode == ISD::ATOMIC_LOAD_FMINIMUM ||
10688 Opcode == ISD::ATOMIC_LOAD_FMAXIMUM ||
10689 Opcode == ISD::ATOMIC_LOAD_UINC_WRAP ||
10690 Opcode == ISD::ATOMIC_LOAD_UDEC_WRAP ||
10691 Opcode == ISD::ATOMIC_LOAD_USUB_COND ||
10692 Opcode == ISD::ATOMIC_LOAD_USUB_SAT || Opcode == ISD::ATOMIC_SWAP ||
10693 Opcode == ISD::ATOMIC_STORE) &&
10694 "Invalid Atomic Op");
10695
10696 EVT VT = Val.getValueType();
10697
10698 SDVTList VTs = Opcode == ISD::ATOMIC_STORE ? getVTList(MVT::Other) :
10699 getVTList(VT, MVT::Other);
10700 SDValue Ops[] = {Chain, Ptr, Val};
10701 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10702}
10703
10705 EVT MemVT, EVT VT, SDValue Chain,
10706 SDValue Ptr, MachineMemOperand *MMO) {
10707 SDVTList VTs = getVTList(VT, MVT::Other);
10708 SDValue Ops[] = {Chain, Ptr};
10709 return getAtomic(ISD::ATOMIC_LOAD, dl, MemVT, VTs, Ops, MMO, ExtType);
10710}
10711
10712/// getMergeValues - Create a MERGE_VALUES node from the given operands.
10714 if (Ops.size() == 1)
10715 return Ops[0];
10716
10718 VTs.reserve(Ops.size());
10719 for (const SDValue &Op : Ops)
10720 VTs.push_back(Op.getValueType());
10721 return getNode(ISD::MERGE_VALUES, dl, getVTList(VTs), Ops);
10722}
10723
10725 SDValue Chain, const SDLoc &dl) {
10726 SmallVector<SDValue, 4> RetValues;
10727 RetValues.reserve(ResultTypes.size());
10728 for (EVT VT : ResultTypes)
10729 RetValues.push_back(VT == MVT::Other ? Chain : getPOISON(VT));
10730 return getMergeValues(RetValues, dl);
10731}
10732
10734 unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef<SDValue> Ops,
10735 EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment,
10737 const AAMDNodes &AAInfo) {
10738 if (Size.hasValue() && !Size.getValue())
10740
10742 MachineMemOperand *MMO =
10743 MF.getMachineMemOperand(PtrInfo, Flags, Size, Alignment, AAInfo);
10744
10745 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, MMO);
10746}
10747
10749 SDVTList VTList,
10750 ArrayRef<SDValue> Ops, EVT MemVT,
10751 MachineMemOperand *MMO) {
10752 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, ArrayRef(MMO));
10753}
10754
10756 SDVTList VTList,
10757 ArrayRef<SDValue> Ops, EVT MemVT,
10759 assert(!MMOs.empty() && "Must have at least one MMO");
10760 assert(
10761 (Opcode == ISD::INTRINSIC_VOID || Opcode == ISD::INTRINSIC_W_CHAIN ||
10762 Opcode == ISD::PREFETCH ||
10763 (Opcode <= (unsigned)std::numeric_limits<int>::max() &&
10764 Opcode >= ISD::BUILTIN_OP_END && TSI->isTargetMemoryOpcode(Opcode))) &&
10765 "Opcode is not a memory-accessing opcode!");
10766
10768 if (MMOs.size() == 1) {
10769 MemRefs = MMOs[0];
10770 } else {
10771 // Allocate: [size_t count][MMO*][MMO*]...
10772 size_t AllocSize =
10773 sizeof(size_t) + MMOs.size() * sizeof(MachineMemOperand *);
10774 void *Buffer = Allocator.Allocate(AllocSize, alignof(size_t));
10775 size_t *CountPtr = static_cast<size_t *>(Buffer);
10776 *CountPtr = MMOs.size();
10777 MachineMemOperand **Array =
10778 reinterpret_cast<MachineMemOperand **>(CountPtr + 1);
10779 llvm::copy(MMOs, Array);
10780 MemRefs = Array;
10781 }
10782
10783 // Memoize the node unless it returns a glue result.
10785 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
10786 SDNodeKey ID(Opcode, VTList, Ops);
10787 ID.AddInteger(getSyntheticNodeSubclassData<MemIntrinsicSDNode>(
10788 Opcode, dl.getIROrder(), VTList, MemVT, MemRefs));
10789 ID.AddInteger(MemVT.getRawBits());
10790 for (const MachineMemOperand *MMO : MMOs) {
10791 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10792 ID.AddInteger(MMO->getFlags());
10793 }
10794 FoldingSetInsertToken InsertToken;
10795 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
10796 cast<MemIntrinsicSDNode>(E)->refineAlignment(MMOs);
10797 return SDValue(E, 0);
10798 }
10799
10800 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10801 VTList, MemVT, MemRefs);
10802 createOperands(N, Ops);
10803 CSEMap.insert(N, InsertToken);
10804 } else {
10805 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10806 VTList, MemVT, MemRefs);
10807 createOperands(N, Ops);
10808 }
10809 InsertNode(N);
10810 SDValue V(N, 0);
10811 NewSDValueDbgMsg(V, "Creating new node: ", this);
10812 return V;
10813}
10814
10816 SDValue Chain, int FrameIndex) {
10817 const unsigned Opcode = IsStart ? ISD::LIFETIME_START : ISD::LIFETIME_END;
10818 const auto VTs = getVTList(MVT::Other);
10819 SDValue Ops[2] = {
10820 Chain,
10821 getFrameIndex(FrameIndex,
10822 getTargetLoweringInfo().getFrameIndexTy(getDataLayout()),
10823 true)};
10824
10825 SDNodeKey ID(Opcode, VTs, Ops);
10826 FoldingSetInsertToken InsertToken;
10827 if (SDNode *E = lookupNode(ID, dl, InsertToken))
10828 return SDValue(E, 0);
10829
10830 LifetimeSDNode *N =
10831 newSDNode<LifetimeSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), VTs);
10832 createOperands(N, Ops);
10833 CSEMap.insert(N, InsertToken);
10834 InsertNode(N);
10835 SDValue V(N, 0);
10836 NewSDValueDbgMsg(V, "Creating new node: ", this);
10837 return V;
10838}
10839
10841 uint64_t Guid, uint64_t Index,
10842 uint32_t Attr) {
10843 const unsigned Opcode = ISD::PSEUDO_PROBE;
10844 const auto VTs = getVTList(MVT::Other);
10845 SDValue Ops[] = {Chain};
10846 SDNodeKey ID(Opcode, VTs, Ops);
10847 ID.AddInteger(Guid);
10848 ID.AddInteger(Index);
10849 ID.AddInteger(Attr);
10850 FoldingSetInsertToken InsertToken;
10851 if (SDNode *E = lookupNode(ID, Dl, InsertToken))
10852 return SDValue(E, 0);
10853
10854 auto *N = newSDNode<PseudoProbeSDNode>(
10855 Opcode, Dl.getIROrder(), Dl.getDebugLoc(), VTs, Guid, Index, Attr);
10856 createOperands(N, Ops);
10857 CSEMap.insert(N, InsertToken);
10858 InsertNode(N);
10859 SDValue V(N, 0);
10860 NewSDValueDbgMsg(V, "Creating new node: ", this);
10861 return V;
10862}
10863
10864/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10865/// MachinePointerInfo record from it. This is particularly useful because the
10866/// code generator has many cases where it doesn't bother passing in a
10867/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10869 SelectionDAG &DAG, SDValue Ptr,
10870 int64_t Offset = 0) {
10871 // If this is FI+Offset, we can model it.
10872 if (const FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr))
10874 FI->getIndex(), Offset);
10875
10876 // If this is (FI+Offset1)+Offset2, we can model it.
10877 if (Ptr.getOpcode() != ISD::ADD ||
10880 return Info;
10881
10882 int FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
10884 DAG.getMachineFunction(), FI,
10885 Offset + cast<ConstantSDNode>(Ptr.getOperand(1))->getSExtValue());
10886}
10887
10888/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10889/// MachinePointerInfo record from it. This is particularly useful because the
10890/// code generator has many cases where it doesn't bother passing in a
10891/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10893 SelectionDAG &DAG, SDValue Ptr,
10894 SDValue OffsetOp) {
10895 // If the 'Offset' value isn't a constant, we can't handle this.
10897 return InferPointerInfo(Info, DAG, Ptr, OffsetNode->getSExtValue());
10898 if (OffsetOp.isUndef())
10899 return InferPointerInfo(Info, DAG, Ptr);
10900 return Info;
10901}
10902
10904 EVT VT, const SDLoc &dl, SDValue Chain,
10905 SDValue Ptr, SDValue Offset,
10906 MachinePointerInfo PtrInfo, EVT MemVT,
10907 Align Alignment,
10908 MachineMemOperand::Flags MMOFlags,
10909 const MMOMetadata &Metadata) {
10910 assert(Chain.getValueType() == MVT::Other &&
10911 "Invalid chain type");
10912
10913 MMOFlags |= MachineMemOperand::MOLoad;
10914 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10915 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10916 // clients.
10917 if (PtrInfo.V.isNull())
10918 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10919
10920 TypeSize Size = MemVT.getStoreSize();
10922 MachineMemOperand *MMO =
10923 MF.getMachineMemOperand(PtrInfo, MMOFlags, Size, Alignment, Metadata);
10924 return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO);
10925}
10926
10928 EVT VT, const SDLoc &dl, SDValue Chain,
10929 SDValue Ptr, SDValue Offset, EVT MemVT,
10930 MachineMemOperand *MMO) {
10931 if (VT == MemVT) {
10932 ExtType = ISD::NON_EXTLOAD;
10933 } else if (ExtType == ISD::NON_EXTLOAD) {
10934 assert(VT == MemVT && "Non-extending load from different memory type!");
10935 } else {
10936 // Extending load.
10937 assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) &&
10938 "Should only be an extending load, not truncating!");
10939 assert(VT.isInteger() == MemVT.isInteger() &&
10940 "Cannot convert from FP to Int or Int -> FP!");
10941 assert(VT.isVector() == MemVT.isVector() &&
10942 "Cannot use an ext load to convert to or from a vector!");
10943 assert((!VT.isVector() ||
10945 "Cannot use an ext load to change the number of vector elements!");
10946 }
10947
10948 assert((!MMO->getRanges() ||
10950 ->getBitWidth() == MemVT.getScalarSizeInBits() &&
10951 MemVT.isInteger())) &&
10952 "Range metadata and load type must match!");
10953
10954 bool Indexed = AM != ISD::UNINDEXED;
10955 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
10956 "Unindexed load with an offset!");
10957
10958 SDVTList VTs = Indexed ?
10959 getVTList(VT, Ptr.getValueType(), MVT::Other) : getVTList(VT, MVT::Other);
10960 SDValue Ops[] = { Chain, Ptr, Offset };
10961 SDNodeKey ID(ISD::LOAD, VTs, Ops);
10962 ID.AddInteger(MemVT.getRawBits());
10963 ID.AddInteger(getSyntheticNodeSubclassData<LoadSDNode>(
10964 dl.getIROrder(), VTs, AM, ExtType, MemVT, MMO));
10965 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10966 ID.AddInteger(MMO->getFlags());
10967 FoldingSetInsertToken InsertToken;
10968 if (auto *E = cast_or_null<LoadSDNode>(lookupNode(ID, dl, InsertToken))) {
10969 E->refineAlignment(MMO);
10970 E->refineMMOMetadata(MMO);
10971 return SDValue(E, 0);
10972 }
10973 auto *N = newSDNode<LoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10974 ExtType, MemVT, MMO);
10975 createOperands(N, Ops);
10976
10977 CSEMap.insert(N, InsertToken);
10978 InsertNode(N);
10979 SDValue V(N, 0);
10980 NewSDValueDbgMsg(V, "Creating new node: ", this);
10981 return V;
10982}
10983
10985 SDValue Ptr, MachinePointerInfo PtrInfo,
10986 MaybeAlign Alignment,
10987 MachineMemOperand::Flags MMOFlags,
10988 const MMOMetadata &Metadata) {
10990 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10991 PtrInfo, VT, Alignment, MMOFlags, Metadata);
10992}
10993
10995 SDValue Ptr, MachineMemOperand *MMO) {
10997 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10998 VT, MMO);
10999}
11000
11002 EVT VT, SDValue Chain, SDValue Ptr,
11003 MachinePointerInfo PtrInfo, EVT MemVT,
11004 MaybeAlign Alignment,
11005 MachineMemOperand::Flags MMOFlags,
11006 const MMOMetadata &Metadata) {
11008 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, PtrInfo,
11009 MemVT, Alignment, MMOFlags, Metadata);
11010}
11011
11013 EVT VT, SDValue Chain, SDValue Ptr, EVT MemVT,
11014 MachineMemOperand *MMO) {
11016 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef,
11017 MemVT, MMO);
11018}
11019
11023 LoadSDNode *LD = cast<LoadSDNode>(OrigLoad);
11024 assert(LD->getOffset().getOpcode() == ISD::POISON &&
11025 "Load is already a indexed load!");
11026 // Don't propagate the invariant or dereferenceable flags.
11027 auto MMOFlags =
11028 LD->getMemOperand()->getFlags() &
11030 return getLoad(
11031 AM, LD->getExtensionType(), OrigLoad.getValueType(), dl, LD->getChain(),
11032 Base, Offset, LD->getPointerInfo(), LD->getMemoryVT(), LD->getAlign(),
11033 MMOFlags,
11034 MMOMetadata(LD->getAAInfo(), LD->getRanges(), LD->getMemCacheHint()));
11035}
11036
11038 SDValue Ptr, MachinePointerInfo PtrInfo,
11039 Align Alignment,
11040 MachineMemOperand::Flags MMOFlags,
11041 const MMOMetadata &Metadata) {
11042 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11043
11044 MMOFlags |= MachineMemOperand::MOStore;
11045 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
11046 assert(!Metadata.Ranges && "range metadata is invalid for stores");
11047
11048 if (PtrInfo.V.isNull())
11049 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
11050
11053 MachineMemOperand *MMO =
11054 MF.getMachineMemOperand(PtrInfo, MMOFlags, Size, Alignment, Metadata);
11055 return getStore(Chain, dl, Val, Ptr, MMO);
11056}
11057
11059 SDValue Ptr, MachineMemOperand *MMO) {
11061 return getStore(Chain, dl, Val, Ptr, Undef, Val.getValueType(), MMO,
11063}
11064
11066 SDValue Ptr, SDValue Offset, EVT SVT,
11068 bool IsTruncating) {
11069 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11070 EVT VT = Val.getValueType();
11071 if (VT == SVT) {
11072 IsTruncating = false;
11073 } else if (!IsTruncating) {
11074 assert(VT == SVT && "No-truncating store from different memory type!");
11075 } else {
11077 "Should only be a truncating store, not extending!");
11078 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
11079 assert(VT.isVector() == SVT.isVector() &&
11080 "Cannot use trunc store to convert to or from a vector!");
11081 assert((!VT.isVector() ||
11083 "Cannot use trunc store to change the number of vector elements!");
11084 }
11085
11086 bool Indexed = AM != ISD::UNINDEXED;
11087 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11088 "Unindexed store with an offset!");
11089 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
11090 : getVTList(MVT::Other);
11091 SDValue Ops[] = {Chain, Val, Ptr, Offset};
11092 SDNodeKey ID(ISD::STORE, VTs, Ops);
11093 ID.AddInteger(SVT.getRawBits());
11094 ID.AddInteger(getSyntheticNodeSubclassData<StoreSDNode>(
11095 dl.getIROrder(), VTs, AM, IsTruncating, SVT, MMO));
11096 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11097 ID.AddInteger(MMO->getFlags());
11098 FoldingSetInsertToken InsertToken;
11099 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11100 cast<StoreSDNode>(E)->refineAlignment(MMO);
11101 cast<StoreSDNode>(E)->refineMMOMetadata(MMO);
11102 return SDValue(E, 0);
11103 }
11104 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11105 IsTruncating, SVT, MMO);
11106 createOperands(N, Ops);
11107
11108 CSEMap.insert(N, InsertToken);
11109 InsertNode(N);
11110 SDValue V(N, 0);
11111 NewSDValueDbgMsg(V, "Creating new node: ", this);
11112 return V;
11113}
11114
11116 SDValue Ptr, SDValue Offset,
11117 MachinePointerInfo PtrInfo, EVT SVT,
11118 Align Alignment,
11119 MachineMemOperand::Flags MMOFlags,
11120 const MMOMetadata &Metadata) {
11121 assert(Chain.getValueType() == MVT::Other &&
11122 "Invalid chain type");
11123
11124 MMOFlags |= MachineMemOperand::MOStore;
11125 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
11126 assert(!Metadata.Ranges && "range metadata is invalid for stores");
11127
11128 if (PtrInfo.V.isNull())
11129 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
11130
11132 MachineMemOperand *MMO = MF.getMachineMemOperand(
11133 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, Metadata);
11134 return getTruncStore(Chain, dl, Val, Ptr, Offset, SVT, MMO);
11135}
11136
11138 SDValue Ptr, MachinePointerInfo PtrInfo,
11139 EVT SVT, Align Alignment,
11140 MachineMemOperand::Flags MMOFlags,
11141 const MMOMetadata &Metadata) {
11142 return getTruncStore(Chain, dl, Val, Ptr, getPOISON(Ptr.getValueType()),
11143 PtrInfo, SVT, Alignment, MMOFlags, Metadata);
11144}
11145
11147 SDValue Ptr, SDValue Offset, EVT SVT,
11148 MachineMemOperand *MMO) {
11149 return getStore(Chain, dl, Val, Ptr, Offset, SVT, MMO, ISD::UNINDEXED, true);
11150}
11151
11153 SDValue Ptr, EVT SVT,
11154 MachineMemOperand *MMO) {
11155 return getStore(Chain, dl, Val, Ptr, getPOISON(Ptr.getValueType()), SVT, MMO,
11156 ISD::UNINDEXED, true);
11157}
11158
11162 StoreSDNode *ST = cast<StoreSDNode>(OrigStore);
11163 assert(ST->getOffset().getOpcode() == ISD::POISON &&
11164 "Store is already a indexed store!");
11165 return getStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
11166 ST->getMemoryVT(), ST->getMemOperand(), AM,
11167 ST->isTruncatingStore());
11168}
11169
11171 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl,
11172 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL,
11173 MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment,
11174 MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo,
11175 const MDNode *Ranges, bool IsExpanding) {
11176 MMOFlags |= MachineMemOperand::MOLoad;
11177 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
11178 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
11179 // clients.
11180 if (PtrInfo.V.isNull())
11181 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
11182
11183 TypeSize Size = MemVT.getStoreSize();
11185 MachineMemOperand *MMO = MF.getMachineMemOperand(
11186 PtrInfo, MMOFlags, Size, Alignment, MMOMetadata(AAInfo, Ranges));
11187 return getLoadVP(AM, ExtType, VT, dl, Chain, Ptr, Offset, Mask, EVL, MemVT,
11188 MMO, IsExpanding);
11189}
11190
11192 ISD::LoadExtType ExtType, EVT VT,
11193 const SDLoc &dl, SDValue Chain, SDValue Ptr,
11194 SDValue Offset, SDValue Mask, SDValue EVL,
11195 EVT MemVT, MachineMemOperand *MMO,
11196 bool IsExpanding) {
11197 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11198 assert(Mask.getValueType().getVectorElementCount() ==
11199 VT.getVectorElementCount() &&
11200 "Vector width mismatch between mask and data");
11201
11202 bool Indexed = AM != ISD::UNINDEXED;
11203 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11204 "Unindexed load with an offset!");
11205
11206 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
11207 : getVTList(VT, MVT::Other);
11208 SDValue Ops[] = {Chain, Ptr, Offset, Mask, EVL};
11209 SDNodeKey ID(ISD::VP_LOAD, VTs, Ops);
11210 ID.AddInteger(MemVT.getRawBits());
11211 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadSDNode>(
11212 dl.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
11213 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11214 ID.AddInteger(MMO->getFlags());
11215 FoldingSetInsertToken InsertToken;
11216 if (auto *E = cast_or_null<VPLoadSDNode>(lookupNode(ID, dl, InsertToken))) {
11217 E->refineAlignment(MMO);
11218 E->refineMMOMetadata(MMO);
11219 return SDValue(E, 0);
11220 }
11221 auto *N = newSDNode<VPLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11222 ExtType, IsExpanding, MemVT, MMO);
11223 createOperands(N, Ops);
11224
11225 CSEMap.insert(N, InsertToken);
11226 InsertNode(N);
11227 SDValue V(N, 0);
11228 NewSDValueDbgMsg(V, "Creating new node: ", this);
11229 return V;
11230}
11231
11233 SDValue Ptr, SDValue Mask, SDValue EVL,
11234 MachinePointerInfo PtrInfo,
11235 MaybeAlign Alignment,
11236 MachineMemOperand::Flags MMOFlags,
11237 const AAMDNodes &AAInfo, const MDNode *Ranges,
11238 bool IsExpanding) {
11240 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
11241 Mask, EVL, PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges,
11242 IsExpanding);
11243}
11244
11246 SDValue Ptr, SDValue Mask, SDValue EVL,
11247 MachineMemOperand *MMO, bool IsExpanding) {
11249 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
11250 Mask, EVL, VT, MMO, IsExpanding);
11251}
11252
11254 EVT VT, SDValue Chain, SDValue Ptr,
11255 SDValue Mask, SDValue EVL,
11256 MachinePointerInfo PtrInfo, EVT MemVT,
11257 MaybeAlign Alignment,
11258 MachineMemOperand::Flags MMOFlags,
11259 const AAMDNodes &AAInfo, bool IsExpanding) {
11261 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
11262 EVL, PtrInfo, MemVT, Alignment, MMOFlags, AAInfo, nullptr,
11263 IsExpanding);
11264}
11265
11267 EVT VT, SDValue Chain, SDValue Ptr,
11268 SDValue Mask, SDValue EVL, EVT MemVT,
11269 MachineMemOperand *MMO, bool IsExpanding) {
11271 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
11272 EVL, MemVT, MMO, IsExpanding);
11273}
11274
11276 SDValue Ptr, SDValue Offset, SDValue Mask,
11277 SDValue EVL, EVT MemVT, MachineMemOperand *MMO,
11278 ISD::MemIndexedMode AM, bool IsTruncating,
11279 bool IsCompressing) {
11280 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11281 assert(Mask.getValueType().getVectorElementCount() ==
11283 "Vector width mismatch between mask and data");
11284
11285 bool Indexed = AM != ISD::UNINDEXED;
11286 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11287 "Unindexed vp_store with an offset!");
11288 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
11289 : getVTList(MVT::Other);
11290 SDValue Ops[] = {Chain, Val, Ptr, Offset, Mask, EVL};
11291 SDNodeKey ID(ISD::VP_STORE, VTs, Ops);
11292 ID.AddInteger(MemVT.getRawBits());
11293 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
11294 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11295 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11296 ID.AddInteger(MMO->getFlags());
11297 FoldingSetInsertToken InsertToken;
11298 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11299 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
11300 return SDValue(E, 0);
11301 }
11302 auto *N = newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11303 IsTruncating, IsCompressing, MemVT, MMO);
11304 createOperands(N, Ops);
11305
11306 CSEMap.insert(N, InsertToken);
11307 InsertNode(N);
11308 SDValue V(N, 0);
11309 NewSDValueDbgMsg(V, "Creating new node: ", this);
11310 return V;
11311}
11312
11314 SDValue Val, SDValue Ptr, SDValue Mask,
11315 SDValue EVL, MachinePointerInfo PtrInfo,
11316 EVT SVT, Align Alignment,
11317 MachineMemOperand::Flags MMOFlags,
11318 const AAMDNodes &AAInfo,
11319 bool IsCompressing) {
11320 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11321
11322 MMOFlags |= MachineMemOperand::MOStore;
11323 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
11324
11325 if (PtrInfo.V.isNull())
11326 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
11327
11329 MachineMemOperand *MMO = MF.getMachineMemOperand(
11330 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
11331 return getTruncStoreVP(Chain, dl, Val, Ptr, Mask, EVL, SVT, MMO,
11332 IsCompressing);
11333}
11334
11336 SDValue Val, SDValue Ptr, SDValue Mask,
11337 SDValue EVL, EVT SVT,
11338 MachineMemOperand *MMO,
11339 bool IsCompressing) {
11340 EVT VT = Val.getValueType();
11341
11342 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11343 if (VT == SVT)
11344 return getStoreVP(Chain, dl, Val, Ptr, getPOISON(Ptr.getValueType()), Mask,
11345 EVL, VT, MMO, ISD::UNINDEXED,
11346 /*IsTruncating*/ false, IsCompressing);
11347
11349 "Should only be a truncating store, not extending!");
11350 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
11351 assert(VT.isVector() == SVT.isVector() &&
11352 "Cannot use trunc store to convert to or from a vector!");
11353 assert((!VT.isVector() ||
11355 "Cannot use trunc store to change the number of vector elements!");
11356
11357 SDVTList VTs = getVTList(MVT::Other);
11359 SDValue Ops[] = {Chain, Val, Ptr, Undef, Mask, EVL};
11360 SDNodeKey ID(ISD::VP_STORE, VTs, Ops);
11361 ID.AddInteger(SVT.getRawBits());
11362 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
11363 dl.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
11364 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11365 ID.AddInteger(MMO->getFlags());
11366 FoldingSetInsertToken InsertToken;
11367 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11368 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
11369 return SDValue(E, 0);
11370 }
11371 auto *N =
11372 newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11373 ISD::UNINDEXED, true, IsCompressing, SVT, MMO);
11374 createOperands(N, Ops);
11375
11376 CSEMap.insert(N, InsertToken);
11377 InsertNode(N);
11378 SDValue V(N, 0);
11379 NewSDValueDbgMsg(V, "Creating new node: ", this);
11380 return V;
11381}
11382
11384 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL,
11385 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask,
11386 SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding) {
11387 bool Indexed = AM != ISD::UNINDEXED;
11388 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11389 "Unindexed load with an offset!");
11390
11391 SDValue Ops[] = {Chain, Ptr, Offset, Stride, Mask, EVL};
11392 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
11393 : getVTList(VT, MVT::Other);
11394 SDNodeKey ID(ISD::EXPERIMENTAL_VP_STRIDED_LOAD, VTs, Ops);
11395 ID.AddInteger(MemVT.getRawBits());
11396 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedLoadSDNode>(
11397 DL.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
11398 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11399
11400 FoldingSetInsertToken InsertToken;
11401 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
11402 cast<VPStridedLoadSDNode>(E)->refineAlignment(MMO);
11403 return SDValue(E, 0);
11404 }
11405
11406 auto *N =
11407 newSDNode<VPStridedLoadSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, AM,
11408 ExtType, IsExpanding, MemVT, MMO);
11409 createOperands(N, Ops);
11410 CSEMap.insert(N, InsertToken);
11411 InsertNode(N);
11412 SDValue V(N, 0);
11413 NewSDValueDbgMsg(V, "Creating new node: ", this);
11414 return V;
11415}
11416
11418 SDValue Ptr, SDValue Stride,
11419 SDValue Mask, SDValue EVL,
11420 MachineMemOperand *MMO,
11421 bool IsExpanding) {
11423 return getStridedLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, DL, Chain, Ptr,
11424 Undef, Stride, Mask, EVL, VT, MMO, IsExpanding);
11425}
11426
11428 ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain,
11429 SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT,
11430 MachineMemOperand *MMO, bool IsExpanding) {
11432 return getStridedLoadVP(ISD::UNINDEXED, ExtType, VT, DL, Chain, Ptr, Undef,
11433 Stride, Mask, EVL, MemVT, MMO, IsExpanding);
11434}
11435
11437 SDValue Val, SDValue Ptr,
11438 SDValue Offset, SDValue Stride,
11439 SDValue Mask, SDValue EVL, EVT MemVT,
11440 MachineMemOperand *MMO,
11442 bool IsTruncating, bool IsCompressing) {
11443 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11444 bool Indexed = AM != ISD::UNINDEXED;
11445 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11446 "Unindexed vp_store with an offset!");
11447 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
11448 : getVTList(MVT::Other);
11449 SDValue Ops[] = {Chain, Val, Ptr, Offset, Stride, Mask, EVL};
11450 SDNodeKey ID(ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
11451 ID.AddInteger(MemVT.getRawBits());
11452 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
11453 DL.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11454 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11455 FoldingSetInsertToken InsertToken;
11456 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
11457 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
11458 return SDValue(E, 0);
11459 }
11460 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
11461 VTs, AM, IsTruncating,
11462 IsCompressing, MemVT, MMO);
11463 createOperands(N, Ops);
11464
11465 CSEMap.insert(N, InsertToken);
11466 InsertNode(N);
11467 SDValue V(N, 0);
11468 NewSDValueDbgMsg(V, "Creating new node: ", this);
11469 return V;
11470}
11471
11474 ISD::MemIndexType IndexType) {
11475 assert(Ops.size() == 6 && "Incompatible number of operands");
11476
11477 SDNodeKey ID(ISD::VP_GATHER, VTs, Ops);
11478 ID.AddInteger(VT.getRawBits());
11479 ID.AddInteger(getSyntheticNodeSubclassData<VPGatherSDNode>(
11480 dl.getIROrder(), VTs, VT, MMO, IndexType));
11481 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11482 ID.AddInteger(MMO->getFlags());
11483 FoldingSetInsertToken InsertToken;
11484 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11485 cast<VPGatherSDNode>(E)->refineAlignment(MMO);
11486 return SDValue(E, 0);
11487 }
11488
11489 auto *N = newSDNode<VPGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11490 VT, MMO, IndexType);
11491 createOperands(N, Ops);
11492
11493 assert(N->getMask().getValueType().getVectorElementCount() ==
11494 N->getValueType(0).getVectorElementCount() &&
11495 "Vector width mismatch between mask and data");
11496 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11497 N->getValueType(0).getVectorElementCount().isScalable() &&
11498 "Scalable flags of index and data do not match");
11500 N->getIndex().getValueType().getVectorElementCount(),
11501 N->getValueType(0).getVectorElementCount()) &&
11502 "Vector width mismatch between index and data");
11503 assert(isa<ConstantSDNode>(N->getScale()) &&
11504 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11505 "Scale should be a constant power of 2");
11506
11507 CSEMap.insert(N, InsertToken);
11508 InsertNode(N);
11509 SDValue V(N, 0);
11510 NewSDValueDbgMsg(V, "Creating new node: ", this);
11511 return V;
11512}
11513
11516 MachineMemOperand *MMO,
11517 ISD::MemIndexType IndexType) {
11518 assert(Ops.size() == 7 && "Incompatible number of operands");
11519
11520 SDNodeKey ID(ISD::VP_SCATTER, VTs, Ops);
11521 ID.AddInteger(VT.getRawBits());
11522 ID.AddInteger(getSyntheticNodeSubclassData<VPScatterSDNode>(
11523 dl.getIROrder(), VTs, VT, MMO, IndexType));
11524 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11525 ID.AddInteger(MMO->getFlags());
11526 FoldingSetInsertToken InsertToken;
11527 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11528 cast<VPScatterSDNode>(E)->refineAlignment(MMO);
11529 return SDValue(E, 0);
11530 }
11531 auto *N = newSDNode<VPScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11532 VT, MMO, IndexType);
11533 createOperands(N, Ops);
11534
11535 assert(N->getMask().getValueType().getVectorElementCount() ==
11536 N->getValue().getValueType().getVectorElementCount() &&
11537 "Vector width mismatch between mask and data");
11538 assert(
11539 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11540 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11541 "Scalable flags of index and data do not match");
11543 N->getIndex().getValueType().getVectorElementCount(),
11544 N->getValue().getValueType().getVectorElementCount()) &&
11545 "Vector width mismatch between index and data");
11546 assert(isa<ConstantSDNode>(N->getScale()) &&
11547 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11548 "Scale should be a constant power of 2");
11549
11550 CSEMap.insert(N, InsertToken);
11551 InsertNode(N);
11552 SDValue V(N, 0);
11553 NewSDValueDbgMsg(V, "Creating new node: ", this);
11554 return V;
11555}
11556
11559 SDValue PassThru, EVT MemVT,
11560 MachineMemOperand *MMO,
11562 ISD::LoadExtType ExtTy, bool isExpanding) {
11563 bool Indexed = AM != ISD::UNINDEXED;
11564 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11565 "Unindexed masked load with an offset!");
11566 SDVTList VTs = Indexed ? getVTList(VT, Base.getValueType(), MVT::Other)
11567 : getVTList(VT, MVT::Other);
11568 SDValue Ops[] = {Chain, Base, Offset, Mask, PassThru};
11569 SDNodeKey ID(ISD::MLOAD, VTs, Ops);
11570 ID.AddInteger(MemVT.getRawBits());
11571 ID.AddInteger(getSyntheticNodeSubclassData<MaskedLoadSDNode>(
11572 dl.getIROrder(), VTs, AM, ExtTy, isExpanding, MemVT, MMO));
11573 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11574 ID.AddInteger(MMO->getFlags());
11575 FoldingSetInsertToken InsertToken;
11576 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11577 cast<MaskedLoadSDNode>(E)->refineAlignment(MMO);
11578 return SDValue(E, 0);
11579 }
11580 auto *N = newSDNode<MaskedLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11581 AM, ExtTy, isExpanding, MemVT, MMO);
11582 createOperands(N, Ops);
11583
11584 CSEMap.insert(N, InsertToken);
11585 InsertNode(N);
11586 SDValue V(N, 0);
11587 NewSDValueDbgMsg(V, "Creating new node: ", this);
11588 return V;
11589}
11590
11595 assert(LD->getOffset().getOpcode() == ISD::POISON &&
11596 "Masked load is already a indexed load!");
11597 return getMaskedLoad(OrigLoad.getValueType(), dl, LD->getChain(), Base,
11598 Offset, LD->getMask(), LD->getPassThru(),
11599 LD->getMemoryVT(), LD->getMemOperand(), AM,
11600 LD->getExtensionType(), LD->isExpandingLoad());
11601}
11602
11605 SDValue Mask, EVT MemVT,
11606 MachineMemOperand *MMO,
11607 ISD::MemIndexedMode AM, bool IsTruncating,
11608 bool IsCompressing) {
11609 assert(Chain.getValueType() == MVT::Other &&
11610 "Invalid chain type");
11611 bool Indexed = AM != ISD::UNINDEXED;
11612 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11613 "Unindexed masked store with an offset!");
11614 SDVTList VTs = Indexed ? getVTList(Base.getValueType(), MVT::Other)
11615 : getVTList(MVT::Other);
11616 SDValue Ops[] = {Chain, Val, Base, Offset, Mask};
11617 SDNodeKey ID(ISD::MSTORE, VTs, Ops);
11618 ID.AddInteger(MemVT.getRawBits());
11619 ID.AddInteger(getSyntheticNodeSubclassData<MaskedStoreSDNode>(
11620 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11621 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11622 ID.AddInteger(MMO->getFlags());
11623 FoldingSetInsertToken InsertToken;
11624 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11625 cast<MaskedStoreSDNode>(E)->refineAlignment(MMO);
11626 return SDValue(E, 0);
11627 }
11628 auto *N =
11629 newSDNode<MaskedStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11630 IsTruncating, IsCompressing, MemVT, MMO);
11631 createOperands(N, Ops);
11632
11633 CSEMap.insert(N, InsertToken);
11634 InsertNode(N);
11635 SDValue V(N, 0);
11636 NewSDValueDbgMsg(V, "Creating new node: ", this);
11637 return V;
11638}
11639
11644 assert(ST->getOffset().getOpcode() == ISD::POISON &&
11645 "Masked store is already a indexed store!");
11646 return getMaskedStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
11647 ST->getMask(), ST->getMemoryVT(), ST->getMemOperand(),
11648 AM, ST->isTruncatingStore(), ST->isCompressingStore());
11649}
11650
11653 MachineMemOperand *MMO,
11654 ISD::MemIndexType IndexType,
11655 ISD::LoadExtType ExtTy) {
11656 assert(Ops.size() == 6 && "Incompatible number of operands");
11657
11658 SDNodeKey ID(ISD::MGATHER, VTs, Ops);
11659 ID.AddInteger(MemVT.getRawBits());
11660 ID.AddInteger(getSyntheticNodeSubclassData<MaskedGatherSDNode>(
11661 dl.getIROrder(), VTs, MemVT, MMO, IndexType, ExtTy));
11662 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11663 ID.AddInteger(MMO->getFlags());
11664 FoldingSetInsertToken InsertToken;
11665 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11666 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11667 return SDValue(E, 0);
11668 }
11669
11670 auto *N = newSDNode<MaskedGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11671 VTs, MemVT, MMO, IndexType, ExtTy);
11672 createOperands(N, Ops);
11673
11674 assert(N->getPassThru().getValueType() == N->getValueType(0) &&
11675 "Incompatible type of the PassThru value in MaskedGatherSDNode");
11676 assert(N->getMask().getValueType().getVectorElementCount() ==
11677 N->getValueType(0).getVectorElementCount() &&
11678 "Vector width mismatch between mask and data");
11679 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11680 N->getValueType(0).getVectorElementCount().isScalable() &&
11681 "Scalable flags of index and data do not match");
11683 N->getIndex().getValueType().getVectorElementCount(),
11684 N->getValueType(0).getVectorElementCount()) &&
11685 "Vector width mismatch between index and data");
11686 assert(isa<ConstantSDNode>(N->getScale()) &&
11687 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11688 "Scale should be a constant power of 2");
11689
11690 CSEMap.insert(N, InsertToken);
11691 InsertNode(N);
11692 SDValue V(N, 0);
11693 NewSDValueDbgMsg(V, "Creating new node: ", this);
11694 return V;
11695}
11696
11699 MachineMemOperand *MMO,
11700 ISD::MemIndexType IndexType,
11701 bool IsTrunc) {
11702 assert(Ops.size() == 6 && "Incompatible number of operands");
11703
11704 SDNodeKey ID(ISD::MSCATTER, VTs, Ops);
11705 ID.AddInteger(MemVT.getRawBits());
11706 ID.AddInteger(getSyntheticNodeSubclassData<MaskedScatterSDNode>(
11707 dl.getIROrder(), VTs, MemVT, MMO, IndexType, IsTrunc));
11708 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11709 ID.AddInteger(MMO->getFlags());
11710 FoldingSetInsertToken InsertToken;
11711 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11712 cast<MaskedScatterSDNode>(E)->refineAlignment(MMO);
11713 return SDValue(E, 0);
11714 }
11715
11716 auto *N = newSDNode<MaskedScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11717 VTs, MemVT, MMO, IndexType, IsTrunc);
11718 createOperands(N, Ops);
11719
11720 assert(N->getMask().getValueType().getVectorElementCount() ==
11721 N->getValue().getValueType().getVectorElementCount() &&
11722 "Vector width mismatch between mask and data");
11723 assert(
11724 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11725 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11726 "Scalable flags of index and data do not match");
11728 N->getIndex().getValueType().getVectorElementCount(),
11729 N->getValue().getValueType().getVectorElementCount()) &&
11730 "Vector width mismatch between index and data");
11731 assert(isa<ConstantSDNode>(N->getScale()) &&
11732 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11733 "Scale should be a constant power of 2");
11734
11735 CSEMap.insert(N, InsertToken);
11736 InsertNode(N);
11737 SDValue V(N, 0);
11738 NewSDValueDbgMsg(V, "Creating new node: ", this);
11739 return V;
11740}
11741
11743 const SDLoc &dl, ArrayRef<SDValue> Ops,
11744 MachineMemOperand *MMO,
11745 ISD::MemIndexType IndexType) {
11746 assert(Ops.size() == 7 && "Incompatible number of operands");
11747
11749 ID.AddInteger(MemVT.getRawBits());
11750 ID.AddInteger(getSyntheticNodeSubclassData<MaskedHistogramSDNode>(
11751 dl.getIROrder(), VTs, MemVT, MMO, IndexType));
11752 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11753 ID.AddInteger(MMO->getFlags());
11754 FoldingSetInsertToken InsertToken;
11755 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11756 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11757 return SDValue(E, 0);
11758 }
11759
11760 auto *N = newSDNode<MaskedHistogramSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11761 VTs, MemVT, MMO, IndexType);
11762 createOperands(N, Ops);
11763
11764 assert(N->getMask().getValueType().getVectorElementCount() ==
11765 N->getIndex().getValueType().getVectorElementCount() &&
11766 "Vector width mismatch between mask and data");
11767 assert(isa<ConstantSDNode>(N->getScale()) &&
11768 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11769 "Scale should be a constant power of 2");
11770 assert(N->getInc().getValueType().isInteger() && "Non integer update value");
11771
11772 CSEMap.insert(N, InsertToken);
11773 InsertNode(N);
11774 SDValue V(N, 0);
11775 NewSDValueDbgMsg(V, "Creating new node: ", this);
11776 return V;
11777}
11778
11780 SDValue Ptr, SDValue Mask, SDValue EVL,
11781 MachineMemOperand *MMO) {
11782 SDVTList VTs = getVTList(VT, EVL.getValueType(), MVT::Other);
11783 SDValue Ops[] = {Chain, Ptr, Mask, EVL};
11784 SDNodeKey ID(ISD::VP_LOAD_FF, VTs, Ops);
11785 ID.AddInteger(VT.getRawBits());
11786 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadFFSDNode>(DL.getIROrder(),
11787 VTs, VT, MMO));
11788 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11789 ID.AddInteger(MMO->getFlags());
11790 FoldingSetInsertToken InsertToken;
11791 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
11792 cast<VPLoadFFSDNode>(E)->refineAlignment(MMO);
11793 return SDValue(E, 0);
11794 }
11795 auto *N = newSDNode<VPLoadFFSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs,
11796 VT, MMO);
11797 createOperands(N, Ops);
11798
11799 CSEMap.insert(N, InsertToken);
11800 InsertNode(N);
11801 SDValue V(N, 0);
11802 NewSDValueDbgMsg(V, "Creating new node: ", this);
11803 return V;
11804}
11805
11807 EVT MemVT, MachineMemOperand *MMO) {
11808 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11809 SDVTList VTs = getVTList(MVT::Other);
11810 SDValue Ops[] = {Chain, Ptr};
11812 ID.AddInteger(MemVT.getRawBits());
11813 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11814 ISD::GET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11815 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11816 ID.AddInteger(MMO->getFlags());
11817 FoldingSetInsertToken InsertToken;
11818 if (SDNode *E = lookupNode(ID, dl, InsertToken))
11819 return SDValue(E, 0);
11820
11821 auto *N = newSDNode<FPStateAccessSDNode>(ISD::GET_FPENV_MEM, dl.getIROrder(),
11822 dl.getDebugLoc(), VTs, MemVT, MMO);
11823 createOperands(N, Ops);
11824
11825 CSEMap.insert(N, InsertToken);
11826 InsertNode(N);
11827 SDValue V(N, 0);
11828 NewSDValueDbgMsg(V, "Creating new node: ", this);
11829 return V;
11830}
11831
11833 EVT MemVT, MachineMemOperand *MMO) {
11834 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11835 SDVTList VTs = getVTList(MVT::Other);
11836 SDValue Ops[] = {Chain, Ptr};
11838 ID.AddInteger(MemVT.getRawBits());
11839 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11840 ISD::SET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11841 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11842 ID.AddInteger(MMO->getFlags());
11843 FoldingSetInsertToken InsertToken;
11844 if (SDNode *E = lookupNode(ID, dl, InsertToken))
11845 return SDValue(E, 0);
11846
11847 auto *N = newSDNode<FPStateAccessSDNode>(ISD::SET_FPENV_MEM, dl.getIROrder(),
11848 dl.getDebugLoc(), VTs, MemVT, MMO);
11849 createOperands(N, Ops);
11850
11851 CSEMap.insert(N, InsertToken);
11852 InsertNode(N);
11853 SDValue V(N, 0);
11854 NewSDValueDbgMsg(V, "Creating new node: ", this);
11855 return V;
11856}
11857
11859 // select undef, T, F --> T (if T is a constant), otherwise F
11860 // select, ?, undef, F --> F
11861 // select, ?, T, undef --> T
11862 if (Cond.isUndef())
11863 return isConstantValueOfAnyType(T) ? T : F;
11864 if (T.isUndef())
11866 if (F.isUndef())
11868
11869 // select true, T, F --> T
11870 // select false, T, F --> F
11871 if (auto C = isBoolConstant(Cond))
11872 return *C ? T : F;
11873
11874 // select ?, T, T --> T
11875 if (T == F)
11876 return T;
11877
11878 return SDValue();
11879}
11880
11882 // shift undef, Y --> 0 (can always assume that the undef value is 0)
11883 if (X.isUndef())
11884 return getConstant(0, SDLoc(X.getNode()), X.getValueType());
11885 // shift X, undef --> undef (because it may shift by the bitwidth)
11886 if (Y.isUndef())
11887 return getUNDEF(X.getValueType());
11888
11889 // shift 0, Y --> 0
11890 // shift X, 0 --> X
11892 return X;
11893
11894 // shift X, C >= bitwidth(X) --> undef
11895 // All vector elements must be too big (or undef) to avoid partial undefs.
11896 auto isShiftTooBig = [X](ConstantSDNode *Val) {
11897 return !Val || Val->getAPIntValue().uge(X.getScalarValueSizeInBits());
11898 };
11899 if (ISD::matchUnaryPredicate(Y, isShiftTooBig, true))
11900 return getUNDEF(X.getValueType());
11901
11902 // shift i1/vXi1 X, Y --> X (any non-zero shift amount is undefined).
11903 if (X.getValueType().getScalarType() == MVT::i1)
11904 return X;
11905
11906 return SDValue();
11907}
11908
11910 SDNodeFlags Flags) {
11911 // If this operation has 'nnan' or 'ninf' and at least 1 disallowed operand
11912 // (an undef operand can be chosen to be Nan/Inf), then the result of this
11913 // operation is poison. That result can be relaxed to undef.
11914 ConstantFPSDNode *XC = isConstOrConstSplatFP(X, /* AllowUndefs */ true);
11915 ConstantFPSDNode *YC = isConstOrConstSplatFP(Y, /* AllowUndefs */ true);
11916 bool HasNan = (XC && XC->getValueAPF().isNaN()) ||
11917 (YC && YC->getValueAPF().isNaN());
11918 bool HasInf = (XC && XC->getValueAPF().isInfinity()) ||
11919 (YC && YC->getValueAPF().isInfinity());
11920
11921 if (Flags.hasNoNaNs() && (HasNan || X.isUndef() || Y.isUndef()))
11922 return getUNDEF(X.getValueType());
11923
11924 if (Flags.hasNoInfs() && (HasInf || X.isUndef() || Y.isUndef()))
11925 return getUNDEF(X.getValueType());
11926
11927 if (!YC)
11928 return SDValue();
11929
11930 // X + -0.0 --> X
11931 if (Opcode == ISD::FADD)
11932 if (YC->getValueAPF().isNegZero())
11933 return X;
11934
11935 // X - +0.0 --> X
11936 if (Opcode == ISD::FSUB)
11937 if (YC->getValueAPF().isPosZero())
11938 return X;
11939
11940 // X * 1.0 --> X
11941 // X / 1.0 --> X
11942 if (Opcode == ISD::FMUL || Opcode == ISD::FDIV)
11943 if (YC->getValueAPF().isOne())
11944 return X;
11945
11946 // X * 0.0 --> 0.0
11947 if (Opcode == ISD::FMUL && Flags.hasNoNaNs() && Flags.hasNoSignedZeros())
11948 if (YC->getValueAPF().isZero())
11949 return getConstantFP(0.0, SDLoc(Y), Y.getValueType());
11950
11951 return SDValue();
11952}
11953
11955 SDValue Ptr, SDValue SV, unsigned Align) {
11956 SDValue Ops[] = { Chain, Ptr, SV, getTargetConstant(Align, dl, MVT::i32) };
11957 return getNode(ISD::VAARG, dl, getVTList(VT, MVT::Other), Ops);
11958}
11959
11960SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11962 switch (Ops.size()) {
11963 case 0: return getNode(Opcode, DL, VT);
11964 case 1: return getNode(Opcode, DL, VT, Ops[0].get());
11965 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]);
11966 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]);
11967 default: break;
11968 }
11969
11970 // Copy from an SDUse array into an SDValue array for use with
11971 // the regular getNode logic.
11973 return getNode(Opcode, DL, VT, NewOps);
11974}
11975
11976SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11978 SDNodeFlags Flags;
11979 if (Inserter)
11980 Flags = Inserter->getFlags();
11981 return getNode(Opcode, DL, VT, Ops, Flags);
11982}
11983
11984SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11985 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11986 unsigned NumOps = Ops.size();
11987 switch (NumOps) {
11988 case 0: return getNode(Opcode, DL, VT);
11989 case 1: return getNode(Opcode, DL, VT, Ops[0], Flags);
11990 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Flags);
11991 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2], Flags);
11992 default: break;
11993 }
11994
11995#ifndef NDEBUG
11996 for (const auto &Op : Ops)
11997 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11998 "Operand is DELETED_NODE!");
11999#endif
12000
12001 switch (Opcode) {
12002 default: break;
12003 case ISD::BUILD_VECTOR:
12004 // Attempt to simplify BUILD_VECTOR.
12005 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
12006 return V;
12007 break;
12009 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
12010 return V;
12011 break;
12012 case ISD::SELECT_CC:
12013 assert(NumOps == 5 && "SELECT_CC takes 5 operands!");
12014 assert(Ops[0].getValueType() == Ops[1].getValueType() &&
12015 "LHS and RHS of condition must have same type!");
12016 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
12017 "True and False arms of SelectCC must have same type!");
12018 assert(Ops[2].getValueType() == VT &&
12019 "select_cc node must be of same type as true and false value!");
12020 assert((!Ops[0].getValueType().isVector() ||
12021 Ops[0].getValueType().getVectorElementCount() ==
12022 VT.getVectorElementCount()) &&
12023 "Expected select_cc with vector result to have the same sized "
12024 "comparison type!");
12025 break;
12026 case ISD::BR_CC:
12027 assert(NumOps == 5 && "BR_CC takes 5 operands!");
12028 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
12029 "LHS/RHS of comparison should match types!");
12030 break;
12031 case ISD::VP_REDUCE_MUL:
12032 // If it is VP_REDUCE_MUL mask operation then turn it to VP_REDUCE_AND
12033 if (VT == MVT::i1)
12034 Opcode = ISD::VP_REDUCE_AND;
12035 break;
12036 case ISD::VP_REDUCE_ADD:
12037 // If it is VP_REDUCE_ADD mask operation then turn it to VP_REDUCE_XOR
12038 if (VT == MVT::i1)
12039 Opcode = ISD::VP_REDUCE_XOR;
12040 break;
12041 case ISD::VP_REDUCE_SMAX:
12042 case ISD::VP_REDUCE_UMIN:
12043 // If it is VP_REDUCE_SMAX/VP_REDUCE_UMIN mask operation then turn it to
12044 // VP_REDUCE_AND.
12045 if (VT == MVT::i1)
12046 Opcode = ISD::VP_REDUCE_AND;
12047 break;
12048 case ISD::VP_REDUCE_SMIN:
12049 case ISD::VP_REDUCE_UMAX:
12050 // If it is VP_REDUCE_SMIN/VP_REDUCE_UMAX mask operation then turn it to
12051 // VP_REDUCE_OR.
12052 if (VT == MVT::i1)
12053 Opcode = ISD::VP_REDUCE_OR;
12054 break;
12055 }
12056
12057 // Memoize nodes.
12058 SDNode *N;
12059 SDVTList VTs = getVTList(VT);
12060
12061 if (VT != MVT::Glue) {
12062 SDNodeKey ID(Opcode, VTs, Ops);
12063 FoldingSetInsertToken InsertToken;
12064
12065 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
12066 E->intersectFlagsWith(Flags);
12067 return SDValue(E, 0);
12068 }
12069
12070 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
12071 createOperands(N, Ops);
12072
12073 CSEMap.insert(N, InsertToken);
12074 } else {
12075 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
12076 createOperands(N, Ops);
12077 }
12078
12079 N->setFlags(Flags);
12080 InsertNode(N);
12081 SDValue V(N, 0);
12082 NewSDValueDbgMsg(V, "Creating new node: ", this);
12083 return V;
12084}
12085
12086SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
12087 ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops) {
12088 SDNodeFlags Flags;
12089 if (Inserter)
12090 Flags = Inserter->getFlags();
12091 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
12092}
12093
12094SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
12096 const SDNodeFlags Flags) {
12097 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
12098}
12099
12100SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12102 SDNodeFlags Flags;
12103 if (Inserter)
12104 Flags = Inserter->getFlags();
12105 return getNode(Opcode, DL, VTList, Ops, Flags);
12106}
12107
12108SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12109 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
12110 if (VTList.NumVTs == 1)
12111 return getNode(Opcode, DL, VTList.VTs[0], Ops, Flags);
12112
12113#ifndef NDEBUG
12114 for (const auto &Op : Ops)
12115 assert(Op.getOpcode() != ISD::DELETED_NODE &&
12116 "Operand is DELETED_NODE!");
12117#endif
12118
12119 if (SDValue V = FoldConstantArithmetic(Opcode, DL, VTList, Ops, Flags))
12120 return V;
12121
12122 switch (Opcode) {
12123 case ISD::SADDO:
12124 case ISD::UADDO:
12125 case ISD::SSUBO:
12126 case ISD::USUBO: {
12127 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
12128 "Invalid add/sub overflow op!");
12129 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
12130 Ops[0].getValueType() == Ops[1].getValueType() &&
12131 Ops[0].getValueType() == VTList.VTs[0] &&
12132 "Binary operator types must match!");
12133 SDValue N1 = Ops[0], N2 = Ops[1];
12134 canonicalizeCommutativeBinop(Opcode, N1, N2);
12135
12136 // (X +- 0) -> X with zero-overflow.
12137 ConstantSDNode *N2CV = isConstOrConstSplat(N2, /*AllowUndefs*/ false,
12138 /*AllowTruncation*/ true);
12139 if (N2CV && N2CV->isZero()) {
12140 SDValue ZeroOverFlow = getConstant(0, DL, VTList.VTs[1]);
12141 return getNode(ISD::MERGE_VALUES, DL, VTList, {N1, ZeroOverFlow}, Flags);
12142 }
12143
12144 if (VTList.VTs[0].getScalarType() == MVT::i1 &&
12145 VTList.VTs[1].getScalarType() == MVT::i1) {
12146 SDValue F1 = getFreeze(N1);
12147 SDValue F2 = getFreeze(N2);
12148 // {vXi1,vXi1} (u/s)addo(vXi1 x, vXi1y) -> {xor(x,y),and(x,y)}
12149 if (Opcode == ISD::UADDO || Opcode == ISD::SADDO)
12150 return getNode(ISD::MERGE_VALUES, DL, VTList,
12151 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
12152 getNode(ISD::AND, DL, VTList.VTs[1], F1, F2)},
12153 Flags);
12154 // {vXi1,vXi1} (u/s)subo(vXi1 x, vXi1y) -> {xor(x,y),and(~x,y)}
12155 if (Opcode == ISD::USUBO || Opcode == ISD::SSUBO) {
12156 SDValue NotF1 = getNOT(DL, F1, VTList.VTs[0]);
12157 return getNode(ISD::MERGE_VALUES, DL, VTList,
12158 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
12159 getNode(ISD::AND, DL, VTList.VTs[1], NotF1, F2)},
12160 Flags);
12161 }
12162 }
12163 break;
12164 }
12165 case ISD::SADDO_CARRY:
12166 case ISD::UADDO_CARRY:
12167 case ISD::SSUBO_CARRY:
12168 case ISD::USUBO_CARRY:
12169 assert(VTList.NumVTs == 2 && Ops.size() == 3 &&
12170 "Invalid add/sub overflow op!");
12171 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
12172 Ops[0].getValueType() == Ops[1].getValueType() &&
12173 Ops[0].getValueType() == VTList.VTs[0] &&
12174 Ops[2].getValueType() == VTList.VTs[1] &&
12175 "Binary operator types must match!");
12176 break;
12177 case ISD::SMUL_LOHI:
12178 case ISD::UMUL_LOHI: {
12179 assert(VTList.NumVTs == 2 && Ops.size() == 2 && "Invalid mul lo/hi op!");
12180 assert(VTList.VTs[0].isInteger() && VTList.VTs[0] == VTList.VTs[1] &&
12181 VTList.VTs[0] == Ops[0].getValueType() &&
12182 VTList.VTs[0] == Ops[1].getValueType() &&
12183 "Binary operator types must match!");
12184 // Constant fold.
12187 if (LHS && RHS) {
12188 unsigned Width = VTList.VTs[0].getScalarSizeInBits();
12189 unsigned OutWidth = Width * 2;
12190 APInt Val = LHS->getAPIntValue();
12191 APInt Mul = RHS->getAPIntValue();
12192 if (Opcode == ISD::SMUL_LOHI) {
12193 Val = Val.sext(OutWidth);
12194 Mul = Mul.sext(OutWidth);
12195 } else {
12196 Val = Val.zext(OutWidth);
12197 Mul = Mul.zext(OutWidth);
12198 }
12199 Val *= Mul;
12200
12201 SDValue Hi =
12202 getConstant(Val.extractBits(Width, Width), DL, VTList.VTs[0]);
12203 SDValue Lo = getConstant(Val.trunc(Width), DL, VTList.VTs[0]);
12204 return getNode(ISD::MERGE_VALUES, DL, VTList, {Lo, Hi}, Flags);
12205 }
12206 break;
12207 }
12208 case ISD::FFREXP: {
12209 assert(VTList.NumVTs == 2 && Ops.size() == 1 && "Invalid ffrexp op!");
12210 assert(VTList.VTs[0].isFloatingPoint() && VTList.VTs[1].isInteger() &&
12211 VTList.VTs[0] == Ops[0].getValueType() && "frexp type mismatch");
12212
12214 int FrexpExp;
12215 APFloat FrexpMant =
12216 frexp(C->getValueAPF(), FrexpExp, APFloat::rmNearestTiesToEven);
12217 SDValue Result0 = getConstantFP(FrexpMant, DL, VTList.VTs[0]);
12218 SDValue Result1 = getSignedConstant(FrexpMant.isFinite() ? FrexpExp : 0,
12219 DL, VTList.VTs[1]);
12220 return getNode(ISD::MERGE_VALUES, DL, VTList, {Result0, Result1}, Flags);
12221 }
12222
12223 break;
12224 }
12226 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
12227 "Invalid STRICT_FP_EXTEND!");
12228 assert(VTList.VTs[0].isFloatingPoint() &&
12229 Ops[1].getValueType().isFloatingPoint() && "Invalid FP cast!");
12230 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
12231 "STRICT_FP_EXTEND result type should be vector iff the operand "
12232 "type is vector!");
12233 assert((!VTList.VTs[0].isVector() ||
12234 VTList.VTs[0].getVectorElementCount() ==
12235 Ops[1].getValueType().getVectorElementCount()) &&
12236 "Vector element count mismatch!");
12237 assert(Ops[1].getValueType().bitsLT(VTList.VTs[0]) &&
12238 "Invalid fpext node, dst <= src!");
12239 break;
12241 assert(VTList.NumVTs == 2 && Ops.size() == 3 && "Invalid STRICT_FP_ROUND!");
12242 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
12243 "STRICT_FP_ROUND result type should be vector iff the operand "
12244 "type is vector!");
12245 assert((!VTList.VTs[0].isVector() ||
12246 VTList.VTs[0].getVectorElementCount() ==
12247 Ops[1].getValueType().getVectorElementCount()) &&
12248 "Vector element count mismatch!");
12249 assert(VTList.VTs[0].isFloatingPoint() &&
12250 Ops[1].getValueType().isFloatingPoint() &&
12251 VTList.VTs[0].bitsLT(Ops[1].getValueType()) &&
12252 Ops[2].getOpcode() == ISD::TargetConstant &&
12253 (Ops[2]->getAsZExtVal() == 0 || Ops[2]->getAsZExtVal() == 1) &&
12254 "Invalid STRICT_FP_ROUND!");
12255 break;
12256 }
12257
12258 // Memoize the node unless it returns a glue result.
12259 SDNode *N;
12260 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
12261 SDNodeKey ID(Opcode, VTList, Ops);
12262 FoldingSetInsertToken InsertToken;
12263 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
12264 E->intersectFlagsWith(Flags);
12265 return SDValue(E, 0);
12266 }
12267
12268 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
12269 createOperands(N, Ops);
12270 CSEMap.insert(N, InsertToken);
12271 } else {
12272 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
12273 createOperands(N, Ops);
12274 }
12275
12276 N->setFlags(Flags);
12277 InsertNode(N);
12278 SDValue V(N, 0);
12279 NewSDValueDbgMsg(V, "Creating new node: ", this);
12280 return V;
12281}
12282
12283SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
12284 SDVTList VTList) {
12285 return getNode(Opcode, DL, VTList, ArrayRef<SDValue>());
12286}
12287
12288SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12289 SDValue N1) {
12290 SDValue Ops[] = { N1 };
12291 return getNode(Opcode, DL, VTList, Ops);
12292}
12293
12294SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12295 SDValue N1, SDValue N2) {
12296 SDValue Ops[] = { N1, N2 };
12297 return getNode(Opcode, DL, VTList, Ops);
12298}
12299
12300SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12301 SDValue N1, SDValue N2, SDValue N3) {
12302 SDValue Ops[] = { N1, N2, N3 };
12303 return getNode(Opcode, DL, VTList, Ops);
12304}
12305
12306SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12307 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
12308 SDValue Ops[] = { N1, N2, N3, N4 };
12309 return getNode(Opcode, DL, VTList, Ops);
12310}
12311
12312SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12313 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
12314 SDValue N5) {
12315 SDValue Ops[] = { N1, N2, N3, N4, N5 };
12316 return getNode(Opcode, DL, VTList, Ops);
12317}
12318
12320 if (!VT.isExtended())
12321 return makeVTList(SDNode::getValueTypeList(VT.getSimpleVT()), 1);
12322
12323 EVT VTs[] = {VT};
12324 return getVTList(VTs);
12325}
12326
12328 EVT VTs[] = {VT1, VT2};
12329 return getVTList(VTs);
12330}
12331
12333 EVT VTs[] = {VT1, VT2, VT3};
12334 return getVTList(VTs);
12335}
12336
12338 EVT VTs[] = {VT1, VT2, VT3, VT4};
12339 return getVTList(VTs);
12340}
12341
12343 auto It = VTLists.find(VTs);
12344 if (It == VTLists.end()) {
12345 EVT *Array = Allocator.Allocate<EVT>(VTs.size());
12346 llvm::copy(VTs, Array);
12347 It = VTLists.insert(ArrayRef(Array, VTs.size())).first;
12348 }
12349 return makeVTList(It->data(), It->size());
12350}
12351
12352/// UpdateNodeOperands - *Mutate* the specified node in-place to have the
12353/// specified operands. If the resultant node already exists in the DAG,
12354/// this does not modify the specified node, instead it returns the node that
12355/// already exists. If the resultant node does not exist in the DAG, the
12356/// input node is returned. As a degenerate case, if you specify the same
12357/// input operands as the node already has, the input node is returned.
12359 assert(N->getNumOperands() == 1 && "Update with wrong number of operands");
12360
12361 // Check to see if there is no change.
12362 if (Op == N->getOperand(0)) return N;
12363
12364 // See if the modified node already exists.
12365 FoldingSetInsertToken InsertToken;
12366 if (SDNode *Existing = FindModifiedNodeSlot(N, Op, InsertToken))
12367 return Existing;
12368
12369 // Nope it doesn't. Remove the node from its current place in the maps.
12370 if (InsertToken)
12371 if (!RemoveNodeFromCSEMaps(N))
12372 InsertToken = {};
12373
12374 // Now we update the operands.
12375 N->OperandList[0].set(Op);
12376
12378 // If this gets put into a CSE map, add it.
12379 if (InsertToken)
12380 CSEMap.insert(N, InsertToken);
12381 return N;
12382}
12383
12385 assert(N->getNumOperands() == 2 && "Update with wrong number of operands");
12386
12387 // Check to see if there is no change.
12388 if (Op1 == N->getOperand(0) && Op2 == N->getOperand(1))
12389 return N; // No operands changed, just return the input node.
12390
12391 // See if the modified node already exists.
12392 FoldingSetInsertToken InsertToken;
12393 if (SDNode *Existing = FindModifiedNodeSlot(N, Op1, Op2, InsertToken))
12394 return Existing;
12395
12396 // Nope it doesn't. Remove the node from its current place in the maps.
12397 if (InsertToken)
12398 if (!RemoveNodeFromCSEMaps(N))
12399 InsertToken = {};
12400
12401 // Now we update the operands.
12402 if (N->OperandList[0] != Op1)
12403 N->OperandList[0].set(Op1);
12404 if (N->OperandList[1] != Op2)
12405 N->OperandList[1].set(Op2);
12406
12408 // If this gets put into a CSE map, add it.
12409 if (InsertToken)
12410 CSEMap.insert(N, InsertToken);
12411 return N;
12412}
12413
12416 SDValue Ops[] = { Op1, Op2, Op3 };
12417 return UpdateNodeOperands(N, Ops);
12418}
12419
12422 SDValue Op3, SDValue Op4) {
12423 SDValue Ops[] = { Op1, Op2, Op3, Op4 };
12424 return UpdateNodeOperands(N, Ops);
12425}
12426
12429 SDValue Op3, SDValue Op4, SDValue Op5) {
12430 SDValue Ops[] = { Op1, Op2, Op3, Op4, Op5 };
12431 return UpdateNodeOperands(N, Ops);
12432}
12433
12436 unsigned NumOps = Ops.size();
12437 assert(N->getNumOperands() == NumOps &&
12438 "Update with wrong number of operands");
12439
12440 // If no operands changed just return the input node.
12441 if (std::equal(Ops.begin(), Ops.end(), N->op_begin()))
12442 return N;
12443
12444 // See if the modified node already exists.
12445 FoldingSetInsertToken InsertToken;
12446 if (SDNode *Existing = FindModifiedNodeSlot(N, Ops, InsertToken))
12447 return Existing;
12448
12449 // Nope it doesn't. Remove the node from its current place in the maps.
12450 if (InsertToken)
12451 if (!RemoveNodeFromCSEMaps(N))
12452 InsertToken = {};
12453
12454 // Now we update the operands.
12455 for (unsigned i = 0; i != NumOps; ++i)
12456 if (N->OperandList[i] != Ops[i])
12457 N->OperandList[i].set(Ops[i]);
12458
12460 // If this gets put into a CSE map, add it.
12461 if (InsertToken)
12462 CSEMap.insert(N, InsertToken);
12463 return N;
12464}
12465
12466/// DropOperands - Release the operands and set this node to have
12467/// zero operands.
12469 // Unlike the code in MorphNodeTo that does this, we don't need to
12470 // watch for dead nodes here.
12471 for (op_iterator I = op_begin(), E = op_end(); I != E; ) {
12472 SDUse &Use = *I++;
12473 Use.set(SDValue());
12474 }
12475}
12476
12478 ArrayRef<MachineMemOperand *> NewMemRefs) {
12479 if (NewMemRefs.empty()) {
12480 N->clearMemRefs();
12481 return;
12482 }
12483
12484 // Check if we can avoid allocating by storing a single reference directly.
12485 if (NewMemRefs.size() == 1) {
12486 N->MemRefs = NewMemRefs[0];
12487 N->NumMemRefs = 1;
12488 return;
12489 }
12490
12491 MachineMemOperand **MemRefsBuffer =
12492 Allocator.template Allocate<MachineMemOperand *>(NewMemRefs.size());
12493 llvm::copy(NewMemRefs, MemRefsBuffer);
12494 N->MemRefs = MemRefsBuffer;
12495 N->NumMemRefs = static_cast<int>(NewMemRefs.size());
12496}
12497
12498/// SelectNodeTo - These are wrappers around MorphNodeTo that accept a
12499/// machine opcode.
12500///
12502 EVT VT) {
12503 SDVTList VTs = getVTList(VT);
12504 return SelectNodeTo(N, MachineOpc, VTs, {});
12505}
12506
12508 EVT VT, SDValue Op1) {
12509 SDVTList VTs = getVTList(VT);
12510 SDValue Ops[] = { Op1 };
12511 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12512}
12513
12515 EVT VT, SDValue Op1,
12516 SDValue Op2) {
12517 SDVTList VTs = getVTList(VT);
12518 SDValue Ops[] = { Op1, Op2 };
12519 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12520}
12521
12523 EVT VT, SDValue Op1,
12524 SDValue Op2, SDValue Op3) {
12525 SDVTList VTs = getVTList(VT);
12526 SDValue Ops[] = { Op1, Op2, Op3 };
12527 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12528}
12529
12532 SDVTList VTs = getVTList(VT);
12533 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12534}
12535
12537 EVT VT1, EVT VT2, ArrayRef<SDValue> Ops) {
12538 SDVTList VTs = getVTList(VT1, VT2);
12539 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12540}
12541
12543 EVT VT1, EVT VT2) {
12544 SDVTList VTs = getVTList(VT1, VT2);
12545 return SelectNodeTo(N, MachineOpc, VTs, {});
12546}
12547
12549 EVT VT1, EVT VT2, EVT VT3,
12551 SDVTList VTs = getVTList(VT1, VT2, VT3);
12552 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12553}
12554
12556 EVT VT1, EVT VT2,
12557 SDValue Op1, SDValue Op2) {
12558 SDVTList VTs = getVTList(VT1, VT2);
12559 SDValue Ops[] = { Op1, Op2 };
12560 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12561}
12562
12565 SDNode *New = MorphNodeTo(N, ~MachineOpc, VTs, Ops);
12566 // Reset the NodeID to -1.
12567 New->setNodeId(-1);
12568 if (New != N) {
12569 ReplaceAllUsesWith(N, New);
12571 }
12572 return New;
12573}
12574
12575/// UpdateSDLocOnMergeSDNode - If the opt level is -O0 then it throws away
12576/// the line number information on the merged node since it is not possible to
12577/// preserve the information that operation is associated with multiple lines.
12578/// This will make the debugger working better at -O0, were there is a higher
12579/// probability having other instructions associated with that line.
12580///
12581/// For IROrder, we keep the smaller of the two
12582SDNode *SelectionDAG::UpdateSDLocOnMergeSDNode(SDNode *N, const SDLoc &OLoc) {
12583 DebugLoc NLoc = N->getDebugLoc();
12584 if (NLoc && OptLevel == CodeGenOptLevel::None && OLoc.getDebugLoc() != NLoc) {
12585 N->setDebugLoc(DebugLoc());
12586 }
12587 unsigned Order = std::min(N->getIROrder(), OLoc.getIROrder());
12588 N->setIROrder(Order);
12589 return N;
12590}
12591
12592/// MorphNodeTo - This *mutates* the specified node to have the specified
12593/// return type, opcode, and operands.
12594///
12595/// Note that MorphNodeTo returns the resultant node. If there is already a
12596/// node of the specified opcode and operands, it returns that node instead of
12597/// the current one. Note that the SDLoc need not be the same.
12598///
12599/// Using MorphNodeTo is faster than creating a new node and swapping it in
12600/// with ReplaceAllUsesWith both because it often avoids allocating a new
12601/// node, and because it doesn't require CSE recalculation for any of
12602/// the node's users.
12603///
12604/// However, note that MorphNodeTo recursively deletes dead nodes from the DAG.
12605/// As a consequence it isn't appropriate to use from within the DAG combiner or
12606/// the legalizer which maintain worklists that would need to be updated when
12607/// deleting things.
12610 // If an identical node already exists, use it.
12611 FoldingSetInsertToken InsertToken;
12612 if (VTs.VTs[VTs.NumVTs-1] != MVT::Glue) {
12613 SDNodeKey ID(Opc, VTs, Ops);
12614 AddNodeIDCustom(ID.Tail, N, Opc);
12615 if (SDNode *ON = lookupNode(ID, SDLoc(N), InsertToken))
12616 return UpdateSDLocOnMergeSDNode(ON, SDLoc(N));
12617 }
12618
12619 if (!RemoveNodeFromCSEMaps(N))
12620 InsertToken = {};
12621
12622 // Start the morphing.
12623 N->NodeType = Opc;
12624 N->ValueList = VTs.VTs;
12625 N->NumValues = VTs.NumVTs;
12626
12627 // Clear the operands list, updating used nodes to remove this from their
12628 // use list. Keep track of any operands that become dead as a result.
12629 SmallPtrSet<SDNode*, 16> DeadNodeSet;
12630 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
12631 SDUse &Use = *I++;
12632 SDNode *Used = Use.getNode();
12633 Use.set(SDValue());
12634 if (Used->use_empty())
12635 DeadNodeSet.insert(Used);
12636 }
12637
12638 // For MachineNode, initialize the memory references information.
12640 MN->clearMemRefs();
12641
12642 // Swap for an appropriately sized array from the recycler.
12643 removeOperands(N);
12644 createOperands(N, Ops);
12645
12646 // Delete any nodes that are still dead after adding the uses for the
12647 // new operands.
12648 if (!DeadNodeSet.empty()) {
12649 SmallVector<SDNode *, 16> DeadNodes;
12650 for (SDNode *N : DeadNodeSet)
12651 if (N->use_empty())
12652 DeadNodes.push_back(N);
12653 RemoveDeadNodes(DeadNodes);
12654 }
12655
12656 if (InsertToken)
12657 CSEMap.insert(N, InsertToken); // Memoize the new node.
12658 return N;
12659}
12660
12662 unsigned OrigOpc = Node->getOpcode();
12663 unsigned NewOpc;
12664 switch (OrigOpc) {
12665 default:
12666 llvm_unreachable("mutateStrictFPToFP called with unexpected opcode!");
12667#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12668 case ISD::STRICT_##DAGN: NewOpc = ISD::DAGN; break;
12669#define CMP_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12670 case ISD::STRICT_##DAGN: NewOpc = ISD::SETCC; break;
12671#include "llvm/IR/ConstrainedOps.def"
12672 }
12673
12674 assert(Node->getNumValues() == 2 && "Unexpected number of results!");
12675
12676 // We're taking this node out of the chain, so we need to re-link things.
12677 SDValue InputChain = Node->getOperand(0);
12678 SDValue OutputChain = SDValue(Node, 1);
12679 ReplaceAllUsesOfValueWith(OutputChain, InputChain);
12680
12682 for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
12683 Ops.push_back(Node->getOperand(i));
12684
12685 SDVTList VTs = getVTList(Node->getValueType(0));
12686 SDNode *Res = MorphNodeTo(Node, NewOpc, VTs, Ops);
12687
12688 // MorphNodeTo can operate in two ways: if an existing node with the
12689 // specified operands exists, it can just return it. Otherwise, it
12690 // updates the node in place to have the requested operands.
12691 if (Res == Node) {
12692 // If we updated the node in place, reset the node ID. To the isel,
12693 // this should be just like a newly allocated machine node.
12694 Res->setNodeId(-1);
12695 } else {
12698 }
12699
12700 return Res;
12701}
12702
12703/// getMachineNode - These are used for target selectors to create a new node
12704/// with specified return type(s), MachineInstr opcode, and operands.
12705///
12706/// Note that getMachineNode returns the resultant node. If there is already a
12707/// node of the specified opcode and operands, it returns that node instead of
12708/// the current one.
12710 EVT VT) {
12711 SDVTList VTs = getVTList(VT);
12712 return getMachineNode(Opcode, dl, VTs, {});
12713}
12714
12716 EVT VT, SDValue Op1) {
12717 SDVTList VTs = getVTList(VT);
12718 SDValue Ops[] = { Op1 };
12719 return getMachineNode(Opcode, dl, VTs, Ops);
12720}
12721
12723 EVT VT, SDValue Op1, SDValue Op2) {
12724 SDVTList VTs = getVTList(VT);
12725 SDValue Ops[] = { Op1, Op2 };
12726 return getMachineNode(Opcode, dl, VTs, Ops);
12727}
12728
12730 EVT VT, SDValue Op1, SDValue Op2,
12731 SDValue Op3) {
12732 SDVTList VTs = getVTList(VT);
12733 SDValue Ops[] = { Op1, Op2, Op3 };
12734 return getMachineNode(Opcode, dl, VTs, Ops);
12735}
12736
12739 SDVTList VTs = getVTList(VT);
12740 return getMachineNode(Opcode, dl, VTs, Ops);
12741}
12742
12744 EVT VT1, EVT VT2, SDValue Op1,
12745 SDValue Op2) {
12746 SDVTList VTs = getVTList(VT1, VT2);
12747 SDValue Ops[] = { Op1, Op2 };
12748 return getMachineNode(Opcode, dl, VTs, Ops);
12749}
12750
12752 EVT VT1, EVT VT2, SDValue Op1,
12753 SDValue Op2, SDValue Op3) {
12754 SDVTList VTs = getVTList(VT1, VT2);
12755 SDValue Ops[] = { Op1, Op2, Op3 };
12756 return getMachineNode(Opcode, dl, VTs, Ops);
12757}
12758
12760 EVT VT1, EVT VT2,
12762 SDVTList VTs = getVTList(VT1, VT2);
12763 return getMachineNode(Opcode, dl, VTs, Ops);
12764}
12765
12767 EVT VT1, EVT VT2, EVT VT3,
12768 SDValue Op1, SDValue Op2) {
12769 SDVTList VTs = getVTList(VT1, VT2, VT3);
12770 SDValue Ops[] = { Op1, Op2 };
12771 return getMachineNode(Opcode, dl, VTs, Ops);
12772}
12773
12775 EVT VT1, EVT VT2, EVT VT3,
12776 SDValue Op1, SDValue Op2,
12777 SDValue Op3) {
12778 SDVTList VTs = getVTList(VT1, VT2, VT3);
12779 SDValue Ops[] = { Op1, Op2, Op3 };
12780 return getMachineNode(Opcode, dl, VTs, Ops);
12781}
12782
12784 EVT VT1, EVT VT2, EVT VT3,
12786 SDVTList VTs = getVTList(VT1, VT2, VT3);
12787 return getMachineNode(Opcode, dl, VTs, Ops);
12788}
12789
12791 ArrayRef<EVT> ResultTys,
12793 SDVTList VTs = getVTList(ResultTys);
12794 return getMachineNode(Opcode, dl, VTs, Ops);
12795}
12796
12798 SDVTList VTs,
12800 bool DoCSE = VTs.VTs[VTs.NumVTs-1] != MVT::Glue;
12802 FoldingSetInsertToken InsertToken;
12803
12804 if (DoCSE) {
12805 SDNodeKey ID(~Opcode, VTs, Ops);
12806 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
12807 return cast<MachineSDNode>(UpdateSDLocOnMergeSDNode(E, DL));
12808 }
12809 }
12810
12811 // Allocate a new MachineSDNode.
12812 N = newSDNode<MachineSDNode>(~Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
12813 createOperands(N, Ops);
12814
12815 if (DoCSE)
12816 CSEMap.insert(N, InsertToken);
12817
12818 InsertNode(N);
12819 NewSDValueDbgMsg(SDValue(N, 0), "Creating new machine node: ", this);
12820 return N;
12821}
12822
12823/// getTargetExtractSubreg - A convenience function for creating
12824/// TargetOpcode::EXTRACT_SUBREG nodes.
12826 SDValue Operand) {
12827 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12828 SDNode *Subreg = getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL,
12829 VT, Operand, SRIdxVal);
12830 return SDValue(Subreg, 0);
12831}
12832
12833/// getTargetInsertSubreg - A convenience function for creating
12834/// TargetOpcode::INSERT_SUBREG nodes.
12836 SDValue Operand, SDValue Subreg) {
12837 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12838 SDNode *Result = getMachineNode(TargetOpcode::INSERT_SUBREG, DL,
12839 VT, Operand, Subreg, SRIdxVal);
12840 return SDValue(Result, 0);
12841}
12842
12843/// getNodeIfExists - Get the specified node if it's already available, or
12844/// else return NULL.
12847 bool AllowCommute) {
12848 SDNodeFlags Flags;
12849 if (Inserter)
12850 Flags = Inserter->getFlags();
12851 return getNodeIfExists(Opcode, VTList, Ops, Flags, AllowCommute);
12852}
12853
12856 const SDNodeFlags Flags,
12857 bool AllowCommute) {
12858 if (VTList.VTs[VTList.NumVTs - 1] == MVT::Glue)
12859 return nullptr;
12860
12861 auto Lookup = [&](ArrayRef<SDValue> LookupOps) -> SDNode * {
12862 SDNodeKey ID(Opcode, VTList, LookupOps);
12863 FoldingSetInsertToken InsertToken;
12864 if (SDNode *E = lookupNode(ID, InsertToken)) {
12865 E->intersectFlagsWith(Flags);
12866 return E;
12867 }
12868 return nullptr;
12869 };
12870
12871 if (SDNode *Existing = Lookup(Ops))
12872 return Existing;
12873
12874 if (AllowCommute && TLI->isCommutativeBinOp(Opcode))
12875 return Lookup({Ops[1], Ops[0]});
12876
12877 return nullptr;
12878}
12879
12880/// doesNodeExist - Check if a node exists without modifying its flags.
12881bool SelectionDAG::doesNodeExist(unsigned Opcode, SDVTList VTList,
12883 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {
12884 SDNodeKey ID(Opcode, VTList, Ops);
12885 FoldingSetInsertToken InsertToken;
12886 if (lookupNode(ID, SDLoc(), InsertToken))
12887 return true;
12888 }
12889 return false;
12890}
12891
12892/// getDbgValue - Creates a SDDbgValue node.
12893///
12894/// SDNode
12896 SDNode *N, unsigned R, bool IsIndirect,
12897 const DebugLoc &DL, unsigned O) {
12898 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12899 "Expected inlined-at fields to agree");
12900 return new (DbgInfo->getAlloc())
12901 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromNode(N, R),
12902 {}, IsIndirect, DL, O,
12903 /*IsVariadic=*/false);
12904}
12905
12906/// Constant
12908 DIExpression *Expr,
12909 const Value *C,
12910 const DebugLoc &DL, unsigned O) {
12911 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12912 "Expected inlined-at fields to agree");
12913 return new (DbgInfo->getAlloc())
12914 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromConst(C), {},
12915 /*IsIndirect=*/false, DL, O,
12916 /*IsVariadic=*/false);
12917}
12918
12919/// FrameIndex
12921 DIExpression *Expr, unsigned FI,
12922 bool IsIndirect,
12923 const DebugLoc &DL,
12924 unsigned O) {
12925 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12926 "Expected inlined-at fields to agree");
12927 return getFrameIndexDbgValue(Var, Expr, FI, {}, IsIndirect, DL, O);
12928}
12929
12930/// FrameIndex with dependencies
12932 DIExpression *Expr, unsigned FI,
12933 ArrayRef<SDNode *> Dependencies,
12934 bool IsIndirect,
12935 const DebugLoc &DL,
12936 unsigned O) {
12937 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12938 "Expected inlined-at fields to agree");
12939 return new (DbgInfo->getAlloc())
12940 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromFrameIdx(FI),
12941 Dependencies, IsIndirect, DL, O,
12942 /*IsVariadic=*/false);
12943}
12944
12945/// VReg
12947 Register VReg, bool IsIndirect,
12948 const DebugLoc &DL, unsigned O) {
12949 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12950 "Expected inlined-at fields to agree");
12951 return new (DbgInfo->getAlloc())
12952 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromVReg(VReg),
12953 {}, IsIndirect, DL, O,
12954 /*IsVariadic=*/false);
12955}
12956
12959 ArrayRef<SDNode *> Dependencies,
12960 bool IsIndirect, const DebugLoc &DL,
12961 unsigned O, bool IsVariadic) {
12962 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12963 "Expected inlined-at fields to agree");
12964 return new (DbgInfo->getAlloc())
12965 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, Locs, Dependencies, IsIndirect,
12966 DL, O, IsVariadic);
12967}
12968
12970 unsigned OffsetInBits, unsigned SizeInBits,
12971 bool InvalidateDbg) {
12972 SDNode *FromNode = From.getNode();
12973 SDNode *ToNode = To.getNode();
12974 assert(FromNode && ToNode && "Can't modify dbg values");
12975
12976 // PR35338
12977 // TODO: assert(From != To && "Redundant dbg value transfer");
12978 // TODO: assert(FromNode != ToNode && "Intranode dbg value transfer");
12979 if (From == To || FromNode == ToNode)
12980 return;
12981
12982 if (!FromNode->getHasDebugValue())
12983 return;
12984
12985 SDDbgOperand FromLocOp =
12986 SDDbgOperand::fromNode(From.getNode(), From.getResNo());
12988
12990 for (SDDbgValue *Dbg : GetDbgValues(FromNode)) {
12991 if (Dbg->isInvalidated())
12992 continue;
12993
12994 // TODO: assert(!Dbg->isInvalidated() && "Transfer of invalid dbg value");
12995
12996 // Create a new location ops vector that is equal to the old vector, but
12997 // with each instance of FromLocOp replaced with ToLocOp.
12998 bool Changed = false;
12999 auto NewLocOps = Dbg->copyLocationOps();
13000 std::replace_if(
13001 NewLocOps.begin(), NewLocOps.end(),
13002 [&Changed, FromLocOp](const SDDbgOperand &Op) {
13003 bool Match = Op == FromLocOp;
13004 Changed |= Match;
13005 return Match;
13006 },
13007 ToLocOp);
13008 // Ignore this SDDbgValue if we didn't find a matching location.
13009 if (!Changed)
13010 continue;
13011
13012 DIVariable *Var = Dbg->getVariable();
13013 auto *Expr = Dbg->getExpression();
13014 // If a fragment is requested, update the expression.
13015 if (SizeInBits) {
13016 // When splitting a larger (e.g., sign-extended) value whose
13017 // lower bits are described with an SDDbgValue, do not attempt
13018 // to transfer the SDDbgValue to the upper bits.
13019 if (auto FI = Expr->getFragmentInfo())
13020 if (OffsetInBits + SizeInBits > FI->SizeInBits)
13021 continue;
13022 auto Fragment = DIExpression::createFragmentExpression(Expr, OffsetInBits,
13023 SizeInBits);
13024 if (!Fragment)
13025 continue;
13026 Expr = *Fragment;
13027 }
13028
13029 auto AdditionalDependencies = Dbg->getAdditionalDependencies();
13030 // Clone the SDDbgValue and move it to To.
13031 SDDbgValue *Clone = getDbgValueList(
13032 Var, Expr, NewLocOps, AdditionalDependencies, Dbg->isIndirect(),
13033 Dbg->getDebugLoc(), std::max(ToNode->getIROrder(), Dbg->getOrder()),
13034 Dbg->isVariadic());
13035 ClonedDVs.push_back(Clone);
13036
13037 if (InvalidateDbg) {
13038 // Invalidate value and indicate the SDDbgValue should not be emitted.
13039 Dbg->setIsInvalidated();
13040 Dbg->setIsEmitted();
13041 }
13042 }
13043
13044 for (SDDbgValue *Dbg : ClonedDVs) {
13045 assert(is_contained(Dbg->getSDNodes(), ToNode) &&
13046 "Transferred DbgValues should depend on the new SDNode");
13047 AddDbgValue(Dbg, false);
13048 }
13049}
13050
13052 if (!N.getHasDebugValue())
13053 return;
13054
13055 auto GetLocationOperand = [](SDNode *Node, unsigned ResNo) {
13056 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(Node))
13057 return SDDbgOperand::fromFrameIdx(FISDN->getIndex());
13058 return SDDbgOperand::fromNode(Node, ResNo);
13059 };
13060
13062 for (auto *DV : GetDbgValues(&N)) {
13063 if (DV->isInvalidated())
13064 continue;
13065 switch (N.getOpcode()) {
13066 default:
13067 break;
13068 case ISD::ADD: {
13069 SDValue N0 = N.getOperand(0);
13070 SDValue N1 = N.getOperand(1);
13071 if (!isa<ConstantSDNode>(N0)) {
13072 bool RHSConstant = isa<ConstantSDNode>(N1);
13073 uint64_t Offset;
13074 if (RHSConstant)
13075 Offset = N.getConstantOperandVal(1);
13076 // We are not allowed to turn indirect debug values variadic, so
13077 // don't salvage those.
13078 if (!RHSConstant && DV->isIndirect())
13079 continue;
13080
13081 // Rewrite an ADD constant node into a DIExpression. Since we are
13082 // performing arithmetic to compute the variable's *value* in the
13083 // DIExpression, we need to mark the expression with a
13084 // DW_OP_stack_value.
13085 auto *DIExpr = DV->getExpression();
13086 auto NewLocOps = DV->copyLocationOps();
13087 bool Changed = false;
13088 size_t OrigLocOpsSize = NewLocOps.size();
13089 for (size_t i = 0; i < OrigLocOpsSize; ++i) {
13090 // We're not given a ResNo to compare against because the whole
13091 // node is going away. We know that any ISD::ADD only has one
13092 // result, so we can assume any node match is using the result.
13093 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
13094 NewLocOps[i].getSDNode() != &N)
13095 continue;
13096 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
13097 if (RHSConstant) {
13100 DIExpr = DIExpression::appendOpsToArg(DIExpr, ExprOps, i, true);
13101 } else {
13102 // Convert to a variadic expression (if not already).
13103 // convertToVariadicExpression() returns a const pointer, so we use
13104 // a temporary const variable here.
13105 const auto *TmpDIExpr =
13109 ExprOps.push_back(NewLocOps.size());
13110 ExprOps.push_back(dwarf::DW_OP_plus);
13111 SDDbgOperand RHS =
13113 NewLocOps.push_back(RHS);
13114 DIExpr = DIExpression::appendOpsToArg(TmpDIExpr, ExprOps, i, true);
13115 }
13116 Changed = true;
13117 }
13118 (void)Changed;
13119 assert(Changed && "Salvage target doesn't use N");
13120
13121 bool IsVariadic =
13122 DV->isVariadic() || OrigLocOpsSize != NewLocOps.size();
13123
13124 auto AdditionalDependencies = DV->getAdditionalDependencies();
13125 SDDbgValue *Clone = getDbgValueList(
13126 DV->getVariable(), DIExpr, NewLocOps, AdditionalDependencies,
13127 DV->isIndirect(), DV->getDebugLoc(), DV->getOrder(), IsVariadic);
13128 ClonedDVs.push_back(Clone);
13129 DV->setIsInvalidated();
13130 DV->setIsEmitted();
13131 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting";
13132 N0.getNode()->dumprFull(this);
13133 dbgs() << " into " << *DIExpr << '\n');
13134 }
13135 break;
13136 }
13137 case ISD::TRUNCATE: {
13138 SDValue N0 = N.getOperand(0);
13139 TypeSize FromSize = N0.getValueSizeInBits();
13140 TypeSize ToSize = N.getValueSizeInBits(0);
13141
13142 DIExpression *DbgExpression = DV->getExpression();
13143 auto ExtOps = DIExpression::getExtOps(FromSize, ToSize, false);
13144 auto NewLocOps = DV->copyLocationOps();
13145 bool Changed = false;
13146 for (size_t i = 0; i < NewLocOps.size(); ++i) {
13147 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
13148 NewLocOps[i].getSDNode() != &N)
13149 continue;
13150
13151 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
13152 DbgExpression = DIExpression::appendOpsToArg(DbgExpression, ExtOps, i);
13153 Changed = true;
13154 }
13155 assert(Changed && "Salvage target doesn't use N");
13156 (void)Changed;
13157
13158 SDDbgValue *Clone =
13159 getDbgValueList(DV->getVariable(), DbgExpression, NewLocOps,
13160 DV->getAdditionalDependencies(), DV->isIndirect(),
13161 DV->getDebugLoc(), DV->getOrder(), DV->isVariadic());
13162
13163 ClonedDVs.push_back(Clone);
13164 DV->setIsInvalidated();
13165 DV->setIsEmitted();
13166 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting"; N0.getNode()->dumprFull(this);
13167 dbgs() << " into " << *DbgExpression << '\n');
13168 break;
13169 }
13170 }
13171 }
13172
13173 for (SDDbgValue *Dbg : ClonedDVs) {
13174 assert((!Dbg->getSDNodes().empty() ||
13175 llvm::any_of(Dbg->getLocationOps(),
13176 [&](const SDDbgOperand &Op) {
13177 return Op.getKind() == SDDbgOperand::FRAMEIX;
13178 })) &&
13179 "Salvaged DbgValue should depend on a new SDNode");
13180 AddDbgValue(Dbg, false);
13181 }
13182}
13183
13184/// Creates a SDDbgLabel node.
13186 const DebugLoc &DL, unsigned O) {
13187 assert(cast<DILabel>(Label)->isValidLocationForIntrinsic(DL) &&
13188 "Expected inlined-at fields to agree");
13189 return new (DbgInfo->getAlloc()) SDDbgLabel(Label, DL, O);
13190}
13191
13192namespace {
13193
13194/// RAUWUpdateListener - Helper for ReplaceAllUsesWith - When the node
13195/// pointed to by a use iterator is deleted, increment the use iterator
13196/// so that it doesn't dangle.
13197///
13198class RAUWUpdateListener : public SelectionDAG::DAGUpdateListener {
13201
13202 void NodeDeleted(SDNode *N, SDNode *E) override {
13203 // Increment the iterator as needed.
13204 while (UI != UE && N == UI->getUser())
13205 ++UI;
13206 }
13207
13208public:
13209 RAUWUpdateListener(SelectionDAG &d,
13212 : SelectionDAG::DAGUpdateListener(d), UI(ui), UE(ue) {}
13213};
13214
13215} // end anonymous namespace
13216
13217/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13218/// This can cause recursive merging of nodes in the DAG.
13219///
13220/// This version assumes From has a single result value.
13221///
13223 SDNode *From = FromN.getNode();
13224 assert(From->getNumValues() == 1 && FromN.getResNo() == 0 &&
13225 "Cannot replace with this method!");
13226 assert(From != To.getNode() && "Cannot replace uses of with self");
13227
13228 // Preserve Debug Values
13229 transferDbgValues(FromN, To);
13230 // Preserve extra info.
13231 copyExtraInfo(From, To.getNode());
13232
13233 // Iterate over all the existing uses of From. New uses will be added
13234 // to the beginning of the use list, which we avoid visiting.
13235 // This specifically avoids visiting uses of From that arise while the
13236 // replacement is happening, because any such uses would be the result
13237 // of CSE: If an existing node looks like From after one of its operands
13238 // is replaced by To, we don't want to replace of all its users with To
13239 // too. See PR3018 for more info.
13240 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13241 RAUWUpdateListener Listener(*this, UI, UE);
13242 while (UI != UE) {
13243 SDNode *User = UI->getUser();
13244
13245 // This node is about to morph, remove its old self from the CSE maps.
13246 RemoveNodeFromCSEMaps(User);
13247
13248 // A user can appear in a use list multiple times, and when this
13249 // happens the uses are usually next to each other in the list.
13250 // To help reduce the number of CSE recomputations, process all
13251 // the uses of this user that we can find this way.
13252 do {
13253 SDUse &Use = *UI;
13254 ++UI;
13255 Use.set(To);
13256 if (To->isDivergent() != From->isDivergent())
13258 } while (UI != UE && UI->getUser() == User);
13259 // Now that we have modified User, add it back to the CSE maps. If it
13260 // already exists there, recursively merge the results together.
13261 AddModifiedNodeToCSEMaps(User);
13262 }
13263
13264 // If we just RAUW'd the root, take note.
13265 if (FromN == getRoot())
13266 setRoot(To);
13267}
13268
13269/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13270/// This can cause recursive merging of nodes in the DAG.
13271///
13272/// This version assumes that for each value of From, there is a
13273/// corresponding value in To in the same position with the same type.
13274///
13276#ifndef NDEBUG
13277 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
13278 assert((!From->hasAnyUseOfValue(i) ||
13279 From->getValueType(i) == To->getValueType(i)) &&
13280 "Cannot use this version of ReplaceAllUsesWith!");
13281#endif
13282
13283 // Handle the trivial case.
13284 if (From == To)
13285 return;
13286
13287 // Preserve Debug Info. Only do this if there's a use.
13288 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
13289 if (From->hasAnyUseOfValue(i)) {
13290 assert((i < To->getNumValues()) && "Invalid To location");
13291 transferDbgValues(SDValue(From, i), SDValue(To, i));
13292 }
13293 // Preserve extra info.
13294 copyExtraInfo(From, To);
13295
13296 // Iterate over just the existing users of From. See the comments in
13297 // the ReplaceAllUsesWith above.
13298 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13299 RAUWUpdateListener Listener(*this, UI, UE);
13300 while (UI != UE) {
13301 SDNode *User = UI->getUser();
13302
13303 // This node is about to morph, remove its old self from the CSE maps.
13304 RemoveNodeFromCSEMaps(User);
13305
13306 // A user can appear in a use list multiple times, and when this
13307 // happens the uses are usually next to each other in the list.
13308 // To help reduce the number of CSE recomputations, process all
13309 // the uses of this user that we can find this way.
13310 do {
13311 SDUse &Use = *UI;
13312 ++UI;
13313 Use.setNode(To);
13314 if (To->isDivergent() != From->isDivergent())
13316 } while (UI != UE && UI->getUser() == User);
13317
13318 // Now that we have modified User, add it back to the CSE maps. If it
13319 // already exists there, recursively merge the results together.
13320 AddModifiedNodeToCSEMaps(User);
13321 }
13322
13323 // If we just RAUW'd the root, take note.
13324 if (From == getRoot().getNode())
13325 setRoot(SDValue(To, getRoot().getResNo()));
13326}
13327
13328/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13329/// This can cause recursive merging of nodes in the DAG.
13330///
13331/// This version can replace From with any result values. To must match the
13332/// number and types of values returned by From.
13334 if (From->getNumValues() == 1) // Handle the simple case efficiently.
13335 return ReplaceAllUsesWith(SDValue(From, 0), To[0]);
13336
13337 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) {
13338 // Preserve Debug Info.
13339 transferDbgValues(SDValue(From, i), To[i]);
13340 // Preserve extra info.
13341 copyExtraInfo(From, To[i].getNode());
13342 }
13343
13344 // Iterate over just the existing users of From. See the comments in
13345 // the ReplaceAllUsesWith above.
13346 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13347 RAUWUpdateListener Listener(*this, UI, UE);
13348 while (UI != UE) {
13349 SDNode *User = UI->getUser();
13350
13351 // This node is about to morph, remove its old self from the CSE maps.
13352 RemoveNodeFromCSEMaps(User);
13353
13354 // A user can appear in a use list multiple times, and when this happens the
13355 // uses are usually next to each other in the list. To help reduce the
13356 // number of CSE and divergence recomputations, process all the uses of this
13357 // user that we can find this way.
13358 bool To_IsDivergent = false;
13359 do {
13360 SDUse &Use = *UI;
13361 const SDValue &ToOp = To[Use.getResNo()];
13362 ++UI;
13363 Use.set(ToOp);
13364 if (ToOp.getValueType() != MVT::Other)
13365 To_IsDivergent |= ToOp->isDivergent();
13366 } while (UI != UE && UI->getUser() == User);
13367
13368 if (To_IsDivergent != From->isDivergent())
13370
13371 // Now that we have modified User, add it back to the CSE maps. If it
13372 // already exists there, recursively merge the results together.
13373 AddModifiedNodeToCSEMaps(User);
13374 }
13375
13376 // If we just RAUW'd the root, take note.
13377 if (From == getRoot().getNode())
13378 setRoot(SDValue(To[getRoot().getResNo()]));
13379}
13380
13381/// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
13382/// uses of other values produced by From.getNode() alone. The Deleted
13383/// vector is handled the same way as for ReplaceAllUsesWith.
13385 // Handle the really simple, really trivial case efficiently.
13386 if (From == To) return;
13387
13388 // Handle the simple, trivial, case efficiently.
13389 if (From.getNode()->getNumValues() == 1) {
13390 ReplaceAllUsesWith(From, To);
13391 return;
13392 }
13393
13394 // Preserve Debug Info.
13395 transferDbgValues(From, To);
13396 copyExtraInfo(From.getNode(), To.getNode());
13397
13398 // Iterate over just the existing users of From. See the comments in
13399 // the ReplaceAllUsesWith above.
13400 SDNode::use_iterator UI = From.getNode()->use_begin(),
13401 UE = From.getNode()->use_end();
13402 RAUWUpdateListener Listener(*this, UI, UE);
13403 while (UI != UE) {
13404 SDNode *User = UI->getUser();
13405 bool UserRemovedFromCSEMaps = false;
13406
13407 // A user can appear in a use list multiple times, and when this
13408 // happens the uses are usually next to each other in the list.
13409 // To help reduce the number of CSE recomputations, process all
13410 // the uses of this user that we can find this way.
13411 do {
13412 SDUse &Use = *UI;
13413
13414 // Skip uses of different values from the same node.
13415 if (Use.getResNo() != From.getResNo()) {
13416 ++UI;
13417 continue;
13418 }
13419
13420 // If this node hasn't been modified yet, it's still in the CSE maps,
13421 // so remove its old self from the CSE maps.
13422 if (!UserRemovedFromCSEMaps) {
13423 RemoveNodeFromCSEMaps(User);
13424 UserRemovedFromCSEMaps = true;
13425 }
13426
13427 ++UI;
13428 Use.set(To);
13429 if (To->isDivergent() != From->isDivergent())
13431 } while (UI != UE && UI->getUser() == User);
13432 // We are iterating over all uses of the From node, so if a use
13433 // doesn't use the specific value, no changes are made.
13434 if (!UserRemovedFromCSEMaps)
13435 continue;
13436
13437 // Now that we have modified User, add it back to the CSE maps. If it
13438 // already exists there, recursively merge the results together.
13439 AddModifiedNodeToCSEMaps(User);
13440 }
13441
13442 // If we just RAUW'd the root, take note.
13443 if (From == getRoot())
13444 setRoot(To);
13445}
13446
13447namespace {
13448
13449/// UseMemo - This class is used by SelectionDAG::ReplaceAllUsesOfValuesWith
13450/// to record information about a use.
13451struct UseMemo {
13452 SDNode *User;
13453 unsigned Index;
13454 SDUse *Use;
13455};
13456
13457/// operator< - Sort Memos by User.
13458bool operator<(const UseMemo &L, const UseMemo &R) {
13459 return (intptr_t)L.User < (intptr_t)R.User;
13460}
13461
13462/// RAUOVWUpdateListener - Helper for ReplaceAllUsesOfValuesWith - When the node
13463/// pointed to by a UseMemo is deleted, set the User to nullptr to indicate that
13464/// the node already has been taken care of recursively.
13465class RAUOVWUpdateListener : public SelectionDAG::DAGUpdateListener {
13466 SmallVectorImpl<UseMemo> &Uses;
13467
13468 void NodeDeleted(SDNode *N, SDNode *E) override {
13469 for (UseMemo &Memo : Uses)
13470 if (Memo.User == N)
13471 Memo.User = nullptr;
13472 }
13473
13474public:
13475 RAUOVWUpdateListener(SelectionDAG &d, SmallVectorImpl<UseMemo> &uses)
13476 : SelectionDAG::DAGUpdateListener(d), Uses(uses) {}
13477};
13478
13479} // end anonymous namespace
13480
13481/// Return true if a glue output should propagate divergence information.
13483 switch (Node->getOpcode()) {
13484 case ISD::CopyFromReg:
13485 case ISD::CopyToReg:
13486 return false;
13487 default:
13488 return true;
13489 }
13490
13491 llvm_unreachable("covered opcode switch");
13492}
13493
13495 if (TLI->isSDNodeAlwaysUniform(N)) {
13496 assert(!TLI->isSDNodeSourceOfDivergence(N, FLI, UA) &&
13497 "Conflicting divergence information!");
13498 return false;
13499 }
13500 if (TLI->isSDNodeSourceOfDivergence(N, FLI, UA))
13501 return true;
13502 for (const auto &Op : N->ops()) {
13503 EVT VT = Op.getValueType();
13504
13505 // Skip Chain. It does not carry divergence.
13506 if (VT != MVT::Other && Op.getNode()->isDivergent() &&
13507 (VT != MVT::Glue || gluePropagatesDivergence(Op.getNode())))
13508 return true;
13509 }
13510 return false;
13511}
13512
13514 SmallVector<SDNode *, 16> Worklist(1, N);
13515 do {
13516 N = Worklist.pop_back_val();
13517 bool IsDivergent = calculateDivergence(N);
13518 if (N->SDNodeBits.IsDivergent != IsDivergent) {
13519 N->SDNodeBits.IsDivergent = IsDivergent;
13520 llvm::append_range(Worklist, N->users());
13521 }
13522 } while (!Worklist.empty());
13523}
13524
13525void SelectionDAG::CreateTopologicalOrder(std::vector<SDNode *> &Order) {
13527 Order.reserve(AllNodes.size());
13528 for (auto &N : allnodes()) {
13529 unsigned NOps = N.getNumOperands();
13530 Degree[&N] = NOps;
13531 if (0 == NOps)
13532 Order.push_back(&N);
13533 }
13534 for (size_t I = 0; I != Order.size(); ++I) {
13535 SDNode *N = Order[I];
13536 for (auto *U : N->users()) {
13537 unsigned &UnsortedOps = Degree[U];
13538 if (0 == --UnsortedOps)
13539 Order.push_back(U);
13540 }
13541 }
13542}
13543
13544#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
13545void SelectionDAG::VerifyDAGDivergence() {
13546 std::vector<SDNode *> TopoOrder;
13547 CreateTopologicalOrder(TopoOrder);
13548 for (auto *N : TopoOrder) {
13549 assert(calculateDivergence(N) == N->isDivergent() &&
13550 "Divergence bit inconsistency detected");
13551 }
13552}
13553#endif
13554
13555/// ReplaceAllUsesOfValuesWith - Replace any uses of From with To, leaving
13556/// uses of other values produced by From.getNode() alone. The same value
13557/// may appear in both the From and To list. The Deleted vector is
13558/// handled the same way as for ReplaceAllUsesWith.
13560 const SDValue *To,
13561 unsigned Num){
13562 // Handle the simple, trivial case efficiently.
13563 if (Num == 1)
13564 return ReplaceAllUsesOfValueWith(*From, *To);
13565
13566 transferDbgValues(*From, *To);
13567 copyExtraInfo(From->getNode(), To->getNode());
13568
13569 // Read up all the uses and make records of them. This helps
13570 // processing new uses that are introduced during the
13571 // replacement process.
13573 for (unsigned i = 0; i != Num; ++i) {
13574 unsigned FromResNo = From[i].getResNo();
13575 SDNode *FromNode = From[i].getNode();
13576 for (SDUse &Use : FromNode->uses()) {
13577 if (Use.getResNo() == FromResNo) {
13578 UseMemo Memo = {Use.getUser(), i, &Use};
13579 Uses.push_back(Memo);
13580 }
13581 }
13582 }
13583
13584 // Sort the uses, so that all the uses from a given User are together.
13586 RAUOVWUpdateListener Listener(*this, Uses);
13587
13588 for (unsigned UseIndex = 0, UseIndexEnd = Uses.size();
13589 UseIndex != UseIndexEnd; ) {
13590 // We know that this user uses some value of From. If it is the right
13591 // value, update it.
13592 SDNode *User = Uses[UseIndex].User;
13593 // If the node has been deleted by recursive CSE updates when updating
13594 // another node, then just skip this entry.
13595 if (User == nullptr) {
13596 ++UseIndex;
13597 continue;
13598 }
13599
13600 // This node is about to morph, remove its old self from the CSE maps.
13601 RemoveNodeFromCSEMaps(User);
13602
13603 // The Uses array is sorted, so all the uses for a given User
13604 // are next to each other in the list.
13605 // To help reduce the number of CSE recomputations, process all
13606 // the uses of this user that we can find this way.
13607 do {
13608 unsigned i = Uses[UseIndex].Index;
13609 SDUse &Use = *Uses[UseIndex].Use;
13610 ++UseIndex;
13611
13612 Use.set(To[i]);
13613 } while (UseIndex != UseIndexEnd && Uses[UseIndex].User == User);
13614
13615 // Now that we have modified User, add it back to the CSE maps. If it
13616 // already exists there, recursively merge the results together.
13617 AddModifiedNodeToCSEMaps(User);
13618 }
13619}
13620
13621/// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
13622/// based on their topological order. It returns the maximum id and a vector
13623/// of the SDNodes* in assigned order by reference.
13625 unsigned DAGSize = 0;
13626
13627 // SortedPos tracks the progress of the algorithm. Nodes before it are
13628 // sorted, nodes after it are unsorted. When the algorithm completes
13629 // it is at the end of the list.
13630 allnodes_iterator SortedPos = allnodes_begin();
13631
13632 // Visit all the nodes. Move nodes with no operands to the front of
13633 // the list immediately. Annotate nodes that do have operands with their
13634 // operand count. Before we do this, the Node Id fields of the nodes
13635 // may contain arbitrary values. After, the Node Id fields for nodes
13636 // before SortedPos will contain the topological sort index, and the
13637 // Node Id fields for nodes At SortedPos and after will contain the
13638 // count of outstanding operands.
13640 checkForCycles(&N, this);
13641 unsigned Degree = N.getNumOperands();
13642 if (Degree == 0) {
13643 // A node with no uses, add it to the result array immediately.
13644 N.setNodeId(DAGSize++);
13645 allnodes_iterator Q(&N);
13646 if (Q != SortedPos)
13647 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(Q));
13648 assert(SortedPos != AllNodes.end() && "Overran node list");
13649 ++SortedPos;
13650 } else {
13651 // Temporarily use the Node Id as scratch space for the degree count.
13652 N.setNodeId(Degree);
13653 }
13654 }
13655
13656 // Visit all the nodes. As we iterate, move nodes into sorted order,
13657 // such that by the time the end is reached all nodes will be sorted.
13658 for (SDNode &Node : allnodes()) {
13659 SDNode *N = &Node;
13660 checkForCycles(N, this);
13661 // N is in sorted position, so all its uses have one less operand
13662 // that needs to be sorted.
13663 for (SDNode *P : N->users()) {
13664 unsigned Degree = P->getNodeId();
13665 assert(Degree != 0 && "Invalid node degree");
13666 --Degree;
13667 if (Degree == 0) {
13668 // All of P's operands are sorted, so P may sorted now.
13669 P->setNodeId(DAGSize++);
13670 if (P->getIterator() != SortedPos)
13671 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(P));
13672 assert(SortedPos != AllNodes.end() && "Overran node list");
13673 ++SortedPos;
13674 } else {
13675 // Update P's outstanding operand count.
13676 P->setNodeId(Degree);
13677 }
13678 }
13679 if (Node.getIterator() == SortedPos) {
13680#ifndef NDEBUG
13682 SDNode *S = &*++I;
13683 dbgs() << "Overran sorted position:\n";
13684 S->dumprFull(this); dbgs() << "\n";
13685 dbgs() << "Checking if this is due to cycles\n";
13686 checkForCycles(this, true);
13687#endif
13688 llvm_unreachable(nullptr);
13689 }
13690 }
13691
13692 assert(SortedPos == AllNodes.end() &&
13693 "Topological sort incomplete!");
13694 assert(AllNodes.front().getOpcode() == ISD::EntryToken &&
13695 "First node in topological sort is not the entry token!");
13696 assert(AllNodes.front().getNodeId() == 0 &&
13697 "First node in topological sort has non-zero id!");
13698 assert(AllNodes.front().getNumOperands() == 0 &&
13699 "First node in topological sort has operands!");
13700 assert(AllNodes.back().getNodeId() == (int)DAGSize-1 &&
13701 "Last node in topologic sort has unexpected id!");
13702 assert(AllNodes.back().use_empty() &&
13703 "Last node in topologic sort has users!");
13704 assert(DAGSize == allnodes_size() && "Node count mismatch!");
13705 return DAGSize;
13706}
13707
13709 SmallVectorImpl<const SDNode *> &SortedNodes) const {
13710 SortedNodes.clear();
13711 // Node -> remaining number of outstanding operands.
13712 DenseMap<const SDNode *, unsigned> RemainingOperands;
13713
13714 // Put nodes without any operands into SortedNodes first.
13715 for (const SDNode &N : allnodes()) {
13716 checkForCycles(&N, this);
13717 unsigned NumOperands = N.getNumOperands();
13718 if (NumOperands == 0)
13719 SortedNodes.push_back(&N);
13720 else
13721 // Record their total number of outstanding operands.
13722 RemainingOperands[&N] = NumOperands;
13723 }
13724
13725 // A node is pushed into SortedNodes when all of its operands (predecessors in
13726 // the graph) are also in SortedNodes.
13727 for (unsigned i = 0U; i < SortedNodes.size(); ++i) {
13728 const SDNode *N = SortedNodes[i];
13729 for (const SDNode *U : N->users()) {
13730 // HandleSDNode is never part of a DAG and therefore has no entry in
13731 // RemainingOperands.
13732 if (U->getOpcode() == ISD::HANDLENODE)
13733 continue;
13734 unsigned &NumRemOperands = RemainingOperands[U];
13735 assert(NumRemOperands && "Invalid number of remaining operands");
13736 --NumRemOperands;
13737 if (!NumRemOperands)
13738 SortedNodes.push_back(U);
13739 }
13740 }
13741
13742 assert(SortedNodes.size() == AllNodes.size() && "Node count mismatch");
13743 assert(SortedNodes.front()->getOpcode() == ISD::EntryToken &&
13744 "First node in topological sort is not the entry token");
13745 assert(SortedNodes.front()->getNumOperands() == 0 &&
13746 "First node in topological sort has operands");
13747}
13748
13749/// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the
13750/// value is produced by SD.
13751void SelectionDAG::AddDbgValue(SDDbgValue *DB, bool isParameter) {
13752 for (SDNode *SD : DB->getSDNodes()) {
13753 if (!SD)
13754 continue;
13755 assert(DbgInfo->getSDDbgValues(SD).empty() || SD->getHasDebugValue());
13756 SD->setHasDebugValue(true);
13757 }
13758 DbgInfo->add(DB, isParameter);
13759}
13760
13761void SelectionDAG::AddDbgLabel(SDDbgLabel *DB) { DbgInfo->add(DB); }
13762
13764 SDValue NewMemOpChain) {
13765 assert(isa<MemSDNode>(NewMemOpChain) && "Expected a memop node");
13766 assert(NewMemOpChain.getValueType() == MVT::Other && "Expected a token VT");
13767 // The new memory operation must have the same position as the old load in
13768 // terms of memory dependency. Create a TokenFactor for the old load and new
13769 // memory operation and update uses of the old load's output chain to use that
13770 // TokenFactor.
13771 if (OldChain == NewMemOpChain || OldChain.use_empty())
13772 return NewMemOpChain;
13773
13774 SDValue TokenFactor = getNode(ISD::TokenFactor, SDLoc(OldChain), MVT::Other,
13775 OldChain, NewMemOpChain);
13776 ReplaceAllUsesOfValueWith(OldChain, TokenFactor);
13777 UpdateNodeOperands(TokenFactor.getNode(), OldChain, NewMemOpChain);
13778 return TokenFactor;
13779}
13780
13782 SDValue NewMemOp) {
13783 assert(isa<MemSDNode>(NewMemOp.getNode()) && "Expected a memop node");
13784 SDValue OldChain = SDValue(OldLoad, 1);
13785 SDValue NewMemOpChain = NewMemOp.getValue(1);
13786 return makeEquivalentMemoryOrdering(OldChain, NewMemOpChain);
13787}
13788
13790 Function **OutFunction) {
13791 assert(isa<ExternalSymbolSDNode>(Op) && "Node should be an ExternalSymbol");
13792
13793 auto *Symbol = cast<ExternalSymbolSDNode>(Op)->getSymbol();
13794 auto *Module = MF->getFunction().getParent();
13795 auto *Function = Module->getFunction(Symbol);
13796
13797 if (OutFunction != nullptr)
13798 *OutFunction = Function;
13799
13800 if (Function != nullptr) {
13801 auto PtrTy = TLI->getPointerTy(getDataLayout(), Function->getAddressSpace());
13802 return getGlobalAddress(Function, SDLoc(Op), PtrTy);
13803 }
13804
13805 std::string ErrorStr;
13806 raw_string_ostream ErrorFormatter(ErrorStr);
13807 ErrorFormatter << "Undefined external symbol ";
13808 ErrorFormatter << '"' << Symbol << '"';
13809 report_fatal_error(Twine(ErrorStr));
13810}
13811
13812//===----------------------------------------------------------------------===//
13813// SDNode Class
13814//===----------------------------------------------------------------------===//
13815
13818 return Const != nullptr && Const->isZero();
13819}
13820
13822 return V.isUndef() || isNullConstant(V);
13823}
13824
13827 return Const != nullptr && Const->isZero() && !Const->isNegative();
13828}
13829
13832 return Const != nullptr && Const->isAllOnes();
13833}
13834
13837 return Const != nullptr && Const->isOne();
13838}
13839
13842 return Const != nullptr && Const->isMinSignedValue();
13843}
13844
13846 SDValue V, unsigned OperandNo,
13847 unsigned Depth) const {
13848 APInt DemandedElts = getDemandAllEltsMask(V);
13849 return isIdentityElement(Opcode, Flags, V, DemandedElts, OperandNo, Depth);
13850}
13851
13853 SDValue V, const APInt &DemandedElts,
13854 unsigned OperandNo, unsigned Depth) const {
13855 // NOTE: The cases should match with IR's ConstantExpr::getBinOpIdentity().
13856 // TODO: Target-specific opcodes could be added.
13857 if (V.getValueType().isInteger()) {
13858 KnownBits Known = computeKnownBits(V, DemandedElts, Depth);
13859 if (Known.isConstant()) {
13860 const APInt &Const = Known.getConstant();
13861 switch (Opcode) {
13862 case ISD::ADD:
13863 case ISD::OR:
13864 case ISD::XOR:
13865 case ISD::UMAX:
13866 return Const.isZero();
13867 case ISD::MUL:
13868 return Const.isOne();
13869 case ISD::AND:
13870 case ISD::UMIN:
13871 return Const.isAllOnes();
13872 case ISD::SMAX:
13873 return Const.isMinSignedValue();
13874 case ISD::SMIN:
13875 return Const.isMaxSignedValue();
13876 case ISD::SUB:
13877 case ISD::SHL:
13878 case ISD::SRA:
13879 case ISD::SRL:
13880 return OperandNo == 1 && Const.isZero();
13881 case ISD::UDIV:
13882 case ISD::SDIV:
13883 return OperandNo == 1 && Const.isOne();
13884 }
13885 }
13886 } else if (auto *ConstFP = isConstOrConstSplatFP(V, DemandedElts)) {
13887 switch (Opcode) {
13888 case ISD::FADD:
13889 return ConstFP->isZero() &&
13890 (Flags.hasNoSignedZeros() || ConstFP->isNegative());
13891 case ISD::FSUB:
13892 return OperandNo == 1 && ConstFP->isZero() &&
13893 (Flags.hasNoSignedZeros() || !ConstFP->isNegative());
13894 case ISD::FMUL:
13895 return ConstFP->isOne();
13896 case ISD::FDIV:
13897 return OperandNo == 1 && ConstFP->isOne();
13898 case ISD::FMINNUM:
13899 case ISD::FMAXNUM:
13900 case ISD::FMINIMUMNUM:
13901 case ISD::FMAXIMUMNUM: {
13902 // Neutral element for fminnum/fminimumnum is NaN, Inf or FLT_MAX,
13903 // depending on fast-math flags (FMF).
13904 EVT VT = V.getValueType();
13905 const fltSemantics &Semantics = VT.getFltSemantics();
13906 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics)
13907 : !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
13908 : APFloat::getLargest(Semantics);
13909 if (Opcode == ISD::FMAXNUM || Opcode == ISD::FMAXIMUMNUM)
13910 NeutralAF.changeSign();
13911
13912 return ConstFP->isExactlyValue(NeutralAF);
13913 }
13914 case ISD::FMINIMUM:
13915 case ISD::FMAXIMUM: {
13916 // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
13917 const APFloat &VAPF = ConstFP->getValueAPF();
13918 bool NeutralNegative = (Opcode == ISD::FMAXIMUM);
13919 if (Flags.hasNoInfs())
13920 return VAPF.isLargest() && VAPF.isNegative() == NeutralNegative;
13921 return VAPF.isInfinity() && VAPF.isNegative() == NeutralNegative;
13922 }
13923 }
13924 }
13925 return false;
13926}
13927
13929 while (V.getOpcode() == ISD::BITCAST)
13930 V = V.getOperand(0);
13931 return V;
13932}
13933
13935 while (V.getOpcode() == ISD::BITCAST && V.getOperand(0).hasOneUse())
13936 V = V.getOperand(0);
13937 return V;
13938}
13939
13941 while (V.getOpcode() == ISD::EXTRACT_SUBVECTOR)
13942 V = V.getOperand(0);
13943 return V;
13944}
13945
13947 while (V.getOpcode() == ISD::INSERT_VECTOR_ELT) {
13948 SDValue InVec = V.getOperand(0);
13949 SDValue EltNo = V.getOperand(2);
13950 EVT VT = InVec.getValueType();
13951 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
13952 if (IndexC && VT.isFixedLengthVector() &&
13953 IndexC->getAPIntValue().ult(VT.getVectorNumElements()) &&
13954 !DemandedElts[IndexC->getZExtValue()]) {
13955 V = InVec;
13956 continue;
13957 }
13958 break;
13959 }
13960 return V;
13961}
13962
13964 while (V.getOpcode() == ISD::TRUNCATE)
13965 V = V.getOperand(0);
13966 return V;
13967}
13968
13969bool llvm::isBitwiseNot(SDValue V, bool AllowUndefs) {
13970 if (V.getOpcode() != ISD::XOR)
13971 return false;
13972 V = peekThroughBitcasts(V.getOperand(1));
13973 unsigned NumBits = V.getScalarValueSizeInBits();
13974 ConstantSDNode *C =
13975 isConstOrConstSplat(V, AllowUndefs, /*AllowTruncation*/ true);
13976 return C && (C->getAPIntValue().countr_one() >= NumBits);
13977}
13978
13980 bool AllowTruncation) {
13981 APInt DemandedElts = getDemandAllEltsMask(N);
13982 return isConstOrConstSplat(N, DemandedElts, AllowUndefs, AllowTruncation);
13983}
13984
13986 bool AllowUndefs,
13987 bool AllowTruncation) {
13989 return CN;
13990
13991 // SplatVectors can truncate their operands. Ignore that case here unless
13992 // AllowTruncation is set.
13993 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
13994 EVT VecEltVT = N->getValueType(0).getVectorElementType();
13995 if (auto *CN = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
13996 EVT CVT = CN->getValueType(0);
13997 assert(CVT.bitsGE(VecEltVT) && "Illegal splat_vector element extension");
13998 if (AllowTruncation || CVT == VecEltVT)
13999 return CN;
14000 }
14001 }
14002
14004 BitVector UndefElements;
14005 ConstantSDNode *CN = BV->getConstantSplatNode(DemandedElts, &UndefElements);
14006
14007 // BuildVectors can truncate their operands. Ignore that case here unless
14008 // AllowTruncation is set.
14009 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
14010 if (CN && (UndefElements.none() || AllowUndefs)) {
14011 EVT CVT = CN->getValueType(0);
14012 EVT NSVT = N.getValueType().getScalarType();
14013 assert(CVT.bitsGE(NSVT) && "Illegal build vector element extension");
14014 if (AllowTruncation || (CVT == NSVT))
14015 return CN;
14016 }
14017 }
14018
14019 if (N.getOpcode() == ISD::MERGE_VALUES)
14020 return isConstOrConstSplat(N.getOperand(N.getResNo()), DemandedElts,
14021 AllowUndefs, AllowTruncation);
14022
14023 return nullptr;
14024}
14025
14027 APInt DemandedElts = getDemandAllEltsMask(N);
14028 return isConstOrConstSplatFP(N, DemandedElts, AllowUndefs);
14029}
14030
14032 const APInt &DemandedElts,
14033 bool AllowUndefs) {
14035 return CN;
14036
14038 BitVector UndefElements;
14039 ConstantFPSDNode *CN =
14040 BV->getConstantFPSplatNode(DemandedElts, &UndefElements);
14041 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
14042 if (CN && (UndefElements.none() || AllowUndefs))
14043 return CN;
14044 }
14045
14046 if (N.getOpcode() == ISD::SPLAT_VECTOR)
14047 if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N.getOperand(0)))
14048 return CN;
14049
14050 return nullptr;
14051}
14052
14053bool llvm::isNullOrNullSplat(SDValue N, bool AllowUndefs) {
14054 // TODO: may want to use peekThroughBitcast() here.
14055 ConstantSDNode *C =
14056 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
14057 return C && C->isZero();
14058}
14059
14060bool llvm::isOneOrOneSplat(SDValue N, bool AllowUndefs) {
14061 ConstantSDNode *C =
14062 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation*/ true);
14063 return C && C->isOne();
14064}
14065
14066bool llvm::isOneOrOneSplatFP(SDValue N, bool AllowUndefs) {
14067 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
14068 return C && C->isOne();
14069}
14070
14071bool llvm::isAllOnesOrAllOnesSplat(SDValue N, bool AllowUndefs) {
14073 unsigned BitWidth = N.getScalarValueSizeInBits();
14074 ConstantSDNode *C =
14075 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
14076 return C && C->getAPIntValue().countTrailingOnes() >= BitWidth;
14077}
14078
14079bool llvm::isZeroOrZeroSplat(SDValue N, bool AllowUndefs) {
14081 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs, true);
14082 return C && C->isZero();
14083}
14084
14085bool llvm::isZeroOrZeroSplatFP(SDValue N, bool AllowUndefs) {
14086 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
14087 return C && C->isZero();
14088}
14089
14093
14095 unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt,
14097 : SDNode(Opc, Order, dl, VTs), MemoryVT(memvt), MemRefs(memrefs) {
14098 bool IsVolatile = false;
14099 bool IsNonTemporal = false;
14100 bool IsDereferenceable = true;
14101 bool IsInvariant = true;
14102 for (const MachineMemOperand *MMO : memoperands()) {
14103 IsVolatile |= MMO->isVolatile();
14104 IsNonTemporal |= MMO->isNonTemporal();
14105 IsDereferenceable &= MMO->isDereferenceable();
14106 IsInvariant &= MMO->isInvariant();
14107 }
14108 MemSDNodeBits.IsVolatile = IsVolatile;
14109 MemSDNodeBits.IsNonTemporal = IsNonTemporal;
14110 MemSDNodeBits.IsDereferenceable = IsDereferenceable;
14111 MemSDNodeBits.IsInvariant = IsInvariant;
14112
14113 // For the single-MMO case, we check here that the size of the memory operand
14114 // fits within the size of the MMO. This is because the MMO might indicate
14115 // only a possible address range instead of specifying the affected memory
14116 // addresses precisely.
14119 getMemOperand()->getSize().getValue())) &&
14120 "Size mismatch!");
14121}
14122
14123namespace {
14124
14125 struct EVTArray {
14126 std::vector<EVT> VTs;
14127
14128 EVTArray() {
14129 VTs.reserve(MVT::VALUETYPE_SIZE);
14130 for (unsigned i = 0; i < MVT::VALUETYPE_SIZE; ++i)
14131 VTs.push_back(MVT((MVT::SimpleValueType)i));
14132 }
14133 };
14134
14135} // end anonymous namespace
14136
14137/// getValueTypeList - Return a pointer to the specified value type.
14138///
14139const EVT *SDNode::getValueTypeList(MVT VT) {
14140 static EVTArray SimpleVTArray;
14141
14142 assert(VT < MVT::VALUETYPE_SIZE && "Value type out of range!");
14143 return &SimpleVTArray.VTs[VT.SimpleTy];
14144}
14145
14146/// hasAnyUseOfValue - Return true if there are any use of the indicated
14147/// value. This method ignores uses of other values defined by this operation.
14148bool SDNode::hasAnyUseOfValue(unsigned Value) const {
14149 assert(Value < getNumValues() && "Bad value!");
14150
14151 for (SDUse &U : uses())
14152 if (U.getResNo() == Value)
14153 return true;
14154
14155 return false;
14156}
14157
14158/// isOnlyUserOf - Return true if this node is the only use of N.
14159bool SDNode::isOnlyUserOf(const SDNode *N) const {
14160 bool Seen = false;
14161 for (const SDNode *User : N->users()) {
14162 if (User == this)
14163 Seen = true;
14164 else
14165 return false;
14166 }
14167
14168 return Seen;
14169}
14170
14171/// Return true if the only users of N are contained in Nodes.
14173 bool Seen = false;
14174 for (const SDNode *User : N->users()) {
14175 if (llvm::is_contained(Nodes, User))
14176 Seen = true;
14177 else
14178 return false;
14179 }
14180
14181 return Seen;
14182}
14183
14184/// Return true if the referenced return value is an operand of N.
14185bool SDValue::isOperandOf(const SDNode *N) const {
14186 return is_contained(N->op_values(), *this);
14187}
14188
14189bool SDNode::isOperandOf(const SDNode *N) const {
14190 return any_of(N->op_values(),
14191 [this](SDValue Op) { return this == Op.getNode(); });
14192}
14193
14194/// reachesChainWithoutSideEffects - Return true if this operand (which must
14195/// be a chain) reaches the specified operand without crossing any
14196/// side-effecting instructions on any chain path. In practice, this looks
14197/// through token factors and non-volatile loads. In order to remain efficient,
14198/// this only looks a couple of nodes in, it does not do an exhaustive search.
14199///
14200/// Note that we only need to examine chains when we're searching for
14201/// side-effects; SelectionDAG requires that all side-effects are represented
14202/// by chains, even if another operand would force a specific ordering. This
14203/// constraint is necessary to allow transformations like splitting loads.
14205 unsigned Depth) const {
14206 if (*this == Dest) return true;
14207
14208 // Don't search too deeply, we just want to be able to see through
14209 // TokenFactor's etc.
14210 if (Depth == 0) return false;
14211
14212 // If this is a token factor, all inputs to the TF happen in parallel.
14213 if (getOpcode() == ISD::TokenFactor) {
14214 // First, try a shallow search.
14215 if (is_contained((*this)->ops(), Dest)) {
14216 // We found the chain we want as an operand of this TokenFactor.
14217 // Essentially, we reach the chain without side-effects if we could
14218 // serialize the TokenFactor into a simple chain of operations with
14219 // Dest as the last operation. This is automatically true if the
14220 // chain has one use: there are no other ordering constraints.
14221 // If the chain has more than one use, we give up: some other
14222 // use of Dest might force a side-effect between Dest and the current
14223 // node.
14224 if (Dest.hasOneUse())
14225 return true;
14226 }
14227 // Next, try a deep search: check whether every operand of the TokenFactor
14228 // reaches Dest.
14229 return llvm::all_of((*this)->ops(), [=](SDValue Op) {
14230 return Op.reachesChainWithoutSideEffects(Dest, Depth - 1);
14231 });
14232 }
14233
14234 // Loads don't have side effects, look through them.
14235 if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(*this)) {
14236 if (Ld->isUnordered())
14237 return Ld->getChain().reachesChainWithoutSideEffects(Dest, Depth-1);
14238 }
14239 return false;
14240}
14241
14242bool SDNode::hasPredecessor(const SDNode *N) const {
14245 Worklist.push_back(this);
14246 return hasPredecessorHelper(N, Visited, Worklist);
14247}
14248
14250 this->Flags &= Flags;
14251}
14252
14253SDValue
14255 ArrayRef<ISD::NodeType> CandidateBinOps,
14256 bool AllowPartials) {
14257 // The pattern must end in an extract from index 0.
14258 if (Extract->getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
14259 !isNullConstant(Extract->getOperand(1)))
14260 return SDValue();
14261
14262 // Match against one of the candidate binary ops.
14263 SDValue Op = Extract->getOperand(0);
14264 if (llvm::none_of(CandidateBinOps, [Op](ISD::NodeType BinOp) {
14265 return Op.getOpcode() == unsigned(BinOp);
14266 }))
14267 return SDValue();
14268
14269 // Floating-point reductions may require relaxed constraints on the final step
14270 // of the reduction because they may reorder intermediate operations.
14271 unsigned CandidateBinOp = Op.getOpcode();
14272 if (Op.getValueType().isFloatingPoint()) {
14273 SDNodeFlags Flags = Op->getFlags();
14274 switch (CandidateBinOp) {
14275 case ISD::FADD:
14276 if (!Flags.hasNoSignedZeros() || !Flags.hasAllowReassociation())
14277 return SDValue();
14278 break;
14279 default:
14280 llvm_unreachable("Unhandled FP opcode for binop reduction");
14281 }
14282 }
14283
14284 // Matching failed - attempt to see if we did enough stages that a partial
14285 // reduction from a subvector is possible.
14286 auto PartialReduction = [&](SDValue Op, unsigned NumSubElts) {
14287 if (!AllowPartials || !Op)
14288 return SDValue();
14289 EVT OpVT = Op.getValueType();
14290 EVT OpSVT = OpVT.getScalarType();
14291 EVT SubVT = EVT::getVectorVT(*getContext(), OpSVT, NumSubElts);
14292 if (TLI->getExtractSubvectorCost(SubVT, OpVT, 0) >
14294 return SDValue();
14295 BinOp = (ISD::NodeType)CandidateBinOp;
14296 return getExtractSubvector(SDLoc(Op), SubVT, Op, 0);
14297 };
14298
14299 // At each stage, we're looking for something that looks like:
14300 // %s = shufflevector <8 x i32> %op, <8 x i32> undef,
14301 // <8 x i32> <i32 2, i32 3, i32 undef, i32 undef,
14302 // i32 undef, i32 undef, i32 undef, i32 undef>
14303 // %a = binop <8 x i32> %op, %s
14304 // Where the mask changes according to the stage. E.g. for a 3-stage pyramid,
14305 // we expect something like:
14306 // <4,5,6,7,u,u,u,u>
14307 // <2,3,u,u,u,u,u,u>
14308 // <1,u,u,u,u,u,u,u>
14309 // While a partial reduction match would be:
14310 // <2,3,u,u,u,u,u,u>
14311 // <1,u,u,u,u,u,u,u>
14312 unsigned Stages = Log2_32(Op.getValueType().getVectorNumElements());
14313 SDValue PrevOp;
14314 for (unsigned i = 0; i < Stages; ++i) {
14315 unsigned MaskEnd = (1 << i);
14316
14317 if (Op.getOpcode() != CandidateBinOp)
14318 return PartialReduction(PrevOp, MaskEnd);
14319
14320 SDValue Op0 = Op.getOperand(0);
14321 SDValue Op1 = Op.getOperand(1);
14322
14324 if (Shuffle) {
14325 Op = Op1;
14326 } else {
14327 Shuffle = dyn_cast<ShuffleVectorSDNode>(Op1);
14328 Op = Op0;
14329 }
14330
14331 // The first operand of the shuffle should be the same as the other operand
14332 // of the binop.
14333 if (!Shuffle || Shuffle->getOperand(0) != Op)
14334 return PartialReduction(PrevOp, MaskEnd);
14335
14336 // Verify the shuffle has the expected (at this stage of the pyramid) mask.
14337 for (int Index = 0; Index < (int)MaskEnd; ++Index)
14338 if (Shuffle->getMaskElt(Index) != (int)(MaskEnd + Index))
14339 return PartialReduction(PrevOp, MaskEnd);
14340
14341 PrevOp = Op;
14342 }
14343
14344 // Handle subvector reductions, which tend to appear after the shuffle
14345 // reduction stages.
14346 while (Op.getOpcode() == CandidateBinOp) {
14347 unsigned NumElts = Op.getValueType().getVectorNumElements();
14348 SDValue Op0 = Op.getOperand(0);
14349 SDValue Op1 = Op.getOperand(1);
14350 if (Op0.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
14352 Op0.getOperand(0) != Op1.getOperand(0))
14353 break;
14354 SDValue Src = Op0.getOperand(0);
14355 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
14356 if (NumSrcElts != (2 * NumElts))
14357 break;
14358 if (!(Op0.getConstantOperandAPInt(1) == 0 &&
14359 Op1.getConstantOperandAPInt(1) == NumElts) &&
14360 !(Op1.getConstantOperandAPInt(1) == 0 &&
14361 Op0.getConstantOperandAPInt(1) == NumElts))
14362 break;
14363 Op = Src;
14364 }
14365
14366 BinOp = (ISD::NodeType)CandidateBinOp;
14367 return Op;
14368}
14369
14371 EVT VT = N->getValueType(0);
14372 EVT EltVT = VT.getVectorElementType();
14373 unsigned NE = getMaxRuntimeNumElements(VT);
14374
14375 if (VT.isScalableVector() && (NE == 0 || ResNE != 0))
14376 reportFatalUsageError("Cannot unroll scalable vector!");
14377
14378 assert(NE && "Nothing to unroll!");
14379 SDLoc dl(N);
14380
14381 // If ResNE is 0, fully unroll the vector op.
14382 if (ResNE == 0)
14383 ResNE = NE;
14384 else if (NE > ResNE)
14385 NE = ResNE;
14386
14387 if (N->getNumValues() == 2) {
14388 SmallVector<SDValue, 8> Scalars0, Scalars1;
14389 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14390 EVT VT1 = N->getValueType(1);
14391 EVT EltVT1 = VT1.getVectorElementType();
14392
14393 unsigned i;
14394 for (i = 0; i != NE; ++i) {
14395 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14396 SDValue Operand = N->getOperand(j);
14397 EVT OperandVT = Operand.getValueType();
14398
14399 // A vector operand; extract a single element.
14400 EVT OperandEltVT = OperandVT.getVectorElementType();
14401 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14402 }
14403
14404 SDValue EltOp = getNode(N->getOpcode(), dl, {EltVT, EltVT1}, Operands);
14405 Scalars0.push_back(EltOp);
14406 Scalars1.push_back(EltOp.getValue(1));
14407 }
14408
14409 for (; i < ResNE; ++i) {
14410 Scalars0.push_back(getUNDEF(EltVT));
14411 Scalars1.push_back(getUNDEF(EltVT1));
14412 }
14413
14415 : ElementCount::getFixed(ResNE);
14416 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResEC);
14417 EVT VecVT1 = EVT::getVectorVT(*getContext(), EltVT1, ResEC);
14418 SDValue Vec0 = buildVectorFromUnrolledParts(VecVT, dl, Scalars0);
14419 SDValue Vec1 = buildVectorFromUnrolledParts(VecVT1, dl, Scalars1);
14420 return getMergeValues({Vec0, Vec1}, dl);
14421 }
14422
14423 assert(N->getNumValues() == 1 &&
14424 "Can't unroll a vector with multiple results!");
14425
14427 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14428
14429 unsigned i;
14430 for (i= 0; i != NE; ++i) {
14431 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14432 SDValue Operand = N->getOperand(j);
14433 EVT OperandVT = Operand.getValueType();
14434 if (OperandVT.isVector()) {
14435 // A vector operand; extract a single element.
14436 EVT OperandEltVT = OperandVT.getVectorElementType();
14437 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14438 } else {
14439 // A scalar operand; just use it as is.
14440 Operands[j] = Operand;
14441 }
14442 }
14443
14444 switch (N->getOpcode()) {
14445 default: {
14446 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands,
14447 N->getFlags()));
14448 break;
14449 }
14450 case ISD::VSELECT:
14451 Scalars.push_back(
14452 getNode(ISD::SELECT, dl, EltVT, Operands, N->getFlags()));
14453 break;
14454 case ISD::SHL:
14455 case ISD::SRA:
14456 case ISD::SRL:
14457 case ISD::ROTL:
14458 case ISD::ROTR:
14459 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands[0],
14461 Operands[1])));
14462 break;
14464 EVT ExtVT = cast<VTSDNode>(Operands[1])->getVT().getVectorElementType();
14465 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT,
14466 Operands[0],
14467 getValueType(ExtVT)));
14468 break;
14469 }
14470 case ISD::ADDRSPACECAST: {
14471 const auto *ASC = cast<AddrSpaceCastSDNode>(N);
14472 Scalars.push_back(
14473 getAddrSpaceCast(dl, EltVT, Operands[0], ASC->getSrcAddressSpace(),
14474 ASC->getDestAddressSpace(), ASC->getFlags()));
14475 break;
14476 }
14477 }
14478 }
14479
14480 for (; i < ResNE; ++i)
14481 Scalars.push_back(getUNDEF(EltVT));
14482
14483 EVT VecVT = VT.isScalableVector()
14484 ? VT
14485 : EVT::getVectorVT(*getContext(), EltVT, ResNE);
14486 return buildVectorFromUnrolledParts(VecVT, dl, Scalars);
14487}
14488
14489std::pair<SDValue, SDValue> SelectionDAG::UnrollVectorOverflowOp(
14490 SDNode *N, unsigned ResNE) {
14491 unsigned Opcode = N->getOpcode();
14492 assert((Opcode == ISD::UADDO || Opcode == ISD::SADDO ||
14493 Opcode == ISD::USUBO || Opcode == ISD::SSUBO ||
14494 Opcode == ISD::UMULO || Opcode == ISD::SMULO) &&
14495 "Expected an overflow opcode");
14496
14497 EVT ResVT = N->getValueType(0);
14498 EVT OvVT = N->getValueType(1);
14499 EVT ResEltVT = ResVT.getVectorElementType();
14500 EVT OvEltVT = OvVT.getVectorElementType();
14501 SDLoc dl(N);
14502
14503 // If ResNE is 0, fully unroll the vector op.
14504 unsigned NE = ResVT.getVectorNumElements();
14505 if (ResNE == 0)
14506 ResNE = NE;
14507 else if (NE > ResNE)
14508 NE = ResNE;
14509
14510 SmallVector<SDValue, 8> LHSScalars;
14511 SmallVector<SDValue, 8> RHSScalars;
14512 ExtractVectorElements(N->getOperand(0), LHSScalars, 0, NE);
14513 ExtractVectorElements(N->getOperand(1), RHSScalars, 0, NE);
14514
14515 EVT SVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), ResEltVT);
14516 SDVTList VTs = getVTList(ResEltVT, SVT);
14517 SmallVector<SDValue, 8> ResScalars;
14518 SmallVector<SDValue, 8> OvScalars;
14519 for (unsigned i = 0; i < NE; ++i) {
14520 SDValue Res = getNode(Opcode, dl, VTs, LHSScalars[i], RHSScalars[i]);
14521 SDValue Ov =
14522 getSelect(dl, OvEltVT, Res.getValue(1),
14523 getBoolConstant(true, dl, OvEltVT, ResVT),
14524 getConstant(0, dl, OvEltVT));
14525
14526 ResScalars.push_back(Res);
14527 OvScalars.push_back(Ov);
14528 }
14529
14530 ResScalars.append(ResNE - NE, getUNDEF(ResEltVT));
14531 OvScalars.append(ResNE - NE, getUNDEF(OvEltVT));
14532
14533 EVT NewResVT = EVT::getVectorVT(*getContext(), ResEltVT, ResNE);
14534 EVT NewOvVT = EVT::getVectorVT(*getContext(), OvEltVT, ResNE);
14535 return std::make_pair(getBuildVector(NewResVT, dl, ResScalars),
14536 getBuildVector(NewOvVT, dl, OvScalars));
14537}
14538
14541 unsigned Bytes, int Dist,
14542 const SelectionDAG &DAG) {
14543 if (LS->isVolatile() || Base->isVolatile())
14544 return false;
14545 // TODO: probably too restrictive for atomics, revisit
14546 if (!LS->isSimple())
14547 return false;
14548 if (LS->isIndexed() || Base->isIndexed())
14549 return false;
14550 if (LS->getChain() != Base->getChain())
14551 return false;
14552 EVT VT = LS->getMemoryVT();
14553 if (VT.getSizeInBits() / 8 != Bytes)
14554 return false;
14555
14556 auto BaseLocDecomp = BaseIndexOffset::match(Base, DAG);
14557 auto LocDecomp = BaseIndexOffset::match(LS, DAG);
14558
14559 int64_t Offset = 0;
14560 if (BaseLocDecomp.equalBaseIndex(LocDecomp, DAG, Offset))
14561 return (Dist * (int64_t)Bytes == Offset);
14562 return false;
14563}
14564
14567 unsigned Bytes,
14568 int Dist) const {
14569 return areNonVolatileConsecutiveLoadsOrStores(LD, Base, Bytes, Dist, *this);
14570}
14571
14574 unsigned Bytes,
14575 int Dist) const {
14576 return areNonVolatileConsecutiveLoadsOrStores(ST, Base, Bytes, Dist, *this);
14577}
14578
14579/// InferPtrAlignment - Infer alignment of a load / store address. Return
14580/// std::nullopt if it cannot be inferred.
14582 // If this is a GlobalAddress + cst, return the alignment.
14583 const GlobalValue *GV = nullptr;
14584 int64_t GVOffset = 0;
14585 if (TLI->isGAPlusOffset(Ptr.getNode(), GV, GVOffset)) {
14586 unsigned PtrWidth = getDataLayout().getPointerTypeSizeInBits(GV->getType());
14587 KnownBits Known(PtrWidth);
14589 unsigned AlignBits = Known.countMinTrailingZeros();
14590 if (AlignBits)
14591 return commonAlignment(Align::fromLog2(std::min(31U, AlignBits)),
14592 GVOffset);
14593 }
14594
14595 // If this is a direct reference to a stack slot, use information about the
14596 // stack slot's alignment.
14597 int FrameIdx = INT_MIN;
14598 int64_t FrameOffset = 0;
14600 FrameIdx = FI->getIndex();
14601 } else if (isBaseWithConstantOffset(Ptr) &&
14603 // Handle FI+Cst
14604 FrameIdx = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
14605 FrameOffset = Ptr.getConstantOperandVal(1);
14606 }
14607
14608 if (FrameIdx != INT_MIN) {
14610 return commonAlignment(MFI.getObjectAlign(FrameIdx), FrameOffset);
14611 }
14612
14613 return std::nullopt;
14614}
14615
14616/// Split the scalar node with EXTRACT_ELEMENT using the provided
14617/// VTs and return the low/high part.
14618std::pair<SDValue, SDValue> SelectionDAG::SplitScalar(const SDValue &N,
14619 const SDLoc &DL,
14620 const EVT &LoVT,
14621 const EVT &HiVT) {
14622 assert(!LoVT.isVector() && !HiVT.isVector() && !N.getValueType().isVector() &&
14623 "Split node must be a scalar type");
14624 SDValue Lo =
14626 SDValue Hi =
14628 return std::make_pair(Lo, Hi);
14629}
14630
14631/// GetSplitDestVTs - Compute the VTs needed for the low/hi parts of a type
14632/// which is split (or expanded) into two not necessarily identical pieces.
14633std::pair<EVT, EVT> SelectionDAG::GetSplitDestVTs(const EVT &VT) const {
14634 // Currently all types are split in half.
14635 EVT LoVT, HiVT;
14636 if (!VT.isVector())
14637 LoVT = HiVT = TLI->getTypeToTransformTo(*getContext(), VT);
14638 else
14639 LoVT = HiVT = VT.getHalfNumVectorElementsVT(*getContext());
14640
14641 return std::make_pair(LoVT, HiVT);
14642}
14643
14644/// GetDependentSplitDestVTs - Compute the VTs needed for the low/hi parts of a
14645/// type, dependent on an enveloping VT that has been split into two identical
14646/// pieces. Sets the HiIsEmpty flag when hi type has zero storage size.
14647std::pair<EVT, EVT>
14649 bool *HiIsEmpty) const {
14650 EVT EltTp = VT.getVectorElementType();
14651 // Examples:
14652 // custom VL=8 with enveloping VL=8/8 yields 8/0 (hi empty)
14653 // custom VL=9 with enveloping VL=8/8 yields 8/1
14654 // custom VL=10 with enveloping VL=8/8 yields 8/2
14655 // etc.
14656 ElementCount VTNumElts = VT.getVectorElementCount();
14657 ElementCount EnvNumElts = EnvVT.getVectorElementCount();
14658 assert(VTNumElts.isScalable() == EnvNumElts.isScalable() &&
14659 "Mixing fixed width and scalable vectors when enveloping a type");
14660 EVT LoVT, HiVT;
14661 if (VTNumElts.getKnownMinValue() > EnvNumElts.getKnownMinValue()) {
14662 LoVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14663 HiVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts - EnvNumElts);
14664 *HiIsEmpty = false;
14665 } else {
14666 // Flag that hi type has zero storage size, but return split envelop type
14667 // (this would be easier if vector types with zero elements were allowed).
14668 LoVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts);
14669 HiVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14670 *HiIsEmpty = true;
14671 }
14672 return std::make_pair(LoVT, HiVT);
14673}
14674
14675/// SplitVector - Split the vector with EXTRACT_SUBVECTOR and return the
14676/// low/high part.
14677std::pair<SDValue, SDValue>
14678SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT,
14679 const EVT &HiVT) {
14680 assert(LoVT.isScalableVector() == HiVT.isScalableVector() &&
14681 LoVT.isScalableVector() == N.getValueType().isScalableVector() &&
14682 "Splitting vector with an invalid mixture of fixed and scalable "
14683 "vector types");
14685 N.getValueType().getVectorMinNumElements() &&
14686 "More vector elements requested than available!");
14687 SDValue Lo, Hi;
14688 Lo = getExtractSubvector(DL, LoVT, N, 0);
14689 // For scalable vectors it is safe to use LoVT.getVectorMinNumElements()
14690 // (rather than having to use ElementCount), because EXTRACT_SUBVECTOR scales
14691 // IDX with the runtime scaling factor of the result vector type. For
14692 // fixed-width result vectors, that runtime scaling factor is 1.
14694 return std::make_pair(Lo, Hi);
14695}
14696
14697std::pair<SDValue, SDValue> SelectionDAG::SplitEVL(SDValue N, EVT VecVT,
14698 const SDLoc &DL) {
14699 // Split the vector length parameter.
14700 // %evl -> umin(%evl, %halfnumelts) and usubsat(%evl - %halfnumelts).
14701 EVT VT = N.getValueType();
14703 "Expecting the mask to be an evenly-sized vector");
14704 SDValue HalfNumElts = getElementCount(
14706 SDValue Lo = getNode(ISD::UMIN, DL, VT, N, HalfNumElts);
14707 SDValue Hi = getNode(ISD::USUBSAT, DL, VT, N, HalfNumElts);
14708 return std::make_pair(Lo, Hi);
14709}
14710
14711/// Widen the vector up to the next power of two using INSERT_SUBVECTOR.
14713 EVT VT = N.getValueType();
14716 return getInsertSubvector(DL, getPOISON(WideVT), N, 0);
14717}
14718
14721 unsigned Start, unsigned Count,
14722 EVT EltVT) {
14723 EVT VT = Op.getValueType();
14724 if (Count == 0)
14726 if (EltVT == EVT())
14727 EltVT = VT.getVectorElementType();
14728 SDLoc SL(Op);
14729 for (unsigned i = Start, e = Start + Count; i != e; ++i) {
14730 Args.push_back(getExtractVectorElt(SL, EltVT, Op, i));
14731 }
14732}
14733
14734// getAddressSpace - Return the address space this GlobalAddress belongs to.
14736 return getGlobal()->getType()->getAddressSpace();
14737}
14738
14741 return Val.MachineCPVal->getType();
14742 return Val.ConstVal->getType();
14743}
14744
14745bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue, APInt &SplatUndef,
14746 unsigned &SplatBitSize,
14747 bool &HasAnyUndefs,
14748 unsigned MinSplatBits,
14749 bool IsBigEndian) const {
14750 EVT VT = getValueType(0);
14751 assert(VT.isVector() && "Expected a vector type");
14752 unsigned VecWidth = VT.getSizeInBits();
14753 if (MinSplatBits > VecWidth)
14754 return false;
14755
14756 // FIXME: The widths are based on this node's type, but build vectors can
14757 // truncate their operands.
14758 SplatValue = APInt(VecWidth, 0);
14759 SplatUndef = APInt(VecWidth, 0);
14760
14761 // Get the bits. Bits with undefined values (when the corresponding element
14762 // of the vector is an ISD::UNDEF value) are set in SplatUndef and cleared
14763 // in SplatValue. If any of the values are not constant, give up and return
14764 // false.
14765 unsigned int NumOps = getNumOperands();
14766 assert(NumOps > 0 && "isConstantSplat has 0-size build vector");
14767 unsigned EltWidth = VT.getScalarSizeInBits();
14768
14769 for (unsigned j = 0; j < NumOps; ++j) {
14770 unsigned i = IsBigEndian ? NumOps - 1 - j : j;
14771 SDValue OpVal = getOperand(i);
14772 unsigned BitPos = j * EltWidth;
14773
14774 if (OpVal.isUndef())
14775 SplatUndef.setBits(BitPos, BitPos + EltWidth);
14776 else if (auto *CN = dyn_cast<ConstantSDNode>(OpVal))
14777 SplatValue.insertBits(CN->getAPIntValue().zextOrTrunc(EltWidth), BitPos);
14778 else if (auto *CN = dyn_cast<ConstantFPSDNode>(OpVal))
14779 SplatValue.insertBits(CN->getValueAPF().bitcastToAPInt(), BitPos);
14780 else
14781 return false;
14782 }
14783
14784 // The build_vector is all constants or undefs. Find the smallest element
14785 // size that splats the vector.
14786 HasAnyUndefs = (SplatUndef != 0);
14787
14788 // FIXME: This does not work for vectors with elements less than 8 bits.
14789 while (VecWidth > 8) {
14790 // If we can't split in half, stop here.
14791 if (VecWidth & 1)
14792 break;
14793
14794 unsigned HalfSize = VecWidth / 2;
14795 APInt HighValue = SplatValue.extractBits(HalfSize, HalfSize);
14796 APInt LowValue = SplatValue.extractBits(HalfSize, 0);
14797 APInt HighUndef = SplatUndef.extractBits(HalfSize, HalfSize);
14798 APInt LowUndef = SplatUndef.extractBits(HalfSize, 0);
14799
14800 // If the two halves do not match (ignoring undef bits), stop here.
14801 if ((HighValue & ~LowUndef) != (LowValue & ~HighUndef) ||
14802 MinSplatBits > HalfSize)
14803 break;
14804
14805 SplatValue = HighValue | LowValue;
14806 SplatUndef = HighUndef & LowUndef;
14807
14808 VecWidth = HalfSize;
14809 }
14810
14811 // FIXME: The loop above only tries to split in halves. But if the input
14812 // vector for example is <3 x i16> it wouldn't be able to detect a
14813 // SplatBitSize of 16. No idea if that is a design flaw currently limiting
14814 // optimizations. I guess that back in the days when this helper was created
14815 // vectors normally was power-of-2 sized.
14816
14817 SplatBitSize = VecWidth;
14818 return true;
14819}
14820
14822 BitVector *UndefElements) const {
14823 unsigned NumOps = getNumOperands();
14824 if (UndefElements) {
14825 UndefElements->clear();
14826 UndefElements->resize(NumOps);
14827 }
14828 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14829 if (!DemandedElts)
14830 return SDValue();
14831 SDValue Splatted;
14832 for (unsigned i = 0; i != NumOps; ++i) {
14833 if (!DemandedElts[i])
14834 continue;
14835 SDValue Op = getOperand(i);
14836 if (Op.isUndef()) {
14837 if (UndefElements)
14838 (*UndefElements)[i] = true;
14839 } else if (!Splatted) {
14840 Splatted = Op;
14841 } else if (Splatted != Op) {
14842 return SDValue();
14843 }
14844 }
14845
14846 if (!Splatted) {
14847 unsigned FirstDemandedIdx = DemandedElts.countr_zero();
14848 assert(getOperand(FirstDemandedIdx).isUndef() &&
14849 "Can only have a splat without a constant for all undefs.");
14850 return getOperand(FirstDemandedIdx);
14851 }
14852
14853 return Splatted;
14854}
14855
14857 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14858 return getSplatValue(DemandedElts, UndefElements);
14859}
14860
14862 SmallVectorImpl<SDValue> &Sequence,
14863 BitVector *UndefElements) const {
14864 unsigned NumOps = getNumOperands();
14865 Sequence.clear();
14866 if (UndefElements) {
14867 UndefElements->clear();
14868 UndefElements->resize(NumOps);
14869 }
14870 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14871 if (!DemandedElts || NumOps < 2 || !isPowerOf2_32(NumOps))
14872 return false;
14873
14874 // Set the undefs even if we don't find a sequence (like getSplatValue).
14875 if (UndefElements)
14876 for (unsigned I = 0; I != NumOps; ++I)
14877 if (DemandedElts[I] && getOperand(I).isUndef())
14878 (*UndefElements)[I] = true;
14879
14880 // Iteratively widen the sequence length looking for repetitions.
14881 for (unsigned SeqLen = 1; SeqLen < NumOps; SeqLen *= 2) {
14882 Sequence.append(SeqLen, SDValue());
14883 for (unsigned I = 0; I != NumOps; ++I) {
14884 if (!DemandedElts[I])
14885 continue;
14886 SDValue &SeqOp = Sequence[I % SeqLen];
14888 if (Op.isUndef()) {
14889 if (!SeqOp)
14890 SeqOp = Op;
14891 continue;
14892 }
14893 if (SeqOp && !SeqOp.isUndef() && SeqOp != Op) {
14894 Sequence.clear();
14895 break;
14896 }
14897 SeqOp = Op;
14898 }
14899 if (!Sequence.empty())
14900 return true;
14901 }
14902
14903 assert(Sequence.empty() && "Failed to empty non-repeating sequence pattern");
14904 return false;
14905}
14906
14908 BitVector *UndefElements) const {
14909 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14910 return getRepeatedSequence(DemandedElts, Sequence, UndefElements);
14911}
14912
14915 BitVector *UndefElements) const {
14917 getSplatValue(DemandedElts, UndefElements));
14918}
14919
14922 return dyn_cast_or_null<ConstantSDNode>(getSplatValue(UndefElements));
14923}
14924
14927 BitVector *UndefElements) const {
14929 getSplatValue(DemandedElts, UndefElements));
14930}
14931
14936
14937int32_t
14939 uint32_t BitWidth) const {
14940 if (ConstantFPSDNode *CN =
14942 bool IsExact;
14943 APSInt IntVal(BitWidth);
14944 const APFloat &APF = CN->getValueAPF();
14945 if (APF.convertToInteger(IntVal, APFloat::rmTowardZero, &IsExact) !=
14946 APFloat::opOK ||
14947 !IsExact)
14948 return -1;
14949
14950 return IntVal.exactLogBase2();
14951 }
14952 return -1;
14953}
14954
14956 bool IsLittleEndian, unsigned DstEltSizeInBits,
14957 SmallVectorImpl<APInt> &RawBitElements, BitVector &UndefElements) const {
14958 // Early-out if this contains anything but Undef/Constant/ConstantFP.
14959 if (!isConstant())
14960 return false;
14961
14962 unsigned NumSrcOps = getNumOperands();
14963 unsigned SrcEltSizeInBits = getValueType(0).getScalarSizeInBits();
14964 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14965 "Invalid bitcast scale");
14966
14967 // Extract raw src bits.
14968 SmallVector<APInt> SrcBitElements(NumSrcOps,
14969 APInt::getZero(SrcEltSizeInBits));
14970 BitVector SrcUndeElements(NumSrcOps, false);
14971
14972 for (unsigned I = 0; I != NumSrcOps; ++I) {
14974 if (Op.isUndef()) {
14975 SrcUndeElements.set(I);
14976 continue;
14977 }
14978 auto *CInt = dyn_cast<ConstantSDNode>(Op);
14979 auto *CFP = dyn_cast<ConstantFPSDNode>(Op);
14980 assert((CInt || CFP) && "Unknown constant");
14981 SrcBitElements[I] = CInt ? CInt->getAPIntValue().trunc(SrcEltSizeInBits)
14982 : CFP->getValueAPF().bitcastToAPInt();
14983 }
14984
14985 // Recast to dst width.
14986 recastRawBits(IsLittleEndian, DstEltSizeInBits, RawBitElements,
14987 SrcBitElements, UndefElements, SrcUndeElements);
14988 return true;
14989}
14990
14991void BuildVectorSDNode::recastRawBits(bool IsLittleEndian,
14992 unsigned DstEltSizeInBits,
14993 SmallVectorImpl<APInt> &DstBitElements,
14994 ArrayRef<APInt> SrcBitElements,
14995 BitVector &DstUndefElements,
14996 const BitVector &SrcUndefElements) {
14997 unsigned NumSrcOps = SrcBitElements.size();
14998 unsigned SrcEltSizeInBits = SrcBitElements[0].getBitWidth();
14999 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
15000 "Invalid bitcast scale");
15001 assert(NumSrcOps == SrcUndefElements.size() &&
15002 "Vector size mismatch");
15003
15004 unsigned NumDstOps = (NumSrcOps * SrcEltSizeInBits) / DstEltSizeInBits;
15005 DstUndefElements.clear();
15006 DstUndefElements.resize(NumDstOps, false);
15007 DstBitElements.assign(NumDstOps, APInt::getZero(DstEltSizeInBits));
15008
15009 // Concatenate src elements constant bits together into dst element.
15010 if (SrcEltSizeInBits <= DstEltSizeInBits) {
15011 unsigned Scale = DstEltSizeInBits / SrcEltSizeInBits;
15012 for (unsigned I = 0; I != NumDstOps; ++I) {
15013 DstUndefElements.set(I);
15014 APInt &DstBits = DstBitElements[I];
15015 for (unsigned J = 0; J != Scale; ++J) {
15016 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
15017 if (SrcUndefElements[Idx])
15018 continue;
15019 DstUndefElements.reset(I);
15020 const APInt &SrcBits = SrcBitElements[Idx];
15021 assert(SrcBits.getBitWidth() == SrcEltSizeInBits &&
15022 "Illegal constant bitwidths");
15023 DstBits.insertBits(SrcBits, J * SrcEltSizeInBits);
15024 }
15025 }
15026 return;
15027 }
15028
15029 // Split src element constant bits into dst elements.
15030 unsigned Scale = SrcEltSizeInBits / DstEltSizeInBits;
15031 for (unsigned I = 0; I != NumSrcOps; ++I) {
15032 if (SrcUndefElements[I]) {
15033 DstUndefElements.set(I * Scale, (I + 1) * Scale);
15034 continue;
15035 }
15036 const APInt &SrcBits = SrcBitElements[I];
15037 for (unsigned J = 0; J != Scale; ++J) {
15038 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
15039 APInt &DstBits = DstBitElements[Idx];
15040 DstBits = SrcBits.extractBits(DstEltSizeInBits, J * DstEltSizeInBits);
15041 }
15042 }
15043}
15044
15046 for (const SDValue &Op : op_values()) {
15047 unsigned Opc = Op.getOpcode();
15048 if (!Op.isUndef() && Opc != ISD::Constant && Opc != ISD::ConstantFP)
15049 return false;
15050 }
15051 return true;
15052}
15053
15054std::optional<std::pair<APInt, APInt>>
15056 unsigned NumOps = getNumOperands();
15057 if (NumOps < 2)
15058 return std::nullopt;
15059
15060 unsigned EltSize = getValueType(0).getScalarSizeInBits();
15061 APInt Start, Stride;
15062 int FirstIdx = -1, SecondIdx = -1;
15063
15064 // Find the first two non-undef constant elements to determine Start and
15065 // Stride, then verify all remaining elements match the sequence.
15066 for (unsigned I = 0; I < NumOps; ++I) {
15068 if (Op->isUndef())
15069 continue;
15070 if (!isa<ConstantSDNode>(Op))
15071 return std::nullopt;
15072
15073 APInt Val = getConstantOperandAPInt(I).trunc(EltSize);
15074 if (FirstIdx < 0) {
15075 FirstIdx = I;
15076 Start = Val;
15077 } else if (SecondIdx < 0) {
15078 SecondIdx = I;
15079 // Compute stride using modular arithmetic. Simple division would handle
15080 // common strides (1, 2, -1, etc.), but modular inverse maximizes matches.
15081 // Example: <0, poison, poison, 0xFF> has stride 0x55 since 3*0x55 = 0xFF
15082 // Note that modular arithmetic is agnostic to signed/unsigned.
15083 unsigned IdxDiff = I - FirstIdx;
15084 APInt ValDiff = Val - Start;
15085
15086 // Step 1: Factor out common powers of 2 from IdxDiff and ValDiff.
15087 unsigned CommonPow2Bits = llvm::countr_zero(IdxDiff);
15088 if (ValDiff.countr_zero() < CommonPow2Bits)
15089 return std::nullopt; // ValDiff not divisible by 2^CommonPow2Bits
15090 IdxDiff >>= CommonPow2Bits;
15091 ValDiff.lshrInPlace(CommonPow2Bits);
15092
15093 // Step 2: IdxDiff is now odd, so its inverse mod 2^EltSize exists.
15094 // TODO: There are 2^CommonPow2Bits valid strides; currently we only try
15095 // one, but we could try all candidates to handle more cases.
15096 Stride = ValDiff * APInt(EltSize, IdxDiff).multiplicativeInverse();
15097 if (Stride.isZero())
15098 return std::nullopt;
15099
15100 // Step 3: Adjust Start based on the first defined element's index.
15101 Start -= Stride * FirstIdx;
15102 } else {
15103 // Verify this element matches the sequence.
15104 if (Val != Start + Stride * I)
15105 return std::nullopt;
15106 }
15107 }
15108
15109 // Need at least two defined elements.
15110 if (SecondIdx < 0)
15111 return std::nullopt;
15112
15113 return std::make_pair(Start, Stride);
15114}
15115
15117 // Find the first non-undef value in the shuffle mask.
15118 unsigned i, e;
15119 for (i = 0, e = Mask.size(); i != e && Mask[i] < 0; ++i)
15120 /* search */;
15121
15122 // If all elements are undefined, this shuffle can be considered a splat
15123 // (although it should eventually get simplified away completely).
15124 if (i == e)
15125 return true;
15126
15127 // Make sure all remaining elements are either undef or the same as the first
15128 // non-undef value.
15129 for (int Idx = Mask[i]; i != e; ++i)
15130 if (Mask[i] >= 0 && Mask[i] != Idx)
15131 return false;
15132 return true;
15133}
15134
15135// Returns true if it is a constant integer BuildVector or constant integer,
15136// possibly hidden by a bitcast.
15138 SDValue N, bool AllowOpaques) const {
15140
15141 if (auto *C = dyn_cast<ConstantSDNode>(N))
15142 return AllowOpaques || !C->isOpaque();
15143
15145 return true;
15146
15147 // Treat a GlobalAddress supporting constant offset folding as a
15148 // constant integer.
15149 if (auto *GA = dyn_cast<GlobalAddressSDNode>(N))
15150 if (GA->getOpcode() == ISD::GlobalAddress &&
15151 TLI->isOffsetFoldingLegal(GA))
15152 return true;
15153
15154 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
15155 isa<ConstantSDNode>(N.getOperand(0)))
15156 return true;
15157 return false;
15158}
15159
15160// Returns true if it is a constant float BuildVector or constant float.
15163 return true;
15164
15166 return true;
15167
15168 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
15169 isa<ConstantFPSDNode>(N.getOperand(0)))
15170 return true;
15171
15172 return false;
15173}
15174
15175std::optional<bool> SelectionDAG::isBoolConstant(SDValue N) const {
15176 ConstantSDNode *Const =
15177 isConstOrConstSplat(N, false, /*AllowTruncation=*/true);
15178 if (!Const)
15179 return std::nullopt;
15180
15181 EVT VT = N.getValueType();
15182 const APInt CVal = Const->getAPIntValue().trunc(VT.getScalarSizeInBits());
15183 switch (TLI->getBooleanContents(VT)) {
15185 if (CVal.isOne())
15186 return true;
15187 if (CVal.isZero())
15188 return false;
15189 return std::nullopt;
15191 if (CVal.isAllOnes())
15192 return true;
15193 if (CVal.isZero())
15194 return false;
15195 return std::nullopt;
15197 return CVal[0];
15198 }
15199 llvm_unreachable("Unknown BooleanContent enum");
15200}
15201
15202void SelectionDAG::createOperands(SDNode *Node, ArrayRef<SDValue> Vals) {
15203 assert(!Node->OperandList && "Node already has operands");
15205 "too many operands to fit into SDNode");
15206 SDUse *Ops = OperandRecycler.allocate(
15207 ArrayRecycler<SDUse>::Capacity::get(Vals.size()), OperandAllocator);
15208
15209 bool IsDivergent = false;
15210 for (unsigned I = 0; I != Vals.size(); ++I) {
15211 Ops[I].setUser(Node);
15212 Ops[I].setInitial(Vals[I]);
15213 EVT VT = Ops[I].getValueType();
15214
15215 // Skip Chain. It does not carry divergence.
15216 if (VT != MVT::Other &&
15217 (VT != MVT::Glue || gluePropagatesDivergence(Ops[I].getNode())) &&
15218 Ops[I].getNode()->isDivergent()) {
15219 IsDivergent = true;
15220 }
15221 }
15222 Node->NumOperands = Vals.size();
15223 Node->OperandList = Ops;
15224 if (!TLI->isSDNodeAlwaysUniform(Node)) {
15225 IsDivergent |= TLI->isSDNodeSourceOfDivergence(Node, FLI, UA);
15226 Node->SDNodeBits.IsDivergent = IsDivergent;
15227 }
15228 checkForCycles(Node);
15229}
15230
15233 size_t Limit = SDNode::getMaxNumOperands();
15234 while (Vals.size() > Limit) {
15235 unsigned SliceIdx = Vals.size() - Limit;
15236 auto ExtractedTFs = ArrayRef<SDValue>(Vals).slice(SliceIdx, Limit);
15237 SDValue NewTF = getNode(ISD::TokenFactor, DL, MVT::Other, ExtractedTFs);
15238 Vals.erase(Vals.begin() + SliceIdx, Vals.end());
15239 Vals.emplace_back(NewTF);
15240 }
15241 return getNode(ISD::TokenFactor, DL, MVT::Other, Vals);
15242}
15243
15245 EVT VT, SDNodeFlags Flags) {
15246 switch (Opcode) {
15247 default:
15248 return SDValue();
15249 case ISD::ADD:
15250 case ISD::OR:
15251 case ISD::XOR:
15252 case ISD::UMAX:
15253 case ISD::MUL:
15254 case ISD::AND:
15255 case ISD::UMIN:
15256 case ISD::SMAX:
15257 case ISD::SMIN:
15259 VT);
15260 case ISD::FADD:
15261 // If flags allow, prefer positive zero since it's generally cheaper
15262 // to materialize on most targets.
15263 return getConstantFP(Flags.hasNoSignedZeros() ? 0.0 : -0.0, DL, VT);
15264 case ISD::FMUL:
15265 return getConstantFP(1.0, DL, VT);
15266 case ISD::FMINNUM:
15267 case ISD::FMAXNUM:
15268 case ISD::FMINIMUMNUM:
15269 case ISD::FMAXIMUMNUM: {
15270 // Neutral element for fminnum/fminimumnum is NaN, Inf or FLT_MAX,
15271 // depending on fast-math flags (FMF).
15272 const fltSemantics &Semantics = VT.getFltSemantics();
15273 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics) :
15274 !Flags.hasNoInfs() ? APFloat::getInf(Semantics) :
15275 APFloat::getLargest(Semantics);
15276 if (Opcode == ISD::FMAXNUM || Opcode == ISD::FMAXIMUMNUM)
15277 NeutralAF.changeSign();
15278
15279 return getConstantFP(NeutralAF, DL, VT);
15280 }
15281 case ISD::FMINIMUM:
15282 case ISD::FMAXIMUM: {
15283 // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
15284 const fltSemantics &Semantics = VT.getFltSemantics();
15285 APFloat NeutralAF = !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
15286 : APFloat::getLargest(Semantics);
15287 if (Opcode == ISD::FMAXIMUM)
15288 NeutralAF.changeSign();
15289
15290 return getConstantFP(NeutralAF, DL, VT);
15291 }
15292
15293 }
15294}
15295
15297 SDValue Acc, SDValue LHS,
15298 SDValue RHS) {
15299 EVT AccVT = Acc.getValueType();
15300 if (AccVT.isFloatingPoint()) {
15301 assert(Opc == ISD::PARTIAL_REDUCE_FMLA && "Unexpected opcode");
15302 SDValue NegRHS = getNode(ISD::FNEG, DL, RHS.getValueType(), RHS);
15303 return getNode(Opc, DL, AccVT, Acc, LHS, NegRHS);
15304 }
15307 "Unexpected opcode");
15308 SDValue NegAcc = getNegative(Acc, DL, AccVT);
15309 SDValue MLA = getNode(Opc, DL, AccVT, NegAcc, LHS, RHS);
15310 return getNegative(MLA, DL, AccVT);
15311}
15312
15313/// Helper used to make a call to a library function that has one argument of
15314/// pointer type.
15315///
15316/// Such functions include 'fegetmode', 'fesetenv' and some others, which are
15317/// used to get or set floating-point state. They have one argument of pointer
15318/// type, which points to the memory region containing bits of the
15319/// floating-point state. The value returned by such function is ignored in the
15320/// created call.
15321///
15322/// \param LibFunc Reference to library function (value of RTLIB::Libcall).
15323/// \param Ptr Pointer used to save/load state.
15324/// \param InChain Ingoing token chain.
15325/// \param Node Node being legalized
15326/// \returns Outgoing chain token.
15328 SDValue InChain, SDNode *Node) {
15329 assert(InChain.getValueType() == MVT::Other && "Expected token chain");
15330 RTLIB::LibcallImpl LibcallImpl =
15331 Libcalls->getLibcallImpl(static_cast<RTLIB::Libcall>(LibFunc));
15332 if (LibcallImpl == RTLIB::Unsupported) {
15333 getContext()->emitError(Twine("no libcall available for ") +
15334 Node->getOperationName(this));
15335 return InChain;
15336 }
15337
15339 Args.emplace_back(Ptr, Ptr.getValueType().getTypeForEVT(*getContext()));
15340 SDValue Callee =
15341 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout()));
15343 CLI.setDebugLoc(SDLoc(Node))
15344 .setChain(InChain)
15345 .setLibCallee(Libcalls->getLibcallImplCallingConv(LibcallImpl),
15346 Type::getVoidTy(*getContext()), Callee, std::move(Args));
15347 return TLI->LowerCallTo(CLI).second;
15348}
15349
15351 assert(From && To && "Invalid SDNode; empty source SDValue?");
15352 auto I = SDEI.find(From);
15353 if (I == SDEI.end())
15354 return;
15355
15356 // Use of operator[] on the DenseMap may cause an insertion, which invalidates
15357 // the iterator, hence the need to make a copy to prevent a use-after-free.
15358 NodeExtraInfo NEI = I->second;
15359 if (LLVM_LIKELY(!NEI.PCSections)) {
15360 // No deep copy required for the types of extra info set.
15361 //
15362 // FIXME: Investigate if other types of extra info also need deep copy. This
15363 // depends on the types of nodes they can be attached to: if some extra info
15364 // is only ever attached to nodes where a replacement To node is always the
15365 // node where later use and propagation of the extra info has the intended
15366 // semantics, no deep copy is required.
15367 SDEI[To] = std::move(NEI);
15368 return;
15369 }
15370
15371 const SDNode *EntrySDN = getEntryNode().getNode();
15372
15373 // We need to copy NodeExtraInfo to all _new_ nodes that are being introduced
15374 // through the replacement of From with To. Otherwise, replacements of a node
15375 // (From) with more complex nodes (To and its operands) may result in lost
15376 // extra info where the root node (To) is insignificant in further propagating
15377 // and using extra info when further lowering to MIR.
15378 //
15379 // In the first step pre-populate the visited set with the nodes reachable
15380 // from the old From node. This avoids copying NodeExtraInfo to parts of the
15381 // DAG that is not new and should be left untouched.
15382 SmallVector<const SDNode *> Leafs{From}; // Leafs reachable with VisitFrom.
15383 DenseSet<const SDNode *> FromReach; // The set of nodes reachable from From.
15384 auto VisitFrom = [&](auto &&Self, const SDNode *N, int MaxDepth) {
15385 if (MaxDepth == 0) {
15386 // Remember this node in case we need to increase MaxDepth and continue
15387 // populating FromReach from this node.
15388 Leafs.emplace_back(N);
15389 return;
15390 }
15391 if (!FromReach.insert(N).second)
15392 return;
15393 for (const SDValue &Op : N->op_values())
15394 Self(Self, Op.getNode(), MaxDepth - 1);
15395 };
15396
15397 // Copy extra info to To and all its transitive operands (that are new).
15399 auto DeepCopyTo = [&](auto &&Self, const SDNode *N) {
15400 if (FromReach.contains(N))
15401 return true;
15402 if (!Visited.insert(N).second)
15403 return true;
15404 if (EntrySDN == N)
15405 return false;
15406 for (const SDValue &Op : N->op_values()) {
15407 if (N == To && Op.getNode() == EntrySDN) {
15408 // Special case: New node's operand is the entry node; just need to
15409 // copy extra info to new node.
15410 break;
15411 }
15412 if (!Self(Self, Op.getNode()))
15413 return false;
15414 }
15415 // Copy only if entry node was not reached.
15416 SDEI[N] = std::move(NEI);
15417 return true;
15418 };
15419
15420 // We first try with a lower MaxDepth, assuming that the path to common
15421 // operands between From and To is relatively short. This significantly
15422 // improves performance in the common case. The initial MaxDepth is big
15423 // enough to avoid retry in the common case; the last MaxDepth is large
15424 // enough to avoid having to use the fallback below (and protects from
15425 // potential stack exhaustion from recursion).
15426 for (int PrevDepth = 0, MaxDepth = 16; MaxDepth <= 1024;
15427 PrevDepth = MaxDepth, MaxDepth *= 2, Visited.clear()) {
15428 // StartFrom is the previous (or initial) set of leafs reachable at the
15429 // previous maximum depth.
15431 std::swap(StartFrom, Leafs);
15432 for (const SDNode *N : StartFrom)
15433 VisitFrom(VisitFrom, N, MaxDepth - PrevDepth);
15434 if (LLVM_LIKELY(DeepCopyTo(DeepCopyTo, To)))
15435 return;
15436 // This should happen very rarely (reached the entry node).
15437 LLVM_DEBUG(dbgs() << __func__ << ": MaxDepth=" << MaxDepth << " too low\n");
15438 assert(!Leafs.empty());
15439 }
15440
15441 // This should not happen - but if it did, that means the subgraph reachable
15442 // from From has depth greater or equal to maximum MaxDepth, and VisitFrom()
15443 // could not visit all reachable common operands. Consequently, we were able
15444 // to reach the entry node.
15445 errs() << "warning: incomplete propagation of SelectionDAG::NodeExtraInfo\n";
15446 assert(false && "From subgraph too complex - increase max. MaxDepth?");
15447 // Best-effort fallback if assertions disabled.
15448 SDEI[To] = std::move(NEI);
15449}
15450
15452 assert(VT.isVector() && "Can only unroll vector types!");
15453 if (VT.isFixedLengthVector())
15454 return VT.getVectorNumElements();
15455
15456 const MachineFunction &MF = getMachineFunction();
15457 const Function &F = MF.getFunction();
15458
15459 APInt MaxVScale = getVScaleRange(&F, sizeof(unsigned) * 8).getUnsignedMax();
15460 if (MaxVScale.ugt(VScaleUnrollLimit))
15461 return 0;
15462
15463 bool Overflow;
15464 APInt MinNElts(sizeof(unsigned) * 8, VT.getVectorMinNumElements());
15465 APInt MaxNElts = MinNElts.umul_ov(MaxVScale, Overflow);
15466 if (Overflow)
15467 return 0;
15468
15469 return MaxNElts.getZExtValue();
15470}
15471
15473 ArrayRef<SDValue> Scalars) {
15474 assert(Scalars.size() == getMaxRuntimeNumElements(VT) &&
15475 "Element count mismatch!");
15476 if (VT.isFixedLengthVector())
15477 return getBuildVector(VT, DL, Scalars);
15478
15479 SDValue Vec = getPOISON(VT);
15480 // Iterate in reverse so result remains poison until we encounter a lane that
15481 // exists, after which all lower-numbered lanes must also exist.
15482 for (unsigned IdxVal : reverse(seq(Scalars.size())))
15483 Vec = getInsertVectorElt(DL, Vec, Scalars[IdxVal], IdxVal);
15484
15485 return Vec;
15486}
15487
15488#ifndef NDEBUG
15489static void checkForCyclesHelper(const SDNode *N,
15492 const llvm::SelectionDAG *DAG) {
15493 // If this node has already been checked, don't check it again.
15494 if (Checked.count(N))
15495 return;
15496
15497 // If a node has already been visited on this depth-first walk, reject it as
15498 // a cycle.
15499 if (!Visited.insert(N).second) {
15500 errs() << "Detected cycle in SelectionDAG\n";
15501 dbgs() << "Offending node:\n";
15502 N->dumprFull(DAG); dbgs() << "\n";
15503 abort();
15504 }
15505
15506 for (const SDValue &Op : N->op_values())
15507 checkForCyclesHelper(Op.getNode(), Visited, Checked, DAG);
15508
15509 Checked.insert(N);
15510 Visited.erase(N);
15511}
15512#endif
15513
15515 const llvm::SelectionDAG *DAG,
15516 bool force) {
15517#ifndef NDEBUG
15518 bool check = force;
15519#ifdef EXPENSIVE_CHECKS
15520 check = true;
15521#endif // EXPENSIVE_CHECKS
15522 if (check) {
15523 assert(N && "Checking nonexistent SDNode");
15526 checkForCyclesHelper(N, visited, checked, DAG);
15527 }
15528#endif // !NDEBUG
15529}
15530
15531void llvm::checkForCycles(const llvm::SelectionDAG *DAG, bool force) {
15532 checkForCycles(DAG->getRoot().getNode(), DAG, force);
15533}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned Imm
unsigned uint64_t
static bool isConstant(const MachineInstr &MI)
constexpr LLT S1
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...
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Function Alias Analysis Results
#define X(NUM, ENUM, NAME)
Definition ELF.h:857
This file implements the BitVector class.
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
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:617
#define LLVM_LIKELY(EXPR)
Definition Compiler.h:351
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseSet and SmallDenseSet classes.
This file contains constants used for implementing Dwarf debug support.
This file defines a hash set that can be used to remove duplication of nodes in a graph.
static MaybeAlign getAlign(Value *Ptr)
iv users
Definition IVUsers.cpp:48
std::pair< Instruction::BinaryOps, Value * > OffsetOp
Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
static constexpr Value * getValue(Ty &ValueOrUse)
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static Register getMemsetValue(Register Val, LLT Ty, MachineIRBuilder &MIB)
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition Lint.cpp:540
static Align getPrefTypeAlign(EVT VT, SelectionDAG &DAG)
static bool isConstantSplatVector(SDValue N, APInt &SplatValue, unsigned MinSizeInBits)
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
Register const TargetRegisterInfo * TRI
This file provides utility analysis objects describing memory locations.
This file contains the declarations for metadata subclasses.
#define T
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
#define P(N)
PowerPC Reduce CR logical Operation
const SmallVectorImpl< MachineOperand > & Cond
Remove Loads Into Fake Uses
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
Contains matchers for matching SelectionDAG nodes and values.
SI Fold Operands
const char * Msg
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 bool shouldLowerMemFuncForSize(const MachineFunction &MF, SelectionDAG &DAG)
static SDValue getFixedOrScalableQuantity(SelectionDAG &DAG, const SDLoc &DL, EVT VT, Ty Quantity)
static std::pair< SDValue, SDValue > getRuntimeCallSDValueHelper(SDValue Chain, const SDLoc &dl, TargetLowering::ArgListTy &&Args, const CallInst *CI, RTLIB::Libcall Call, SelectionDAG *DAG, const TargetLowering *TLI)
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 cl::opt< int > VScaleUnrollLimit("vscale-unroll-limit", cl::desc("Maximum vscale for which vector unrolling is allowed."), cl::Hidden, cl::init(64))
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 AddNodeIDNode(FoldingSetNodeID &ID, const SDNode *N)
Serialize a node the way SDNodes were uniqued before SDNodeKey, to cross-check the typed comparison a...
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 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 APInt getIntegerIdentity(unsigned Opcode, unsigned BitWidth)
static SDValue getMemIntrinsicSize(SelectionDAG &DAG, const SDLoc &dl, SDValue Size, unsigned DstAS, unsigned SrcAS)
The length of a memory intrinsic (e.g.
static void checkAddrSpaceIsValidForLibcall(const TargetLowering *TLI, const DataLayout &DL, unsigned AS)
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 bool isInTailCallPositionWrapper(const CallInst *CI, const SelectionDAG *SelDAG, bool AllowReturnsFirstArg)
static bool keyMatches(const SDNodeKey &Key, const SDNode &N)
static bool areNonVolatileConsecutiveLoadsOrStores(LSBaseSDNode *LS, LSBaseSDNode *Base, unsigned Bytes, int Dist, const SelectionDAG &DAG)
static bool gluePropagatesDivergence(const SDNode *Node)
Return true if a glue output should propagate divergence information.
static void AddNodeIDCustom(FoldingSetNodeID &ID, const SDNode *N, unsigned Opc)
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 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 cl::opt< unsigned > MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192), cl::desc("DAG combiner limit number of steps when searching DAG " "for predecessor nodes"))
static APInt getDemandAllEltsMask(SDValue V)
Construct a DemandedElts mask which demands all elements of V.
static SDValue getMemcpyLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo, BatchAAResults *BatchAA, const MDNode *DstMemCacheHint, const MDNode *SrcMemCacheHint)
static SDValue getMemmoveLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo)
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:119
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
This file describes how to lower LLVM code to machine code.
static void removeOperands(MachineInstr &MI, unsigned i)
static OverflowResult mapOverflowResult(ConstantRange::OverflowResult OR)
Convert ConstantRange OverflowResult into ValueTracking OverflowResult.
static int Lookup(ArrayRef< TableEntry > Table, unsigned Opcode)
static unsigned getSize(unsigned Kind)
static const fltSemantics & IEEEsingle()
Definition APFloat.h:304
cmpResult
IEEE-754R 5.11: Floating Point Comparison Relations.
Definition APFloat.h:351
static constexpr roundingMode rmTowardZero
Definition APFloat.h:365
static const fltSemantics & BFloat()
Definition APFloat.h:303
static const fltSemantics & IEEEquad()
Definition APFloat.h:306
static const fltSemantics & IEEEdouble()
Definition APFloat.h:305
static constexpr roundingMode rmTowardNegative
Definition APFloat.h:364
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:361
static constexpr roundingMode rmTowardPositive
Definition APFloat.h:363
static const fltSemantics & IEEEhalf()
Definition APFloat.h:302
opStatus
IEEE-754R 7: Default exception handling.
Definition APFloat.h:377
static APFloat getQNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for QNaN values.
Definition APFloat.h:1224
opStatus divide(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1312
void copySign(const APFloat &RHS)
Definition APFloat.h:1406
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:6040
opStatus subtract(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1294
bool isNegative() const
Definition APFloat.h:1583
opStatus add(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1285
bool isFinite() const
Definition APFloat.h:1588
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
Definition APFloat.h:1451
opStatus multiply(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1303
bool isZero() const
Definition APFloat.h:1579
LLVM_READONLY bool isOne() const
Definition APFloat.h:1661
bool isLargest() const
Definition APFloat.h:1599
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1242
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition APFloat.h:1436
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1202
opStatus mod(const APFloat &RHS)
Definition APFloat.h:1330
bool isPosZero() const
Definition APFloat.h:1594
bool isNegZero() const
Definition APFloat.h:1595
void changeSign()
Definition APFloat.h:1401
static APFloat getNaN(const fltSemantics &Sem, bool Negative=false, uint64_t payload=0)
Factory for NaN values.
Definition APFloat.h:1213
bool isInfinity() const
Definition APFloat.h:1580
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:2009
LLVM_ABI APInt usub_sat(const APInt &RHS) const
Definition APInt.cpp:2093
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1602
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:230
void clearBit(unsigned BitPosition)
Set a given bit to 0.
Definition APInt.h:1426
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1057
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:225
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:419
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1560
unsigned popcount() const
Count the number of bits set.
Definition APInt.h:1690
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition APInt.cpp:1078
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1532
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:970
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1350
APInt abs() const
Get the absolute value.
Definition APInt.h:1815
LLVM_ABI APInt sadd_sat(const APInt &RHS) const
Definition APInt.cpp:2064
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:367
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1186
static APInt getBitsSet(unsigned numBits, unsigned loBit, unsigned hiBit)
Get a value with a block of bits set.
Definition APInt.h:254
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:376
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition APInt.cpp:1695
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1508
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1115
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:205
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:325
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1673
LLVM_ABI APInt rotr(unsigned rotateAmt) const
Rotate right by rotateAmt.
Definition APInt.cpp:1199
LLVM_ABI APInt reverseBits() const
Definition APInt.cpp:786
void ashrInPlace(unsigned ShiftAmt)
Arithmetic right-shift this APInt by ShiftAmt in place.
Definition APInt.h:836
bool sle(const APInt &RHS) const
Signed less or equal comparison.
Definition APInt.h:1170
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1659
unsigned getNumSignBits() const
Computes the number of leading bits of this APInt that are equal to its sign bit.
Definition APInt.h:1648
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1618
static LLVM_ABI APInt getSplat(unsigned NewLen, const APInt &V)
Return a value containing V broadcasted over NewLen bits.
Definition APInt.cpp:648
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:215
LLVM_ABI APInt sshl_sat(const APInt &RHS) const
Definition APInt.cpp:2124
LLVM_ABI APInt ushl_sat(const APInt &RHS) const
Definition APInt.cpp:2138
LLVM_ABI APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
Definition APInt.cpp:1086
LLVM_ABI APInt rotl(unsigned rotateAmt) const
Rotate left by rotateAmt.
Definition APInt.cpp:1186
LLVM_ABI void insertBits(const APInt &SubBits, unsigned bitPosition)
Insert the bits from a smaller APInt starting at bitPosition.
Definition APInt.cpp:393
unsigned logBase2() const
Definition APInt.h:1781
LLVM_ABI APInt uadd_sat(const APInt &RHS) const
Definition APInt.cpp:2074
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:829
LLVM_ABI APInt multiplicativeInverse() const
Definition APInt.cpp:1303
LLVM_ABI APInt srem(const APInt &RHS) const
Function for signed remainder operation.
Definition APInt.cpp:1774
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:330
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1154
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
Definition APInt.cpp:1030
void setBits(unsigned loBit, unsigned hiBit)
Set the bits from loBit (inclusive) to hiBit (exclusive) to 1.
Definition APInt.h:1387
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:875
LLVM_ABI APInt byteSwap() const
Definition APInt.cpp:764
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1261
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:436
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:302
void clearBits(unsigned LoBit, unsigned HiBit)
Clear the bits from LoBit (inclusive) to HiBit (exclusive) to 0.
Definition APInt.h:1437
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:196
LLVM_ABI APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
Definition APInt.cpp:478
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1241
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:385
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:282
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:235
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
Definition APInt.h:860
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:853
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1225
LLVM_ABI APInt ssub_sat(const APInt &RHS) const
Definition APInt.cpp:2083
An arbitrary precision integer that knows its signedness.
Definition APSInt.h:24
unsigned getSrcAddressSpace() const
unsigned getDestAddressSpace() const
static Capacity get(size_t N)
Get the capacity of an array that can hold at least N elements.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
static LLVM_ABI BaseIndexOffset match(const SDNode *N, const SelectionDAG &DAG)
Parses tree in N for base, index, offset addresses.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal=false)
BitVector & reset()
Reset all bits in the bitvector.
Definition BitVector.h:409
void resize(unsigned N, bool t=false)
Grow or shrink the bitvector.
Definition BitVector.h:355
void clear()
Removes all bits from the bitvector.
Definition BitVector.h:349
BitVector & set()
Set all bits in the bitvector.
Definition BitVector.h:366
bool none() const
Returns true if none of the bits are set.
Definition BitVector.h:207
size_type size() const
Returns the number of bits in this bitvector.
Definition BitVector.h:178
const BlockAddress * getBlockAddress() const
The address of a basic block.
Definition Constants.h:1088
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
A "pseudo-class" with methods for operating on BUILD_VECTORs.
LLVM_ABI 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 LLVM_ABI 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.
LLVM_ABI bool getRepeatedSequence(const APInt &DemandedElts, SmallVectorImpl< SDValue > &Sequence, BitVector *UndefElements=nullptr) const
Find the shortest repeating sequence of values in the build vector.
LLVM_ABI 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.
LLVM_ABI SDValue getSplatValue(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted value or a null value if this is not a splat.
LLVM_ABI 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.
LLVM_ABI ConstantSDNode * getConstantSplatNode(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted constant or null if this is not a constant splat.
LLVM_ABI 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_ABI std::optional< std::pair< APInt, APInt > > isArithmeticSequence() const
If this BuildVector is constant and represents an arithmetic sequence "<a, a+n, a+2n,...
LLVM_ABI bool isConstant() const
This class represents a function call, abstracting a target machine's calling convention.
bool isTailCall() const
static LLVM_ABI 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:420
const APFloat & getValue() const
Definition Constants.h:464
This is the shared class of boolean and integer constants.
Definition Constants.h:87
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition Constants.h:162
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
MachineConstantPoolValue * getMachineCPVal() const
const Constant * getConstVal() const
LLVM_ABI Type * getType() const
This class represents a range of values.
PreferredRangeType
If represented precisely, the result of some range operations may consist of multiple disjoint ranges...
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
static LLVM_ABI ConstantRange fromKnownBits(const KnownBits &Known, bool IsSigned)
Initialize a range based on a known bits constraint.
LLVM_ABI OverflowResult unsignedSubMayOverflow(const ConstantRange &Other) const
Return whether unsigned sub of the two ranges always/never overflows.
LLVM_ABI OverflowResult unsignedAddMayOverflow(const ConstantRange &Other) const
Return whether unsigned add of the two ranges always/never overflows.
LLVM_ABI KnownBits toKnownBits() const
Return known bits for values in this range.
LLVM_ABI ConstantRange zeroExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
LLVM_ABI APInt getSignedMin() const
Return the smallest signed value contained in the ConstantRange.
LLVM_ABI OverflowResult unsignedMulMayOverflow(const ConstantRange &Other) const
Return whether unsigned mul of the two ranges always/never overflows.
LLVM_ABI ConstantRange signExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
LLVM_ABI ConstantRange multiply(const ConstantRange &Other, unsigned NoWrapKind=0) const
Return a new range representing the possible values resulting from a multiplication of a value in thi...
LLVM_ABI bool contains(const APInt &Val) const
Return true if the specified value is in the set.
LLVM_ABI APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
LLVM_ABI ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
LLVM_ABI 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.
LLVM_ABI 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:43
LLVM_ABI Constant * getSplatValue(bool AllowPoison=false) const
If all elements of the vector constant have the same value, return that value.
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
DWARF expression.
static LLVM_ABI ExtOps getExtOps(unsigned FromSize, unsigned ToSize, bool Signed)
Returns the ops for a zero- or sign-extension in a DIExpression.
static LLVM_ABI void appendOffset(SmallVectorImpl< uint64_t > &Ops, int64_t Offset)
Append Ops with operations to apply the Offset.
static LLVM_ABI 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 LLVM_ABI const DIExpression * convertToVariadicExpression(const DIExpression *Expr)
If Expr is a non-variadic expression (i.e.
static LLVM_ABI 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.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
bool isLittleEndian() const
Layout endianness...
Definition DataLayout.h:217
LLVM_ABI 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.
LLVM_ABI Align getABITypeAlign(Type *Ty) const
Returns the minimum ABI-required alignment for the specified type.
LLVM_ABI unsigned getPointerTypeSizeInBits(Type *) const
The pointer representation size in bits for this type.
LLVM_ABI Align getPrefTypeAlign(Type *Ty) const
Returns the preferred stack/global alignment for the specified type.
A debug info location.
Definition DebugLoc.h:126
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition TypeSize.h:305
constexpr bool isScalar() const
Exactly one element.
Definition TypeSize.h:316
const char * getSymbol() const
Insertion token: a failed lookup fills it in, the matching insert consumes it.
Definition FoldingSet.h:284
This class is used to gather all the unique data bits of a node.
Definition FoldingSet.h:162
Data structure describing the variable locations in a function.
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition Function.h:696
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:329
LLVM_ABI unsigned getAddressSpace() const
const GlobalValue * getGlobal() const
bool isThreadLocal() const
If the value is "Thread Local", its value isn't shared by the threads.
unsigned getAddressSpace() const
Module * getParent()
Get the module that this global value is contained inside of...
PointerType * getType() const
Global values are always pointers.
This class is used to form a handle around another node that is persistent and is updated across invo...
const SDValue & getValue() const
static LLVM_ABI bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:71
LLVM_ABI void emitError(const Instruction *I, const Twine &ErrorStr)
emitError - Emit an error message to the currently installed error handler with optional location inf...
Base class for LoadSDNode and StoreSDNode.
Tracks which library functions to use for a particular subtarget or function.
CallingConv::ID getLibcallImplCallingConv(RTLIB::LibcallImpl Call) const
Get the CallingConv that should be used for the specified libcall.
RTLIB::LibcallImpl getLibcallImpl(RTLIB::Libcall Call) const
Return the lowering's selection of implementation call for Call.
This SDNode is used for LIFETIME_START/LIFETIME_END values.
This class is used to represent ISD::LOAD nodes.
static LocationSize precise(uint64_t Value)
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1081
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1437
Machine Value Type.
SimpleValueType SimpleTy
bool bitsLT(MVT VT) const
Return true if this has less bits than VT.
static MVT getIntegerVT(unsigned BitWidth)
Abstract base class for all machine specific constantpool value subclasses.
virtual void addSelectionDAGCSEId(FoldingSetNodeID &ID)=0
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
LLVM_ABI 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.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
Function & getFunction()
Return the LLVM function that this machine code represents.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
A description of a memory reference used in the backend.
const MDNode * getRanges() const
Return the range tag for 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 MSTORE node.
This SDNode is used for target intrinsics that touch memory and need an associated MachineMemOperand.
This is an abstract virtual class for memory operations.
size_t getNumMemOperands() const
Return the number of memory operands.
LLVM_ABI MemSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt, PointerUnion< MachineMemOperand *, MachineMemOperand ** > memrefs)
Constructor that supports single or multiple MMOs.
PointerUnion< MachineMemOperand *, MachineMemOperand ** > MemRefs
Memory reference information.
MachineMemOperand * getMemOperand() const
Return the unique MachineMemOperand object describing the memory reference performed by operation.
const MachinePointerInfo & getPointerInfo() const
ArrayRef< MachineMemOperand * > memoperands() const
Return the memory operands for this node.
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.
Root of the metadata hierarchy.
Definition Metadata.h:64
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
Function * getFunction(StringRef Name) const
Look up the specified function in the module symbol table.
Definition Module.cpp:235
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
Class to represent pointers.
static PointerType * getUnqual(LLVMContext &C)
This constructs an opaque pointer to an object in the default address space (address space zero).
static LLVM_ABI PointerType * get(LLVMContext &C, unsigned AddressSpace)
This constructs an opaque pointer to an object in a numbered address space.
Definition Type.cpp:887
unsigned getAddressSpace() const
Return the address space of the Pointer type.
A discriminated union of two or more pointer types, with the discriminator in the low bits of the poi...
bool isNull() const
Test if the pointer held in the union is null, regardless of which type it is.
Analysis providing profile information.
void Deallocate(SubClass *E)
Deallocate - Release storage for the pointed-to object.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Keeps track of dbg_value information through SDISel.
LLVM_ABI void add(SDDbgValue *V, bool isParameter)
LLVM_ABI void erase(const SDNode *Node)
Invalidate all DbgValues attached to the node and remove it from the Node-to-DbgValues map.
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(Register 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.
const APInt & getAsAPIntVal() const
Helper method returns the APInt value of a ConstantSDNode.
bool isMachineOpcode() const
Test if this node has a post-isel opcode, directly corresponding to a MachineInstr opcode.
LLVM_ABI void dumprFull(const SelectionDAG *G=nullptr) const
printrFull to dbgs().
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
bool isDivergent() const
LLVM_ABI 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.
iterator_range< use_iterator > uses()
MemSDNodeBitfields MemSDNodeBits
bool getHasDebugValue() const
SDNodeFlags getFlags() const
void setNodeId(int Id)
Set unique node id.
LLVM_ABI 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 LLVM_ABI 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.
LLVM_ABI 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.
std::optional< APInt > bitcastToAPInt() const
LLVM_ABI bool hasPredecessor(const SDNode *N) const
Return true if N is a predecessor of this node.
LLVM_ABI 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
Returns true if the node type is UNDEF or POISON.
op_iterator op_end() const
op_iterator op_begin() const
static use_iterator use_end()
LLVM_ABI void DropOperands()
Release the operands and set this node to have zero operands.
SDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs)
Create an SDNode.
Represents a use of a SDNode.
SDNode * getUser()
This returns the SDNode that contains this Use.
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, in exactly one operand.
LLVM_ABI bool isOperandOf(const SDNode *N) const
Return true if the referenced return value is an operand of N.
SDValue()=default
LLVM_ABI 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 void verifyTargetNode(const SelectionDAG &DAG, const SDNode *N) const
Checks that the given target-specific node is valid. Aborts if it is not.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
LLVM_ABI SDValue getElementCount(const SDLoc &DL, EVT VT, ElementCount EC)
LLVM_ABI Align getReducedAlign(EVT VT, bool UseABI)
In most cases this function returns the ABI alignment for a given type, except for illegal vector typ...
LLVM_ABI SDValue getShiftAmountOperand(EVT LHSTy, SDValue Op)
Return the specified value casted to the target's desired shift amount type.
LLVM_ABI std::pair< SDValue, SDValue > getMemccpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue C, SDValue Size, const CallInst *CI)
Lower a memccpy operation into a target library call and return the resulting chain and call result a...
LLVM_ABI SDValue emitStackConvert(SDValue SrcOp, EVT SlotVT, EVT DestVT, const SDLoc &DL, SDValue Chain)
Emit a store/load combination to the stack.
LLVM_ABI bool isKnownNeverLogicalZero(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
Test whether the given floating point SDValue (or all elements of it, if it is a vector) is known to ...
LLVM_ABI 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 getExtractVectorElt(const SDLoc &DL, EVT VT, SDValue Vec, unsigned Idx)
Extract element at Idx from Vec.
LLVM_ABI SDValue getSplatSourceVector(SDValue V, int &SplatIndex)
If V is a splatted value, return the source vector and its splat index.
LLVM_ABI SDValue getLabelNode(unsigned Opcode, const SDLoc &dl, SDValue Root, MCSymbol *Label)
LLVM_ABI OverflowKind computeOverflowForUnsignedSub(SDValue N0, SDValue N1) const
Determine if the result of the unsigned sub of 2 nodes can overflow.
LLVM_ABI 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.
LLVM_ABI std::pair< SDValue, SDValue > getStrlen(SDValue Chain, const SDLoc &dl, SDValue Src, const CallInst *CI)
Lower a strlen operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getMaskedGather(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType, ISD::LoadExtType ExtTy)
LLVM_ABI SDValue FoldSetCC(EVT VT, SDValue N1, SDValue N2, ISD::CondCode Cond, const SDLoc &dl, SDNodeFlags Flags={})
Constant fold a setcc to true or false.
bool isKnownNeverSNaN(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
LLVM_ABI SDValue makeStateFunctionCall(unsigned LibFunc, SDValue Ptr, SDValue InChain, SDNode *Node)
Helper used to make a call to a library function that has one argument of pointer type.
LLVM_ABI std::optional< bool > isBoolConstant(SDValue N) const
Check if a value \op N is a constant using the target's BooleanContent for its type.
LLVM_ABI SDValue getStackArgumentTokenFactor(SDValue Chain)
Compute a TokenFactor to force all the incoming stack arguments to be loaded from the stack.
const TargetSubtargetInfo & getSubtarget() const
LLVM_ABI ConstantRange computeConstantRange(SDValue Op, bool ForSigned, unsigned Depth=0) const
Determine the possible constant range of an integer or vector of integers.
LLVM_ABI SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL)
LLVM_ABI void updateDivergence(SDNode *N)
LLVM_ABI 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...
LLVM_ABI SDValue getAllOnesConstant(const SDLoc &DL, EVT VT, bool IsTarget=false, bool IsOpaque=false)
LLVM_ABI 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),...
LLVM_ABI 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.
LLVM_ABI SDValue getAtomicMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Value, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo)
LLVM_ABI SDValue getAtomicLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT MemVT, EVT VT, SDValue Chain, SDValue Ptr, MachineMemOperand *MMO)
LLVM_ABI SDNode * getNodeIfExists(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops, const SDNodeFlags Flags, bool AllowCommute=false)
Get the specified node if it's already available, or else return NULL.
LLVM_ABI 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,...
LLVM_ABI SDValue getFreeze(SDValue V)
Return a freeze using the SDLoc of the value operand.
LLVM_ABI 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,...
LLVM_ABI const BasicBlock * getBasicBlock() const
LLVM_ABI SelectionDAG(const TargetMachine &TM, CodeGenOptLevel)
LLVM_ABI SDValue getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVol, bool AlwaysInline, const CallInst *CI, MachinePointerInfo DstPtrInfo, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI SDValue getConstantPool(const Constant *C, EVT VT, MaybeAlign Align=std::nullopt, int Offs=0, bool isT=false, unsigned TargetFlags=0)
LLVM_ABI 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)
LLVM_ABI 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.
LLVM_ABI 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...
LLVM_ABI bool isConstantIntBuildVectorOrConstantInt(SDValue N, bool AllowOpaques=true) const
Test whether the given value is a constant int or similar node.
LLVM_ABI void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To, unsigned Num)
Like ReplaceAllUsesOfValueWith, but for multiple values at once.
LLVM_ABI SDValue getJumpTableDebugInfo(int JTI, SDValue Chain, const SDLoc &DL)
LLVM_ABI SDValue getSymbolFunctionGlobalAddress(SDValue Op, Function **TargetFunction=nullptr)
Return a GlobalAddress of the function from the current module with name matching the given ExternalS...
LLVM_ABI std::optional< unsigned > getValidMaximumShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue UnrollVectorOp(SDNode *N, unsigned ResNE=0)
Utility function used by legalize and lowering to "unroll" a vector operation by splitting out the sc...
LLVM_ABI SDValue getVScale(const SDLoc &DL, EVT VT, APInt MulImm)
Return a node that represents the runtime scaling 'MulImm * RuntimeVL'.
LLVM_ABI 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.
static LLVM_ABI unsigned getHasPredecessorMaxSteps()
LLVM_ABI bool haveNoCommonBitsSet(SDValue A, SDValue B) const
Return true if A and B have no common bits set.
LLVM_ABI SDValue getAddrSpaceCast(const SDLoc &dl, EVT VT, SDValue Ptr, unsigned SrcAS, unsigned DestAS, const SDNodeFlags Flags=SDNodeFlags())
Return an AddrSpaceCastSDNode.
SDValue getExtractSubvector(const SDLoc &DL, EVT VT, SDValue Vec, unsigned Idx)
Return the VT typed sub-vector of Vec at Idx.
LLVM_ABI bool cannotBeOrderedNegativeFP(SDValue Op) const
Test whether the given float value is known to be positive.
LLVM_ABI SDValue getRegister(Register Reg, EVT VT)
LLVM_ABI bool calculateDivergence(SDNode *N)
LLVM_ABI std::pair< SDValue, SDValue > getStrcmp(SDValue Chain, const SDLoc &dl, SDValue S0, SDValue S1, const CallInst *CI)
Lower a strcmp operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getGetFPEnv(SDValue Chain, const SDLoc &dl, SDValue Ptr, EVT MemVT, MachineMemOperand *MMO)
LLVM_ABI SDValue getAssertAlign(const SDLoc &DL, SDValue V, Align A)
Return an AssertAlignSDNode.
LLVM_ABI SDNode * mutateStrictFPToFP(SDNode *Node)
Mutate the specified strict FP node to its non-strict equivalent, unlinking the node from its chain a...
LLVM_ABI bool canIgnoreSignBitOfZero(const SDUse &Use) const
Check if a use of a float value is insensitive to signed zeros.
LLVM_ABI bool SignBitIsZeroFP(SDValue Op, unsigned Depth=0) const
Return true if the sign bit of Op is known to be zero, for a floating-point value.
LLVM_ABI 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=LocationSize::precise(0), const AAMDNodes &AAInfo=AAMDNodes())
Creates a MemIntrinsicNode that may produce a result and takes a list of operands.
SDValue getInsertSubvector(const SDLoc &DL, SDValue Vec, SDValue SubVec, unsigned Idx)
Insert SubVec at the Idx element of Vec.
LLVM_ABI 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 getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond, SDValue Chain=SDValue(), bool IsSignaling=false, SDNodeFlags Flags={})
Helper function to make it easier to build SetCC's if you just have an ISD::CondCode instead of an SD...
LLVM_ABI 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.
LLVM_ABI Align getEVTAlign(EVT MemoryVT) const
Compute the default alignment value for the given type.
LLVM_ABI bool shouldOptForSize() const
LLVM_ABI bool hasSwiftErrorArg() const
LLVM_ABI SDValue buildVectorFromUnrolledParts(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Scalars)
Returns a vector constructed from the scalar values in order.
LLVM_ABI SDValue getNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a bitwise NOT operation as (XOR Val, -1).
LLVM_ABI SDValue getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
const TargetLowering & getTargetLoweringInfo() const
LLVM_ABI bool isEqualTo(SDValue A, SDValue B) const
Test whether two SDValues are known to compare equal.
static constexpr unsigned MaxRecursionDepth
LLVM_ABI unsigned getMaxRuntimeNumElements(EVT VT) const
Returns the maximum runtime number of elements in VT if known, or 0 otherwise.
LLVM_ABI 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)
bool isGuaranteedNotToBePoison(SDValue Op, unsigned Depth=0) const
Return true if this function can prove that Op is never poison.
LLVM_ABI SDValue getIdentityElement(unsigned Opcode, const SDLoc &DL, EVT VT, SDNodeFlags Flags)
Get the (commutative) identity element for the given opcode, if it exists.
LLVM_ABI SDValue expandVACopy(SDNode *Node)
Expand the specified ISD::VACOPY node as the Legalize pass would.
LLVM_ABI SDValue getIndexedMaskedLoad(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI 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.
LLVM_ABI 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...
LLVM_ABI 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...
LLVM_ABI void salvageDebugInfo(SDNode &N)
To be invoked on an SDNode that is slated to be erased.
LLVM_ABI 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.
LLVM_ABI 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
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
LLVM_ABI 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.
LLVM_ABI 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...
LLVM_ABI 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.
LLVM_ABI void DeleteNode(SDNode *N)
Remove the specified node from the system.
LLVM_ABI SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Offset, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
LLVM_ABI SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
LLVM_ABI 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.
LLVM_ABI std::pair< SDValue, SDValue > getStrcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, const CallInst *CI)
Lower a strcpy operation into a target library call and return the resulting chain and call result as...
SDValue getSelect(const SDLoc &DL, EVT VT, SDValue Cond, SDValue LHS, SDValue RHS, SDNodeFlags Flags=SDNodeFlags())
Helper function to make it easier to build Select's if you just have operands and don't want to check...
LLVM_ABI SDValue getNegative(SDValue Val, const SDLoc &DL, EVT VT)
Create negative operation as (SUB 0, Val).
LLVM_ABI std::optional< unsigned > getValidShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has a uniform shift amount that is less than the element bit-width of the shi...
LLVM_ABI void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
LLVM_ABI SDValue simplifySelect(SDValue Cond, SDValue TVal, SDValue FVal)
Try to simplify a select/vselect into 1 of its operands or a constant.
LLVM_ABI 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.
LLVM_ABI bool isConstantFPBuildVectorOrConstantFP(SDValue N) const
Test whether the given value is a constant FP or similar node.
const DataLayout & getDataLayout() const
LLVM_ABI SDValue getPartialReduceMLS(unsigned Opc, const SDLoc &DL, SDValue Acc, SDValue LHS, SDValue RHS)
Get an expression that implements a partial multiply-subtract reduction.
LLVM_ABI SDValue expandVAArg(SDNode *Node)
Expand the specified ISD::VAARG node as the Legalize pass would.
LLVM_ABI SDValue getTokenFactor(const SDLoc &DL, SmallVectorImpl< SDValue > &Vals)
Creates a new TokenFactor containing Vals.
LLVM_ABI SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Helper function to build ISD::STORE nodes.
LLVM_ABI bool doesNodeExist(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops)
Check if a node exists without modifying its flags.
LLVM_ABI ConstantRange computeConstantRangeIncludingKnownBits(SDValue Op, bool ForSigned, unsigned Depth=0) const
Combine constant ranges from computeConstantRange() and computeKnownBits().
const SelectionDAGTargetInfo & getSelectionDAGInfo() const
LLVM_ABI bool areNonVolatileConsecutiveLoads(LoadSDNode *LD, LoadSDNode *Base, unsigned Bytes, int Dist) const
Return true if loads are next to each other and can be merged.
LLVM_ABI SDValue getMaskedHistogram(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
LLVM_ABI SDDbgLabel * getDbgLabel(DILabel *Label, const DebugLoc &DL, unsigned O)
Creates a SDDbgLabel node.
LLVM_ABI 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)
LLVM_ABI OverflowKind computeOverflowForUnsignedMul(SDValue N0, SDValue N1) const
Determine if the result of the unsigned mul of 2 nodes can overflow.
LLVM_ABI void copyExtraInfo(SDNode *From, SDNode *To)
Copy extra info associated with one node to another.
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
LLVM_ABI SDValue getGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT, int64_t offset=0, bool isTargetGA=false, unsigned TargetFlags=0)
LLVM_ABI 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.
LLVM_ABI SDValue getLoadFFVP(EVT VT, const SDLoc &DL, SDValue Chain, SDValue Ptr, SDValue Mask, SDValue EVL, MachineMemOperand *MMO)
LLVM_ABI SDValue getTypeSize(const SDLoc &DL, EVT VT, TypeSize TS)
LLVM_ABI SDValue getMDNode(const MDNode *MD)
Return an MDNodeSDNode which holds an MDNode.
LLVM_ABI void clear()
Clear state and free memory necessary to make this SelectionDAG ready to process a new block.
LLVM_ABI std::pair< SDValue, SDValue > getMemcmp(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, const CallInst *CI)
Lower a memcmp operation into a target library call and return the resulting chain and call result as...
LLVM_ABI void ReplaceAllUsesWith(SDValue From, SDValue To)
Modify anything using 'From' to use 'To' instead.
LLVM_ABI SDValue getCommutedVectorShuffle(const ShuffleVectorSDNode &SV)
Returns an ISD::VECTOR_SHUFFLE node semantically equivalent to the shuffle node in input but with swa...
LLVM_ABI 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 MMOMetadata &Metadata=MMOMetadata())
LLVM_ABI 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.
LLVM_ABI SDValue getSignedConstant(int64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
LLVM_ABI SDValue getSrcValue(const Value *v)
Construct a node to track a Value* through the backend.
SDValue getSplatVector(EVT VT, const SDLoc &DL, SDValue Op)
LLVM_ABI SDValue getAtomicMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo)
LLVM_ABI OverflowKind computeOverflowForSignedMul(SDValue N0, SDValue N1) const
Determine if the result of the signed mul of 2 nodes can overflow.
LLVM_ABI MaybeAlign InferPtrAlign(SDValue Ptr) const
Infer alignment of a load / store address.
LLVM_ABI void dump() const
Dump the textual format of this DAG.
LLVM_ABI bool MaskedValueIsAllOnes(SDValue Op, const APInt &Mask, unsigned Depth=0) const
Return true if '(Op & Mask) == Mask'.
LLVM_ABI bool SignBitIsZero(SDValue Op, unsigned Depth=0) const
Return true if the sign bit of Op is known to be zero.
LLVM_ABI void RemoveDeadNodes()
This method deletes all unreachable nodes in the SelectionDAG.
LLVM_ABI void RemoveDeadNode(SDNode *N)
Remove the specified node from the system.
LLVM_ABI void AddDbgLabel(SDDbgLabel *DB)
Add a dbg_label SDNode.
bool isConstantValueOfAnyType(SDValue N) const
LLVM_ABI bool canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts, UndefPoisonKind Kind=UndefPoisonKind::UndefOrPoison, bool ConsiderFlags=true, unsigned Depth=0) const
Return true if Op can create undef or poison from non-undef & non-poison operands.
SDValue getInsertVectorElt(const SDLoc &DL, SDValue Vec, SDValue Elt, unsigned Idx)
Insert Elt into Vec at offset Idx.
LLVM_ABI SDValue getTargetExtractSubreg(int SRIdx, const SDLoc &DL, EVT VT, SDValue Operand)
A convenience function for creating TargetInstrInfo::EXTRACT_SUBREG nodes.
LLVM_ABI 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...
LLVM_ABI SDDbgValue * getVRegDbgValue(DIVariable *Var, DIExpression *Expr, Register VReg, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a VReg SDDbgValue node.
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI KnownFPClass computeKnownFPClass(SDValue Op, FPClassTest InterestedClasses, unsigned Depth=0) const
Determine floating-point class information about Op.
LLVM_ABI bool isIdentityElement(unsigned Opc, SDNodeFlags Flags, SDValue V, unsigned OperandNo, unsigned Depth=0) const
Returns true if V is an identity element of Opc with Flags.
LLVM_ABI SDValue getEHLabel(const SDLoc &dl, SDValue Root, MCSymbol *Label)
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(SDValue Op, UndefPoisonKind Kind=UndefPoisonKind::UndefOrPoison, unsigned Depth=0) const
Return true if this function can prove that Op is never poison and, Kind can be used to track poison ...
LLVM_ABI bool isKnownNeverZero(SDValue Op, unsigned Depth=0) const
Test whether the given SDValue is known to contain non-zero value(s).
LLVM_ABI SDValue getIndexedStore(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SDNodeFlags Flags=SDNodeFlags())
LLVM_ABI std::optional< unsigned > getValidMinimumShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue getSetFPEnv(SDValue Chain, const SDLoc &dl, SDValue Ptr, EVT MemVT, MachineMemOperand *MMO)
LLVM_ABI 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 ...
LLVM_ABI 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)
LLVM_ABI SDValue getExternalSymbol(const char *Sym, EVT VT)
const TargetMachine & getTarget() const
LLVM_ABI 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...
LLVM_ABI std::pair< SDValue, SDValue > SplitEVL(SDValue N, EVT VecVT, const SDLoc &DL)
Split the explicit vector length parameter of a VP operation.
LLVM_ABI 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...
LLVM_ABI SDValue getMaskFromElementCount(const SDLoc &DL, EVT VT, ElementCount Len)
Return a vector with the first 'Len' lanes set to true and remaining lanes set to false.
LLVM_ABI 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()
LLVM_ABI SDValue getBlockAddress(const BlockAddress *BA, EVT VT, int64_t Offset=0, bool isTarget=false, unsigned TargetFlags=0)
LLVM_ABI SDValue WidenVector(const SDValue &N, const SDLoc &DL)
Widen the vector up to the next power of two using INSERT_SUBVECTOR.
const LibcallLoweringInfo & getLibcalls() const
LLVM_ABI 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)
LLVM_ABI SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI SDDbgValue * getConstantDbgValue(DIVariable *Var, DIExpression *Expr, const Value *C, const DebugLoc &DL, unsigned O)
Creates a constant SDDbgValue node.
LLVM_ABI SDValue getScatterVP(SDVTList VTs, EVT VT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getLifetimeNode(bool IsStart, const SDLoc &dl, SDValue Chain, int FrameIndex)
Creates a LifetimeSDNode that starts (IsStart==true) or ends (IsStart==false) the lifetime of the Fra...
ArrayRef< SDDbgValue * > GetDbgValues(const SDNode *SD) const
Get the debug values which reference the given SDNode.
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI OverflowKind computeOverflowForSignedAdd(SDValue N0, SDValue N1) const
Determine if the result of the signed addition of 2 nodes can overflow.
LLVM_ABI 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...
LLVM_ABI 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
LLVM_ABI bool isKnownNeverNaN(SDValue Op, const APInt &DemandedElts, 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 in...
LLVM_ABI SDValue FoldConstantBuildVector(BuildVectorSDNode *BV, const SDLoc &DL, EVT DstEltVT)
Fold BUILD_VECTOR of constants/undefs to the destination type BUILD_VECTOR of constants/undefs elemen...
LLVM_ABI SDValue getAtomicMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo)
LLVM_ABI SDValue getIndexedMaskedStore(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI 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)
LLVM_ABI 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.
LLVM_ABI bool MaskedVectorIsZero(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
Return true if 'Op' is known to be zero in DemandedElts.
LLVM_ABI 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.
LLVM_ABI SDDbgValue * getFrameIndexDbgValue(DIVariable *Var, DIExpression *Expr, unsigned FI, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a FrameIndex SDDbgValue node.
LLVM_ABI 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)
LLVM_ABI SDValue getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align DstAlign, Align SrcAlign, bool isVol, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
LLVM_ABI SDValue getJumpTable(int JTI, EVT VT, bool isTarget=false, unsigned TargetFlags=0)
LLVM_ABI bool isBaseWithConstantOffset(SDValue Op) const
Return true if the specified operand is an ISD::ADD with a ConstantSDNode on the right-hand side,...
LLVM_ABI SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI void getTopologicallyOrderedNodes(SmallVectorImpl< const SDNode * > &SortedNodes) const
Get all the nodes in their topological order without modifying any states.
LLVM_ABI 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
LLVM_ABI std::pair< SDValue, SDValue > getStrstr(SDValue Chain, const SDLoc &dl, SDValue S0, SDValue S1, const CallInst *CI)
Lower a strstr operation into a target library call and return the resulting chain and call result as...
LLVM_ABI 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 ...
LLVM_ABI OverflowKind computeOverflowForUnsignedAdd(SDValue N0, SDValue N1) const
Determine if the result of the unsigned addition of 2 nodes can overflow.
SDValue getPOISON(EVT VT)
Return a POISON node. POISON does not have a useful SDLoc.
SDValue getSplatBuildVector(EVT VT, const SDLoc &DL, SDValue Op)
Return a splat ISD::BUILD_VECTOR node, consisting of Op splatted to all elements.
LLVM_ABI SDValue getErrorMergeValues(ArrayRef< EVT > ResultTypes, SDValue Chain, const SDLoc &dl)
Return poison values for each of ResultTypes, substituting Chain for any result of type MVT::Other,...
LLVM_ABI SDValue getFrameIndex(int FI, EVT VT, bool isTarget=false)
LLVM_ABI 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...
LLVM_ABI 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.
LLVM_ABI SDValue getRegisterMask(const uint32_t *RegMask)
LLVM_ABI 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...
LLVM_ABI SDValue getCondCode(ISD::CondCode Cond)
LLVM_ABI bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth=0) const
Return true if 'Op & Mask' is known to be zero.
LLVM_ABI bool isKnownToBeAPowerOfTwoFP(SDValue Val, unsigned Depth=0) const
Test if the given fp value is known to be an integer power-of-2, either positive or negative.
LLVM_ABI OverflowKind computeOverflowForSignedSub(SDValue N0, SDValue N1) const
Determine if the result of the signed sub of 2 nodes can overflow.
LLVM_ABI void init(MachineFunction &NewMF, const TargetLibraryInfo *LibraryInfo, const LibcallLoweringInfo *LibcallsInfo, UniformityInfo *UA, ProfileSummaryInfo *PSIin, BlockFrequencyInfo *BFIin, FunctionVarLocs const *FnVarLocs)
Prepare this SelectionDAG to process code in the given MachineFunction.
SDValue getObjectPtrOffset(const SDLoc &SL, SDValue Ptr, TypeSize Offset)
Create an add instruction with appropriate flags when used for addressing some offset of an object.
LLVMContext * getContext() const
LLVM_ABI 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.
LLVM_ABI bool isKnownToBeAPowerOfTwo(SDValue Val, bool OrZero=false, unsigned Depth=0) const
Test if the given value is known to have exactly one bit set.
LLVM_ABI SDValue getDeactivationSymbol(const GlobalValue *GV)
LLVM_ABI SDValue getTargetExternalSymbol(const char *Sym, EVT VT, unsigned TargetFlags=0)
LLVM_ABI SDValue getMCSymbol(MCSymbol *Sym, EVT VT)
LLVM_ABI bool isUndef(unsigned Opcode, ArrayRef< SDValue > Ops)
Return true if the result of this operation is always undefined.
LLVM_ABI SDValue CreateStackTemporary(TypeSize Bytes, Align Alignment)
Create a stack temporary based on the size in bytes and the alignment.
LLVM_ABI SDNode * UpdateNodeOperands(SDNode *N, SDValue Op)
Mutate the specified node in-place to have the specified operands.
LLVM_ABI 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...
LLVM_ABI SDValue foldConstantFPMath(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops)
Fold floating-point operations when all operands are constants and/or undefined.
LLVM_ABI std::optional< ConstantRange > getValidShiftAmountRange(SDValue V, const APInt &DemandedElts, unsigned Depth) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue FoldSymbolOffset(unsigned Opcode, EVT VT, const GlobalAddressSDNode *GA, const SDNode *N2)
LLVM_ABI SDValue getIndexedLoad(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI 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.
LLVM_ABI SDDbgValue * getDbgValue(DIVariable *Var, DIExpression *Expr, SDNode *N, unsigned R, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a SDDbgValue node.
LLVM_ABI 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)
DenormalMode getDenormalMode(EVT VT) const
Return the current function's default denormal handling kind for the given floating point type.
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.
LLVM_ABI 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.
LLVM_ABI 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 ...
LLVM_ABI bool isADDLike(SDValue Op, bool NoWrap=false) const
Return true if the specified operand is an ISD::OR or ISD::XOR node that can be treated as an ISD::AD...
LLVM_ABI SDValue getVectorShuffle(EVT VT, const SDLoc &dl, SDValue N1, SDValue N2, ArrayRef< int > Mask)
Return an ISD::VECTOR_SHUFFLE node.
LLVM_ABI SDValue simplifyShift(SDValue X, SDValue Y)
Try to simplify a shift into 1 of its operands or a constant.
LLVM_ABI bool areNonVolatileConsecutiveStores(StoreSDNode *ST, StoreSDNode *Base, unsigned Bytes, int Dist) const
Return true if stores are next to each other and can be merged.
LLVM_ABI 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 ...
LLVM_ABI SDValue getLogicalNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a logical NOT operation as (XOR Val, BooleanOne).
LLVM_ABI 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
This SDNode is used to implement the code generator support for the llvm IR shufflevector instruction...
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.
static LLVM_ABI bool isSplatMask(ArrayRef< int > Mask)
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
bool erase(PtrType Ptr)
Remove pointer from the set.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This class is used to represent ISD::STORE nodes.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:138
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.
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.
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.
unsigned getMaxStoresPerMemset(bool OptSize) const
Get maximum # of store operations permitted for llvm.memset.
virtual bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *=nullptr) const
Determine if the target supports unaligned memory accesses.
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 getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
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...
BooleanContent
Enum that describes how the target represents true/false values.
virtual unsigned getMaxGluedStoresPerMemcpy() const
Get maximum # of store operations to be glued together.
std::vector< ArgListEntry > ArgListTy
unsigned getMaxStoresPerMemmove(bool OptSize) const
Get maximum # of store operations permitted for llvm.memmove.
virtual bool isLegalStoreImmediate(int64_t Value) const
Return true if the specified immediate is legal for the value input of a store instruction.
static ISD::NodeType getExtendForContent(BooleanContent Content)
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual bool findOptimalMemOpLowering(LLVMContext &Context, std::vector< EVT > &MemOps, unsigned Limit, const MemOp &Op, unsigned DstAS, unsigned SrcAS, const AttributeList &FuncAttributes, EVT *LargestVT=nullptr) 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.
Primary interface to the complete machine description for the target machine.
const Triple & getTargetTriple() const
virtual bool isNoopAddrSpaceCast(const DataLayout &DL, unsigned SrcAS, unsigned DestAS) const
Returns true if a cast between SrcAS and DestAS is a noop.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const SelectionDAGTargetInfo * getSelectionDAGInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
virtual const TargetLowering * getTargetLowering() const
bool isOSDarwin() const
Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, DriverKit, XROS, or bridgeOS).
Definition Triple.h:724
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:339
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:283
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:299
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:272
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:297
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:187
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:222
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:303
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM_ABI unsigned getOperandNo() const
Return the operand # of this use in its User.
Definition Use.cpp:35
LLVM_ABI void set(Value *Val)
Definition Value.h:876
User * getUser() const
Returns the User that contains this Use.
Definition Use.h:61
Value * getOperand(unsigned i) const
Definition User.h:207
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:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:209
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition DenseSet.h:182
constexpr bool hasKnownScalarFactor(const FixedOrScalableQuantity &RHS) const
Returns true if there exists a value X where RHS*X will result in a value whose quantity matches our ...
Definition TypeSize.h:265
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
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:165
constexpr LeafTy divideCoefficientBy(ScalarTy RHS) const
We do not provide the '/' operator here because division for polynomial types does not work in the sa...
Definition TypeSize.h:252
static constexpr bool isKnownGE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:237
A raw_ostream that writes to an std::string.
CallInst * Call
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI APInt clmulr(const APInt &LHS, const APInt &RHS)
Perform a reversed carry-less multiply.
Definition APInt.cpp:3235
LLVM_ABI APInt mulhu(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on zero-extended operands.
Definition APInt.cpp:3165
LLVM_ABI APInt avgCeilU(const APInt &C1, const APInt &C2)
Compute the ceil of the unsigned average of C1 and C2.
Definition APInt.cpp:3152
LLVM_ABI APInt avgFloorU(const APInt &C1, const APInt &C2)
Compute the floor of the unsigned average of C1 and C2.
Definition APInt.cpp:3142
LLVM_ABI APInt pext(const APInt &Val, const APInt &Mask)
Perform a "compress" operation, also known as pext or bext.
Definition APInt.cpp:3245
LLVM_ABI APInt fshr(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift right.
Definition APInt.cpp:3216
LLVM_ABI APInt mulhs(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on sign-extended operands.
Definition APInt.cpp:3157
LLVM_ABI APInt clmul(const APInt &LHS, const APInt &RHS)
Perform a carry-less multiply, also known as XOR multiplication, and return low-bits.
Definition APInt.cpp:3225
LLVM_ABI APInt pdep(const APInt &Val, const APInt &Mask)
Perform an "expand" operation, also known as pdep or bdep.
Definition APInt.cpp:3255
APInt abds(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be signed.
Definition APInt.h:2294
LLVM_ABI APInt fshl(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift left.
Definition APInt.cpp:3207
LLVM_ABI APInt ScaleBitMask(const APInt &A, unsigned NewBitWidth, bool MatchAllBits=false)
Splat/Merge neighboring bits to widen/narrow the bitmask represented by.
Definition APInt.cpp:3043
LLVM_ABI APInt clmulh(const APInt &LHS, const APInt &RHS)
Perform a carry-less multiply, and return high-bits.
Definition APInt.cpp:3240
APInt abdu(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be unsigned.
Definition APInt.h:2299
LLVM_ABI APInt avgFloorS(const APInt &C1, const APInt &C2)
Compute the floor of the signed average of C1 and C2.
Definition APInt.cpp:3137
LLVM_ABI APInt avgCeilS(const APInt &C1, const APInt &C2)
Compute the ceil of the signed average of C1 and C2.
Definition APInt.cpp:3147
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
LLVM_ABI CondCode getSetCCInverse(CondCode Operation, bool isIntegerLike)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
ISD namespace - This namespace contains an enum which represents all of the SelectionDAG node types a...
Definition ISDOpcodes.h:26
LLVM_ABI 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...
LLVM_ABI 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.
bool matchUnaryPredicateImpl(SDValue Op, const APInt &DemandedElts, std::function< bool(ConstNodeType *)> Match, bool AllowUndefs=false, bool AllowTruncation=false)
Attempt to match a unary predicate against a scalar/splat constant or every element of a constant BUI...
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:43
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
Definition ISDOpcodes.h:837
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h:263
@ TargetConstantPool
Definition ISDOpcodes.h:191
@ MDNODE_SDNODE
MDNODE_SDNODE - This is a node that holdes an MDNode*, which is used to reference metadata in the IR.
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
Definition ISDOpcodes.h:516
@ PTRADD
PTRADD represents pointer arithmetic semantics, for targets that opt in using shouldPreservePtrArith(...
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition ISDOpcodes.h:47
@ POISON
POISON - A poison node.
Definition ISDOpcodes.h:238
@ PARTIAL_REDUCE_SMLA
PARTIAL_REDUCE_[U|S]MLA(Accumulator, Input1, Input2) The partial reduction nodes sign or zero extend ...
@ MASK_BEFOREFIRST
Has one mask vector operand.
@ VECREDUCE_SEQ_FADD
Generic reduction nodes.
@ MLOAD
Masked load and store - consecutive vector load and store operations with additional mask operand tha...
@ VECREDUCE_FMINIMUMNUM
@ FGETSIGN
INT = FGETSIGN(FP) - Return the sign bit of the specified floating point value as an integer 0/1 valu...
Definition ISDOpcodes.h:543
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
Definition ISDOpcodes.h:277
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition ISDOpcodes.h:605
@ JUMP_TABLE_DEBUG_INFO
JUMP_TABLE_DEBUG_INFO - Jumptable debug info.
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:797
@ TargetBlockAddress
Definition ISDOpcodes.h:193
@ DEACTIVATION_SYMBOL
Untyped node storing deactivation symbol reference (DeactivationSymbolSDNode).
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, val, ptr) This corresponds to "store atomic" instruction.
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:296
@ FMAD
FMAD - Perform a * b + c, while getting the same result as the separately rounded operations.
Definition ISDOpcodes.h:527
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:266
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:871
@ ATOMIC_LOAD_USUB_COND
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:523
@ FATAN2
FATAN2 - atan2, inspired by libm.
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition ISDOpcodes.h:222
@ GlobalAddress
Definition ISDOpcodes.h:90
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition ISDOpcodes.h:898
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:589
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:420
@ VECREDUCE_FMAXIMUM
FMINIMUM/FMAXIMUM nodes propatate NaNs and signed zeroes using the llvm.minimum and llvm....
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition ISDOpcodes.h:757
@ SIGN_EXTEND_VECTOR_INREG
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
Definition ISDOpcodes.h:928
@ FP16_TO_FP
FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions and truncation for half-preci...
@ FMULADD
FMULADD - Performs a * b + c, with, or without, intermediate rounding.
Definition ISDOpcodes.h:533
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition ISDOpcodes.h:256
@ CLMUL
Carry-less multiplication operations.
Definition ISDOpcodes.h:788
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
@ GlobalTLSAddress
Definition ISDOpcodes.h:91
@ SRCVALUE
SRCVALUE - This is a node type that holds a Value* that is used to make reference to a value in the L...
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
@ ATOMIC_LOAD_USUB_SAT
@ CTLZ_ZERO_POISON
Definition ISDOpcodes.h:806
@ ANNOTATION_LABEL
ANNOTATION_LABEL - Represents a mid basic block label used by annotations.
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:862
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
Definition ISDOpcodes.h:725
@ SCALAR_TO_VECTOR
SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a scalar value into element 0 of the...
Definition ISDOpcodes.h:675
@ TargetExternalSymbol
Definition ISDOpcodes.h:192
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
@ TargetJumpTable
Definition ISDOpcodes.h:190
@ TargetIndex
TargetIndex - Like a constant pool entry, but with completely target-dependent semantics.
Definition ISDOpcodes.h:200
@ PARTIAL_REDUCE_FMLA
@ PREFETCH
PREFETCH - This corresponds to a prefetch intrinsic.
@ TRUNCATE_SSAT_U
Definition ISDOpcodes.h:891
@ VECREDUCE_FMAXIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM nodes do not propagate NaNs and order signed zeroes using the llvm....
@ 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:845
@ FNEG
Perform various unary floating-point operations inspired by libm.
@ BR_CC
BR_CC - Conditional branch.
@ SSUBO
Same for subtraction.
Definition ISDOpcodes.h:355
@ STEP_VECTOR
STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised of a linear sequence of unsign...
Definition ISDOpcodes.h:701
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:546
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:553
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:377
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:814
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
@ UNDEF
UNDEF - An undefined node.
Definition ISDOpcodes.h:235
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition ISDOpcodes.h:249
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition ISDOpcodes.h:682
@ AssertAlign
AssertAlign - These nodes record if a register contains a value that has a known alignment and the tr...
Definition ISDOpcodes.h:71
@ GET_ACTIVE_LANE_MASK
GET_ACTIVE_LANE_MASK - this corrosponds to the llvm.get.active.lane.mask intrinsic.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:83
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition ISDOpcodes.h:232
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:351
@ TargetGlobalAddress
TargetGlobalAddress - Like GlobalAddress, but the DAG does no folding or anything else with this node...
Definition ISDOpcodes.h:187
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
@ CTLS
Count leading redundant sign bits.
Definition ISDOpcodes.h:810
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
@ MULHU
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
Definition ISDOpcodes.h:714
@ ATOMIC_LOAD_FMAXIMUM
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:779
@ AssertNoFPClass
AssertNoFPClass - These nodes record if a register contains a float value that is known to be not som...
Definition ISDOpcodes.h:80
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
Definition ISDOpcodes.h:659
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:619
@ FMINNUM_IEEE
FMINNUM_IEEE/FMAXNUM_IEEE - Perform floating-point minimumNumber or maximumNumber on two values,...
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
Definition ISDOpcodes.h:50
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:581
@ CopyToReg
CopyToReg - This node has three operands: a chain, a register number to set to this value,...
Definition ISDOpcodes.h:226
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:868
@ TargetConstantFP
Definition ISDOpcodes.h:182
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
Definition ISDOpcodes.h:829
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
@ ATOMIC_CMP_SWAP
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo,...
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition ISDOpcodes.h:389
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:359
@ ATOMIC_LOAD_FMINIMUM
@ TargetFrameIndex
Definition ISDOpcodes.h:189
@ VECTOR_SPLICE_LEFT
VECTOR_SPLICE_LEFT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by OFFSET elements an...
Definition ISDOpcodes.h:663
@ ANY_EXTEND_VECTOR_INREG
ANY_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register any-extension of the low la...
Definition ISDOpcodes.h:917
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition ISDOpcodes.h:906
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:737
@ MASKED_UDIV
Masked vector arithmetic that returns poison on disabled lanes.
@ LIFETIME_START
This corresponds to the llvm.lifetime.
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:996
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:823
@ UADDO_CARRY
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:331
@ MGATHER
Masked gather and scatter - load and store operations for a vector of random addresses with additiona...
@ HANDLENODE
HANDLENODE node - Used as a handle for various purposes.
@ BF16_TO_FP
BF16_TO_FP, FP_TO_BF16 - These operators are used to perform promotions and truncation for bfloat16.
@ ATOMIC_LOAD_UDEC_WRAP
@ PEXT
Parallel bit extract (compress) and parallel bit deposit (expand).
Definition ISDOpcodes.h:793
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition ISDOpcodes.h:505
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:944
@ TargetConstant
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification,...
Definition ISDOpcodes.h:181
@ STRICT_FP_EXTEND
X = STRICT_FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:510
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:749
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:207
@ GET_FPENV_MEM
Gets the current floating-point environment.
@ PSEUDO_PROBE
Pseudo probe for AutoFDO, as a place holder in a basic block to improve the sample counts quality.
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
Definition ISDOpcodes.h:745
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
Definition ISDOpcodes.h:720
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:667
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:306
@ SPLAT_VECTOR_PARTS
SPLAT_VECTOR_PARTS(SCALAR1, SCALAR2, ...) - Returns a vector with the scalar values joined together a...
Definition ISDOpcodes.h:691
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
Definition ISDOpcodes.h:243
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:570
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:55
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ CTTZ_ZERO_POISON
Bit counting operators with a poisoned result for zero inputs.
Definition ISDOpcodes.h:805
@ ExternalSymbol
Definition ISDOpcodes.h:95
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:977
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:709
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
Definition ISDOpcodes.h:939
@ ADDRSPACECAST
ADDRSPACECAST - This operator converts between pointers of different address spaces.
@ EXPERIMENTAL_VECTOR_HISTOGRAM
Experimental vector histogram intrinsic Operands: Input Chain, Inc, Mask, Base, Index,...
@ 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:963
@ VECREDUCE_FMINIMUM
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:874
@ VAARG
VAARG - VAARG has four operands: an input chain, a pointer, a SRCVALUE, and the alignment.
@ VECREDUCE_SEQ_FMUL
@ SHL_PARTS
SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded integer shift operations.
Definition ISDOpcodes.h:851
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:64
@ ATOMIC_LOAD_UINC_WRAP
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:539
@ PARTIAL_REDUCE_SUMLA
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:368
@ VECTOR_REPEAT
VECTOR_REPEAT(FIXED_LENGTH_VECTOR) Repeatedly copies the elements of the source fixed-length vector t...
Definition ISDOpcodes.h:645
@ SET_FPENV_MEM
Sets the current floating point environment.
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
@ TRUNCATE_SSAT_S
TRUNCATE_[SU]SAT_[SU] - Truncate for saturated operand [SU] located in middle, prefix for SAT means i...
Definition ISDOpcodes.h:889
@ ABDS
ABDS/ABDU - Absolute difference - Return the absolute difference between two numbers interpreted as s...
Definition ISDOpcodes.h:732
@ TRUNCATE_USAT_U
Definition ISDOpcodes.h:893
@ SADDO_CARRY
Carry-using overflow-aware nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:341
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition ISDOpcodes.h:215
@ TargetGlobalTLSAddress
Definition ISDOpcodes.h:188
@ ABS_MIN_POISON
ABS with a poison result for INT_MIN.
Definition ISDOpcodes.h:761
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:561
LLVM_ABI NodeType getOppositeSignednessMinMaxOpcode(unsigned MinMaxOpc)
Given a MinMaxOpc of ISD::(U|S)MIN or ISD::(U|S)MAX, returns the corresponding opcode with the opposi...
LLVM_ABI bool isBuildVectorOfConstantSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantSDNode or undef.
LLVM_ABI NodeType getExtForLoadExtType(bool IsFP, LoadExtType)
bool isZEXTLoad(const SDNode *N)
Returns true if the specified node is a ZEXTLOAD.
bool isExtOpcode(unsigned Opcode)
LLVM_ABI 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...
LLVM_ABI NodeType getUnmaskedBinOpOpcode(unsigned MaskedOpc)
Given a MaskedOpc of ISD::MASKED_(U|S)(DIV|REM), returns the unmasked ISD::(U|S)(DIV|REM).
LLVM_ABI 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...
LLVM_ABI bool isVPBinaryOp(unsigned Opcode)
Whether this is a vector-predicated binary operation opcode.
LLVM_ABI CondCode getSetCCInverse(CondCode Operation, EVT Type)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
LLVM_ABI std::optional< unsigned > getBaseOpcodeForVP(unsigned Opcode, bool hasFPExcept)
Translate this VP Opcode to its corresponding non-VP Opcode.
bool isBitwiseLogicOp(unsigned Opcode)
Whether this is bitwise logic opcode.
bool isTrueWhenEqual(CondCode Cond)
Return true if the specified condition returns true if the two operands to the condition are equal.
LLVM_ABI 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...
LLVM_ABI std::optional< unsigned > getVPExplicitVectorLengthIdx(unsigned Opcode)
The operand position of the explicit vector length parameter.
LLVM_ABI bool matchBinaryPredicate(SDValue LHS, SDValue RHS, const APInt &DemandedElts, 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 isEXTLoad(const SDNode *N)
Returns true if the specified node is a EXTLOAD.
LLVM_ABI 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...
LLVM_ABI bool isFreezeUndef(const SDNode *N)
Return true if the specified node is FREEZE(UNDEF).
LLVM_ABI CondCode getSetCCSwappedOperands(CondCode Operation)
Return the operation corresponding to (Y op X) when given the operation for (X op Y).
LLVM_ABI std::optional< unsigned > getVPForBaseOpcode(unsigned Opcode)
Translate this non-VP Opcode to its corresponding VP Opcode.
MemIndexType
MemIndexType enum - This enum defines how to interpret MGATHER/SCATTER's index parameter when calcula...
LLVM_ABI bool isBuildVectorAllZeros(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are 0 or undef.
LLVM_ABI bool isConstantSplatVector(const SDNode *N, APInt &SplatValue)
Node predicates.
LLVM_ABI NodeType getInverseMinMaxOpcode(unsigned MinMaxOpc)
Given a MinMaxOpc of ISD::(U|S)MIN or ISD::(U|S)MAX, returns ISD::(U|S)MAX and ISD::(U|S)MIN,...
LLVM_ABI bool isVPReduction(unsigned Opcode)
Whether this is a vector-predicated reduction opcode.
MemIndexedMode
MemIndexedMode enum - This enum defines the load / store indexed addressing modes.
LLVM_ABI 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,...
LLVM_ABI bool isBuildVectorAllOnes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are ~0 or undef.
LLVM_ABI 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).
LLVM_ABI bool isVPOpcode(unsigned Opcode)
Whether this is a vector-predicated Opcode.
bool matchUnaryPredicate(SDValue Op, const APInt &DemandedElts, std::function< bool(ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTruncation=false)
Hook for matching ConstantSDNode predicate.
LLVM_ABI 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< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
match_deferred< 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()...
auto m_Value()
Match an arbitrary value and ignore it.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
LLVM_ABI Libcall getMEMCPY_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMCPY_ELEMENT_UNORDERED_ATOMIC - Return MEMCPY_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
LLVM_ABI Libcall getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMSET_ELEMENT_UNORDERED_ATOMIC - Return MEMSET_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
LLVM_ABI 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(SDValue N, Pattern &&P)
LLVM_ABI unsigned rot(unsigned SrcSignBits, unsigned BitWidth, std::optional< APInt > RotAmt, bool IsRotateRight)
Compute the number of sign bits after rotating a value.
initializer< Ty > init(const Ty &Val)
@ DW_OP_LLVM_arg
Only used in LLVM metadata.
Definition Dwarf.h:149
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:679
NodeAddr< NodeBase * > Node
Definition RDFGraph.h:381
This is an optimization pass for GlobalISel generic memory operations.
GenericUniformityInfo< SSAContext > UniformityInfo
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:339
@ Offset
Definition DWP.cpp:577
bool operator<(int64_t V1, const APSInt &V2)
Definition APSInt.h:360
LLVM_ABI ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred)
getICmpCondCode - Return the ISD condition code corresponding to the given LLVM IR integer condition ...
Definition Analysis.cpp:248
void fill(R &&Range, T &&Value)
Provide wrappers to std::fill which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1775
LLVM_ABI 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:1755
LLVM_ABI bool isNullConstant(SDValue V)
Returns true if V is a constant integer zero.
LLVM_ABI 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:1558
LLVM_ABI SDValue getBitwiseNotOperand(SDValue V, SDValue Mask, bool AllowUndefs)
If V is a bitwise not, returns the inverted operand.
@ Known
Known to have no common set bits.
@ Undef
Value of the register doesn't matter.
LLVM_ABI 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 tuples (A, B,...
Definition STLExtras.h:2570
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition bit.h:315
@ Store
The extracted value is stored (ExtractElement only).
bool isIntOrFPConstant(SDValue V)
Return true if V is either a integer or FP constant.
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
Definition Casting.h:732
LLVM_ABI 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.
LLVM_ABI bool isOneOrOneSplatFP(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant floating-point value, or a splatted vector of a constant float...
int bit_width(T Value)
Returns the number of bits needed to represent Value if Value is nonzero.
Definition bit.h:325
LLVM_READONLY APFloat maximum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximum semantics.
Definition APFloat.h:1801
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2224
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:244
LLVM_ABI 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:649
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
auto cast_or_null(const Y &Val)
Definition Casting.h:714
LLVM_ABI 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:1540
LLVM_ABI bool isMinSignedConstant(SDValue V)
Returns true if V is a constant min signed integer value.
LLVM_ABI ConstantFPSDNode * isConstOrConstSplatFP(SDValue N, bool AllowUndefs=false)
Returns the SDNode if it is a constant splat BuildVector or constant float.
LLVM_ABI 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:1713
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition bit.h:204
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
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:1762
LLVM_ABI 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 2008 maxNum semantics.
Definition APFloat.h:1756
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:326
LLVM_ABI bool isBitwiseNot(SDValue V, bool AllowUndefs=false)
Returns true if V is a bitwise not operation.
auto reverse(ContainerTy &&C)
Definition STLExtras.h:408
LLVM_ABI SDValue peekThroughInsertVectorElt(SDValue V, const APInt &DemandedElts)
Recursively peek through INSERT_VECTOR_ELT nodes, returning the source vector operand of V,...
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:280
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
LLVM_ABI void checkForCycles(const SelectionDAG *DAG, bool force=false)
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1652
LLVM_READONLY APFloat minimumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimumNumber semantics.
Definition APFloat.h:1787
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI const MDNode * getMemCacheHintMetadata(const Instruction &I, unsigned OperandNo=0)
Return the cache hint metadata node for memory operand OperandNo on I, or nullptr when the instructio...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI 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:1769
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
constexpr std::underlying_type_t< Enum > to_underlying(Enum E)
Returns underlying integer value of an enum.
LLVM_ABI 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...
LLVM_ABI 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:227
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
bool includesPoison(UndefPoisonKind Kind)
Returns true if Kind includes the Poison bit.
Definition UndefPoison.h:27
LLVM_ABI 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...
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Other
Any other memory.
Definition ModRef.h:68
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
bool includesUndef(UndefPoisonKind Kind)
Returns true if Kind includes the Undef bit.
Definition UndefPoison.h:33
LLVM_READONLY APFloat minnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2008 minNum semantics.
Definition APFloat.h:1737
@ Mul
Product of integers.
@ Sub
Subtraction of integers.
@ Fast
Assign the register banks as fast as possible (default).
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
LLVM_ABI bool isNullConstantOrUndef(SDValue V)
Returns true if V is a constant integer zero or an UNDEF node.
IntPtrTy
Definition InstrProf.h:82
LLVM_ABI bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM, bool ReturnsFirstArg=false)
Test if the given instruction is in a position to be optimized with a tail-call.
Definition Analysis.cpp:656
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI 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:1901
constexpr unsigned BitWidth
LLVM_ABI bool funcReturnsFirstArgOfCall(const CallInst &CI)
Returns true if the parent of CI returns CI's first argument after calling CI.
Definition Analysis.cpp:835
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isZeroOrZeroSplat(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
constexpr auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
Definition Sequence.h:341
LLVM_ABI bool isOneConstant(SDValue V)
Returns true if V is a constant integer one.
UndefPoisonKind
Enumeration to track whether we are interested in Undef, Poison, or both.
Definition UndefPoison.h:20
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1963
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:206
LLVM_ABI 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:567
unsigned Log2(Align A)
Returns the log2 of the alignment.
Definition Alignment.h:202
LLVM_ABI bool isZeroOrZeroSplatFP(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant (+/-)0.0 floating-point value or a splatted vector thereof (wi...
bool equal(L &&LRange, R &&RRange)
Wrapper function around std::equal to detect if pair-wise elements between two ranges are the same.
Definition STLExtras.h:2162
LLVM_ABI 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:1774
LLVM_READONLY APFloat maximumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximumNumber semantics.
Definition APFloat.h:1814
LLVM_ABI 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:368
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
#define N
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:774
MDNode * TBAAStruct
The tag for type-based alias analysis (tbaa struct).
Definition Metadata.h:794
MDNode * TBAA
The tag for type-based alias analysis.
Definition Metadata.h:791
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:82
static constexpr Align fromLog2(unsigned Log2Value)
Returns an alignment of 1 << Log2Value bytes.
Definition Alignment.h:73
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:35
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition ValueTypes.h:418
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition ValueTypes.h:145
intptr_t getRawBits() const
Definition ValueTypes.h:543
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:70
EVT changeTypeToInteger() const
Return the type converted to an equivalently sized integer or vector with integer element type.
Definition ValueTypes.h:129
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:307
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:323
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:155
ElementCount getVectorElementCount() const
Definition ValueTypes.h:373
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:396
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:382
uint64_t getScalarSizeInBits() const
Definition ValueTypes.h:408
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:339
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:61
bool isFixedLengthVector() const
Definition ValueTypes.h:199
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:176
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:346
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
Definition ValueTypes.h:315
bool bitsEq(EVT VT) const
Return true if this has the same number of bits as VT.
Definition ValueTypes.h:279
LLVM_ABI Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition ValueTypes.h:187
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:351
bool isExtended() const
Test if the given EVT is extended (as opposed to being simple).
Definition ValueTypes.h:150
LLVM_ABI const fltSemantics & getFltSemantics() const
Returns an APFloat semantics tag appropriate for the value type.
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:359
bool bitsLE(EVT VT) const
Return true if this has no more bits than VT.
Definition ValueTypes.h:331
EVT getHalfNumVectorElementsVT(LLVMContext &Context) const
Definition ValueTypes.h:484
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:160
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition KnownBits.h:315
static LLVM_ABI KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from zero-extended multiply-hi.
static LLVM_ABI KnownBits smax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smax(LHS, RHS).
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition KnownBits.h:106
bool isZero() const
Returns true if value is all zero.
Definition KnownBits.h:78
static LLVM_ABI KnownBits usub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.usub.sat(LHS, RHS)
static LLVM_ABI KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
static LLVM_ABI KnownBits urem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for urem(LHS, RHS).
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:288
static LLVM_ABI std::optional< bool > ne(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_NE result.
KnownBits trunc(unsigned BitWidth) const
Return known bits for a truncation of the value we're tracking.
Definition KnownBits.h:165
KnownBits byteSwap() const
Definition KnownBits.h:559
static LLVM_ABI KnownBits fshl(const KnownBits &LHS, const KnownBits &RHS, const APInt &Amt)
Compute known bits for fshl(LHS, RHS, Amt).
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:303
void setAllZero()
Make all bits known to be zero and discard any previous information.
Definition KnownBits.h:84
KnownBits reverseBits() const
Definition KnownBits.h:563
KnownBits concat(const KnownBits &Lo) const
Concatenate the bits from Lo onto the bottom of *this.
Definition KnownBits.h:247
unsigned getBitWidth() const
Get the bit width of this value.
Definition KnownBits.h:44
static LLVM_ABI KnownBits umax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umax(LHS, RHS).
KnownBits zext(unsigned BitWidth) const
Return known bits for a zero extension of the value we're tracking.
Definition KnownBits.h:176
void resetAll()
Resets the known state of all bits.
Definition KnownBits.h:72
static KnownBits add(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false, bool SelfAdd=false)
Compute knownbits resulting from addition of LHS and RHS.
Definition KnownBits.h:361
static LLVM_ABI KnownBits lshr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for lshr(LHS, RHS).
bool isNonZero() const
Returns true if this value is known to be non-zero.
Definition KnownBits.h:109
static LLVM_ABI KnownBits abdu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for abdu(LHS, RHS).
KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const
Return a subset of the known bits from [bitPosition,bitPosition+numBits).
Definition KnownBits.h:239
static LLVM_ABI KnownBits pdep(const KnownBits &Val, const KnownBits &Mask)
Compute known bits for pdep(Val, Mask).
static LLVM_ABI KnownBits avgFloorU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorU.
KnownBits sext(unsigned BitWidth) const
Return known bits for a sign extension of the value we're tracking.
Definition KnownBits.h:184
static LLVM_ABI KnownBits computeForSubBorrow(const KnownBits &LHS, KnownBits RHS, const KnownBits &Borrow)
Compute known bits results from subtracting RHS from LHS with 1-bit Borrow.
KnownBits zextOrTrunc(unsigned BitWidth) const
Return known bits for a zero extension or truncation of the value we're tracking.
Definition KnownBits.h:200
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:146
static LLVM_ABI KnownBits fshr(const KnownBits &LHS, const KnownBits &RHS, const APInt &Amt)
Compute known bits for fshr(LHS, RHS, Amt).
static LLVM_ABI KnownBits abds(KnownBits LHS, KnownBits RHS)
Compute known bits for abds(LHS, RHS).
static LLVM_ABI KnownBits smin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smin(LHS, RHS).
static LLVM_ABI KnownBits mulhs(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from sign-extended multiply-hi.
static LLVM_ABI KnownBits srem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for srem(LHS, RHS).
static LLVM_ABI KnownBits udiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for udiv(LHS, RHS).
bool isStrictlyPositive() const
Returns true if this value is known to be positive.
Definition KnownBits.h:112
static LLVM_ABI KnownBits sdiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for sdiv(LHS, RHS).
static LLVM_ABI KnownBits avgFloorS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorS.
static bool haveNoCommonBitsSet(const KnownBits &LHS, const KnownBits &RHS)
Return true if LHS and RHS have no common bits set.
Definition KnownBits.h:340
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:103
static LLVM_ABI 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:54
static KnownBits sub(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false)
Compute knownbits resulting from subtraction of LHS and RHS.
Definition KnownBits.h:376
unsigned countMaxLeadingZeros() const
Returns the maximum number of leading zero bits possible.
Definition KnownBits.h:294
static LLVM_ABI KnownBits avgCeilU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilU.
static LLVM_ABI KnownBits mul(const KnownBits &LHS, const KnownBits &RHS, bool NoUndefSelfMultiply=false)
Compute known bits resulting from multiplying LHS and RHS.
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:171
static LLVM_ABI KnownBits clmul(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for clmul(LHS, RHS).
LLVM_ABI KnownBits abs(bool IntMinIsPoison=false) const
Compute known bits for the absolute value.
static LLVM_ABI KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW=false, bool NSW=false, bool ShAmtNonZero=false)
Compute known bits for shl(LHS, RHS).
static LLVM_ABI KnownBits umin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umin(LHS, RHS).
static LLVM_ABI KnownBits pext(const KnownBits &Val, const KnownBits &Mask)
Compute known bits for pext(Val, Mask).
static LLVM_ABI KnownBits avgCeilS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilS.
bool isUnknown() const
KnownFPClass intersectWith(const KnownFPClass &RHS) const
static LLVM_ABI KnownFPClass bitcast(const fltSemantics &FltSemantics, const KnownBits &Bits)
Report known values for a bitcast into a float with provided semantics.
LLVM IR metadata carried by a MachineMemOperand.
This class contains a discriminated union of information about pointers in memory operands,...
LLVM_ABI bool isDereferenceable(unsigned Size, LLVMContext &C, const DataLayout &DL) const
Return true if memory region [V, V+Offset+Size) is known to be dereferenceable.
LLVM_ABI 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 LLVM_ABI 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:111
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.
Definition Alignment.h:135
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)
static MemOp Move(uint64_t Size, bool DstAlignCanChange, Align DstAlign, Align SrcAlign, bool IsVolatile)
static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl)
Get the libcall routine name for the specified libcall implementation.
These are IR-level optimization flags that may be propagated to SDNodes.
static LLVM_ABI bool isEqual(const KeyTy &Key, const SDNode &N)
The key SelectionDAG uniques SDNodes by.
void AddPointer(const void *P)
SmallVector< SDValue, 0 > OpStorage
Backs Ops when the key is built from a node; empty otherwise.
void AddInteger(T I)
const EVT * VTs
ArrayRef< SDValue > Ops
FoldingSetNodeID Tail
SDNodeKey(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops)
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.
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)