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
1489void SelectionDAG::allnodes_clear() {
1490 assert(&*AllNodes.begin() == &EntryNode);
1491 AllNodes.remove(AllNodes.begin());
1492 while (!AllNodes.empty())
1493 DeallocateNode(&AllNodes.front());
1494#ifndef NDEBUG
1495 NextPersistentId = 0;
1496#endif
1497}
1498
1499SDNode *SelectionDAG::lookupNode(const SDNodeKey &Key,
1500 FoldingSetInsertToken &InsertToken) {
1501 SDNode *N = CSEMap.lookup(Key, InsertToken);
1502 if (N) {
1503 switch (N->getOpcode()) {
1504 default: break;
1505 case ISD::Constant:
1506 case ISD::ConstantFP:
1507 llvm_unreachable("Querying for Constant and ConstantFP nodes requires "
1508 "debug location. Use another overload.");
1509 }
1510 }
1511 return N;
1512}
1513
1514SDNode *SelectionDAG::lookupNode(const SDNodeKey &Key, const SDLoc &DL,
1515 FoldingSetInsertToken &InsertToken) {
1516 SDNode *N = CSEMap.lookup(Key, InsertToken);
1517 if (N) {
1518 switch (N->getOpcode()) {
1519 case ISD::Constant:
1520 case ISD::ConstantFP:
1521 // Erase debug location from the node if the node is used at several
1522 // different places. Do not propagate one location to all uses as it
1523 // will cause a worse single stepping debugging experience.
1524 if (N->getDebugLoc() != DL.getDebugLoc())
1525 N->setDebugLoc(DebugLoc());
1526 break;
1527 default:
1528 // When the node's point of use is located earlier in the instruction
1529 // sequence than its prior point of use, update its debug info to the
1530 // earlier location.
1531 if (DL.getIROrder() && DL.getIROrder() < N->getIROrder())
1532 N->setDebugLoc(DL.getDebugLoc());
1533 break;
1534 }
1535 }
1536 return N;
1537}
1538
1540 allnodes_clear();
1541 OperandRecycler.clear(OperandAllocator);
1542 OperandAllocator.Reset();
1543 CSEMap.clear();
1544
1545 ExtendedValueTypeNodes.clear();
1546 ExternalSymbols.clear();
1547 TargetExternalSymbols.clear();
1548 MCSymbols.clear();
1549 SDEI.clear();
1550 llvm::fill(CondCodeNodes, nullptr);
1551 llvm::fill(ValueTypeNodes, nullptr);
1552
1553 EntryNode.UseList = nullptr;
1554 InsertNode(&EntryNode);
1555 Root = getEntryNode();
1556 DbgInfo->clear();
1557}
1558
1560 return VT.bitsGT(Op.getValueType())
1561 ? getNode(ISD::FP_EXTEND, DL, VT, Op)
1562 : getNode(ISD::FP_ROUND, DL, VT, Op,
1563 getIntPtrConstant(0, DL, /*isTarget=*/true));
1564}
1565
1566std::pair<SDValue, SDValue>
1568 const SDLoc &DL, EVT VT) {
1569 assert(!VT.bitsEq(Op.getValueType()) &&
1570 "Strict no-op FP extend/round not allowed.");
1571 SDValue Res =
1572 VT.bitsGT(Op.getValueType())
1573 ? getNode(ISD::STRICT_FP_EXTEND, DL, {VT, MVT::Other}, {Chain, Op})
1574 : getNode(ISD::STRICT_FP_ROUND, DL, {VT, MVT::Other},
1575 {Chain, Op, getIntPtrConstant(0, DL, /*isTarget=*/true)});
1576
1577 return std::pair<SDValue, SDValue>(Res, SDValue(Res.getNode(), 1));
1578}
1579
1581 return VT.bitsGT(Op.getValueType()) ?
1582 getNode(ISD::ANY_EXTEND, DL, VT, Op) :
1583 getNode(ISD::TRUNCATE, DL, VT, Op);
1584}
1585
1587 return VT.bitsGT(Op.getValueType()) ?
1588 getNode(ISD::SIGN_EXTEND, DL, VT, Op) :
1589 getNode(ISD::TRUNCATE, DL, VT, Op);
1590}
1591
1593 return VT.bitsGT(Op.getValueType()) ?
1594 getNode(ISD::ZERO_EXTEND, DL, VT, Op) :
1595 getNode(ISD::TRUNCATE, DL, VT, Op);
1596}
1597
1599 EVT VT) {
1600 assert(!VT.isVector());
1601 auto Type = Op.getValueType();
1602 SDValue DestOp;
1603 if (Type == VT)
1604 return Op;
1605 auto Size = Op.getValueSizeInBits();
1606 DestOp = getBitcast(EVT::getIntegerVT(*Context, Size), Op);
1607 if (DestOp.getValueType() == VT)
1608 return DestOp;
1609
1610 return getAnyExtOrTrunc(DestOp, DL, VT);
1611}
1612
1614 EVT OpVT) {
1615 if (VT.bitsLE(Op.getValueType()))
1616 return getNode(ISD::TRUNCATE, SL, VT, Op);
1617
1618 TargetLowering::BooleanContent BType = TLI->getBooleanContents(OpVT);
1619 return getNode(TLI->getExtendForContent(BType), SL, VT, Op);
1620}
1621
1623 EVT OpVT = Op.getValueType();
1624 assert(VT.isInteger() && OpVT.isInteger() &&
1625 "Cannot getZeroExtendInReg FP types");
1626 assert(VT.isVector() == OpVT.isVector() &&
1627 "getZeroExtendInReg type should be vector iff the operand "
1628 "type is vector!");
1629 assert((!VT.isVector() ||
1631 "Vector element counts must match in getZeroExtendInReg");
1632 assert(VT.getScalarType().bitsLE(OpVT.getScalarType()) && "Not extending!");
1633 if (OpVT == VT)
1634 return Op;
1635 // TODO: Use computeKnownBits instead of AssertZext.
1636 if (Op.getOpcode() == ISD::AssertZext && cast<VTSDNode>(Op.getOperand(1))
1637 ->getVT()
1638 .getScalarType()
1639 .bitsLE(VT.getScalarType()))
1640 return Op;
1642 VT.getScalarSizeInBits());
1643 return getNode(ISD::AND, DL, OpVT, Op, getConstant(Imm, DL, OpVT));
1644}
1645
1647 // Only unsigned pointer semantics are supported right now. In the future this
1648 // might delegate to TLI to check pointer signedness.
1649 return getZExtOrTrunc(Op, DL, VT);
1650}
1651
1653 // Only unsigned pointer semantics are supported right now. In the future this
1654 // might delegate to TLI to check pointer signedness.
1655 return getZeroExtendInReg(Op, DL, VT);
1656}
1657
1659 return getNode(ISD::SUB, DL, VT, getConstant(0, DL, VT), Val);
1660}
1661
1662/// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
1664 return getNode(ISD::XOR, DL, VT, Val, getAllOnesConstant(DL, VT));
1665}
1666
1668 SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
1669 return getNode(ISD::XOR, DL, VT, Val, TrueValue);
1670}
1671
1673 EVT OpVT) {
1674 if (!V)
1675 return getConstant(0, DL, VT);
1676
1677 switch (TLI->getBooleanContents(OpVT)) {
1680 return getConstant(1, DL, VT);
1682 return getAllOnesConstant(DL, VT);
1683 }
1684 llvm_unreachable("Unexpected boolean content enum!");
1685}
1686
1688 bool isT, bool isO) {
1689 return getConstant(APInt(VT.getScalarSizeInBits(), Val, /*isSigned=*/false),
1690 DL, VT, isT, isO);
1691}
1692
1694 bool isT, bool isO) {
1695 return getConstant(*ConstantInt::get(*Context, Val), DL, VT, isT, isO);
1696}
1697
1699 EVT VT, bool isT, bool isO) {
1700 assert(VT.isInteger() && "Cannot create FP integer constant!");
1701
1702 EVT EltVT = VT.getScalarType();
1703 const ConstantInt *Elt = &Val;
1704
1705 // Vector splats are explicit within the DAG, with ConstantSDNode holding the
1706 // to-be-splatted scalar ConstantInt.
1707 if (isa<VectorType>(Elt->getType()))
1708 Elt = ConstantInt::get(*getContext(), Elt->getValue());
1709
1710 // In some cases the vector type is legal but the element type is illegal and
1711 // needs to be promoted, for example v8i8 on ARM. In this case, promote the
1712 // inserted value (the type does not need to match the vector element type).
1713 // Any extra bits introduced will be truncated away.
1714 if (VT.isVector() && TLI->getTypeAction(*getContext(), EltVT) ==
1716 EltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1717 APInt NewVal;
1718 if (TLI->isSExtCheaperThanZExt(VT.getScalarType(), EltVT))
1719 NewVal = Elt->getValue().sextOrTrunc(EltVT.getSizeInBits());
1720 else
1721 NewVal = Elt->getValue().zextOrTrunc(EltVT.getSizeInBits());
1722 Elt = ConstantInt::get(*getContext(), NewVal);
1723 }
1724 // In other cases the element type is illegal and needs to be expanded, for
1725 // example v2i64 on MIPS32. In this case, find the nearest legal type, split
1726 // the value into n parts and use a vector type with n-times the elements.
1727 // Then bitcast to the type requested.
1728 // Legalizing constants too early makes the DAGCombiner's job harder so we
1729 // only legalize if the DAG tells us we must produce legal types.
1730 else if (NewNodesMustHaveLegalTypes && VT.isVector() &&
1731 TLI->getTypeAction(*getContext(), EltVT) ==
1733 const APInt &NewVal = Elt->getValue();
1734 EVT ViaEltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1735 unsigned ViaEltSizeInBits = ViaEltVT.getSizeInBits();
1736
1737 // For scalable vectors, try to use a SPLAT_VECTOR_PARTS node.
1738 if (VT.isScalableVector() ||
1739 TLI->isOperationLegal(ISD::SPLAT_VECTOR, VT)) {
1740 assert(EltVT.getSizeInBits() % ViaEltSizeInBits == 0 &&
1741 "Can only handle an even split!");
1742 unsigned Parts = EltVT.getSizeInBits() / ViaEltSizeInBits;
1743
1744 SmallVector<SDValue, 2> ScalarParts;
1745 for (unsigned i = 0; i != Parts; ++i)
1746 ScalarParts.push_back(getConstant(
1747 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1748 ViaEltVT, isT, isO));
1749
1750 return getNode(ISD::SPLAT_VECTOR_PARTS, DL, VT, ScalarParts);
1751 }
1752
1753 unsigned ViaVecNumElts = VT.getSizeInBits() / ViaEltSizeInBits;
1754 EVT ViaVecVT = EVT::getVectorVT(*getContext(), ViaEltVT, ViaVecNumElts);
1755
1756 // Check the temporary vector is the correct size. If this fails then
1757 // getTypeToTransformTo() probably returned a type whose size (in bits)
1758 // isn't a power-of-2 factor of the requested type size.
1759 assert(ViaVecVT.getSizeInBits() == VT.getSizeInBits());
1760
1761 SmallVector<SDValue, 2> EltParts;
1762 for (unsigned i = 0; i < ViaVecNumElts / VT.getVectorNumElements(); ++i)
1763 EltParts.push_back(getConstant(
1764 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1765 ViaEltVT, isT, isO));
1766
1767 // EltParts is currently in little endian order. If we actually want
1768 // big-endian order then reverse it now.
1769 if (getDataLayout().isBigEndian())
1770 std::reverse(EltParts.begin(), EltParts.end());
1771
1772 // The elements must be reversed when the element order is different
1773 // to the endianness of the elements (because the BITCAST is itself a
1774 // vector shuffle in this situation). However, we do not need any code to
1775 // perform this reversal because getConstant() is producing a vector
1776 // splat.
1777 // This situation occurs in MIPS MSA.
1778
1780 for (unsigned i = 0, e = VT.getVectorNumElements(); i != e; ++i)
1781 llvm::append_range(Ops, EltParts);
1782
1783 SDValue V =
1784 getNode(ISD::BITCAST, DL, VT, getBuildVector(ViaVecVT, DL, Ops));
1785 return V;
1786 }
1787
1788 assert(Elt->getBitWidth() == EltVT.getSizeInBits() &&
1789 "APInt size does not match type size!");
1790 unsigned Opc = isT ? ISD::TargetConstant : ISD::Constant;
1791 SDVTList VTs = getVTList(EltVT);
1792 SDNodeKey ID(Opc, VTs, {});
1793 ID.AddPointer(Elt);
1794 ID.AddBoolean(isO);
1795 FoldingSetInsertToken InsertToken;
1796 SDNode *N = nullptr;
1797 if ((N = lookupNode(ID, DL, InsertToken)))
1798 if (!VT.isVector())
1799 return SDValue(N, 0);
1800
1801 if (!N) {
1802 N = newSDNode<ConstantSDNode>(isT, isO, Elt, VTs);
1803 if (!isT)
1804 N->setDebugLoc(DL.getDebugLoc());
1805 CSEMap.insert(N, InsertToken);
1806 InsertNode(N);
1807 NewSDValueDbgMsg(SDValue(N, 0), "Creating constant: ", this);
1808 }
1809
1810 SDValue Result(N, 0);
1811 if (VT.isVector())
1812 Result = getSplat(VT, DL, Result);
1813 return Result;
1814}
1815
1817 bool isT, bool isO) {
1818 unsigned Size = VT.getScalarSizeInBits();
1819 return getConstant(APInt(Size, Val, /*isSigned=*/true), DL, VT, isT, isO);
1820}
1821
1823 bool IsOpaque) {
1825 IsTarget, IsOpaque);
1826}
1827
1829 bool isTarget) {
1830 return getConstant(Val, DL, TLI->getPointerTy(getDataLayout()), isTarget);
1831}
1832
1834 const SDLoc &DL) {
1835 assert(VT.isInteger() && "Shift amount is not an integer type!");
1836 EVT ShiftVT = TLI->getShiftAmountTy(VT, getDataLayout());
1837 return getConstant(Val, DL, ShiftVT);
1838}
1839
1841 const SDLoc &DL) {
1842 assert(Val.ult(VT.getScalarSizeInBits()) && "Out of range shift");
1843 return getShiftAmountConstant(Val.getZExtValue(), VT, DL);
1844}
1845
1847 bool isTarget) {
1848 return getConstant(Val, DL, TLI->getVectorIdxTy(getDataLayout()), isTarget);
1849}
1850
1852 bool isTarget) {
1853 return getConstantFP(*ConstantFP::get(*getContext(), V), DL, VT, isTarget);
1854}
1855
1857 EVT VT, bool isTarget) {
1858 assert(VT.isFloatingPoint() && "Cannot create integer FP constant!");
1859
1860 EVT EltVT = VT.getScalarType();
1861 const ConstantFP *Elt = &V;
1862
1863 // Vector splats are explicit within the DAG, with ConstantFPSDNode holding
1864 // the to-be-splatted scalar ConstantFP.
1865 if (isa<VectorType>(Elt->getType()))
1866 Elt = ConstantFP::get(*getContext(), Elt->getValue());
1867
1868 // Do the map lookup using the actual bit pattern for the floating point
1869 // value, so that we don't have problems with 0.0 comparing equal to -0.0, and
1870 // we don't have issues with SNANs.
1871 unsigned Opc = isTarget ? ISD::TargetConstantFP : ISD::ConstantFP;
1872 SDVTList VTs = getVTList(EltVT);
1873 SDNodeKey ID(Opc, VTs, {});
1874 ID.AddPointer(Elt);
1875 FoldingSetInsertToken InsertToken;
1876 SDNode *N = nullptr;
1877 if ((N = lookupNode(ID, DL, InsertToken)))
1878 if (!VT.isVector())
1879 return SDValue(N, 0);
1880
1881 if (!N) {
1882 N = newSDNode<ConstantFPSDNode>(isTarget, Elt, VTs);
1883 CSEMap.insert(N, InsertToken);
1884 InsertNode(N);
1885 }
1886
1887 SDValue Result(N, 0);
1888 if (VT.isVector())
1889 Result = getSplat(VT, DL, Result);
1890 NewSDValueDbgMsg(Result, "Creating fp constant: ", this);
1891 return Result;
1892}
1893
1895 bool isTarget) {
1896 EVT EltVT = VT.getScalarType();
1897 if (EltVT == MVT::f32)
1898 return getConstantFP(APFloat((float)Val), DL, VT, isTarget);
1899 if (EltVT == MVT::f64)
1900 return getConstantFP(APFloat(Val), DL, VT, isTarget);
1901 if (EltVT == MVT::f80 || EltVT == MVT::f128 || EltVT == MVT::ppcf128 ||
1902 EltVT == MVT::f16 || EltVT == MVT::bf16) {
1903 bool Ignored;
1904 APFloat APF = APFloat(Val);
1906 &Ignored);
1907 return getConstantFP(APF, DL, VT, isTarget);
1908 }
1909 llvm_unreachable("Unsupported type in getConstantFP");
1910}
1911
1913 EVT VT, int64_t Offset, bool isTargetGA,
1914 unsigned TargetFlags) {
1915 assert((TargetFlags == 0 || isTargetGA) &&
1916 "Cannot set target flags on target-independent globals");
1917
1918 // Truncate (with sign-extension) the offset value to the pointer size.
1920 if (BitWidth < 64)
1922
1923 unsigned Opc;
1924 if (GV->isThreadLocal())
1926 else
1928
1929 SDVTList VTs = getVTList(VT);
1930 SDNodeKey ID(Opc, VTs, {});
1931 ID.AddPointer(GV);
1932 ID.AddInteger(Offset);
1933 ID.AddInteger(TargetFlags);
1934 FoldingSetInsertToken InsertToken;
1935 if (SDNode *E = lookupNode(ID, DL, InsertToken))
1936 return SDValue(E, 0);
1937
1938 auto *N = newSDNode<GlobalAddressSDNode>(
1939 Opc, DL.getIROrder(), DL.getDebugLoc(), GV, VTs, Offset, TargetFlags);
1940 CSEMap.insert(N, InsertToken);
1941 InsertNode(N);
1942 return SDValue(N, 0);
1943}
1944
1946 SDVTList VTs = getVTList(MVT::Untyped);
1948 ID.AddPointer(GV);
1949 FoldingSetInsertToken InsertToken;
1950 if (SDNode *E = lookupNode(ID, SDLoc(), InsertToken))
1951 return SDValue(E, 0);
1952
1953 auto *N = newSDNode<DeactivationSymbolSDNode>(GV, VTs);
1954 CSEMap.insert(N, InsertToken);
1955 InsertNode(N);
1956 return SDValue(N, 0);
1957}
1958
1959SDValue SelectionDAG::getFrameIndex(int FI, EVT VT, bool isTarget) {
1960 unsigned Opc = isTarget ? ISD::TargetFrameIndex : ISD::FrameIndex;
1961 SDVTList VTs = getVTList(VT);
1962 SDNodeKey ID(Opc, VTs, {});
1963 ID.AddInteger(FI);
1964 FoldingSetInsertToken InsertToken;
1965 if (SDNode *E = lookupNode(ID, InsertToken))
1966 return SDValue(E, 0);
1967
1968 auto *N = newSDNode<FrameIndexSDNode>(FI, VTs, isTarget);
1969 CSEMap.insert(N, InsertToken);
1970 InsertNode(N);
1971 return SDValue(N, 0);
1972}
1973
1974SDValue SelectionDAG::getJumpTable(int JTI, EVT VT, bool isTarget,
1975 unsigned TargetFlags) {
1976 assert((TargetFlags == 0 || isTarget) &&
1977 "Cannot set target flags on target-independent jump tables");
1978 unsigned Opc = isTarget ? ISD::TargetJumpTable : ISD::JumpTable;
1979 SDVTList VTs = getVTList(VT);
1980 SDNodeKey ID(Opc, VTs, {});
1981 ID.AddInteger(JTI);
1982 ID.AddInteger(TargetFlags);
1983 FoldingSetInsertToken InsertToken;
1984 if (SDNode *E = lookupNode(ID, InsertToken))
1985 return SDValue(E, 0);
1986
1987 auto *N = newSDNode<JumpTableSDNode>(JTI, VTs, isTarget, TargetFlags);
1988 CSEMap.insert(N, InsertToken);
1989 InsertNode(N);
1990 return SDValue(N, 0);
1991}
1992
1994 const SDLoc &DL) {
1996 return getNode(ISD::JUMP_TABLE_DEBUG_INFO, DL, MVT::Other, Chain,
1997 getTargetConstant(static_cast<uint64_t>(JTI), DL, PTy, true));
1998}
1999
2001 MaybeAlign Alignment, int Offset,
2002 bool isTarget, unsigned TargetFlags) {
2003 assert((TargetFlags == 0 || isTarget) &&
2004 "Cannot set target flags on target-independent globals");
2005 if (!Alignment)
2006 Alignment = shouldOptForSize()
2007 ? getDataLayout().getABITypeAlign(C->getType())
2008 : getDataLayout().getPrefTypeAlign(C->getType());
2009 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
2010 SDVTList VTs = getVTList(VT);
2011 SDNodeKey ID(Opc, VTs, {});
2012 ID.AddInteger(Alignment->value());
2013 ID.AddInteger(Offset);
2014 ID.AddPointer(C);
2015 ID.AddInteger(TargetFlags);
2016 FoldingSetInsertToken InsertToken;
2017 if (SDNode *E = lookupNode(ID, InsertToken))
2018 return SDValue(E, 0);
2019
2020 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
2021 TargetFlags);
2022 CSEMap.insert(N, InsertToken);
2023 InsertNode(N);
2024 SDValue V = SDValue(N, 0);
2025 NewSDValueDbgMsg(V, "Creating new constant pool: ", this);
2026 return V;
2027}
2028
2030 MaybeAlign Alignment, int Offset,
2031 bool isTarget, unsigned TargetFlags) {
2032 assert((TargetFlags == 0 || isTarget) &&
2033 "Cannot set target flags on target-independent globals");
2034 if (!Alignment)
2035 Alignment = getDataLayout().getPrefTypeAlign(C->getType());
2036 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
2037 SDVTList VTs = getVTList(VT);
2038 SDNodeKey ID(Opc, VTs, {});
2039 ID.AddInteger(Alignment->value());
2040 ID.AddInteger(Offset);
2041 C->addSelectionDAGCSEId(ID.Tail);
2042 ID.AddInteger(TargetFlags);
2043 FoldingSetInsertToken InsertToken;
2044 if (SDNode *E = lookupNode(ID, InsertToken))
2045 return SDValue(E, 0);
2046
2047 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
2048 TargetFlags);
2049 CSEMap.insert(N, InsertToken);
2050 InsertNode(N);
2051 return SDValue(N, 0);
2052}
2053
2055 SDNodeKey ID(ISD::BasicBlock, getVTList(MVT::Other), {});
2056 ID.AddPointer(MBB);
2057 FoldingSetInsertToken InsertToken;
2058 if (SDNode *E = lookupNode(ID, InsertToken))
2059 return SDValue(E, 0);
2060
2061 auto *N = newSDNode<BasicBlockSDNode>(MBB);
2062 CSEMap.insert(N, InsertToken);
2063 InsertNode(N);
2064 return SDValue(N, 0);
2065}
2066
2068 if (VT.isSimple() && (unsigned)VT.getSimpleVT().SimpleTy >=
2069 ValueTypeNodes.size())
2070 ValueTypeNodes.resize(VT.getSimpleVT().SimpleTy+1);
2071
2072 SDNode *&N = VT.isExtended() ?
2073 ExtendedValueTypeNodes[VT] : ValueTypeNodes[VT.getSimpleVT().SimpleTy];
2074
2075 if (N) return SDValue(N, 0);
2076 N = newSDNode<VTSDNode>(VT);
2077 InsertNode(N);
2078 return SDValue(N, 0);
2079}
2080
2082 SDNode *&N = ExternalSymbols[Sym];
2083 if (N) return SDValue(N, 0);
2084 N = newSDNode<ExternalSymbolSDNode>(false, Sym, 0, getVTList(VT));
2085 InsertNode(N);
2086 return SDValue(N, 0);
2087}
2088
2089SDValue SelectionDAG::getExternalSymbol(RTLIB::LibcallImpl Libcall, EVT VT) {
2091 return getExternalSymbol(SymName.data(), VT);
2092}
2093
2095 SDNode *&N = MCSymbols[Sym];
2096 if (N)
2097 return SDValue(N, 0);
2098 N = newSDNode<MCSymbolSDNode>(Sym, getVTList(VT));
2099 InsertNode(N);
2100 return SDValue(N, 0);
2101}
2102
2104 unsigned TargetFlags) {
2105 SDNode *&N =
2106 TargetExternalSymbols[std::pair<std::string, unsigned>(Sym, TargetFlags)];
2107 if (N) return SDValue(N, 0);
2108 N = newSDNode<ExternalSymbolSDNode>(true, Sym, TargetFlags, getVTList(VT));
2109 InsertNode(N);
2110 return SDValue(N, 0);
2111}
2112
2114 EVT VT, unsigned TargetFlags) {
2116 return getTargetExternalSymbol(SymName.data(), VT, TargetFlags);
2117}
2118
2120 if ((unsigned)Cond >= CondCodeNodes.size())
2121 CondCodeNodes.resize(Cond+1);
2122
2123 if (!CondCodeNodes[Cond]) {
2124 auto *N = newSDNode<CondCodeSDNode>(Cond);
2125 CondCodeNodes[Cond] = N;
2126 InsertNode(N);
2127 }
2128
2129 return SDValue(CondCodeNodes[Cond], 0);
2130}
2131
2133 assert(MulImm.getBitWidth() == VT.getSizeInBits() &&
2134 "APInt size does not match type size!");
2135
2136 if (MulImm == 0)
2137 return getConstant(0, DL, VT);
2138
2139 const MachineFunction &MF = getMachineFunction();
2140 const Function &F = MF.getFunction();
2141 ConstantRange CR = getVScaleRange(&F, 64);
2142 if (const APInt *C = CR.getSingleElement())
2143 return getConstant(MulImm * C->getZExtValue(), DL, VT);
2144
2145 return getNode(ISD::VSCALE, DL, VT, getConstant(MulImm, DL, VT));
2146}
2147
2148/// \returns a value of type \p VT that represents the runtime value of \p
2149/// Quantity, i.e. scaled by vscale if it's scalable, or a fixed constant
2150/// otherwise. Quantity should be a FixedOrScalableQuantity, i.e. ElementCount
2151/// or TypeSize.
2152template <typename Ty>
2154 EVT VT, Ty Quantity) {
2155 if (Quantity.isScalable())
2156 return DAG.getVScale(
2157 DL, VT, APInt(VT.getSizeInBits(), Quantity.getKnownMinValue()));
2158
2159 return DAG.getConstant(Quantity.getKnownMinValue(), DL, VT);
2160}
2161
2163 ElementCount EC) {
2164 return getFixedOrScalableQuantity(*this, DL, VT, EC);
2165}
2166
2168 return getFixedOrScalableQuantity(*this, DL, VT, TS);
2169}
2170
2172 ElementCount EC) {
2173 EVT IdxVT = TLI->getVectorIdxTy(getDataLayout());
2174 EVT MaskVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), DataVT);
2175 return getNode(ISD::GET_ACTIVE_LANE_MASK, DL, MaskVT,
2176 getConstant(0, DL, IdxVT), getElementCount(DL, IdxVT, EC));
2177}
2178
2180 APInt One(ResVT.getScalarSizeInBits(), 1);
2181 return getStepVector(DL, ResVT, One);
2182}
2183
2185 const APInt &StepVal) {
2186 assert(ResVT.getScalarSizeInBits() == StepVal.getBitWidth());
2187 if (ResVT.isScalableVector())
2188 return getNode(
2189 ISD::STEP_VECTOR, DL, ResVT,
2190 getTargetConstant(StepVal, DL, ResVT.getVectorElementType()));
2191
2192 SmallVector<SDValue, 16> OpsStepConstants;
2193 for (uint64_t i = 0; i < ResVT.getVectorNumElements(); i++)
2194 OpsStepConstants.push_back(
2195 getConstant(StepVal * i, DL, ResVT.getVectorElementType()));
2196 return getBuildVector(ResVT, DL, OpsStepConstants);
2197}
2198
2199/// Swaps the values of N1 and N2. Swaps all indices in the shuffle mask M that
2200/// point at N1 to point at N2 and indices that point at N2 to point at N1.
2205
2207 SDValue N2, ArrayRef<int> Mask) {
2208 assert(VT.getVectorNumElements() == Mask.size() &&
2209 "Must have the same number of vector elements as mask elements!");
2210 assert(VT == N1.getValueType() && VT == N2.getValueType() &&
2211 "Invalid VECTOR_SHUFFLE");
2212
2213 // Canonicalize shuffle undef, undef -> undef
2214 if (N1.isUndef() && N2.isUndef()) {
2215 if (N1.getOpcode() == ISD::POISON && N2.getOpcode() == ISD::POISON)
2216 return getPOISON(VT);
2217 return getUNDEF(VT);
2218 }
2219
2220 // Validate that all indices in Mask are within the range of the elements
2221 // input to the shuffle.
2222 int NElts = Mask.size();
2223 assert(llvm::all_of(Mask,
2224 [&](int M) { return M < (NElts * 2) && M >= -1; }) &&
2225 "Index out of range");
2226
2227 // Copy the mask so we can do any needed cleanup.
2228 SmallVector<int, 8> MaskVec(Mask);
2229
2230 // Canonicalize shuffle v, v -> v, poison
2231 if (N1 == N2) {
2232 N2 = getPOISON(VT);
2233 for (int i = 0; i != NElts; ++i)
2234 if (MaskVec[i] >= NElts) MaskVec[i] -= NElts;
2235 }
2236
2237 // Canonicalize shuffle undef, v -> v, undef. Commute the shuffle mask.
2238 if (N1.isUndef())
2239 commuteShuffle(N1, N2, MaskVec);
2240
2241 if (TLI->hasVectorBlend()) {
2242 // If shuffling a splat, try to blend the splat instead. We do this here so
2243 // that even when this arises during lowering we don't have to re-handle it.
2244 auto BlendSplat = [&](BuildVectorSDNode *BV, int Offset) {
2245 BitVector UndefElements;
2246 SDValue Splat = BV->getSplatValue(&UndefElements);
2247 if (!Splat)
2248 return;
2249
2250 for (int i = 0; i < NElts; ++i) {
2251 if (MaskVec[i] < Offset || MaskVec[i] >= (Offset + NElts))
2252 continue;
2253
2254 // If this input comes from undef, mark it as such.
2255 if (UndefElements[MaskVec[i] - Offset]) {
2256 MaskVec[i] = -1;
2257 continue;
2258 }
2259
2260 // If we can blend a non-undef lane, use that instead.
2261 if (!UndefElements[i])
2262 MaskVec[i] = i + Offset;
2263 }
2264 };
2265 if (auto *N1BV = dyn_cast<BuildVectorSDNode>(N1))
2266 BlendSplat(N1BV, 0);
2267 if (auto *N2BV = dyn_cast<BuildVectorSDNode>(N2))
2268 BlendSplat(N2BV, NElts);
2269 }
2270
2271 // Canonicalize all index into lhs, -> shuffle lhs, poison
2272 // Canonicalize all index into rhs, -> shuffle rhs, poison
2273 bool AllLHS = true, AllRHS = true;
2274 bool N2Undef = N2.isUndef();
2275 for (int i = 0; i != NElts; ++i) {
2276 if (MaskVec[i] >= NElts) {
2277 if (N2Undef)
2278 MaskVec[i] = -1;
2279 else
2280 AllLHS = false;
2281 } else if (MaskVec[i] >= 0) {
2282 AllRHS = false;
2283 }
2284 }
2285 if (AllLHS && AllRHS)
2286 return getPOISON(VT);
2287 if (AllLHS && !N2Undef)
2288 N2 = getPOISON(VT);
2289 if (AllRHS) {
2290 N1 = getPOISON(VT);
2291 commuteShuffle(N1, N2, MaskVec);
2292 }
2293 // Reset our undef status after accounting for the mask.
2294 N2Undef = N2.isUndef();
2295 // Re-check whether both sides ended up undef.
2296 if (N1.isUndef() && N2Undef) {
2297 if (N1.getOpcode() == ISD::POISON && N2.getOpcode() == ISD::POISON)
2298 return getPOISON(VT);
2299 return getUNDEF(VT);
2300 }
2301
2302 // If Identity shuffle return that node.
2303 bool Identity = true, AllSame = true;
2304 for (int i = 0; i != NElts; ++i) {
2305 if (MaskVec[i] >= 0 && MaskVec[i] != i) Identity = false;
2306 if (MaskVec[i] != MaskVec[0]) AllSame = false;
2307 }
2308 if (Identity && NElts)
2309 return N1;
2310
2311 // Shuffling a constant splat doesn't change the result.
2312 if (N2Undef) {
2313 SDValue V = N1;
2314
2315 // Look through any bitcasts. We check that these don't change the number
2316 // (and size) of elements and just changes their types.
2317 while (V.getOpcode() == ISD::BITCAST)
2318 V = V->getOperand(0);
2319
2320 // A splat should always show up as a build vector node.
2321 if (auto *BV = dyn_cast<BuildVectorSDNode>(V)) {
2322 BitVector UndefElements;
2323 SDValue Splat = BV->getSplatValue(&UndefElements);
2324 // If this is a splat of an undef, shuffling it is also undef.
2325 if (Splat && Splat.isUndef())
2326 return Splat.getOpcode() == ISD::POISON ? getPOISON(VT) : getUNDEF(VT);
2327
2328 bool SameNumElts =
2329 V.getValueType().getVectorNumElements() == VT.getVectorNumElements();
2330
2331 // We only have a splat which can skip shuffles if there is a splatted
2332 // value and no undef lanes rearranged by the shuffle.
2333 if (Splat && UndefElements.none()) {
2334 // Splat of <x, x, ..., x>, return <x, x, ..., x>, provided that the
2335 // number of elements match or the value splatted is a zero constant.
2336 if (SameNumElts || isNullConstant(Splat))
2337 return N1;
2338 }
2339
2340 // If the shuffle itself creates a splat, build the vector directly.
2341 if (AllSame && SameNumElts) {
2342 EVT BuildVT = BV->getValueType(0);
2343 const SDValue &Splatted = BV->getOperand(MaskVec[0]);
2344 SDValue NewBV = getSplatBuildVector(BuildVT, dl, Splatted);
2345
2346 // We may have jumped through bitcasts, so the type of the
2347 // BUILD_VECTOR may not match the type of the shuffle.
2348 if (BuildVT != VT)
2349 NewBV = getNode(ISD::BITCAST, dl, VT, NewBV);
2350 return NewBV;
2351 }
2352 }
2353 }
2354
2355 SDVTList VTs = getVTList(VT);
2356 SDValue Ops[2] = { N1, N2 };
2358 for (int i = 0; i != NElts; ++i)
2359 ID.AddInteger(MaskVec[i]);
2360
2361 FoldingSetInsertToken InsertToken;
2362 if (SDNode *E = lookupNode(ID, dl, InsertToken))
2363 return SDValue(E, 0);
2364
2365 // Allocate the mask array for the node out of the BumpPtrAllocator, since
2366 // SDNode doesn't have access to it. This memory will be "leaked" when
2367 // the node is deallocated, but recovered when the NodeAllocator is released.
2368 int *MaskAlloc = OperandAllocator.Allocate<int>(NElts);
2369 llvm::copy(MaskVec, MaskAlloc);
2370
2371 auto *N = newSDNode<ShuffleVectorSDNode>(VTs, dl.getIROrder(),
2372 dl.getDebugLoc(), MaskAlloc);
2373 createOperands(N, Ops);
2374
2375 CSEMap.insert(N, InsertToken);
2376 InsertNode(N);
2377 SDValue V = SDValue(N, 0);
2378 NewSDValueDbgMsg(V, "Creating new node: ", this);
2379 return V;
2380}
2381
2383 EVT VT = SV.getValueType(0);
2384 SmallVector<int, 8> MaskVec(SV.getMask());
2386
2387 SDValue Op0 = SV.getOperand(0);
2388 SDValue Op1 = SV.getOperand(1);
2389 return getVectorShuffle(VT, SDLoc(&SV), Op1, Op0, MaskVec);
2390}
2391
2393 SDVTList VTs = getVTList(VT);
2394 SDNodeKey ID(ISD::Register, VTs, {});
2395 ID.AddInteger(Reg.id());
2396 FoldingSetInsertToken InsertToken;
2397 if (SDNode *E = lookupNode(ID, InsertToken))
2398 return SDValue(E, 0);
2399
2400 auto *N = newSDNode<RegisterSDNode>(Reg, VTs);
2401 N->SDNodeBits.IsDivergent = TLI->isSDNodeSourceOfDivergence(N, FLI, UA);
2402 CSEMap.insert(N, InsertToken);
2403 InsertNode(N);
2404 return SDValue(N, 0);
2405}
2406
2408 SDNodeKey ID(ISD::RegisterMask, getVTList(MVT::Untyped), {});
2409 ID.AddPointer(RegMask);
2410 FoldingSetInsertToken InsertToken;
2411 if (SDNode *E = lookupNode(ID, InsertToken))
2412 return SDValue(E, 0);
2413
2414 auto *N = newSDNode<RegisterMaskSDNode>(RegMask);
2415 CSEMap.insert(N, InsertToken);
2416 InsertNode(N);
2417 return SDValue(N, 0);
2418}
2419
2421 MCSymbol *Label) {
2422 return getLabelNode(ISD::EH_LABEL, dl, Root, Label);
2423}
2424
2425SDValue SelectionDAG::getLabelNode(unsigned Opcode, const SDLoc &dl,
2426 SDValue Root, MCSymbol *Label) {
2427 SDValue Ops[] = { Root };
2428 SDNodeKey ID(Opcode, getVTList(MVT::Other), Ops);
2429 ID.AddPointer(Label);
2430 FoldingSetInsertToken InsertToken;
2431 if (SDNode *E = lookupNode(ID, InsertToken))
2432 return SDValue(E, 0);
2433
2434 auto *N =
2435 newSDNode<LabelSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), Label);
2436 createOperands(N, Ops);
2437
2438 CSEMap.insert(N, InsertToken);
2439 InsertNode(N);
2440 return SDValue(N, 0);
2441}
2442
2444 int64_t Offset, bool isTarget,
2445 unsigned TargetFlags) {
2446 unsigned Opc = isTarget ? ISD::TargetBlockAddress : ISD::BlockAddress;
2447 SDVTList VTs = getVTList(VT);
2448
2449 SDNodeKey ID(Opc, VTs, {});
2450 ID.AddPointer(BA);
2451 ID.AddInteger(Offset);
2452 ID.AddInteger(TargetFlags);
2453 FoldingSetInsertToken InsertToken;
2454 if (SDNode *E = lookupNode(ID, InsertToken))
2455 return SDValue(E, 0);
2456
2457 auto *N = newSDNode<BlockAddressSDNode>(Opc, VTs, BA, Offset, TargetFlags);
2458 CSEMap.insert(N, InsertToken);
2459 InsertNode(N);
2460 return SDValue(N, 0);
2461}
2462
2464 SDNodeKey ID(ISD::SRCVALUE, getVTList(MVT::Other), {});
2465 ID.AddPointer(V);
2466
2467 FoldingSetInsertToken InsertToken;
2468 if (SDNode *E = lookupNode(ID, InsertToken))
2469 return SDValue(E, 0);
2470
2471 auto *N = newSDNode<SrcValueSDNode>(V);
2472 CSEMap.insert(N, InsertToken);
2473 InsertNode(N);
2474 return SDValue(N, 0);
2475}
2476
2478 SDNodeKey ID(ISD::MDNODE_SDNODE, getVTList(MVT::Other), {});
2479 ID.AddPointer(MD);
2480
2481 FoldingSetInsertToken InsertToken;
2482 if (SDNode *E = lookupNode(ID, InsertToken))
2483 return SDValue(E, 0);
2484
2485 auto *N = newSDNode<MDNodeSDNode>(MD);
2486 CSEMap.insert(N, InsertToken);
2487 InsertNode(N);
2488 return SDValue(N, 0);
2489}
2490
2492 if (VT == V.getValueType())
2493 return V;
2494
2495 return getNode(ISD::BITCAST, SDLoc(V), VT, V);
2496}
2497
2499 unsigned SrcAS, unsigned DestAS,
2500 const SDNodeFlags Flags) {
2501 SDVTList VTs = getVTList(VT);
2502 SDValue Ops[] = {Ptr};
2504 ID.AddInteger(SrcAS);
2505 ID.AddInteger(DestAS);
2506
2507 FoldingSetInsertToken InsertToken;
2508 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
2509 E->intersectFlagsWith(Flags);
2510 return SDValue(E, 0);
2511 }
2512
2513 auto *N = newSDNode<AddrSpaceCastSDNode>(dl.getIROrder(), dl.getDebugLoc(),
2514 VTs, SrcAS, DestAS);
2515 N->setFlags(Flags);
2516 createOperands(N, Ops);
2517
2518 CSEMap.insert(N, InsertToken);
2519 InsertNode(N);
2520 return SDValue(N, 0);
2521}
2522
2524 return getNode(ISD::FREEZE, SDLoc(V), V.getValueType(), V);
2525}
2526
2528 UndefPoisonKind Kind) {
2529 if (isGuaranteedNotToBeUndefOrPoison(V, DemandedElts, Kind))
2530 return V;
2531 return getFreeze(V);
2532}
2533
2534/// getShiftAmountOperand - Return the specified value casted to
2535/// the target's desired shift amount type.
2537 EVT OpTy = Op.getValueType();
2538 EVT ShTy = TLI->getShiftAmountTy(LHSTy, getDataLayout());
2539 if (OpTy == ShTy || OpTy.isVector()) return Op;
2540
2541 return getZExtOrTrunc(Op, SDLoc(Op), ShTy);
2542}
2543
2545 SDLoc dl(Node);
2547 const Value *V = cast<SrcValueSDNode>(Node->getOperand(2))->getValue();
2548 EVT VT = Node->getValueType(0);
2549 SDValue Tmp1 = Node->getOperand(0);
2550 SDValue Tmp2 = Node->getOperand(1);
2551 const MaybeAlign MA(Node->getConstantOperandVal(3));
2552
2553 SDValue VAListLoad = getLoad(TLI.getPointerTy(getDataLayout()), dl, Tmp1,
2554 Tmp2, MachinePointerInfo(V));
2555 SDValue VAList = VAListLoad;
2556
2557 if (MA && *MA > TLI.getMinStackArgumentAlignment()) {
2558 VAList = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2559 getConstant(MA->value() - 1, dl, VAList.getValueType()));
2560
2561 VAList = getNode(
2562 ISD::AND, dl, VAList.getValueType(), VAList,
2563 getSignedConstant(-(int64_t)MA->value(), dl, VAList.getValueType()));
2564 }
2565
2566 // Increment the pointer, VAList, to the next vaarg
2567 Tmp1 = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2568 getConstant(getDataLayout().getTypeAllocSize(
2569 VT.getTypeForEVT(*getContext())),
2570 dl, VAList.getValueType()));
2571 // Store the incremented VAList to the legalized pointer
2572 Tmp1 =
2573 getStore(VAListLoad.getValue(1), dl, Tmp1, Tmp2, MachinePointerInfo(V));
2574 // Load the actual argument out of the pointer VAList
2575 return getLoad(VT, dl, Tmp1, VAList, MachinePointerInfo());
2576}
2577
2579 SDLoc dl(Node);
2581 // This defaults to loading a pointer from the input and storing it to the
2582 // output, returning the chain.
2583 const Value *VD = cast<SrcValueSDNode>(Node->getOperand(3))->getValue();
2584 const Value *VS = cast<SrcValueSDNode>(Node->getOperand(4))->getValue();
2585 SDValue Tmp1 =
2586 getLoad(TLI.getPointerTy(getDataLayout()), dl, Node->getOperand(0),
2587 Node->getOperand(2), MachinePointerInfo(VS));
2588 return getStore(Tmp1.getValue(1), dl, Tmp1, Node->getOperand(1),
2589 MachinePointerInfo(VD));
2590}
2591
2593 const DataLayout &DL = getDataLayout();
2594 Type *Ty = VT.getTypeForEVT(*getContext());
2595 Align RedAlign = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2596
2597 if (TLI->isTypeLegal(VT) || !VT.isVector())
2598 return RedAlign;
2599
2600 const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
2601 const Align StackAlign = TFI->getStackAlign();
2602
2603 // See if we can choose a smaller ABI alignment in cases where it's an
2604 // illegal vector type that will get broken down.
2605 if (RedAlign > StackAlign) {
2606 EVT IntermediateVT;
2607 MVT RegisterVT;
2608 unsigned NumIntermediates;
2609 TLI->getVectorTypeBreakdown(*getContext(), VT, IntermediateVT,
2610 NumIntermediates, RegisterVT);
2611 Ty = IntermediateVT.getTypeForEVT(*getContext());
2612 Align RedAlign2 = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2613 if (RedAlign2 < RedAlign)
2614 RedAlign = RedAlign2;
2615
2616 if (!getMachineFunction().getFrameInfo().isStackRealignable())
2617 // If the stack is not realignable, the alignment should be limited to the
2618 // StackAlignment
2619 RedAlign = std::min(RedAlign, StackAlign);
2620 }
2621
2622 return RedAlign;
2623}
2624
2626 MachineFrameInfo &MFI = MF->getFrameInfo();
2627 const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
2628 int StackID = 0;
2629 if (Bytes.isScalable())
2630 StackID = TFI->getStackIDForScalableVectors();
2631 // The stack id gives an indication of whether the object is scalable or
2632 // not, so it's safe to pass in the minimum size here.
2633 int FrameIdx = MFI.CreateStackObject(Bytes.getKnownMinValue(), Alignment,
2634 false, nullptr, StackID);
2635 return getFrameIndex(FrameIdx, TLI->getFrameIndexTy(getDataLayout()));
2636}
2637
2639 Type *Ty = VT.getTypeForEVT(*getContext());
2640 Align StackAlign =
2641 std::max(getDataLayout().getPrefTypeAlign(Ty), Align(minAlign));
2642 return CreateStackTemporary(VT.getStoreSize(), StackAlign);
2643}
2644
2646 TypeSize VT1Size = VT1.getStoreSize();
2647 TypeSize VT2Size = VT2.getStoreSize();
2648 assert(VT1Size.isScalable() == VT2Size.isScalable() &&
2649 "Don't know how to choose the maximum size when creating a stack "
2650 "temporary");
2651 TypeSize Bytes = VT1Size.getKnownMinValue() > VT2Size.getKnownMinValue()
2652 ? VT1Size
2653 : VT2Size;
2654
2655 Type *Ty1 = VT1.getTypeForEVT(*getContext());
2656 Type *Ty2 = VT2.getTypeForEVT(*getContext());
2657 const DataLayout &DL = getDataLayout();
2658 Align Align = std::max(DL.getPrefTypeAlign(Ty1), DL.getPrefTypeAlign(Ty2));
2659 return CreateStackTemporary(Bytes, Align);
2660}
2661
2663 const SDLoc &DL, SDValue Chain) {
2664 EVT SrcVT = SrcOp.getValueType();
2665 Type *DestType = DestVT.getTypeForEVT(*getContext());
2666 Align DestAlign = getDataLayout().getPrefTypeAlign(DestType);
2667
2668 // Create the stack frame object.
2669 Align SrcAlign =
2671 SDValue FIPtr = CreateStackTemporary(SlotVT.getStoreSize(), SrcAlign);
2672
2673 FrameIndexSDNode *StackPtrFI = cast<FrameIndexSDNode>(FIPtr);
2674 int SPFI = StackPtrFI->getIndex();
2675 MachinePointerInfo PtrInfo =
2677
2678 // Emit a store to the stack slot. Use a truncstore if the input value is
2679 // later than DestVT.
2680 SDValue Store;
2681
2682 if (SrcVT.bitsGT(SlotVT))
2683 Store = getTruncStore(Chain, DL, SrcOp, FIPtr, PtrInfo, SlotVT, SrcAlign);
2684 else {
2685 assert(SrcVT.bitsEq(SlotVT) && "Invalid store");
2686 Store = getStore(Chain, DL, SrcOp, FIPtr, PtrInfo, SrcAlign);
2687 }
2688
2689 // Result is a load from the stack slot.
2690 if (SlotVT.bitsEq(DestVT))
2691 return getLoad(DestVT, DL, Store, FIPtr, PtrInfo, DestAlign);
2692
2693 assert(SlotVT.bitsLT(DestVT) && "Unknown extension!");
2694 return getExtLoad(ISD::EXTLOAD, DL, DestVT, Store, FIPtr, PtrInfo, SlotVT,
2695 DestAlign);
2696}
2697
2699 ISD::CondCode Cond, const SDLoc &dl,
2700 SDNodeFlags Flags) {
2701 EVT OpVT = N1.getValueType();
2702
2703 auto GetUndefBooleanConstant = [&]() {
2704 if (VT.getScalarType() == MVT::i1 ||
2705 TLI->getBooleanContents(OpVT) ==
2707 return getUNDEF(VT);
2708 // ZeroOrOne / ZeroOrNegative require specific values for the high bits,
2709 // so we cannot use getUNDEF(). Return zero instead.
2710 return getConstant(0, dl, VT);
2711 };
2712
2713 // These setcc operations always fold.
2714 switch (Cond) {
2715 default: break;
2716 case ISD::SETFALSE:
2717 case ISD::SETFALSE2: return getBoolConstant(false, dl, VT, OpVT);
2718 case ISD::SETTRUE:
2719 case ISD::SETTRUE2: return getBoolConstant(true, dl, VT, OpVT);
2720
2721 case ISD::SETOEQ:
2722 case ISD::SETOGT:
2723 case ISD::SETOGE:
2724 case ISD::SETOLT:
2725 case ISD::SETOLE:
2726 case ISD::SETONE:
2727 case ISD::SETO:
2728 case ISD::SETUO:
2729 case ISD::SETUEQ:
2730 case ISD::SETUNE:
2731 assert(!OpVT.isInteger() && "Illegal setcc for integer!");
2732 break;
2733 }
2734
2735 if (OpVT.isInteger()) {
2736 // For EQ and NE, we can always pick a value for the undef to make the
2737 // predicate pass or fail, so we can return undef.
2738 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2739 // icmp eq/ne X, undef -> undef.
2740 if ((N1.isUndef() || N2.isUndef()) &&
2741 (Cond == ISD::SETEQ || Cond == ISD::SETNE))
2742 return GetUndefBooleanConstant();
2743
2744 // If both operands are undef, we can return undef for int comparison.
2745 // icmp undef, undef -> undef.
2746 if (N1.isUndef() && N2.isUndef())
2747 return GetUndefBooleanConstant();
2748
2749 // icmp X, X -> true/false
2750 // icmp X, undef -> true/false because undef could be X.
2751 if (N1.isUndef() || N2.isUndef() || N1 == N2)
2752 return getBoolConstant(ISD::isTrueWhenEqual(Cond), dl, VT, OpVT);
2753 }
2754
2756 const APInt &C2 = N2C->getAPIntValue();
2758 const APInt &C1 = N1C->getAPIntValue();
2759
2761 dl, VT, OpVT);
2762 }
2763 }
2764
2765 auto *N1CFP = dyn_cast<ConstantFPSDNode>(N1);
2766 auto *N2CFP = dyn_cast<ConstantFPSDNode>(N2);
2767
2768 if (N1CFP && N2CFP) {
2769 APFloat::cmpResult R = N1CFP->getValueAPF().compare(N2CFP->getValueAPF());
2770 switch (Cond) {
2771 default: break;
2772 case ISD::SETEQ: if (R==APFloat::cmpUnordered)
2773 return GetUndefBooleanConstant();
2774 [[fallthrough]];
2775 case ISD::SETOEQ: return getBoolConstant(R==APFloat::cmpEqual, dl, VT,
2776 OpVT);
2777 case ISD::SETNE: if (R==APFloat::cmpUnordered)
2778 return GetUndefBooleanConstant();
2779 [[fallthrough]];
2781 R==APFloat::cmpLessThan, dl, VT,
2782 OpVT);
2783 case ISD::SETLT: if (R==APFloat::cmpUnordered)
2784 return GetUndefBooleanConstant();
2785 [[fallthrough]];
2786 case ISD::SETOLT: return getBoolConstant(R==APFloat::cmpLessThan, dl, VT,
2787 OpVT);
2788 case ISD::SETGT: if (R==APFloat::cmpUnordered)
2789 return GetUndefBooleanConstant();
2790 [[fallthrough]];
2792 VT, OpVT);
2793 case ISD::SETLE: if (R==APFloat::cmpUnordered)
2794 return GetUndefBooleanConstant();
2795 [[fallthrough]];
2797 R==APFloat::cmpEqual, dl, VT,
2798 OpVT);
2799 case ISD::SETGE: if (R==APFloat::cmpUnordered)
2800 return GetUndefBooleanConstant();
2801 [[fallthrough]];
2803 R==APFloat::cmpEqual, dl, VT, OpVT);
2804 case ISD::SETO: return getBoolConstant(R!=APFloat::cmpUnordered, dl, VT,
2805 OpVT);
2806 case ISD::SETUO: return getBoolConstant(R==APFloat::cmpUnordered, dl, VT,
2807 OpVT);
2809 R==APFloat::cmpEqual, dl, VT,
2810 OpVT);
2811 case ISD::SETUNE: return getBoolConstant(R!=APFloat::cmpEqual, dl, VT,
2812 OpVT);
2814 R==APFloat::cmpLessThan, dl, VT,
2815 OpVT);
2817 R==APFloat::cmpUnordered, dl, VT,
2818 OpVT);
2820 VT, OpVT);
2821 case ISD::SETUGE: return getBoolConstant(R!=APFloat::cmpLessThan, dl, VT,
2822 OpVT);
2823 }
2824 } else if (N1CFP && OpVT.isSimple() && !N2.isUndef()) {
2825 // Ensure that the constant occurs on the RHS.
2827 if (!TLI->isCondCodeLegal(SwappedCond, OpVT.getSimpleVT()))
2828 return SDValue();
2829 return getSetCC(dl, VT, N2, N1, SwappedCond, /*Chain=*/{},
2830 /*IsSignaling=*/false, Flags);
2831 } else if ((N2CFP && N2CFP->getValueAPF().isNaN()) ||
2832 (OpVT.isFloatingPoint() && (N1.isUndef() || N2.isUndef()))) {
2833 // If an operand is known to be a nan (or undef that could be a nan), we can
2834 // fold it.
2835 // Choosing NaN for the undef will always make unordered comparison succeed
2836 // and ordered comparison fails.
2837 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2838 switch (ISD::getUnorderedFlavor(Cond)) {
2839 default:
2840 llvm_unreachable("Unknown flavor!");
2841 case 0: // Known false.
2842 return getBoolConstant(false, dl, VT, OpVT);
2843 case 1: // Known true.
2844 return getBoolConstant(true, dl, VT, OpVT);
2845 case 2: // Undefined.
2846 return GetUndefBooleanConstant();
2847 }
2848 }
2849
2850 // Could not fold it.
2851 return SDValue();
2852}
2853
2854/// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We
2855/// use this predicate to simplify operations downstream.
2857 unsigned BitWidth = Op.getScalarValueSizeInBits();
2859}
2860
2861// TODO: Should have argument to specify if sign bit of nan is ignorable.
2863 if (Depth >= MaxRecursionDepth)
2864 return false; // Limit search depth.
2865
2866 unsigned Opc = Op.getOpcode();
2867 switch (Opc) {
2868 case ISD::FABS:
2869 return true;
2870 case ISD::AssertNoFPClass: {
2871 FPClassTest NoFPClass =
2872 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
2873
2874 const FPClassTest TestMask = fcNan | fcNegative;
2875 return (NoFPClass & TestMask) == TestMask;
2876 }
2877 case ISD::ARITH_FENCE:
2878 return SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2879 case ISD::FEXP:
2880 case ISD::FEXP2:
2881 case ISD::FEXP10:
2882 return Op->getFlags().hasNoNaNs();
2883 case ISD::FMINNUM:
2884 case ISD::FMINNUM_IEEE:
2885 case ISD::FMINIMUM:
2886 case ISD::FMINIMUMNUM:
2887 return SignBitIsZeroFP(Op.getOperand(1), Depth + 1) &&
2888 SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2889 case ISD::FMAXNUM:
2890 case ISD::FMAXNUM_IEEE:
2891 case ISD::FMAXIMUM:
2892 case ISD::FMAXIMUMNUM:
2893 // TODO: If we can ignore the sign bit of nans, only one side being known 0
2894 // is sufficient.
2895 return SignBitIsZeroFP(Op.getOperand(1), Depth + 1) &&
2896 SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2897 default:
2898 return false;
2899 }
2900
2901 llvm_unreachable("covered opcode switch");
2902}
2903
2904/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero. We use
2905/// this predicate to simplify operations downstream. Mask is known to be zero
2906/// for bits that V cannot have.
2908 unsigned Depth) const {
2909 return Mask.isSubsetOf(computeKnownBits(V, Depth).Zero);
2910}
2911
2912/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero in
2913/// DemandedElts. We use this predicate to simplify operations downstream.
2914/// Mask is known to be zero for bits that V cannot have.
2916 const APInt &DemandedElts,
2917 unsigned Depth) const {
2918 return Mask.isSubsetOf(computeKnownBits(V, DemandedElts, Depth).Zero);
2919}
2920
2921/// MaskedVectorIsZero - Return true if 'Op' is known to be zero in
2922/// DemandedElts. We use this predicate to simplify operations downstream.
2924 unsigned Depth /* = 0 */) const {
2925 return computeKnownBits(V, DemandedElts, Depth).isZero();
2926}
2927
2928/// MaskedValueIsAllOnes - Return true if '(Op & Mask) == Mask'.
2930 unsigned Depth) const {
2931 return Mask.isSubsetOf(computeKnownBits(V, Depth).One);
2932}
2933
2935 const APInt &DemandedElts,
2936 unsigned Depth) const {
2937 EVT VT = Op.getValueType();
2938 assert(VT.isVector() && !VT.isScalableVector() && "Only for fixed vectors!");
2939
2940 unsigned NumElts = VT.getVectorNumElements();
2941 assert(DemandedElts.getBitWidth() == NumElts && "Unexpected demanded mask.");
2942
2943 APInt KnownZeroElements = APInt::getZero(NumElts);
2944 for (unsigned EltIdx = 0; EltIdx != NumElts; ++EltIdx) {
2945 if (!DemandedElts[EltIdx])
2946 continue; // Don't query elements that are not demanded.
2947 APInt Mask = APInt::getOneBitSet(NumElts, EltIdx);
2948 if (MaskedVectorIsZero(Op, Mask, Depth))
2949 KnownZeroElements.setBit(EltIdx);
2950 }
2951 return KnownZeroElements;
2952}
2953
2954/// isSplatValue - Return true if the vector V has the same value
2955/// across all DemandedElts. For scalable vectors, we don't know the
2956/// number of lanes at compile time. Instead, we use a 1 bit APInt
2957/// to represent a conservative value for all lanes; that is, that
2958/// one bit value is implicitly splatted across all lanes.
2959bool SelectionDAG::isSplatValue(SDValue V, const APInt &DemandedElts,
2960 APInt &UndefElts, unsigned Depth) const {
2961 unsigned Opcode = V.getOpcode();
2962 EVT VT = V.getValueType();
2963 assert(VT.isVector() && "Vector type expected");
2964 assert((!VT.isScalableVector() || DemandedElts.getBitWidth() == 1) &&
2965 "scalable demanded bits are ignored");
2966
2967 if (!DemandedElts)
2968 return false; // No demanded elts, better to assume we don't know anything.
2969
2970 if (Depth >= MaxRecursionDepth)
2971 return false; // Limit search depth.
2972
2973 // Deal with some common cases here that work for both fixed and scalable
2974 // vector types.
2975 switch (Opcode) {
2976 case ISD::SPLAT_VECTOR:
2977 UndefElts = V.getOperand(0).isUndef()
2978 ? APInt::getAllOnes(DemandedElts.getBitWidth())
2979 : APInt(DemandedElts.getBitWidth(), 0);
2980 return true;
2981 case ISD::ADD:
2982 case ISD::SUB:
2983 case ISD::AND:
2984 case ISD::XOR:
2985 case ISD::OR: {
2986 APInt UndefLHS, UndefRHS;
2987 SDValue LHS = V.getOperand(0);
2988 SDValue RHS = V.getOperand(1);
2989 // Only recognize splats with the same demanded undef elements for both
2990 // operands, otherwise we might fail to handle binop-specific undef
2991 // handling.
2992 // e.g. (and undef, 0) -> 0 etc.
2993 if (isSplatValue(LHS, DemandedElts, UndefLHS, Depth + 1) &&
2994 isSplatValue(RHS, DemandedElts, UndefRHS, Depth + 1) &&
2995 (DemandedElts & UndefLHS) == (DemandedElts & UndefRHS)) {
2996 UndefElts = UndefLHS | UndefRHS;
2997 return true;
2998 }
2999 return false;
3000 }
3001 case ISD::ABS:
3003 case ISD::TRUNCATE:
3004 case ISD::SIGN_EXTEND:
3005 case ISD::ZERO_EXTEND:
3006 return isSplatValue(V.getOperand(0), DemandedElts, UndefElts, Depth + 1);
3007 default:
3008 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
3009 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
3010 return TLI->isSplatValueForTargetNode(V, DemandedElts, UndefElts, *this,
3011 Depth);
3012 break;
3013 }
3014
3015 // We don't support other cases than those above for scalable vectors at
3016 // the moment.
3017 if (VT.isScalableVector())
3018 return false;
3019
3020 unsigned NumElts = VT.getVectorNumElements();
3021 assert(NumElts == DemandedElts.getBitWidth() && "Vector size mismatch");
3022 UndefElts = APInt::getZero(NumElts);
3023
3024 switch (Opcode) {
3025 case ISD::BUILD_VECTOR: {
3026 SDValue Scl;
3027 for (unsigned i = 0; i != NumElts; ++i) {
3028 SDValue Op = V.getOperand(i);
3029 if (Op.isUndef()) {
3030 UndefElts.setBit(i);
3031 continue;
3032 }
3033 if (!DemandedElts[i])
3034 continue;
3035 if (Scl && Scl != Op)
3036 return false;
3037 Scl = Op;
3038 }
3039 return true;
3040 }
3041 case ISD::VECTOR_SHUFFLE: {
3042 // Check if this is a shuffle node doing a splat or a shuffle of a splat.
3043 APInt DemandedLHS = APInt::getZero(NumElts);
3044 APInt DemandedRHS = APInt::getZero(NumElts);
3045 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(V)->getMask();
3046 for (int i = 0; i != (int)NumElts; ++i) {
3047 int M = Mask[i];
3048 if (M < 0) {
3049 UndefElts.setBit(i);
3050 continue;
3051 }
3052 if (!DemandedElts[i])
3053 continue;
3054 if (M < (int)NumElts)
3055 DemandedLHS.setBit(M);
3056 else
3057 DemandedRHS.setBit(M - NumElts);
3058 }
3059
3060 // If we aren't demanding either op, assume there's no splat.
3061 // If we are demanding both ops, assume there's no splat.
3062 if ((DemandedLHS.isZero() && DemandedRHS.isZero()) ||
3063 (!DemandedLHS.isZero() && !DemandedRHS.isZero()))
3064 return false;
3065
3066 // See if the demanded elts of the source op is a splat or we only demand
3067 // one element, which should always be a splat.
3068 // TODO: Handle source ops splats with undefs.
3069 auto CheckSplatSrc = [&](SDValue Src, const APInt &SrcElts) {
3070 APInt SrcUndefs;
3071 return (SrcElts.popcount() == 1) ||
3072 (isSplatValue(Src, SrcElts, SrcUndefs, Depth + 1) &&
3073 (SrcElts & SrcUndefs).isZero());
3074 };
3075 if (!DemandedLHS.isZero())
3076 return CheckSplatSrc(V.getOperand(0), DemandedLHS);
3077 return CheckSplatSrc(V.getOperand(1), DemandedRHS);
3078 }
3080 // Offset the demanded elts by the subvector index.
3081 SDValue Src = V.getOperand(0);
3082 // We don't support scalable vectors at the moment.
3083 if (Src.getValueType().isScalableVector())
3084 return false;
3085 uint64_t Idx = V.getConstantOperandVal(1);
3086 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3087 APInt UndefSrcElts;
3088 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3089 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3090 UndefElts = UndefSrcElts.extractBits(NumElts, Idx);
3091 return true;
3092 }
3093 break;
3094 }
3098 // Widen the demanded elts by the src element count.
3099 SDValue Src = V.getOperand(0);
3100 // We don't support scalable vectors at the moment.
3101 if (Src.getValueType().isScalableVector())
3102 return false;
3103 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3104 APInt UndefSrcElts;
3105 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts);
3106 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3107 UndefElts = UndefSrcElts.trunc(NumElts);
3108 return true;
3109 }
3110 break;
3111 }
3112 case ISD::BITCAST: {
3113 SDValue Src = V.getOperand(0);
3114 EVT SrcVT = Src.getValueType();
3115 unsigned SrcBitWidth = SrcVT.getScalarSizeInBits();
3116 unsigned BitWidth = VT.getScalarSizeInBits();
3117
3118 // Ignore bitcasts from unsupported types.
3119 // TODO: Add fp support?
3120 if (!SrcVT.isVector() || !SrcVT.isInteger() || !VT.isInteger())
3121 break;
3122
3123 // Bitcast 'small element' vector to 'large element' vector.
3124 if ((BitWidth % SrcBitWidth) == 0) {
3125 // See if each sub element is a splat.
3126 unsigned Scale = BitWidth / SrcBitWidth;
3127 unsigned NumSrcElts = SrcVT.getVectorNumElements();
3128 APInt ScaledDemandedElts =
3129 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
3130 for (unsigned I = 0; I != Scale; ++I) {
3131 APInt SubUndefElts;
3132 APInt SubDemandedElt = APInt::getOneBitSet(Scale, I);
3133 APInt SubDemandedElts = APInt::getSplat(NumSrcElts, SubDemandedElt);
3134 SubDemandedElts &= ScaledDemandedElts;
3135 if (!isSplatValue(Src, SubDemandedElts, SubUndefElts, Depth + 1))
3136 return false;
3137 // TODO: Add support for merging sub undef elements.
3138 if (!SubUndefElts.isZero())
3139 return false;
3140 }
3141 return true;
3142 }
3143 break;
3144 }
3145 }
3146
3147 return false;
3148}
3149
3150/// Helper wrapper to main isSplatValue function.
3151bool SelectionDAG::isSplatValue(SDValue V, bool AllowUndefs) const {
3152 EVT VT = V.getValueType();
3153 assert(VT.isVector() && "Vector type expected");
3154
3155 APInt UndefElts;
3156 // Since the number of lanes in a scalable vector is unknown at compile time,
3157 // we track one bit which is implicitly broadcast to all lanes. This means
3158 // that all lanes in a scalable vector are considered demanded.
3159 APInt DemandedElts
3161 return isSplatValue(V, DemandedElts, UndefElts) &&
3162 (AllowUndefs || !UndefElts);
3163}
3164
3167
3168 EVT VT = V.getValueType();
3169 unsigned Opcode = V.getOpcode();
3170 switch (Opcode) {
3171 default: {
3172 APInt UndefElts;
3173 // Since the number of lanes in a scalable vector is unknown at compile time,
3174 // we track one bit which is implicitly broadcast to all lanes. This means
3175 // that all lanes in a scalable vector are considered demanded.
3176 APInt DemandedElts
3178
3179 if (isSplatValue(V, DemandedElts, UndefElts)) {
3180 if (VT.isScalableVector()) {
3181 // DemandedElts and UndefElts are ignored for scalable vectors, since
3182 // the only supported cases are SPLAT_VECTOR nodes.
3183 SplatIdx = 0;
3184 } else {
3185 // Handle case where all demanded elements are UNDEF.
3186 if (DemandedElts.isSubsetOf(UndefElts)) {
3187 SplatIdx = 0;
3188 return getUNDEF(VT);
3189 }
3190 SplatIdx = (UndefElts & DemandedElts).countr_one();
3191 }
3192 return V;
3193 }
3194 break;
3195 }
3196 case ISD::SPLAT_VECTOR:
3197 SplatIdx = 0;
3198 return V;
3199 case ISD::VECTOR_SHUFFLE: {
3200 assert(!VT.isScalableVector());
3201 // Check if this is a shuffle node doing a splat.
3202 // TODO - remove this and rely purely on SelectionDAG::isSplatValue,
3203 // getTargetVShiftNode currently struggles without the splat source.
3204 auto *SVN = cast<ShuffleVectorSDNode>(V);
3205 if (!SVN->isSplat())
3206 break;
3207 int Idx = SVN->getSplatIndex();
3208 int NumElts = V.getValueType().getVectorNumElements();
3209 SplatIdx = Idx % NumElts;
3210 return V.getOperand(Idx / NumElts);
3211 }
3212 }
3213
3214 return SDValue();
3215}
3216
3218 int SplatIdx;
3219 if (SDValue SrcVector = getSplatSourceVector(V, SplatIdx)) {
3220 EVT SVT = SrcVector.getValueType().getScalarType();
3221 EVT LegalSVT = SVT;
3222 if (LegalTypes && !TLI->isTypeLegal(SVT)) {
3223 if (!SVT.isInteger())
3224 return SDValue();
3225 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
3226 if (LegalSVT.bitsLT(SVT))
3227 return SDValue();
3228 }
3229 return getExtractVectorElt(SDLoc(V), LegalSVT, SrcVector, SplatIdx);
3230 }
3231 return SDValue();
3232}
3233
3234std::optional<ConstantRange>
3236 unsigned Depth) const {
3237 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3238 V.getOpcode() == ISD::SRA) &&
3239 "Unknown shift node");
3240 // Shifting more than the bitwidth is not valid.
3241 unsigned BitWidth = V.getScalarValueSizeInBits();
3242
3243 if (auto *Cst = dyn_cast<ConstantSDNode>(V.getOperand(1))) {
3244 const APInt &ShAmt = Cst->getAPIntValue();
3245 if (ShAmt.uge(BitWidth))
3246 return std::nullopt;
3247 return ConstantRange(ShAmt);
3248 }
3249
3250 if (auto *BV = dyn_cast<BuildVectorSDNode>(V.getOperand(1))) {
3251 const APInt *MinAmt = nullptr, *MaxAmt = nullptr;
3252 for (unsigned i = 0, e = BV->getNumOperands(); i != e; ++i) {
3253 if (!DemandedElts[i])
3254 continue;
3255 auto *SA = dyn_cast<ConstantSDNode>(BV->getOperand(i));
3256 if (!SA) {
3257 MinAmt = MaxAmt = nullptr;
3258 break;
3259 }
3260 const APInt &ShAmt = SA->getAPIntValue();
3261 if (ShAmt.uge(BitWidth))
3262 return std::nullopt;
3263 if (!MinAmt || MinAmt->ugt(ShAmt))
3264 MinAmt = &ShAmt;
3265 if (!MaxAmt || MaxAmt->ult(ShAmt))
3266 MaxAmt = &ShAmt;
3267 }
3268 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
3269 "Failed to find matching min/max shift amounts");
3270 if (MinAmt && MaxAmt)
3271 return ConstantRange(*MinAmt, *MaxAmt + 1);
3272 }
3273
3274 // Use computeKnownBits to find a hidden constant/knownbits (usually type
3275 // legalized). e.g. Hidden behind multiple bitcasts/build_vector/casts etc.
3276 KnownBits KnownAmt = computeKnownBits(V.getOperand(1), DemandedElts, Depth);
3277 if (KnownAmt.getMaxValue().ult(BitWidth))
3278 return ConstantRange::fromKnownBits(KnownAmt, /*IsSigned=*/false);
3279
3280 return std::nullopt;
3281}
3282
3283std::optional<unsigned>
3285 unsigned Depth) const {
3286 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3287 V.getOpcode() == ISD::SRA) &&
3288 "Unknown shift node");
3289 if (std::optional<ConstantRange> AmtRange =
3290 getValidShiftAmountRange(V, DemandedElts, Depth))
3291 if (const APInt *ShAmt = AmtRange->getSingleElement())
3292 return ShAmt->getZExtValue();
3293 return std::nullopt;
3294}
3295
3296std::optional<unsigned>
3298 APInt DemandedElts = getDemandAllEltsMask(V);
3299 return getValidShiftAmount(V, DemandedElts, Depth);
3300}
3301
3302std::optional<unsigned>
3304 unsigned Depth) const {
3305 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3306 V.getOpcode() == ISD::SRA) &&
3307 "Unknown shift node");
3308 if (std::optional<ConstantRange> AmtRange =
3309 getValidShiftAmountRange(V, DemandedElts, Depth))
3310 return AmtRange->getUnsignedMin().getZExtValue();
3311 return std::nullopt;
3312}
3313
3314std::optional<unsigned>
3316 APInt DemandedElts = getDemandAllEltsMask(V);
3317 return getValidMinimumShiftAmount(V, DemandedElts, Depth);
3318}
3319
3320std::optional<unsigned>
3322 unsigned Depth) const {
3323 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3324 V.getOpcode() == ISD::SRA) &&
3325 "Unknown shift node");
3326 if (std::optional<ConstantRange> AmtRange =
3327 getValidShiftAmountRange(V, DemandedElts, Depth))
3328 return AmtRange->getUnsignedMax().getZExtValue();
3329 return std::nullopt;
3330}
3331
3332std::optional<unsigned>
3334 APInt DemandedElts = getDemandAllEltsMask(V);
3335 return getValidMaximumShiftAmount(V, DemandedElts, Depth);
3336}
3337
3338/// Determine which bits of Op are known to be either zero or one and return
3339/// them in Known. For vectors, the known bits are those that are shared by
3340/// every vector element.
3342 APInt DemandedElts = getDemandAllEltsMask(Op);
3343 return computeKnownBits(Op, DemandedElts, Depth);
3344}
3345
3346/// Determine which bits of Op are known to be either zero or one and return
3347/// them in Known. The DemandedElts argument allows us to only collect the known
3348/// bits that are shared by the requested vector elements.
3350 unsigned Depth) const {
3351 unsigned BitWidth = Op.getScalarValueSizeInBits();
3352
3353 KnownBits Known(BitWidth); // Don't know anything.
3354
3355 if (auto OptAPInt = Op->bitcastToAPInt()) {
3356 // We know all of the bits for a constant!
3357 return KnownBits::makeConstant(*std::move(OptAPInt));
3358 }
3359
3360 if (Depth >= MaxRecursionDepth)
3361 return Known; // Limit search depth.
3362
3363 KnownBits Known2;
3364 unsigned NumElts = DemandedElts.getBitWidth();
3365 assert((!Op.getValueType().isScalableVector() || NumElts == 1) &&
3366 "DemandedElts for scalable vectors must be 1 to represent all lanes");
3367 assert((!Op.getValueType().isFixedLengthVector() ||
3368 NumElts == Op.getValueType().getVectorNumElements()) &&
3369 "Unexpected vector size");
3370
3371 if (!DemandedElts)
3372 return Known; // No demanded elts, better to assume we don't know anything.
3373
3374 unsigned Opcode = Op.getOpcode();
3375 switch (Opcode) {
3376 case ISD::FREEZE: {
3377 if (isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
3379 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3380 break;
3381 }
3382 case ISD::MERGE_VALUES:
3383 return computeKnownBits(Op.getOperand(Op.getResNo()), DemandedElts,
3384 Depth + 1);
3385 case ISD::SPLAT_VECTOR: {
3386 SDValue SrcOp = Op.getOperand(0);
3387 assert(SrcOp.getValueSizeInBits() >= BitWidth &&
3388 "Expected SPLAT_VECTOR implicit truncation");
3389 // Implicitly truncate the bits to match the official semantics of
3390 // SPLAT_VECTOR.
3392 break;
3393 }
3395 unsigned ScalarSize = Op.getOperand(0).getScalarValueSizeInBits();
3396 assert(ScalarSize * Op.getNumOperands() == BitWidth &&
3397 "Expected SPLAT_VECTOR_PARTS scalars to cover element width");
3398 for (auto [I, SrcOp] : enumerate(Op->ops())) {
3399 Known.insertBits(computeKnownBits(SrcOp, Depth + 1), ScalarSize * I);
3400 }
3401 break;
3402 }
3403 case ISD::STEP_VECTOR: {
3404 const APInt &Step = Op.getConstantOperandAPInt(0);
3405
3406 if (Step.isPowerOf2())
3407 Known.Zero.setLowBits(Step.logBase2());
3408
3410
3411 if (!isUIntN(BitWidth, Op.getValueType().getVectorMinNumElements()))
3412 break;
3413 const APInt MinNumElts =
3414 APInt(BitWidth, Op.getValueType().getVectorMinNumElements());
3415
3416 bool Overflow;
3417 const APInt MaxNumElts = getVScaleRange(&F, BitWidth)
3419 .umul_ov(MinNumElts, Overflow);
3420 if (Overflow)
3421 break;
3422
3423 const APInt MaxValue = (MaxNumElts - 1).umul_ov(Step, Overflow);
3424 if (Overflow)
3425 break;
3426
3427 Known.Zero.setHighBits(MaxValue.countl_zero());
3428 break;
3429 }
3430 case ISD::BUILD_VECTOR:
3431 assert(!Op.getValueType().isScalableVector());
3432 // Collect the known bits that are shared by every demanded vector element.
3433 Known.setAllConflict();
3434 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
3435 if (!DemandedElts[i])
3436 continue;
3437
3438 SDValue SrcOp = Op.getOperand(i);
3439 if (SrcOp.getOpcode() == ISD::POISON)
3440 continue;
3441
3442 Known2 = computeKnownBits(SrcOp, Depth + 1);
3443
3444 // BUILD_VECTOR can implicitly truncate sources, we must handle this.
3445 if (SrcOp.getValueSizeInBits() != BitWidth) {
3446 assert(SrcOp.getValueSizeInBits() > BitWidth &&
3447 "Expected BUILD_VECTOR implicit truncation");
3448 Known2 = Known2.trunc(BitWidth);
3449 }
3450
3451 // Known bits are the values that are shared by every demanded element.
3452 Known = Known.intersectWith(Known2);
3453
3454 // If we don't know any bits, early out.
3455 if (Known.isUnknown())
3456 break;
3457 }
3458
3459 // If every demanded element was poison, we know nothing.
3460 if (Known.hasConflict())
3461 Known.resetAll();
3462 break;
3463 case ISD::VECTOR_COMPRESS: {
3464 SDValue Vec = Op.getOperand(0);
3465 SDValue PassThru = Op.getOperand(2);
3466 Known = computeKnownBits(PassThru, DemandedElts, Depth + 1);
3467 // If we don't know any bits, early out.
3468 if (Known.isUnknown())
3469 break;
3470 Known2 = computeKnownBits(Vec, Depth + 1);
3471 Known = Known.intersectWith(Known2);
3472 break;
3473 }
3474 case ISD::VECTOR_SHUFFLE: {
3475 assert(!Op.getValueType().isScalableVector());
3476 // Collect the known bits that are shared by every vector element referenced
3477 // by the shuffle.
3478 APInt DemandedLHS, DemandedRHS;
3480 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
3481 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
3482 DemandedLHS, DemandedRHS))
3483 break;
3484
3485 // Known bits are the values that are shared by every demanded element.
3486 Known.setAllConflict();
3487 if (!!DemandedLHS) {
3488 SDValue LHS = Op.getOperand(0);
3489 Known2 = computeKnownBits(LHS, DemandedLHS, Depth + 1);
3490 Known = Known.intersectWith(Known2);
3491 }
3492 // If we don't know any bits, early out.
3493 if (Known.isUnknown())
3494 break;
3495 if (!!DemandedRHS) {
3496 SDValue RHS = Op.getOperand(1);
3497 Known2 = computeKnownBits(RHS, DemandedRHS, Depth + 1);
3498 Known = Known.intersectWith(Known2);
3499 }
3500 break;
3501 }
3502 case ISD::VSCALE: {
3504 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
3506 break;
3507 }
3508 case ISD::CONCAT_VECTORS: {
3509 if (Op.getValueType().isScalableVector())
3510 break;
3511 // Split DemandedElts and test each of the demanded subvectors.
3512 Known.setAllConflict();
3513 EVT SubVectorVT = Op.getOperand(0).getValueType();
3514 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
3515 unsigned NumSubVectors = Op.getNumOperands();
3516 for (unsigned i = 0; i != NumSubVectors; ++i) {
3517 APInt DemandedSub =
3518 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
3519 if (!!DemandedSub) {
3520 SDValue Sub = Op.getOperand(i);
3521 Known2 = computeKnownBits(Sub, DemandedSub, Depth + 1);
3522 Known = Known.intersectWith(Known2);
3523 }
3524 // If we don't know any bits, early out.
3525 if (Known.isUnknown())
3526 break;
3527 }
3528 break;
3529 }
3530 case ISD::INSERT_SUBVECTOR: {
3531 if (Op.getValueType().isScalableVector())
3532 break;
3533 // Demand any elements from the subvector and the remainder from the src its
3534 // inserted into.
3535 SDValue Src = Op.getOperand(0);
3536 SDValue Sub = Op.getOperand(1);
3537 uint64_t Idx = Op.getConstantOperandVal(2);
3538 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
3539 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
3540 APInt DemandedSrcElts = DemandedElts;
3541 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
3542
3543 Known.setAllConflict();
3544 if (!!DemandedSubElts) {
3545 Known = computeKnownBits(Sub, DemandedSubElts, Depth + 1);
3546 if (Known.isUnknown())
3547 break; // early-out.
3548 }
3549 if (!!DemandedSrcElts) {
3550 Known2 = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3551 Known = Known.intersectWith(Known2);
3552 }
3553 break;
3554 }
3556 // Offset the demanded elts by the subvector index.
3557 SDValue Src = Op.getOperand(0);
3558
3559 APInt DemandedSrcElts;
3560 if (Src.getValueType().isScalableVector())
3561 DemandedSrcElts = APInt(1, 1); // <=> 'demand all elements'
3562 else {
3563 uint64_t Idx = Op.getConstantOperandVal(1);
3564 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3565 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3566 }
3567 Known = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3568 break;
3569 }
3570 case ISD::SCALAR_TO_VECTOR: {
3571 if (Op.getValueType().isScalableVector())
3572 break;
3573 // We know about scalar_to_vector as much as we know about it source,
3574 // which becomes the first element of otherwise unknown vector.
3575 if (DemandedElts != 1)
3576 break;
3577
3578 SDValue N0 = Op.getOperand(0);
3579 Known = computeKnownBits(N0, Depth + 1);
3580 if (N0.getValueSizeInBits() != BitWidth)
3581 Known = Known.trunc(BitWidth);
3582
3583 break;
3584 }
3585 case ISD::BITCAST: {
3586 if (Op.getValueType().isScalableVector())
3587 break;
3588
3589 SDValue N0 = Op.getOperand(0);
3590 EVT SubVT = N0.getValueType();
3591 unsigned SubBitWidth = SubVT.getScalarSizeInBits();
3592
3593 // Ignore bitcasts from unsupported types.
3594 if (!(SubVT.isInteger() || SubVT.isFloatingPoint()))
3595 break;
3596
3597 // Fast handling of 'identity' bitcasts.
3598 if (BitWidth == SubBitWidth) {
3599 Known = computeKnownBits(N0, DemandedElts, Depth + 1);
3600 break;
3601 }
3602
3603 bool IsLE = getDataLayout().isLittleEndian();
3604
3605 // Bitcast 'small element' vector to 'large element' scalar/vector.
3606 if ((BitWidth % SubBitWidth) == 0) {
3607 assert(N0.getValueType().isVector() && "Expected bitcast from vector");
3608
3609 // Collect known bits for the (larger) output by collecting the known
3610 // bits from each set of sub elements and shift these into place.
3611 // We need to separately call computeKnownBits for each set of
3612 // sub elements as the knownbits for each is likely to be different.
3613 unsigned SubScale = BitWidth / SubBitWidth;
3614 APInt SubDemandedElts(NumElts * SubScale, 0);
3615 for (unsigned i = 0; i != NumElts; ++i)
3616 if (DemandedElts[i])
3617 SubDemandedElts.setBit(i * SubScale);
3618
3619 for (unsigned i = 0; i != SubScale; ++i) {
3620 Known2 = computeKnownBits(N0, SubDemandedElts.shl(i),
3621 Depth + 1);
3622 unsigned Shifts = IsLE ? i : SubScale - 1 - i;
3623 Known.insertBits(Known2, SubBitWidth * Shifts);
3624 }
3625 }
3626
3627 // Bitcast 'large element' scalar/vector to 'small element' vector.
3628 if ((SubBitWidth % BitWidth) == 0) {
3629 assert(Op.getValueType().isVector() && "Expected bitcast to vector");
3630
3631 // Collect known bits for the (smaller) output by collecting the known
3632 // bits from the overlapping larger input elements and extracting the
3633 // sub sections we actually care about.
3634 unsigned SubScale = SubBitWidth / BitWidth;
3635 APInt SubDemandedElts =
3636 APIntOps::ScaleBitMask(DemandedElts, NumElts / SubScale);
3637 Known2 = computeKnownBits(N0, SubDemandedElts, Depth + 1);
3638
3639 Known.setAllConflict();
3640 for (unsigned i = 0; i != NumElts; ++i)
3641 if (DemandedElts[i]) {
3642 unsigned Shifts = IsLE ? i : NumElts - 1 - i;
3643 unsigned Offset = (Shifts % SubScale) * BitWidth;
3644 Known = Known.intersectWith(Known2.extractBits(BitWidth, Offset));
3645 // If we don't know any bits, early out.
3646 if (Known.isUnknown())
3647 break;
3648 }
3649 }
3650 break;
3651 }
3652 case ISD::AND:
3653 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3654 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3655
3656 Known &= Known2;
3657 break;
3658 case ISD::OR:
3659 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3660 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3661
3662 Known |= Known2;
3663 break;
3664 case ISD::XOR:
3665 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3666 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3667
3668 Known ^= Known2;
3669 break;
3670 case ISD::MUL: {
3671 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3672 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3673 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3674 // TODO: SelfMultiply can be poison, but not undef.
3675 if (SelfMultiply)
3676 SelfMultiply &= isGuaranteedNotToBeUndefOrPoison(
3677 Op.getOperand(0), DemandedElts, UndefPoisonKind::UndefOrPoison,
3678 Depth + 1);
3679 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3680
3681 // If the multiplication is known not to overflow, the product of a number
3682 // with itself is non-negative. Only do this if we didn't already computed
3683 // the opposite value for the sign bit.
3684 if (Op->getFlags().hasNoSignedWrap() &&
3685 Op.getOperand(0) == Op.getOperand(1) &&
3686 !Known.isNegative())
3687 Known.makeNonNegative();
3688 break;
3689 }
3690 case ISD::MULHU: {
3691 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3692 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3693 Known = KnownBits::mulhu(Known, Known2);
3694 break;
3695 }
3696 case ISD::MULHS: {
3697 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3698 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3699 Known = KnownBits::mulhs(Known, Known2);
3700 break;
3701 }
3702 case ISD::ABDU: {
3703 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3704 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3705 Known = KnownBits::abdu(Known, Known2);
3706 break;
3707 }
3708 case ISD::ABDS: {
3709 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3710 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3711 Known = KnownBits::abds(Known, Known2);
3712 unsigned SignBits1 =
3713 ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
3714 if (SignBits1 == 1)
3715 break;
3716 unsigned SignBits0 =
3717 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
3718 Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
3719 break;
3720 }
3721 case ISD::UMUL_LOHI: {
3722 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3723 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3724 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3725 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3726 if (Op.getResNo() == 0)
3727 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3728 else
3729 Known = KnownBits::mulhu(Known, Known2);
3730 break;
3731 }
3732 case ISD::SMUL_LOHI: {
3733 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3734 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3735 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3736 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3737 if (Op.getResNo() == 0)
3738 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3739 else
3740 Known = KnownBits::mulhs(Known, Known2);
3741 break;
3742 }
3743 case ISD::AVGFLOORU: {
3744 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3745 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3746 Known = KnownBits::avgFloorU(Known, Known2);
3747 break;
3748 }
3749 case ISD::AVGCEILU: {
3750 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3751 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3752 Known = KnownBits::avgCeilU(Known, Known2);
3753 break;
3754 }
3755 case ISD::AVGFLOORS: {
3756 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3757 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3758 Known = KnownBits::avgFloorS(Known, Known2);
3759 break;
3760 }
3761 case ISD::AVGCEILS: {
3762 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3763 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3764 Known = KnownBits::avgCeilS(Known, Known2);
3765 break;
3766 }
3767 case ISD::SELECT:
3768 case ISD::VSELECT:
3769 Known = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3770 // If we don't know any bits, early out.
3771 if (Known.isUnknown())
3772 break;
3773 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth+1);
3774
3775 // Only known if known in both the LHS and RHS.
3776 Known = Known.intersectWith(Known2);
3777 break;
3778 case ISD::SELECT_CC:
3779 Known = computeKnownBits(Op.getOperand(3), DemandedElts, Depth+1);
3780 // If we don't know any bits, early out.
3781 if (Known.isUnknown())
3782 break;
3783 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3784
3785 // Only known if known in both the LHS and RHS.
3786 Known = Known.intersectWith(Known2);
3787 break;
3788 case ISD::SMULO:
3789 case ISD::UMULO:
3790 if (Op.getResNo() != 1)
3791 break;
3792 // The boolean result conforms to getBooleanContents.
3793 // If we know the result of a setcc has the top bits zero, use this info.
3794 // We know that we have an integer-based boolean since these operations
3795 // are only available for integer.
3796 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
3798 BitWidth > 1)
3799 Known.Zero.setBitsFrom(1);
3800 break;
3801 case ISD::SETCC:
3802 case ISD::SETCCCARRY:
3803 case ISD::STRICT_FSETCC:
3804 case ISD::STRICT_FSETCCS: {
3805 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
3806 // If we know the result of a setcc has the top bits zero, use this info.
3807 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
3809 BitWidth > 1)
3810 Known.Zero.setBitsFrom(1);
3811 break;
3812 }
3813 case ISD::SHL: {
3814 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3815 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3816
3817 bool NUW = Op->getFlags().hasNoUnsignedWrap();
3818 bool NSW = Op->getFlags().hasNoSignedWrap();
3819
3820 bool ShAmtNonZero = Known2.isNonZero();
3821
3822 Known = KnownBits::shl(Known, Known2, NUW, NSW, ShAmtNonZero);
3823
3824 // Minimum shift low bits are known zero.
3825 if (std::optional<unsigned> ShMinAmt =
3826 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
3827 Known.Zero.setLowBits(*ShMinAmt);
3828 break;
3829 }
3830 case ISD::SRL:
3831 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3832 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3833 Known = KnownBits::lshr(Known, Known2, /*ShAmtNonZero=*/false,
3834 Op->getFlags().hasExact());
3835
3836 // Minimum shift high bits are known zero.
3837 if (std::optional<unsigned> ShMinAmt =
3838 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
3839 Known.Zero.setHighBits(*ShMinAmt);
3840 break;
3841 case ISD::SRA:
3842 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3843 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3844 Known = KnownBits::ashr(Known, Known2, /*ShAmtNonZero=*/false,
3845 Op->getFlags().hasExact());
3846 break;
3847 case ISD::ROTL:
3848 case ISD::ROTR:
3849 if (ConstantSDNode *C =
3850 isConstOrConstSplat(Op.getOperand(1), DemandedElts)) {
3851 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3852
3853 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3854
3855 // Canonicalize to ROTR.
3856 if (Opcode == ISD::ROTL && Amt != 0)
3857 Amt = BitWidth - Amt;
3858
3859 Known.Zero = Known.Zero.rotr(Amt);
3860 Known.One = Known.One.rotr(Amt);
3861 }
3862 break;
3863 case ISD::FSHL:
3864 case ISD::FSHR:
3865 if (ConstantSDNode *C = isConstOrConstSplat(Op.getOperand(2), DemandedElts)) {
3866 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3867
3868 // For fshl, 0-shift returns the 1st arg.
3869 // For fshr, 0-shift returns the 2nd arg.
3870 if (Amt == 0) {
3871 Known = computeKnownBits(Op.getOperand(Opcode == ISD::FSHL ? 0 : 1),
3872 DemandedElts, Depth + 1);
3873 break;
3874 }
3875
3876 // fshl: (X << (Z % BW)) | (Y >> (BW - (Z % BW)))
3877 // fshr: (X << (BW - (Z % BW))) | (Y >> (Z % BW))
3878 const APInt ShAmt(BitWidth, Amt);
3879 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3880 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3881 Known = Opcode == ISD::FSHL ? KnownBits::fshl(Known, Known2, ShAmt)
3882 : KnownBits::fshr(Known, Known2, ShAmt);
3883 }
3884 break;
3885 case ISD::SHL_PARTS:
3886 case ISD::SRA_PARTS:
3887 case ISD::SRL_PARTS: {
3888 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3889
3890 // Collect lo/hi source values and concatenate.
3891 unsigned LoBits = Op.getOperand(0).getScalarValueSizeInBits();
3892 unsigned HiBits = Op.getOperand(1).getScalarValueSizeInBits();
3893 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3894 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3895 Known = Known2.concat(Known);
3896
3897 // Collect shift amount.
3898 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
3899
3900 if (Opcode == ISD::SHL_PARTS)
3901 Known = KnownBits::shl(Known, Known2);
3902 else if (Opcode == ISD::SRA_PARTS)
3903 Known = KnownBits::ashr(Known, Known2);
3904 else // if (Opcode == ISD::SRL_PARTS)
3905 Known = KnownBits::lshr(Known, Known2);
3906
3907 // TODO: Minimum shift low/high bits are known zero.
3908
3909 if (Op.getResNo() == 0)
3910 Known = Known.extractBits(LoBits, 0);
3911 else
3912 Known = Known.extractBits(HiBits, LoBits);
3913 break;
3914 }
3916 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3917 EVT EVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
3918 Known = Known.sextInReg(EVT.getScalarSizeInBits());
3919 break;
3920 }
3921 case ISD::CTTZ:
3922 case ISD::CTTZ_ZERO_POISON: {
3923 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3924 // If we have a known 1, its position is our upper bound.
3925 unsigned PossibleTZ = Known2.countMaxTrailingZeros();
3926 unsigned LowBits = llvm::bit_width(PossibleTZ);
3927 Known.Zero.setBitsFrom(LowBits);
3928 break;
3929 }
3930 case ISD::CTLZ:
3931 case ISD::CTLZ_ZERO_POISON: {
3932 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3933 // If we have a known 1, its position is our upper bound.
3934 unsigned PossibleLZ = Known2.countMaxLeadingZeros();
3935 unsigned LowBits = llvm::bit_width(PossibleLZ);
3936 Known.Zero.setBitsFrom(LowBits);
3937 break;
3938 }
3939 case ISD::CTLS: {
3940 unsigned MinRedundantSignBits =
3941 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1;
3942 ConstantRange Range(APInt(BitWidth, MinRedundantSignBits),
3944 Known = Range.toKnownBits();
3945 break;
3946 }
3947 case ISD::CTPOP: {
3948 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3949 // If we know some of the bits are zero, they can't be one.
3950 unsigned PossibleOnes = Known2.countMaxPopulation();
3951 Known.Zero.setBitsFrom(llvm::bit_width(PossibleOnes));
3952 break;
3953 }
3954 case ISD::PARITY: {
3955 // Parity returns 0 everywhere but the LSB.
3956 Known.Zero.setBitsFrom(1);
3957 break;
3958 }
3959 case ISD::PDEP: {
3960 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3961 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3962 Known = KnownBits::pdep(Known2, Known);
3963 break;
3964 }
3965 case ISD::PEXT: {
3966 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3967 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3968 Known = KnownBits::pext(Known2, Known);
3969 break;
3970 }
3971 case ISD::CLMUL: {
3972 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3973 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3974 Known = KnownBits::clmul(Known, Known2);
3975 break;
3976 }
3977 case ISD::MGATHER:
3978 case ISD::MLOAD: {
3979 ISD::LoadExtType ETy =
3980 (Opcode == ISD::MGATHER)
3981 ? cast<MaskedGatherSDNode>(Op)->getExtensionType()
3982 : cast<MaskedLoadSDNode>(Op)->getExtensionType();
3983 if (ETy == ISD::ZEXTLOAD) {
3984 EVT MemVT = cast<MemSDNode>(Op)->getMemoryVT();
3985 KnownBits Known0(MemVT.getScalarSizeInBits());
3986 return Known0.zext(BitWidth);
3987 }
3988 break;
3989 }
3990 case ISD::LOAD: {
3992 const Constant *Cst = TLI->getTargetConstantFromLoad(LD);
3993 if (ISD::isNON_EXTLoad(LD) && Cst) {
3994 // Determine any common known bits from the loaded constant pool value.
3995 Type *CstTy = Cst->getType();
3996 if ((NumElts * BitWidth) == CstTy->getPrimitiveSizeInBits() &&
3997 !Op.getValueType().isScalableVector()) {
3998 // If its a vector splat, then we can (quickly) reuse the scalar path.
3999 // NOTE: We assume all elements match and none are UNDEF.
4000 if (CstTy->isVectorTy()) {
4001 if (const Constant *Splat = Cst->getSplatValue()) {
4002 Cst = Splat;
4003 CstTy = Cst->getType();
4004 }
4005 }
4006 // TODO - do we need to handle different bitwidths?
4007 if (CstTy->isVectorTy() && BitWidth == CstTy->getScalarSizeInBits()) {
4008 // Iterate across all vector elements finding common known bits.
4009 Known.setAllConflict();
4010 for (unsigned i = 0; i != NumElts; ++i) {
4011 if (!DemandedElts[i])
4012 continue;
4013 if (Constant *Elt = Cst->getAggregateElement(i)) {
4014 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
4015 const APInt &Value = CInt->getValue();
4016 Known.One &= Value;
4017 Known.Zero &= ~Value;
4018 continue;
4019 }
4020 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
4021 APInt Value = CFP->getValueAPF().bitcastToAPInt();
4022 Known.One &= Value;
4023 Known.Zero &= ~Value;
4024 continue;
4025 }
4026 }
4027 Known.One.clearAllBits();
4028 Known.Zero.clearAllBits();
4029 break;
4030 }
4031 } else if (BitWidth == CstTy->getPrimitiveSizeInBits()) {
4032 if (auto *CInt = dyn_cast<ConstantInt>(Cst)) {
4033 Known = KnownBits::makeConstant(CInt->getValue());
4034 } else if (auto *CFP = dyn_cast<ConstantFP>(Cst)) {
4035 Known =
4036 KnownBits::makeConstant(CFP->getValueAPF().bitcastToAPInt());
4037 }
4038 }
4039 }
4040 } else if (Op.getResNo() == 0) {
4041 unsigned ScalarMemorySize = LD->getMemoryVT().getScalarSizeInBits();
4042 KnownBits KnownScalarMemory(ScalarMemorySize);
4043 if (const MDNode *MD = LD->getRanges())
4044 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4045
4046 // Extend the Known bits from memory to the size of the scalar result.
4047 if (ISD::isZEXTLoad(Op.getNode()))
4048 Known = KnownScalarMemory.zext(BitWidth);
4049 else if (ISD::isSEXTLoad(Op.getNode()))
4050 Known = KnownScalarMemory.sext(BitWidth);
4051 else if (ISD::isEXTLoad(Op.getNode()))
4052 Known = KnownScalarMemory.anyext(BitWidth);
4053 else
4054 Known = KnownScalarMemory;
4055 assert(Known.getBitWidth() == BitWidth);
4056 return Known;
4057 }
4058 break;
4059 }
4061 if (Op.getValueType().isScalableVector())
4062 break;
4063 EVT InVT = Op.getOperand(0).getValueType();
4064 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4065 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4066 Known = Known.zext(BitWidth);
4067 break;
4068 }
4069 case ISD::ZERO_EXTEND: {
4070 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4071 Known = Known.zext(BitWidth);
4072 break;
4073 }
4075 if (Op.getValueType().isScalableVector())
4076 break;
4077 EVT InVT = Op.getOperand(0).getValueType();
4078 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4079 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4080 // If the sign bit is known to be zero or one, then sext will extend
4081 // it to the top bits, else it will just zext.
4082 Known = Known.sext(BitWidth);
4083 break;
4084 }
4085 case ISD::SIGN_EXTEND: {
4086 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4087 // If the sign bit is known to be zero or one, then sext will extend
4088 // it to the top bits, else it will just zext.
4089 Known = Known.sext(BitWidth);
4090 break;
4091 }
4093 if (Op.getValueType().isScalableVector())
4094 break;
4095 EVT InVT = Op.getOperand(0).getValueType();
4096 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4097 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4098 Known = Known.anyext(BitWidth);
4099 break;
4100 }
4101 case ISD::ANY_EXTEND: {
4102 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4103 Known = Known.anyext(BitWidth);
4104 break;
4105 }
4106 case ISD::TRUNCATE: {
4107 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4108 Known = Known.trunc(BitWidth);
4109 break;
4110 }
4111 case ISD::TRUNCATE_SSAT_S: {
4112 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4113 Known = Known.truncSSat(BitWidth);
4114 break;
4115 }
4116 case ISD::TRUNCATE_SSAT_U: {
4117 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4118 Known = Known.truncSSatU(BitWidth);
4119 break;
4120 }
4121 case ISD::TRUNCATE_USAT_U: {
4122 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4123 Known = Known.truncUSat(BitWidth);
4124 break;
4125 }
4126 case ISD::AssertZext: {
4127 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4129 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4130 Known.Zero |= (~InMask);
4131 Known.One &= (~Known.Zero);
4132 break;
4133 }
4134 case ISD::AssertAlign: {
4135 unsigned LogOfAlign = Log2(cast<AssertAlignSDNode>(Op)->getAlign());
4136 assert(LogOfAlign != 0);
4137
4138 // TODO: Should use maximum with source
4139 // If a node is guaranteed to be aligned, set low zero bits accordingly as
4140 // well as clearing one bits.
4141 Known.Zero.setLowBits(LogOfAlign);
4142 Known.One.clearLowBits(LogOfAlign);
4143 break;
4144 }
4145 case ISD::AssertNoFPClass: {
4146 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4147
4148 FPClassTest NoFPClass =
4149 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
4150 const FPClassTest NegativeTestMask = fcNan | fcNegative;
4151 if ((NoFPClass & NegativeTestMask) == NegativeTestMask) {
4152 // Cannot be negative.
4153 Known.makeNonNegative();
4154 }
4155
4156 const FPClassTest PositiveTestMask = fcNan | fcPositive;
4157 if ((NoFPClass & PositiveTestMask) == PositiveTestMask) {
4158 // Cannot be positive.
4159 Known.makeNegative();
4160 }
4161
4162 break;
4163 }
4164 case ISD::FABS:
4165 // fabs clears the sign bit
4166 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4167 Known.makeNonNegative();
4168 break;
4169 case ISD::FGETSIGN:
4170 // All bits are zero except the low bit.
4171 Known.Zero.setBitsFrom(1);
4172 break;
4173 case ISD::ADD: {
4174 SDNodeFlags Flags = Op.getNode()->getFlags();
4175 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4176 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4177 bool SelfAdd = Op.getOperand(0) == Op.getOperand(1) &&
4179 Op.getOperand(0), DemandedElts,
4181 Known = KnownBits::add(Known, Known2, Flags.hasNoSignedWrap(),
4182 Flags.hasNoUnsignedWrap(), SelfAdd);
4183 break;
4184 }
4185 case ISD::SUB: {
4186 SDNodeFlags Flags = Op.getNode()->getFlags();
4187 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4188 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4189 Known = KnownBits::sub(Known, Known2, Flags.hasNoSignedWrap(),
4190 Flags.hasNoUnsignedWrap());
4191 break;
4192 }
4193 case ISD::USUBO:
4194 case ISD::SSUBO:
4195 case ISD::USUBO_CARRY:
4196 case ISD::SSUBO_CARRY:
4197 if (Op.getResNo() == 1) {
4198 // If we know the result of a setcc has the top bits zero, use this info.
4199 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4201 BitWidth > 1)
4202 Known.Zero.setBitsFrom(1);
4203 break;
4204 }
4205 [[fallthrough]];
4206 case ISD::SUBC: {
4207 assert(Op.getResNo() == 0 &&
4208 "We only compute knownbits for the difference here.");
4209
4210 // With USUBO_CARRY and SSUBO_CARRY a borrow bit may be added in.
4211 KnownBits Borrow(1);
4212 if (Opcode == ISD::USUBO_CARRY || Opcode == ISD::SSUBO_CARRY) {
4213 Borrow = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4214 // Borrow has bit width 1
4215 Borrow = Borrow.trunc(1);
4216 } else {
4217 Borrow.setAllZero();
4218 }
4219
4220 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4221 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4222 Known = KnownBits::computeForSubBorrow(Known, Known2, Borrow);
4223 break;
4224 }
4225 case ISD::UADDO:
4226 case ISD::SADDO:
4227 case ISD::UADDO_CARRY:
4228 case ISD::SADDO_CARRY:
4229 if (Op.getResNo() == 1) {
4230 // If we know the result of a setcc has the top bits zero, use this info.
4231 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4233 BitWidth > 1)
4234 Known.Zero.setBitsFrom(1);
4235 break;
4236 }
4237 [[fallthrough]];
4238 case ISD::ADDC:
4239 case ISD::ADDE: {
4240 assert(Op.getResNo() == 0 && "We only compute knownbits for the sum here.");
4241
4242 // With ADDE and UADDO_CARRY, a carry bit may be added in.
4243 KnownBits Carry(1);
4244 if (Opcode == ISD::ADDE)
4245 // Can't track carry from glue, set carry to unknown.
4246 Carry.resetAll();
4247 else if (Opcode == ISD::UADDO_CARRY || Opcode == ISD::SADDO_CARRY) {
4248 Carry = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4249 // Carry has bit width 1
4250 Carry = Carry.trunc(1);
4251 } else {
4252 Carry.setAllZero();
4253 }
4254
4255 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4256 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4257 Known = KnownBits::computeForAddCarry(Known, Known2, Carry);
4258 break;
4259 }
4260 case ISD::UDIV: {
4261 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4262 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4263 Known = KnownBits::udiv(Known, Known2, Op->getFlags().hasExact());
4264 break;
4265 }
4266 case ISD::SDIV: {
4267 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4268 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4269 Known = KnownBits::sdiv(Known, Known2, Op->getFlags().hasExact());
4270 break;
4271 }
4272 case ISD::SREM: {
4273 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4274 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4275 Known = KnownBits::srem(Known, Known2);
4276 break;
4277 }
4278 case ISD::UREM: {
4279 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4280 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4281 Known = KnownBits::urem(Known, Known2);
4282 break;
4283 }
4284 case ISD::EXTRACT_ELEMENT: {
4285 Known = computeKnownBits(Op.getOperand(0), Depth+1);
4286 const unsigned Index = Op.getConstantOperandVal(1);
4287 const unsigned EltBitWidth = Op.getValueSizeInBits();
4288
4289 // Remove low part of known bits mask
4290 Known.Zero = Known.Zero.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
4291 Known.One = Known.One.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
4292
4293 // Remove high part of known bit mask
4294 Known = Known.trunc(EltBitWidth);
4295 break;
4296 }
4298 SDValue InVec = Op.getOperand(0);
4299 SDValue EltNo = Op.getOperand(1);
4300 EVT VecVT = InVec.getValueType();
4301 // computeKnownBits not yet implemented for scalable vectors.
4302 if (VecVT.isScalableVector())
4303 break;
4304 const unsigned EltBitWidth = VecVT.getScalarSizeInBits();
4305 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4306
4307 // If BitWidth > EltBitWidth the value is anyext:ed. So we do not know
4308 // anything about the extended bits.
4309 if (BitWidth > EltBitWidth)
4310 Known = Known.trunc(EltBitWidth);
4311
4312 // If we know the element index, just demand that vector element, else for
4313 // an unknown element index, ignore DemandedElts and demand them all.
4314 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
4315 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4316 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
4317 DemandedSrcElts =
4318 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
4319
4320 Known = computeKnownBits(InVec, DemandedSrcElts, Depth + 1);
4321 if (BitWidth > EltBitWidth)
4322 Known = Known.anyext(BitWidth);
4323 break;
4324 }
4326 if (Op.getValueType().isScalableVector())
4327 break;
4328
4329 // If we know the element index, split the demand between the
4330 // source vector and the inserted element, otherwise assume we need
4331 // the original demanded vector elements and the value.
4332 SDValue InVec = Op.getOperand(0);
4333 SDValue InVal = Op.getOperand(1);
4334 SDValue EltNo = Op.getOperand(2);
4335 bool DemandedVal = true;
4336 APInt DemandedVecElts = DemandedElts;
4337 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
4338 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
4339 unsigned EltIdx = CEltNo->getZExtValue();
4340 DemandedVal = !!DemandedElts[EltIdx];
4341 DemandedVecElts.clearBit(EltIdx);
4342 }
4343 Known.setAllConflict();
4344 if (DemandedVal) {
4345 Known2 = computeKnownBits(InVal, Depth + 1);
4346 Known = Known.intersectWith(Known2.zextOrTrunc(BitWidth));
4347 }
4348 if (!!DemandedVecElts) {
4349 Known2 = computeKnownBits(InVec, DemandedVecElts, Depth + 1);
4350 Known = Known.intersectWith(Known2);
4351 }
4352 break;
4353 }
4354 case ISD::BITREVERSE: {
4355 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4356 Known = Known2.reverseBits();
4357 break;
4358 }
4359 case ISD::BSWAP: {
4360 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4361 Known = Known2.byteSwap();
4362 break;
4363 }
4364 case ISD::ABS:
4365 case ISD::ABS_MIN_POISON: {
4366 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4367 Known = Known2.abs();
4368 Known.Zero.setHighBits(
4369 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1);
4370 break;
4371 }
4372 case ISD::USUBSAT: {
4373 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4374 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4375 Known = KnownBits::usub_sat(Known, Known2);
4376 break;
4377 }
4378 case ISD::UMIN: {
4379 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4380 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4381 Known = KnownBits::umin(Known, Known2);
4382 break;
4383 }
4384 case ISD::UMAX: {
4385 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4386 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4387 Known = KnownBits::umax(Known, Known2);
4388 break;
4389 }
4390 case ISD::SMIN:
4391 case ISD::SMAX: {
4392 // If we have a clamp pattern, we know that the number of sign bits will be
4393 // the minimum of the clamp min/max range.
4394 bool IsMax = (Opcode == ISD::SMAX);
4395 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
4396 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
4397 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
4398 CstHigh =
4399 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
4400 if (CstLow && CstHigh) {
4401 if (!IsMax)
4402 std::swap(CstLow, CstHigh);
4403
4404 const APInt &ValueLow = CstLow->getAPIntValue();
4405 const APInt &ValueHigh = CstHigh->getAPIntValue();
4406 if (ValueLow.sle(ValueHigh)) {
4407 unsigned LowSignBits = ValueLow.getNumSignBits();
4408 unsigned HighSignBits = ValueHigh.getNumSignBits();
4409 unsigned MinSignBits = std::min(LowSignBits, HighSignBits);
4410 if (ValueLow.isNegative() && ValueHigh.isNegative()) {
4411 Known.One.setHighBits(MinSignBits);
4412 break;
4413 }
4414 if (ValueLow.isNonNegative() && ValueHigh.isNonNegative()) {
4415 Known.Zero.setHighBits(MinSignBits);
4416 break;
4417 }
4418 }
4419 }
4420
4421 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4422 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4423 if (IsMax)
4424 Known = KnownBits::smax(Known, Known2);
4425 else
4426 Known = KnownBits::smin(Known, Known2);
4427
4428 // For SMAX, if CstLow is non-negative we know the result will be
4429 // non-negative and thus all sign bits are 0.
4430 // TODO: There's an equivalent of this for smin with negative constant for
4431 // known ones.
4432 if (IsMax && CstLow) {
4433 const APInt &ValueLow = CstLow->getAPIntValue();
4434 if (ValueLow.isNonNegative()) {
4435 unsigned SignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4436 Known.Zero.setHighBits(std::min(SignBits, ValueLow.getNumSignBits()));
4437 }
4438 }
4439
4440 break;
4441 }
4442 case ISD::UINT_TO_FP: {
4443 Known.makeNonNegative();
4444 break;
4445 }
4446 case ISD::SINT_TO_FP: {
4447 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4448 if (Known2.isNonNegative())
4449 Known.makeNonNegative();
4450 else if (Known2.isNegative())
4451 Known.makeNegative();
4452 break;
4453 }
4454 case ISD::FP_TO_UINT_SAT: {
4455 // FP_TO_UINT_SAT produces an unsigned value that fits in the saturating VT.
4456 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4458 break;
4459 }
4460 case ISD::ATOMIC_LOAD: {
4461 // If we are looking at the loaded value.
4462 if (Op.getResNo() == 0) {
4463 auto *AT = cast<AtomicSDNode>(Op);
4464 unsigned ScalarMemorySize = AT->getMemoryVT().getScalarSizeInBits();
4465 KnownBits KnownScalarMemory(ScalarMemorySize);
4466 if (const MDNode *MD = AT->getRanges())
4467 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4468
4469 switch (AT->getExtensionType()) {
4470 case ISD::ZEXTLOAD:
4471 Known = KnownScalarMemory.zext(BitWidth);
4472 break;
4473 case ISD::SEXTLOAD:
4474 Known = KnownScalarMemory.sext(BitWidth);
4475 break;
4476 case ISD::EXTLOAD:
4477 switch (TLI->getExtendForAtomicOps()) {
4478 case ISD::ZERO_EXTEND:
4479 Known = KnownScalarMemory.zext(BitWidth);
4480 break;
4481 case ISD::SIGN_EXTEND:
4482 Known = KnownScalarMemory.sext(BitWidth);
4483 break;
4484 default:
4485 Known = KnownScalarMemory.anyext(BitWidth);
4486 break;
4487 }
4488 break;
4489 case ISD::NON_EXTLOAD:
4490 Known = KnownScalarMemory;
4491 break;
4492 }
4493 assert(Known.getBitWidth() == BitWidth);
4494 }
4495 break;
4496 }
4498 if (Op.getResNo() == 1) {
4499 // The boolean result conforms to getBooleanContents.
4500 // If we know the result of a setcc has the top bits zero, use this info.
4501 // We know that we have an integer-based boolean since these operations
4502 // are only available for integer.
4503 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
4505 BitWidth > 1)
4506 Known.Zero.setBitsFrom(1);
4507 break;
4508 }
4509 [[fallthrough]];
4511 case ISD::ATOMIC_SWAP:
4522 case ISD::ATOMIC_LOAD_UMAX: {
4523 // If we are looking at the loaded value.
4524 if (Op.getResNo() == 0) {
4525 auto *AT = cast<AtomicSDNode>(Op);
4526 unsigned MemBits = AT->getMemoryVT().getScalarSizeInBits();
4527
4528 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
4529 Known.Zero.setBitsFrom(MemBits);
4530 }
4531 break;
4532 }
4533 case ISD::FrameIndex:
4534 case ISD::TargetFrameIndex: {
4535 const MachineFunction &MF = getMachineFunction();
4536 int FrameIdx = cast<FrameIndexSDNode>(Op)->getIndex();
4537 TLI->computeKnownBitsForStackObjectPointer(
4538 Known, MF, MF.getFrameInfo().getObjectAlign(FrameIdx));
4539 break;
4540 }
4541
4542 default:
4543 if (Opcode < ISD::BUILTIN_OP_END)
4544 break;
4545 [[fallthrough]];
4549 // Allow the target to implement this method for its nodes.
4550 TLI->computeKnownBitsForTargetNode(Op, Known, DemandedElts, *this, Depth);
4551 break;
4552 }
4553
4554 return Known;
4555}
4556
4557/// Convert ConstantRange OverflowResult into SelectionDAG::OverflowKind.
4570
4573 // X + 0 never overflow
4574 if (isNullConstant(N1))
4575 return OFK_Never;
4576
4577 // If both operands each have at least two sign bits, the addition
4578 // cannot overflow.
4579 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4580 return OFK_Never;
4581
4582 // TODO: Add ConstantRange::signedAddMayOverflow handling.
4583 return OFK_Sometime;
4584}
4585
4588 // X + 0 never overflow
4589 if (isNullConstant(N1))
4590 return OFK_Never;
4591
4592 // mulhi + 1 never overflow
4593 KnownBits N1Known = computeKnownBits(N1);
4594 if (N0.getOpcode() == ISD::UMUL_LOHI && N0.getResNo() == 1 &&
4595 N1Known.getMaxValue().ult(2))
4596 return OFK_Never;
4597
4598 KnownBits N0Known = computeKnownBits(N0);
4599 if (N1.getOpcode() == ISD::UMUL_LOHI && N1.getResNo() == 1 &&
4600 N0Known.getMaxValue().ult(2))
4601 return OFK_Never;
4602
4603 // Fallback to ConstantRange::unsignedAddMayOverflow handling.
4604 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4605 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4606 return mapOverflowResult(N0Range.unsignedAddMayOverflow(N1Range));
4607}
4608
4611 // X - 0 never overflow
4612 if (isNullConstant(N1))
4613 return OFK_Never;
4614
4615 // If both operands each have at least two sign bits, the subtraction
4616 // cannot overflow.
4617 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4618 return OFK_Never;
4619
4620 KnownBits N0Known = computeKnownBits(N0);
4621 KnownBits N1Known = computeKnownBits(N1);
4622 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, true);
4623 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, true);
4624 return mapOverflowResult(N0Range.signedSubMayOverflow(N1Range));
4625}
4626
4629 // X - 0 never overflow
4630 if (isNullConstant(N1))
4631 return OFK_Never;
4632
4633 ConstantRange N0Range =
4634 computeConstantRangeIncludingKnownBits(N0, /*ForSigned=*/false);
4635 ConstantRange N1Range =
4636 computeConstantRangeIncludingKnownBits(N1, /*ForSigned=*/false);
4637 return mapOverflowResult(N0Range.unsignedSubMayOverflow(N1Range));
4638}
4639
4642 // X * 0 and X * 1 never overflow.
4643 if (isNullConstant(N1) || isOneConstant(N1))
4644 return OFK_Never;
4645
4648 return mapOverflowResult(N0Range.unsignedMulMayOverflow(N1Range));
4649}
4650
4653 // X * 0 and X * 1 never overflow.
4654 if (isNullConstant(N1) || isOneConstant(N1))
4655 return OFK_Never;
4656
4657 // Get the size of the result.
4658 unsigned BitWidth = N0.getScalarValueSizeInBits();
4659
4660 // Sum of the sign bits.
4661 unsigned SignBits = ComputeNumSignBits(N0) + ComputeNumSignBits(N1);
4662
4663 // If we have enough sign bits, then there's no overflow.
4664 if (SignBits > BitWidth + 1)
4665 return OFK_Never;
4666
4667 if (SignBits == BitWidth + 1) {
4668 // The overflow occurs when the true multiplication of the
4669 // the operands is the minimum negative number.
4670 KnownBits N0Known = computeKnownBits(N0);
4671 KnownBits N1Known = computeKnownBits(N1);
4672 // If one of the operands is non-negative, then there's no
4673 // overflow.
4674 if (N0Known.isNonNegative() || N1Known.isNonNegative())
4675 return OFK_Never;
4676 }
4677
4678 return OFK_Sometime;
4679}
4680
4682 unsigned Depth) const {
4683 APInt DemandedElts = getDemandAllEltsMask(Op);
4684 return computeConstantRange(Op, DemandedElts, ForSigned, Depth);
4685}
4686
4688 const APInt &DemandedElts,
4689 bool ForSigned,
4690 unsigned Depth) const {
4691 EVT VT = Op.getValueType();
4692 unsigned BitWidth = VT.getScalarSizeInBits();
4693
4694 if (Depth >= MaxRecursionDepth)
4695 return ConstantRange::getFull(BitWidth);
4696
4697 if (ConstantSDNode *C = isConstOrConstSplat(Op, DemandedElts))
4698 return ConstantRange(C->getAPIntValue());
4699
4700 unsigned Opcode = Op.getOpcode();
4701 switch (Opcode) {
4702 case ISD::VSCALE: {
4704 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
4705 return getVScaleRange(&F, BitWidth).multiply(Multiplier);
4706 }
4707 default:
4708 break;
4709 }
4710
4711 return ConstantRange::getFull(BitWidth);
4712}
4713
4716 unsigned Depth) const {
4717 APInt DemandedElts = getDemandAllEltsMask(Op);
4718 return computeConstantRangeIncludingKnownBits(Op, DemandedElts, ForSigned,
4719 Depth);
4720}
4721
4723 SDValue Op, const APInt &DemandedElts, bool ForSigned,
4724 unsigned Depth) const {
4725 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
4727 ConstantRange CR2 = computeConstantRange(Op, DemandedElts, ForSigned, Depth);
4730 return CR1.intersectWith(CR2, RangeType);
4731}
4732
4734 unsigned Depth) const {
4735 APInt DemandedElts = getDemandAllEltsMask(Val);
4736 return isKnownToBeAPowerOfTwo(Val, DemandedElts, OrZero, Depth);
4737}
4738
4740 const APInt &DemandedElts,
4741 bool OrZero, unsigned Depth) const {
4742 if (Depth >= MaxRecursionDepth)
4743 return false; // Limit search depth.
4744
4745 EVT OpVT = Val.getValueType();
4746 unsigned BitWidth = OpVT.getScalarSizeInBits();
4747 [[maybe_unused]] unsigned NumElts = DemandedElts.getBitWidth();
4748 assert((!OpVT.isScalableVector() || NumElts == 1) &&
4749 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4750 assert(
4751 (!OpVT.isFixedLengthVector() || NumElts == OpVT.getVectorNumElements()) &&
4752 "Unexpected vector size");
4753
4754 auto IsPowerOfTwoOrZero = [BitWidth, OrZero](const ConstantSDNode *C) {
4755 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
4756 return (OrZero && V.isZero()) || V.isPowerOf2();
4757 };
4758
4759 // Is the constant a known power of 2 or zero?
4760 if (ISD::matchUnaryPredicate(Val, DemandedElts, IsPowerOfTwoOrZero,
4761 /*AllowUndefs=*/false, /*AllowTruncation=*/true))
4762 return true;
4763
4764 switch (Val.getOpcode()) {
4766 SDValue InVec = Val.getOperand(0);
4767 SDValue EltNo = Val.getOperand(1);
4768 EVT VecVT = InVec.getValueType();
4769
4770 // Skip scalable vectors or implicit extensions.
4771 if (VecVT.isScalableVector() ||
4772 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
4773 break;
4774
4775 // If we know the element index, just demand that vector element, else for
4776 // an unknown element index, ignore DemandedElts and demand them all.
4777 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4778 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4779 APInt DemandedSrcElts =
4780 ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts)
4781 ? APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue())
4782 : APInt::getAllOnes(NumSrcElts);
4783 return isKnownToBeAPowerOfTwo(InVec, DemandedSrcElts, OrZero, Depth + 1);
4784 }
4785
4786 case ISD::AND: {
4787 // Looking for `x & -x` pattern:
4788 // If x == 0:
4789 // x & -x -> 0
4790 // If x != 0:
4791 // x & -x -> non-zero pow2
4792 // so if we find the pattern return whether we know `x` is non-zero.
4793 SDValue X, Z;
4794 if (sd_match(Val, m_And(m_Value(X), m_Neg(m_Deferred(X)))) ||
4795 (sd_match(Val, m_And(m_Value(X), m_Sub(m_Value(Z), m_Deferred(X)))) &&
4796 MaskedVectorIsZero(Z, DemandedElts, Depth + 1)))
4797 return OrZero || isKnownNeverZero(X, DemandedElts, Depth);
4798 break;
4799 }
4800
4801 case ISD::SHL: {
4802 // A left-shift of a constant one will have exactly one bit set because
4803 // shifting the bit off the end is undefined.
4804 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4805 if (C && C->getAPIntValue() == 1)
4806 return true;
4807 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4808 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4809 Depth + 1);
4810 }
4811
4812 case ISD::SRL: {
4813 // A logical right-shift of a constant sign-bit will have exactly
4814 // one bit set.
4815 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4816 if (C && C->getAPIntValue().isSignMask())
4817 return true;
4818 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4819 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4820 Depth + 1);
4821 }
4822
4823 case ISD::TRUNCATE:
4824 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4825 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4826 Depth + 1);
4827
4828 case ISD::ROTL:
4829 case ISD::ROTR:
4830 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4831 Depth + 1);
4832 case ISD::BSWAP:
4833 case ISD::BITREVERSE:
4834 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4835 Depth + 1);
4836
4837 case ISD::SMIN:
4838 case ISD::SMAX:
4839 case ISD::UMIN:
4840 case ISD::UMAX:
4841 return isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4842 Depth + 1) &&
4843 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4844 Depth + 1);
4845
4846 case ISD::SELECT:
4847 case ISD::VSELECT:
4848 return isKnownToBeAPowerOfTwo(Val.getOperand(2), DemandedElts, OrZero,
4849 Depth + 1) &&
4850 isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4851 Depth + 1);
4852
4853 case ISD::ZERO_EXTEND:
4854 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4855 Depth + 1);
4856
4857 case ISD::VSCALE:
4858 // vscale(power-of-two) is a power-of-two
4859 return isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4860 Depth + 1);
4861
4862 case ISD::VECTOR_SHUFFLE: {
4864 // Demanded elements with undef shuffle mask elements are unknown
4865 // - we cannot guarantee they are a power of two, so return false.
4866 APInt DemandedLHS, DemandedRHS;
4868 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
4869 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
4870 DemandedLHS, DemandedRHS))
4871 return false;
4872
4873 // All demanded elements from LHS must be known power of two.
4874 if (!!DemandedLHS && !isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedLHS,
4875 OrZero, Depth + 1))
4876 return false;
4877
4878 // All demanded elements from RHS must be known power of two.
4879 if (!!DemandedRHS && !isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedRHS,
4880 OrZero, Depth + 1))
4881 return false;
4882
4883 return true;
4884 }
4885 }
4886
4887 // More could be done here, though the above checks are enough
4888 // to handle some common cases.
4889 return false;
4890}
4891
4893 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Val, true))
4894 return C1->getValueAPF().getExactLog2Abs() >= 0;
4895
4896 if (Val.getOpcode() == ISD::UINT_TO_FP || Val.getOpcode() == ISD::SINT_TO_FP)
4897 return isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth + 1);
4898
4899 return false;
4900}
4901
4903 APInt DemandedElts = getDemandAllEltsMask(Op);
4904 return ComputeNumSignBits(Op, DemandedElts, Depth);
4905}
4906
4907unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
4908 unsigned Depth) const {
4909 EVT VT = Op.getValueType();
4910 assert((VT.isInteger() || VT.isFloatingPoint()) && "Invalid VT!");
4911 unsigned VTBits = VT.getScalarSizeInBits();
4912 unsigned NumElts = DemandedElts.getBitWidth();
4913 unsigned Tmp, Tmp2;
4914 unsigned FirstAnswer = 1;
4915
4916 assert((!VT.isScalableVector() || NumElts == 1) &&
4917 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4918
4919 if (auto *C = dyn_cast<ConstantSDNode>(Op)) {
4920 const APInt &Val = C->getAPIntValue();
4921 return Val.getNumSignBits();
4922 }
4923
4924 if (Depth >= MaxRecursionDepth)
4925 return 1; // Limit search depth.
4926
4927 if (!DemandedElts)
4928 return 1; // No demanded elts, better to assume we don't know anything.
4929
4930 unsigned Opcode = Op.getOpcode();
4931 switch (Opcode) {
4932 default: break;
4933 case ISD::AssertSext:
4934 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4935 return VTBits-Tmp+1;
4936 case ISD::AssertZext:
4937 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4938 return VTBits-Tmp;
4939 case ISD::FREEZE:
4940 if (isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
4942 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4943 break;
4944 case ISD::MERGE_VALUES:
4945 return ComputeNumSignBits(Op.getOperand(Op.getResNo()), DemandedElts,
4946 Depth + 1);
4947 case ISD::SPLAT_VECTOR: {
4948 // Check if the sign bits of source go down as far as the truncated value.
4949 unsigned NumSrcBits = Op.getOperand(0).getValueSizeInBits();
4950 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4951 if (NumSrcSignBits > (NumSrcBits - VTBits))
4952 return NumSrcSignBits - (NumSrcBits - VTBits);
4953 break;
4954 }
4955 case ISD::BUILD_VECTOR:
4956 assert(!VT.isScalableVector());
4957 Tmp = VTBits;
4958 for (unsigned i = 0, e = Op.getNumOperands(); (i < e) && (Tmp > 1); ++i) {
4959 if (!DemandedElts[i])
4960 continue;
4961
4962 SDValue SrcOp = Op.getOperand(i);
4963 // BUILD_VECTOR can implicitly truncate sources, we handle this specially
4964 // for constant nodes to ensure we only look at the sign bits.
4966 APInt T = C->getAPIntValue().trunc(VTBits);
4967 Tmp2 = T.getNumSignBits();
4968 } else if (SrcOp.getOpcode() == ISD::EXTRACT_VECTOR_ELT &&
4969 SrcOp.getOperand(0).getScalarValueSizeInBits() >= VTBits) {
4970 // EXTRACT_VECTOR_ELT can extend the value with high bits undefined. If
4971 // this BUILD_VECTOR truncates those undefined bits we can just look
4972 // through the SrcOp and query the vector directly.
4973 SDValue InVec = SrcOp.getOperand(0);
4974 EVT InVecVT = InVec.getValueType();
4975
4976 APInt DemandedSrcElts;
4977 if (InVecVT.isScalableVector())
4978 // Demand all elements.
4979 DemandedSrcElts = APInt(1, 1);
4980 else {
4981 unsigned NumSrcElts = InVecVT.getVectorNumElements();
4982 auto *ConstEltNo = dyn_cast<ConstantSDNode>(SrcOp.getOperand(1));
4983 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
4984 DemandedSrcElts =
4985 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
4986 else
4987 DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
4988 }
4989
4990 Tmp2 = ComputeNumSignBits(InVec, DemandedSrcElts, Depth + 1);
4991 unsigned ExtraBits = InVec.getScalarValueSizeInBits() - VTBits;
4992 if (ExtraBits)
4993 Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1);
4994 } else {
4995 Tmp2 = ComputeNumSignBits(SrcOp, Depth + 1);
4996
4997 if (SrcOp.getValueSizeInBits() != VTBits) {
4998 assert(SrcOp.getValueSizeInBits() > VTBits &&
4999 "Expected BUILD_VECTOR implicit truncation");
5000 unsigned ExtraBits = SrcOp.getValueSizeInBits() - VTBits;
5001 Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1);
5002 }
5003 }
5004 Tmp = std::min(Tmp, Tmp2);
5005 }
5006 return Tmp;
5007
5008 case ISD::VECTOR_COMPRESS: {
5009 SDValue Vec = Op.getOperand(0);
5010 SDValue PassThru = Op.getOperand(2);
5011 Tmp = ComputeNumSignBits(PassThru, DemandedElts, Depth + 1);
5012 if (Tmp == 1)
5013 return 1;
5014 Tmp2 = ComputeNumSignBits(Vec, Depth + 1);
5015 Tmp = std::min(Tmp, Tmp2);
5016 return Tmp;
5017 }
5018
5019 case ISD::VECTOR_SHUFFLE: {
5020 // Collect the minimum number of sign bits that are shared by every vector
5021 // element referenced by the shuffle.
5022 APInt DemandedLHS, DemandedRHS;
5024 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
5025 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
5026 DemandedLHS, DemandedRHS))
5027 return 1;
5028
5029 Tmp = std::numeric_limits<unsigned>::max();
5030 if (!!DemandedLHS)
5031 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedLHS, Depth + 1);
5032 if (!!DemandedRHS) {
5033 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedRHS, Depth + 1);
5034 Tmp = std::min(Tmp, Tmp2);
5035 }
5036 // If we don't know anything, early out and try computeKnownBits fall-back.
5037 if (Tmp == 1)
5038 break;
5039 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5040 return Tmp;
5041 }
5042
5043 case ISD::BITCAST: {
5044 if (VT.isScalableVector())
5045 break;
5046 SDValue N0 = Op.getOperand(0);
5047 EVT SrcVT = N0.getValueType();
5048 unsigned SrcBits = SrcVT.getScalarSizeInBits();
5049
5050 // Ignore bitcasts from unsupported types..
5051 if (!(SrcVT.isInteger() || SrcVT.isFloatingPoint()))
5052 break;
5053
5054 // Fast handling of 'identity' bitcasts.
5055 if (VTBits == SrcBits)
5056 return ComputeNumSignBits(N0, DemandedElts, Depth + 1);
5057
5058 bool IsLE = getDataLayout().isLittleEndian();
5059
5060 // Bitcast 'large element' scalar/vector to 'small element' vector.
5061 if ((SrcBits % VTBits) == 0) {
5062 assert(VT.isVector() && "Expected bitcast to vector");
5063
5064 unsigned Scale = SrcBits / VTBits;
5065 APInt SrcDemandedElts =
5066 APIntOps::ScaleBitMask(DemandedElts, NumElts / Scale);
5067
5068 // Fast case - sign splat can be simply split across the small elements.
5069 Tmp = ComputeNumSignBits(N0, SrcDemandedElts, Depth + 1);
5070 if (Tmp == SrcBits)
5071 return VTBits;
5072
5073 // Slow case - determine how far the sign extends into each sub-element.
5074 Tmp2 = VTBits;
5075 for (unsigned i = 0; i != NumElts; ++i)
5076 if (DemandedElts[i]) {
5077 unsigned SubOffset = i % Scale;
5078 SubOffset = (IsLE ? ((Scale - 1) - SubOffset) : SubOffset);
5079 SubOffset = SubOffset * VTBits;
5080 if (Tmp <= SubOffset)
5081 return 1;
5082 Tmp2 = std::min(Tmp2, Tmp - SubOffset);
5083 }
5084 return Tmp2;
5085 }
5086 break;
5087 }
5088
5090 // FP_TO_SINT_SAT produces a signed value that fits in the saturating VT.
5091 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
5092 return VTBits - Tmp + 1;
5093 case ISD::SIGN_EXTEND:
5094 Tmp = VTBits - Op.getOperand(0).getScalarValueSizeInBits();
5095 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1) + Tmp;
5097 // Max of the input and what this extends.
5098 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
5099 Tmp = VTBits-Tmp+1;
5100 Tmp2 = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5101 return std::max(Tmp, Tmp2);
5103 if (VT.isScalableVector())
5104 break;
5105 SDValue Src = Op.getOperand(0);
5106 EVT SrcVT = Src.getValueType();
5107 APInt DemandedSrcElts = DemandedElts.zext(SrcVT.getVectorNumElements());
5108 Tmp = VTBits - SrcVT.getScalarSizeInBits();
5109 return ComputeNumSignBits(Src, DemandedSrcElts, Depth+1) + Tmp;
5110 }
5111 case ISD::SRA:
5112 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5113 // SRA X, C -> adds C sign bits.
5114 if (std::optional<unsigned> ShAmt =
5115 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
5116 Tmp = std::min(Tmp + *ShAmt, VTBits);
5117 return Tmp;
5118 case ISD::SHL:
5119 if (std::optional<ConstantRange> ShAmtRange =
5120 getValidShiftAmountRange(Op, DemandedElts, Depth + 1)) {
5121 unsigned MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
5122 unsigned MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
5123 // Try to look through ZERO/SIGN/ANY_EXTEND. If all extended bits are
5124 // shifted out, then we can compute the number of sign bits for the
5125 // operand being extended. A future improvement could be to pass along the
5126 // "shifted left by" information in the recursive calls to
5127 // ComputeKnownSignBits. Allowing us to handle this more generically.
5128 if (ISD::isExtOpcode(Op.getOperand(0).getOpcode())) {
5129 SDValue Ext = Op.getOperand(0);
5130 EVT ExtVT = Ext.getValueType();
5131 SDValue Extendee = Ext.getOperand(0);
5132 EVT ExtendeeVT = Extendee.getValueType();
5133 unsigned SizeDifference =
5134 ExtVT.getScalarSizeInBits() - ExtendeeVT.getScalarSizeInBits();
5135 if (SizeDifference <= MinShAmt) {
5136 Tmp = SizeDifference +
5137 ComputeNumSignBits(Extendee, DemandedElts, Depth + 1);
5138 if (MaxShAmt < Tmp)
5139 return Tmp - MaxShAmt;
5140 }
5141 }
5142 // shl destroys sign bits, ensure it doesn't shift out all sign bits.
5143 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5144 if (MaxShAmt < Tmp)
5145 return Tmp - MaxShAmt;
5146 }
5147 break;
5148 case ISD::AND:
5149 case ISD::OR:
5150 case ISD::XOR: // NOT is handled here.
5151 // Logical binary ops preserve the number of sign bits at the worst.
5152 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5153 if (Tmp != 1) {
5154 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5155 FirstAnswer = std::min(Tmp, Tmp2);
5156 // We computed what we know about the sign bits as our first
5157 // answer. Now proceed to the generic code that uses
5158 // computeKnownBits, and pick whichever answer is better.
5159 }
5160 break;
5161
5162 case ISD::SELECT:
5163 case ISD::VSELECT:
5164 Tmp = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5165 if (Tmp == 1) return 1; // Early out.
5166 Tmp2 = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5167 return std::min(Tmp, Tmp2);
5168 case ISD::SELECT_CC:
5169 Tmp = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5170 if (Tmp == 1) return 1; // Early out.
5171 Tmp2 = ComputeNumSignBits(Op.getOperand(3), DemandedElts, Depth+1);
5172 return std::min(Tmp, Tmp2);
5173
5174 case ISD::SMIN:
5175 case ISD::SMAX: {
5176 // If we have a clamp pattern, we know that the number of sign bits will be
5177 // the minimum of the clamp min/max range.
5178 bool IsMax = (Opcode == ISD::SMAX);
5179 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
5180 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
5181 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
5182 CstHigh =
5183 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
5184 if (CstLow && CstHigh) {
5185 if (!IsMax)
5186 std::swap(CstLow, CstHigh);
5187 if (CstLow->getAPIntValue().sle(CstHigh->getAPIntValue())) {
5188 Tmp = CstLow->getAPIntValue().getNumSignBits();
5189 Tmp2 = CstHigh->getAPIntValue().getNumSignBits();
5190 return std::min(Tmp, Tmp2);
5191 }
5192 }
5193
5194 // Fallback - just get the minimum number of sign bits of the operands.
5195 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5196 if (Tmp == 1)
5197 return 1; // Early out.
5198 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5199 return std::min(Tmp, Tmp2);
5200 }
5201 case ISD::UMIN:
5202 case ISD::UMAX:
5203 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5204 if (Tmp == 1)
5205 return 1; // Early out.
5206 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5207 return std::min(Tmp, Tmp2);
5208 case ISD::SSUBO_CARRY:
5209 case ISD::USUBO_CARRY:
5210 // sub_carry(x,x,c) -> 0/-1 (sext carry)
5211 if (Op.getResNo() == 0 && Op.getOperand(0) == Op.getOperand(1))
5212 return VTBits;
5213 [[fallthrough]];
5214 case ISD::SADDO:
5215 case ISD::UADDO:
5216 case ISD::SADDO_CARRY:
5217 case ISD::UADDO_CARRY:
5218 case ISD::SSUBO:
5219 case ISD::USUBO:
5220 case ISD::SMULO:
5221 case ISD::UMULO:
5222 if (Op.getResNo() != 1)
5223 break;
5224 // The boolean result conforms to getBooleanContents. Fall through.
5225 // If setcc returns 0/-1, all bits are sign bits.
5226 // We know that we have an integer-based boolean since these operations
5227 // are only available for integer.
5228 if (TLI->getBooleanContents(VT.isVector(), false) ==
5230 return VTBits;
5231 break;
5232 case ISD::SETCC:
5233 case ISD::SETCCCARRY:
5234 case ISD::STRICT_FSETCC:
5235 case ISD::STRICT_FSETCCS: {
5236 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
5237 // If setcc returns 0/-1, all bits are sign bits.
5238 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
5240 return VTBits;
5241 break;
5242 }
5244 // Semantically similar to icmp ult.
5245 if (TLI->getBooleanContents(VT.isVector(), /*isFloat=*/false) ==
5247 return VTBits;
5248 break;
5249 case ISD::ROTL:
5250 case ISD::ROTR: {
5251 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5252 ConstantSDNode *C = isConstOrConstSplat(Op.getOperand(1), DemandedElts);
5253 FirstAnswer = SignBitsOps::rot(
5254 Tmp, VTBits, C ? std::optional(C->getAPIntValue()) : std::nullopt,
5255 Opcode == ISD::ROTR);
5256 break;
5257 }
5258 case ISD::ADD:
5259 case ISD::ADDC:
5260 // TODO: Move Operand 1 check before Operand 0 check
5261 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5262 if (Tmp == 1) return 1; // Early out.
5263
5264 // Special case decrementing a value (ADD X, -1):
5265 if (ConstantSDNode *CRHS =
5266 isConstOrConstSplat(Op.getOperand(1), DemandedElts))
5267 if (CRHS->isAllOnes()) {
5269 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
5270
5271 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5272 // sign bits set.
5273 if ((Known.Zero | 1).isAllOnes())
5274 return VTBits;
5275
5276 // If we are subtracting one from a positive number, there is no carry
5277 // out of the result.
5278 if (Known.isNonNegative())
5279 return Tmp;
5280 }
5281
5282 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5283 if (Tmp2 == 1) return 1; // Early out.
5284
5285 // Add can have at most one carry bit. Thus we know that the output
5286 // is, at worst, one more bit than the inputs.
5287 return std::min(Tmp, Tmp2) - 1;
5288 case ISD::SUB:
5289 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5290 if (Tmp2 == 1) return 1; // Early out.
5291
5292 // Handle NEG.
5293 if (ConstantSDNode *CLHS =
5294 isConstOrConstSplat(Op.getOperand(0), DemandedElts))
5295 if (CLHS->isZero()) {
5297 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
5298 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5299 // sign bits set.
5300 if ((Known.Zero | 1).isAllOnes())
5301 return VTBits;
5302
5303 // If the input is known to be positive (the sign bit is known clear),
5304 // the output of the NEG has the same number of sign bits as the input.
5305 if (Known.isNonNegative())
5306 return Tmp2;
5307
5308 // Otherwise, we treat this like a SUB.
5309 }
5310
5311 // Sub can have at most one carry bit. Thus we know that the output
5312 // is, at worst, one more bit than the inputs.
5313 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5314 if (Tmp == 1) return 1; // Early out.
5315 return std::min(Tmp, Tmp2) - 1;
5316 case ISD::MUL: {
5317 // The output of the Mul can be at most twice the valid bits in the inputs.
5318 unsigned SignBitsOp0 = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5319 if (SignBitsOp0 == 1)
5320 break;
5321 unsigned SignBitsOp1 = ComputeNumSignBits(Op.getOperand(1), Depth + 1);
5322 if (SignBitsOp1 == 1)
5323 break;
5324 unsigned OutValidBits =
5325 (VTBits - SignBitsOp0 + 1) + (VTBits - SignBitsOp1 + 1);
5326 return OutValidBits > VTBits ? 1 : VTBits - OutValidBits + 1;
5327 }
5328 case ISD::AVGCEILS:
5329 case ISD::AVGFLOORS:
5330 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5331 if (Tmp == 1)
5332 return 1; // Early out.
5333 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5334 return std::min(Tmp, Tmp2);
5335 case ISD::SREM:
5336 // The sign bit is the LHS's sign bit, except when the result of the
5337 // remainder is zero. The magnitude of the result should be less than or
5338 // equal to the magnitude of the LHS. Therefore, the result should have
5339 // at least as many sign bits as the left hand side.
5340 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5341 case ISD::TRUNCATE: {
5342 // Check if the sign bits of source go down as far as the truncated value.
5343 unsigned NumSrcBits = Op.getOperand(0).getScalarValueSizeInBits();
5344 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5345 if (NumSrcSignBits > (NumSrcBits - VTBits))
5346 return NumSrcSignBits - (NumSrcBits - VTBits);
5347 break;
5348 }
5349 case ISD::EXTRACT_ELEMENT: {
5350 if (VT.isScalableVector())
5351 break;
5352 const int KnownSign = ComputeNumSignBits(Op.getOperand(0), Depth+1);
5353 const int BitWidth = Op.getValueSizeInBits();
5354 const int Items = Op.getOperand(0).getValueSizeInBits() / BitWidth;
5355
5356 // Get reverse index (starting from 1), Op1 value indexes elements from
5357 // little end. Sign starts at big end.
5358 const int rIndex = Items - 1 - Op.getConstantOperandVal(1);
5359
5360 // If the sign portion ends in our element the subtraction gives correct
5361 // result. Otherwise it gives either negative or > bitwidth result
5362 return std::clamp(KnownSign - rIndex * BitWidth, 1, BitWidth);
5363 }
5365 if (VT.isScalableVector())
5366 break;
5367 // If we know the element index, split the demand between the
5368 // source vector and the inserted element, otherwise assume we need
5369 // the original demanded vector elements and the value.
5370 SDValue InVec = Op.getOperand(0);
5371 SDValue InVal = Op.getOperand(1);
5372 SDValue EltNo = Op.getOperand(2);
5373 bool DemandedVal = true;
5374 APInt DemandedVecElts = DemandedElts;
5375 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
5376 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
5377 unsigned EltIdx = CEltNo->getZExtValue();
5378 DemandedVal = !!DemandedElts[EltIdx];
5379 DemandedVecElts.clearBit(EltIdx);
5380 }
5381 Tmp = std::numeric_limits<unsigned>::max();
5382 if (DemandedVal) {
5383 // TODO - handle implicit truncation of inserted elements.
5384 if (InVal.getScalarValueSizeInBits() != VTBits)
5385 break;
5386 Tmp2 = ComputeNumSignBits(InVal, Depth + 1);
5387 Tmp = std::min(Tmp, Tmp2);
5388 }
5389 if (!!DemandedVecElts) {
5390 Tmp2 = ComputeNumSignBits(InVec, DemandedVecElts, Depth + 1);
5391 Tmp = std::min(Tmp, Tmp2);
5392 }
5393 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5394 return Tmp;
5395 }
5397 SDValue InVec = Op.getOperand(0);
5398 SDValue EltNo = Op.getOperand(1);
5399 EVT VecVT = InVec.getValueType();
5400 // ComputeNumSignBits not yet implemented for scalable vectors.
5401 if (VecVT.isScalableVector())
5402 break;
5403 const unsigned BitWidth = Op.getValueSizeInBits();
5404 const unsigned EltBitWidth = Op.getOperand(0).getScalarValueSizeInBits();
5405 const unsigned NumSrcElts = VecVT.getVectorNumElements();
5406
5407 // If BitWidth > EltBitWidth the value is anyext:ed, and we do not know
5408 // anything about sign bits. But if the sizes match we can derive knowledge
5409 // about sign bits from the vector operand.
5410 if (BitWidth != EltBitWidth)
5411 break;
5412
5413 // If we know the element index, just demand that vector element, else for
5414 // an unknown element index, ignore DemandedElts and demand them all.
5415 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
5416 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
5417 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
5418 DemandedSrcElts =
5419 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
5420
5421 return ComputeNumSignBits(InVec, DemandedSrcElts, Depth + 1);
5422 }
5424 // Offset the demanded elts by the subvector index.
5425 SDValue Src = Op.getOperand(0);
5426
5427 APInt DemandedSrcElts;
5428 if (Src.getValueType().isScalableVector())
5429 DemandedSrcElts = APInt(1, 1);
5430 else {
5431 uint64_t Idx = Op.getConstantOperandVal(1);
5432 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5433 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5434 }
5435 return ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5436 }
5437 case ISD::CONCAT_VECTORS: {
5438 if (VT.isScalableVector())
5439 break;
5440 // Determine the minimum number of sign bits across all demanded
5441 // elts of the input vectors. Early out if the result is already 1.
5442 Tmp = std::numeric_limits<unsigned>::max();
5443 EVT SubVectorVT = Op.getOperand(0).getValueType();
5444 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
5445 unsigned NumSubVectors = Op.getNumOperands();
5446 for (unsigned i = 0; (i < NumSubVectors) && (Tmp > 1); ++i) {
5447 APInt DemandedSub =
5448 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
5449 if (!DemandedSub)
5450 continue;
5451 Tmp2 = ComputeNumSignBits(Op.getOperand(i), DemandedSub, Depth + 1);
5452 Tmp = std::min(Tmp, Tmp2);
5453 }
5454 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5455 return Tmp;
5456 }
5457 case ISD::INSERT_SUBVECTOR: {
5458 SDValue Src = Op.getOperand(0);
5459 SDValue Sub = Op.getOperand(1);
5460 if (VT.isScalableVector()) {
5461 Tmp = ComputeNumSignBits(Sub, Depth + 1);
5462 Tmp = std::min(Tmp, ComputeNumSignBits(Src, Depth + 1));
5463 return Tmp;
5464 }
5465 // Demand any elements from the subvector and the remainder from the src its
5466 // inserted into.
5467 uint64_t Idx = Op.getConstantOperandVal(2);
5468 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5469 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5470 APInt DemandedSrcElts = DemandedElts;
5471 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5472
5473 Tmp = std::numeric_limits<unsigned>::max();
5474 if (!!DemandedSubElts) {
5475 Tmp = ComputeNumSignBits(Sub, DemandedSubElts, Depth + 1);
5476 if (Tmp == 1)
5477 return 1; // early-out
5478 }
5479 if (!!DemandedSrcElts) {
5480 Tmp2 = ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5481 Tmp = std::min(Tmp, Tmp2);
5482 }
5483 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5484 return Tmp;
5485 }
5486 case ISD::LOAD: {
5487 // If we are looking at the loaded value of the SDNode.
5488 if (Op.getResNo() != 0)
5489 break;
5490
5492 if (const MDNode *Ranges = LD->getRanges()) {
5493 if (DemandedElts != 1)
5494 break;
5495
5497 if (VTBits > CR.getBitWidth()) {
5498 switch (LD->getExtensionType()) {
5499 case ISD::SEXTLOAD:
5500 CR = CR.signExtend(VTBits);
5501 break;
5502 case ISD::ZEXTLOAD:
5503 CR = CR.zeroExtend(VTBits);
5504 break;
5505 default:
5506 break;
5507 }
5508 }
5509
5510 if (VTBits != CR.getBitWidth())
5511 break;
5512 return std::min(CR.getSignedMin().getNumSignBits(),
5514 }
5515
5516 unsigned ExtType = LD->getExtensionType();
5517 switch (ExtType) {
5518 default:
5519 break;
5520 case ISD::SEXTLOAD: // e.g. i16->i32 = '17' bits known.
5521 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5522 return VTBits - Tmp + 1;
5523 case ISD::ZEXTLOAD: // e.g. i16->i32 = '16' bits known.
5524 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5525 return VTBits - Tmp;
5526 case ISD::NON_EXTLOAD:
5527 if (const Constant *Cst = TLI->getTargetConstantFromLoad(LD)) {
5528 // We only need to handle vectors - computeKnownBits should handle
5529 // scalar cases.
5530 Type *CstTy = Cst->getType();
5531 if (CstTy->isVectorTy() && !VT.isScalableVector() &&
5532 (NumElts * VTBits) == CstTy->getPrimitiveSizeInBits() &&
5533 VTBits == CstTy->getScalarSizeInBits()) {
5534 Tmp = VTBits;
5535 for (unsigned i = 0; i != NumElts; ++i) {
5536 if (!DemandedElts[i])
5537 continue;
5538 if (Constant *Elt = Cst->getAggregateElement(i)) {
5539 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
5540 const APInt &Value = CInt->getValue();
5541 Tmp = std::min(Tmp, Value.getNumSignBits());
5542 continue;
5543 }
5544 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
5545 APInt Value = CFP->getValueAPF().bitcastToAPInt();
5546 Tmp = std::min(Tmp, Value.getNumSignBits());
5547 continue;
5548 }
5549 }
5550 // Unknown type. Conservatively assume no bits match sign bit.
5551 return 1;
5552 }
5553 return Tmp;
5554 }
5555 }
5556 break;
5557 }
5558
5559 break;
5560 }
5563 case ISD::ATOMIC_SWAP:
5575 case ISD::ATOMIC_LOAD: {
5576 auto *AT = cast<AtomicSDNode>(Op);
5577 // If we are looking at the loaded value.
5578 if (Op.getResNo() == 0) {
5579 Tmp = AT->getMemoryVT().getScalarSizeInBits();
5580 if (Tmp == VTBits)
5581 return 1; // early-out
5582
5583 // For atomic_load, prefer to use the extension type.
5584 if (Op->getOpcode() == ISD::ATOMIC_LOAD) {
5585 switch (AT->getExtensionType()) {
5586 default:
5587 break;
5588 case ISD::SEXTLOAD:
5589 return VTBits - Tmp + 1;
5590 case ISD::ZEXTLOAD:
5591 return VTBits - Tmp;
5592 }
5593 }
5594
5595 if (TLI->getExtendForAtomicOps() == ISD::SIGN_EXTEND)
5596 return VTBits - Tmp + 1;
5597 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
5598 return VTBits - Tmp;
5599 }
5600 break;
5601 }
5602 }
5603
5604 // Allow the target to implement this method for its nodes.
5605 if (Opcode >= ISD::BUILTIN_OP_END ||
5606 Opcode == ISD::INTRINSIC_WO_CHAIN ||
5607 Opcode == ISD::INTRINSIC_W_CHAIN ||
5608 Opcode == ISD::INTRINSIC_VOID) {
5609 // TODO: This can probably be removed once target code is audited. This
5610 // is here purely to reduce patch size and review complexity.
5611 if (!VT.isScalableVector()) {
5612 unsigned NumBits =
5613 TLI->ComputeNumSignBitsForTargetNode(Op, DemandedElts, *this, Depth);
5614 if (NumBits > 1)
5615 FirstAnswer = std::max(FirstAnswer, NumBits);
5616 }
5617 }
5618
5619 // Finally, if we can prove that the top bits of the result are 0's or 1's,
5620 // use this information.
5621 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
5622 return std::max(FirstAnswer, Known.countMinSignBits());
5623}
5624
5626 unsigned Depth) const {
5627 unsigned SignBits = ComputeNumSignBits(Op, Depth);
5628 return Op.getScalarValueSizeInBits() - SignBits + 1;
5629}
5630
5632 const APInt &DemandedElts,
5633 unsigned Depth) const {
5634 unsigned SignBits = ComputeNumSignBits(Op, DemandedElts, Depth);
5635 return Op.getScalarValueSizeInBits() - SignBits + 1;
5636}
5637
5639 UndefPoisonKind Kind,
5640 unsigned Depth) const {
5641 // Early out for FREEZE.
5642 if (Op.getOpcode() == ISD::FREEZE)
5643 return true;
5644
5645 APInt DemandedElts = getDemandAllEltsMask(Op);
5646 return isGuaranteedNotToBeUndefOrPoison(Op, DemandedElts, Kind, Depth);
5647}
5648
5650 const APInt &DemandedElts,
5651 UndefPoisonKind Kind,
5652 unsigned Depth) const {
5653 unsigned Opcode = Op.getOpcode();
5654
5655 // Early out for FREEZE.
5656 if (Opcode == ISD::FREEZE)
5657 return true;
5658
5659 if (Depth >= MaxRecursionDepth)
5660 return false; // Limit search depth.
5661
5662 if (isIntOrFPConstant(Op))
5663 return true;
5664
5665 switch (Opcode) {
5666 case ISD::CONDCODE:
5667 case ISD::VALUETYPE:
5668 case ISD::FrameIndex:
5670 case ISD::CopyFromReg:
5671 return true;
5672
5673 case ISD::POISON:
5674 return !includesPoison(Kind);
5675
5676 case ISD::UNDEF:
5677 return !includesUndef(Kind);
5678
5679 case ISD::BITCAST: {
5680 SDValue Src = Op.getOperand(0);
5681 EVT SrcVT = Src.getValueType();
5682 EVT DstVT = Op.getValueType();
5683
5684 if (!SrcVT.isVector() || !DstVT.isVector())
5685 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5686
5687 unsigned SrcEltBits = SrcVT.getScalarSizeInBits();
5688 unsigned DstEltBits = DstVT.getScalarSizeInBits();
5689 ElementCount NumSrcElts = SrcVT.getVectorElementCount();
5690 [[maybe_unused]] ElementCount NumDstElts = DstVT.getVectorElementCount();
5691
5692 if (SrcEltBits == DstEltBits)
5693 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedElts, Kind,
5694 Depth + 1);
5695
5696 if (SrcEltBits < DstEltBits) {
5697 if (DstEltBits % SrcEltBits != 0)
5698 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5699
5700 assert(NumSrcElts == NumDstElts * (DstEltBits / SrcEltBits) &&
5701 "Unexpected vector bitcast");
5702 APInt DemandedSrcElts =
5703 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts.getKnownMinValue());
5704 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5705 Depth + 1);
5706 }
5707
5708 if (SrcEltBits % DstEltBits != 0)
5709 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5710
5711 assert(NumDstElts == NumSrcElts * (SrcEltBits / DstEltBits) &&
5712 "Unexpected vector bitcast");
5713 APInt DemandedSrcElts =
5714 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts.getKnownMinValue());
5715 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5716 Depth + 1);
5717 }
5718
5719 case ISD::BUILD_VECTOR:
5720 // NOTE: BUILD_VECTOR has implicit truncation of wider scalar elements -
5721 // this shouldn't affect the result.
5722 for (unsigned i = 0, e = Op.getNumOperands(); i < e; ++i) {
5723 if (!DemandedElts[i])
5724 continue;
5725 if (!isGuaranteedNotToBeUndefOrPoison(Op.getOperand(i), Kind, Depth + 1))
5726 return false;
5727 }
5728 return true;
5729
5730 case ISD::CONCAT_VECTORS: {
5731 EVT VT = Op.getValueType();
5732 if (!VT.isFixedLengthVector())
5733 break;
5734
5735 EVT SubVT = Op.getOperand(0).getValueType();
5736 unsigned NumSubElts = SubVT.getVectorNumElements();
5737 for (unsigned I = 0, E = Op.getNumOperands(); I != E; ++I) {
5738 APInt DemandedSubElts =
5739 DemandedElts.extractBits(NumSubElts, I * NumSubElts);
5740 if (!!DemandedSubElts &&
5741 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(I), DemandedSubElts,
5742 Kind, Depth + 1))
5743 return false;
5744 }
5745 return true;
5746 }
5747
5749 SDValue Src = Op.getOperand(0);
5750 if (Src.getValueType().isScalableVector())
5751 break;
5752 uint64_t Idx = Op.getConstantOperandVal(1);
5753 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5754 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5755 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5756 Depth + 1);
5757 }
5758
5759 case ISD::INSERT_SUBVECTOR: {
5760 if (Op.getValueType().isScalableVector())
5761 break;
5762 SDValue Src = Op.getOperand(0);
5763 SDValue Sub = Op.getOperand(1);
5764 uint64_t Idx = Op.getConstantOperandVal(2);
5765 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5766 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5767 APInt DemandedSrcElts = DemandedElts;
5768 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5769
5770 if (!!DemandedSubElts && !isGuaranteedNotToBeUndefOrPoison(
5771 Sub, DemandedSubElts, Kind, Depth + 1))
5772 return false;
5773 if (!!DemandedSrcElts && !isGuaranteedNotToBeUndefOrPoison(
5774 Src, DemandedSrcElts, Kind, Depth + 1))
5775 return false;
5776 return true;
5777 }
5778
5780 SDValue Src = Op.getOperand(0);
5781 auto *IndexC = dyn_cast<ConstantSDNode>(Op.getOperand(1));
5782 EVT SrcVT = Src.getValueType();
5783 if (SrcVT.isFixedLengthVector() && IndexC &&
5784 IndexC->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
5785 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
5786 IndexC->getZExtValue());
5787 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5788 Depth + 1);
5789 }
5790 break;
5791 }
5792
5794 SDValue InVec = Op.getOperand(0);
5795 SDValue InVal = Op.getOperand(1);
5796 SDValue EltNo = Op.getOperand(2);
5797 EVT VT = InVec.getValueType();
5798 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
5799 if (IndexC && VT.isFixedLengthVector() &&
5800 IndexC->getAPIntValue().ult(VT.getVectorNumElements())) {
5801 if (DemandedElts[IndexC->getZExtValue()] &&
5802 !isGuaranteedNotToBeUndefOrPoison(InVal, Kind, Depth + 1))
5803 return false;
5804 APInt InVecDemandedElts = DemandedElts;
5805 InVecDemandedElts.clearBit(IndexC->getZExtValue());
5806 if (!!InVecDemandedElts &&
5808 peekThroughInsertVectorElt(InVec, InVecDemandedElts),
5809 InVecDemandedElts, Kind, Depth + 1))
5810 return false;
5811 return true;
5812 }
5813 break;
5814 }
5815
5817 // Check upper (known undef) elements.
5818 if (DemandedElts.ugt(1) && includesUndef(Kind))
5819 return false;
5820 // Check element zero.
5821 if (DemandedElts[0] &&
5822 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind, Depth + 1))
5823 return false;
5824 return true;
5825
5826 case ISD::SPLAT_VECTOR:
5827 return isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind, Depth + 1);
5828
5829 case ISD::SELECT: {
5830 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5831 /*ConsiderFlags*/ true, Depth) &&
5832 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind,
5833 Depth + 1) &&
5834 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(1), DemandedElts,
5835 Kind, Depth + 1) &&
5836 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(2), DemandedElts,
5837 Kind, Depth + 1);
5838 }
5839
5840 case ISD::VECTOR_SHUFFLE: {
5841 APInt DemandedLHS, DemandedRHS;
5842 auto *SVN = cast<ShuffleVectorSDNode>(Op);
5843 if (!getShuffleDemandedElts(DemandedElts.getBitWidth(), SVN->getMask(),
5844 DemandedElts, DemandedLHS, DemandedRHS,
5845 /*AllowUndefElts=*/false))
5846 return false;
5847 if (!DemandedLHS.isZero() &&
5848 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedLHS, Kind,
5849 Depth + 1))
5850 return false;
5851 if (!DemandedRHS.isZero() &&
5852 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(1), DemandedRHS, Kind,
5853 Depth + 1))
5854 return false;
5855 return true;
5856 }
5857
5858 case ISD::SHL:
5859 case ISD::SRL:
5860 case ISD::SRA:
5861 // Shift amount operand is checked by canCreateUndefOrPoison. So it is
5862 // enough to check operand 0 if Op can't create undef/poison.
5863 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5864 /*ConsiderFlags*/ true, Depth) &&
5865 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
5866 Kind, Depth + 1);
5867
5868 case ISD::BSWAP:
5869 case ISD::CTPOP:
5870 case ISD::BITREVERSE:
5871 case ISD::AND:
5872 case ISD::OR:
5873 case ISD::XOR:
5874 case ISD::ADD:
5875 case ISD::SUB:
5876 case ISD::MUL:
5877 case ISD::SADDSAT:
5878 case ISD::UADDSAT:
5879 case ISD::SSUBSAT:
5880 case ISD::USUBSAT:
5881 case ISD::SSHLSAT:
5882 case ISD::USHLSAT:
5883 case ISD::SMIN:
5884 case ISD::SMAX:
5885 case ISD::UMIN:
5886 case ISD::UMAX:
5887 case ISD::ZERO_EXTEND:
5888 case ISD::SIGN_EXTEND:
5889 case ISD::ANY_EXTEND:
5890 case ISD::TRUNCATE:
5891 case ISD::VSELECT: {
5892 // If Op can't create undef/poison and none of its operands are undef/poison
5893 // then Op is never undef/poison. A difference from the more common check
5894 // below, outside the switch, is that we handle elementwise operations for
5895 // which the DemandedElts mask is valid for all operands here.
5896 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5897 /*ConsiderFlags*/ true, Depth) &&
5898 all_of(Op->ops(), [&](SDValue V) {
5899 return isGuaranteedNotToBeUndefOrPoison(V, DemandedElts, Kind,
5900 Depth + 1);
5901 });
5902 }
5903
5904 // TODO: Search for noundef attributes from library functions.
5905
5906 // TODO: Pointers dereferenced by ISD::LOAD/STORE ops are noundef.
5907
5908 default:
5909 // Allow the target to implement this method for its nodes.
5910 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
5911 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
5912 return TLI->isGuaranteedNotToBeUndefOrPoisonForTargetNode(
5913 Op, DemandedElts, *this, Kind, Depth);
5914 break;
5915 }
5916
5917 // If Op can't create undef/poison and none of its operands are undef/poison
5918 // then Op is never undef/poison.
5919 // NOTE: TargetNodes can handle this in themselves in
5920 // isGuaranteedNotToBeUndefOrPoisonForTargetNode or let
5921 // TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode handle it.
5922 return !canCreateUndefOrPoison(Op, Kind, /*ConsiderFlags*/ true, Depth) &&
5923 all_of(Op->ops(), [&](SDValue V) {
5924 return isGuaranteedNotToBeUndefOrPoison(V, Kind, Depth + 1);
5925 });
5926}
5927
5929 bool ConsiderFlags,
5930 unsigned Depth) const {
5931 APInt DemandedElts = getDemandAllEltsMask(Op);
5932 return canCreateUndefOrPoison(Op, DemandedElts, Kind, ConsiderFlags, Depth);
5933}
5934
5936 UndefPoisonKind Kind,
5937 bool ConsiderFlags,
5938 unsigned Depth) const {
5939 if (ConsiderFlags && includesPoison(Kind) && Op->hasPoisonGeneratingFlags())
5940 return true;
5941
5942 unsigned Opcode = Op.getOpcode();
5943 switch (Opcode) {
5944 case ISD::AssertSext:
5945 case ISD::AssertZext:
5946 case ISD::AssertAlign:
5948 // Assertion nodes can create poison if the assertion fails.
5949 return includesPoison(Kind);
5950
5951 case ISD::FREEZE:
5955 case ISD::SADDSAT:
5956 case ISD::UADDSAT:
5957 case ISD::SSUBSAT:
5958 case ISD::USUBSAT:
5959 case ISD::MULHU:
5960 case ISD::MULHS:
5961 case ISD::AVGFLOORS:
5962 case ISD::AVGFLOORU:
5963 case ISD::AVGCEILS:
5964 case ISD::AVGCEILU:
5965 case ISD::ABDU:
5966 case ISD::ABDS:
5967 case ISD::SMIN:
5968 case ISD::SMAX:
5969 case ISD::SCMP:
5970 case ISD::UMIN:
5971 case ISD::UMAX:
5972 case ISD::UCMP:
5973 case ISD::AND:
5974 case ISD::XOR:
5975 case ISD::ROTL:
5976 case ISD::ROTR:
5977 case ISD::FSHL:
5978 case ISD::FSHR:
5979 case ISD::BSWAP:
5980 case ISD::CTTZ:
5981 case ISD::CTLZ:
5982 case ISD::CTLS:
5983 case ISD::CTPOP:
5984 case ISD::BITREVERSE:
5985 case ISD::PARITY:
5986 case ISD::SIGN_EXTEND:
5987 case ISD::TRUNCATE:
5991 case ISD::BITCAST:
5992 case ISD::BUILD_VECTOR:
5993 case ISD::BUILD_PAIR:
5994 case ISD::SPLAT_VECTOR:
5995 case ISD::FABS:
5996 case ISD::FCEIL:
5997 case ISD::FFLOOR:
5998 case ISD::FTRUNC:
5999 case ISD::FRINT:
6000 case ISD::FNEARBYINT:
6001 case ISD::FROUND:
6002 case ISD::FROUNDEVEN:
6003 return false;
6004
6005 case ISD::ABS:
6006 // ISD::ABS defines abs(INT_MIN) -> INT_MIN and never generates poison.
6007 // Different to Intrinsic::abs.
6008 return false;
6010 // ABS_MIN_POISON may produce poison if the input is INT_MIN.
6011 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) <= 1;
6012
6013 case ISD::ADDC:
6014 case ISD::SUBC:
6015 case ISD::ADDE:
6016 case ISD::SUBE:
6017 case ISD::SADDO:
6018 case ISD::SSUBO:
6019 case ISD::SMULO:
6020 case ISD::SADDO_CARRY:
6021 case ISD::SSUBO_CARRY:
6022 case ISD::UADDO:
6023 case ISD::USUBO:
6024 case ISD::UMULO:
6025 case ISD::UADDO_CARRY:
6026 case ISD::USUBO_CARRY:
6027 // No poison on result or overflow flags.
6028 return false;
6029
6030 case ISD::SELECT_CC:
6031 case ISD::SETCC: {
6032 // Integer setcc cannot create undef or poison.
6033 if (Op.getOperand(0).getValueType().isInteger())
6034 return false;
6035
6036 // FP compares are more complicated. They can create poison for nan/infinity
6037 // based on options and flags. The options and flags also cause special
6038 // nonan condition codes to be used. Those condition codes may be preserved
6039 // even if the nonan flag is dropped somewhere.
6040 unsigned CCOp = Opcode == ISD::SETCC ? 2 : 4;
6041 ISD::CondCode CCCode = cast<CondCodeSDNode>(Op.getOperand(CCOp))->get();
6042 return (unsigned)CCCode & 0x10U;
6043 }
6044
6045 case ISD::OR:
6046 case ISD::ZERO_EXTEND:
6047 case ISD::SELECT:
6048 case ISD::VSELECT:
6049 case ISD::ADD:
6050 case ISD::SUB:
6051 case ISD::MUL:
6052 case ISD::FNEG:
6053 case ISD::FADD:
6054 case ISD::FSUB:
6055 case ISD::FMUL:
6056 case ISD::FDIV:
6057 case ISD::FREM:
6058 case ISD::FCOPYSIGN:
6059 case ISD::FMA:
6060 case ISD::FMAD:
6061 case ISD::FMULADD:
6062 case ISD::FP_EXTEND:
6063 case ISD::FMINNUM:
6064 case ISD::FMAXNUM:
6065 case ISD::FMINNUM_IEEE:
6066 case ISD::FMAXNUM_IEEE:
6067 case ISD::FMINIMUM:
6068 case ISD::FMAXIMUM:
6069 case ISD::FMINIMUMNUM:
6070 case ISD::FMAXIMUMNUM:
6076 // No poison except from flags (which is handled above)
6077 return false;
6078
6079 case ISD::SHL:
6080 case ISD::SRL:
6081 case ISD::SRA:
6082 // If the max shift amount isn't in range, then the shift can
6083 // create poison.
6084 return includesPoison(Kind) &&
6085 !getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1);
6086
6089 // If the amount is zero then the result will be poison.
6090 // TODO: Add isKnownNeverZero DemandedElts handling.
6091 return includesPoison(Kind) &&
6092 !isKnownNeverZero(Op.getOperand(0), Depth + 1);
6093
6095 // Check if we demand any upper (undef) elements.
6096 return includesUndef(Kind) && DemandedElts.ugt(1);
6097
6100 // Ensure that the element index is in bounds.
6101 if (includesPoison(Kind)) {
6102 EVT VecVT = Op.getOperand(0).getValueType();
6103 SDValue Idx = Op.getOperand(Opcode == ISD::INSERT_VECTOR_ELT ? 2 : 1);
6104 KnownBits KnownIdx = computeKnownBits(Idx, Depth + 1);
6105 return KnownIdx.getMaxValue().uge(VecVT.getVectorMinNumElements());
6106 }
6107 return false;
6108 }
6109
6110 case ISD::VECTOR_SHUFFLE: {
6111 // Check for any demanded shuffle element that is undef.
6112 auto *SVN = cast<ShuffleVectorSDNode>(Op);
6113 for (auto [Idx, Elt] : enumerate(SVN->getMask()))
6114 if (Elt < 0 && DemandedElts[Idx])
6115 return true;
6116 return false;
6117 }
6118
6120 return false;
6121
6122 default:
6123 // Allow the target to implement this method for its nodes.
6124 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6125 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
6126 return TLI->canCreateUndefOrPoisonForTargetNode(
6127 Op, DemandedElts, *this, Kind, ConsiderFlags, Depth);
6128 break;
6129 }
6130
6131 // Be conservative and return true.
6132 return true;
6133}
6134
6135bool SelectionDAG::isADDLike(SDValue Op, bool NoWrap) const {
6136 unsigned Opcode = Op.getOpcode();
6137 if (Opcode == ISD::OR)
6138 return Op->getFlags().hasDisjoint() ||
6139 haveNoCommonBitsSet(Op.getOperand(0), Op.getOperand(1));
6140 if (Opcode == ISD::XOR)
6141 return !NoWrap && isMinSignedConstant(Op.getOperand(1));
6142 return false;
6143}
6144
6146 return Op.getNumOperands() == 2 && isa<ConstantSDNode>(Op.getOperand(1)) &&
6147 (Op.isAnyAdd() || isADDLike(Op));
6148}
6149
6151 FPClassTest InterestedClasses,
6152 unsigned Depth) const {
6153 APInt DemandedElts = getDemandAllEltsMask(Op);
6154 return computeKnownFPClass(Op, DemandedElts, InterestedClasses, Depth);
6155}
6156
6158 const APInt &DemandedElts,
6159 FPClassTest InterestedClasses,
6160 unsigned Depth) const {
6162
6163 if (const auto *CFP = dyn_cast<ConstantFPSDNode>(Op))
6164 return KnownFPClass(CFP->getValueAPF());
6165
6166 if (Depth >= MaxRecursionDepth)
6167 return Known;
6168
6169 if (Op.getOpcode() == ISD::UNDEF)
6170 return Known;
6171
6172 EVT VT = Op.getValueType();
6173 assert(VT.isFloatingPoint() && "Computing KnownFPClass on non-FP op!");
6174 assert((!VT.isFixedLengthVector() ||
6175 DemandedElts.getBitWidth() == VT.getVectorNumElements()) &&
6176 "Unexpected vector size");
6177
6178 if (!DemandedElts)
6179 return Known;
6180
6181 unsigned Opcode = Op.getOpcode();
6182 switch (Opcode) {
6183 case ISD::POISON: {
6184 Known.setKnownFPClasses(fcNone);
6185 Known.setSignBit(false);
6186 break;
6187 }
6188 case ISD::FNEG: {
6189 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6190 InterestedClasses, Depth + 1);
6191 Known.fneg();
6192 break;
6193 }
6194 case ISD::BUILD_VECTOR: {
6195 assert(!VT.isScalableVector());
6196 bool First = true;
6197 for (unsigned I = 0, E = Op.getNumOperands(); I != E; ++I) {
6198 if (!DemandedElts[I])
6199 continue;
6200
6201 if (First) {
6202 Known =
6203 computeKnownFPClass(Op.getOperand(I), InterestedClasses, Depth + 1);
6204 First = false;
6205 } else {
6206 Known |=
6207 computeKnownFPClass(Op.getOperand(I), InterestedClasses, Depth + 1);
6208 }
6209
6210 if (Known.isUnknown())
6211 break;
6212 }
6213 break;
6214 }
6216 SDValue Src = Op.getOperand(0);
6217 auto *CIdx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6218 EVT SrcVT = Src.getValueType();
6219 if (SrcVT.isFixedLengthVector() && CIdx) {
6220 if (CIdx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6221 APInt DemandedSrcElts = APInt::getOneBitSet(
6222 SrcVT.getVectorNumElements(), CIdx->getZExtValue());
6223 Known = computeKnownFPClass(Src, DemandedSrcElts, InterestedClasses,
6224 Depth + 1);
6225 } else {
6226 // Out of bounds index is poison.
6227 Known.setKnownFPClasses(fcNone);
6228 }
6229 } else {
6230 Known = computeKnownFPClass(Src, InterestedClasses, Depth + 1);
6231 }
6232 break;
6233 }
6234 case ISD::SPLAT_VECTOR: {
6235 Known = computeKnownFPClass(Op.getOperand(0), InterestedClasses, Depth + 1);
6236 break;
6237 }
6238 case ISD::BITCAST: {
6239 // FIXME: It should not be necessary to check for an elementwise bitcast.
6240 // If a bitcast is not elementwise between vector / scalar types,
6241 // computeKnownBits already splices the known bits of the source elements
6242 // appropriately so as to line up with the bits of the result's demanded
6243 // elements.
6244 EVT SrcVT = Op.getOperand(0).getValueType();
6245 if (VT.isScalableVector() || SrcVT.isScalableVector())
6246 break;
6247 unsigned VTNumElts = VT.isVector() ? VT.getVectorNumElements() : 1;
6248 unsigned SrcVTNumElts = SrcVT.isVector() ? SrcVT.getVectorNumElements() : 1;
6249 if (VTNumElts != SrcVTNumElts)
6250 break;
6251
6252 KnownBits Bits = computeKnownBits(Op, DemandedElts, Depth + 1);
6254 break;
6255 }
6256 case ISD::FABS: {
6257 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6258 InterestedClasses, Depth + 1);
6259 Known.fabs();
6260 break;
6261 }
6262 case ISD::FCOPYSIGN: {
6263 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6264 InterestedClasses, Depth + 1);
6265 KnownFPClass KnownSign = computeKnownFPClass(Op.getOperand(1), DemandedElts,
6266 InterestedClasses, Depth + 1);
6267 Known.copysign(KnownSign);
6268 break;
6269 }
6270 case ISD::AssertNoFPClass: {
6271 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6272 InterestedClasses, Depth + 1);
6273 FPClassTest AssertedClasses =
6274 static_cast<FPClassTest>(Op->getConstantOperandVal(1));
6275 Known.setKnownFPClasses(Known.getKnownFPClasses() & ~AssertedClasses);
6276 break;
6277 }
6279 SDValue Src = Op.getOperand(0);
6280 EVT SrcVT = Src.getValueType();
6281 if (SrcVT.isFixedLengthVector()) {
6282 unsigned Idx = Op.getConstantOperandVal(1);
6283 unsigned NumSrcElts = SrcVT.getVectorNumElements();
6284
6285 APInt DemandedSrcElts = DemandedElts.zextOrTrunc(NumSrcElts).shl(Idx);
6286 Known = computeKnownFPClass(Src, DemandedSrcElts, InterestedClasses,
6287 Depth + 1);
6288 } else {
6289 Known = computeKnownFPClass(Src, InterestedClasses, Depth + 1);
6290 }
6291 break;
6292 }
6293 case ISD::INSERT_SUBVECTOR: {
6294 SDValue BaseVector = Op.getOperand(0);
6295 SDValue SubVector = Op.getOperand(1);
6296 EVT BaseVT = BaseVector.getValueType();
6297 if (BaseVT.isFixedLengthVector()) {
6298 unsigned Idx = Op.getConstantOperandVal(2);
6299 unsigned NumBaseElts = BaseVT.getVectorNumElements();
6300 unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
6301
6302 APInt DemandedMask =
6303 APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
6304 APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
6305 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
6306
6307 if (!DemandedSrcElts.isZero())
6308 Known = computeKnownFPClass(BaseVector, DemandedSrcElts,
6309 InterestedClasses, Depth + 1);
6310 if (!DemandedSubElts.isZero()) {
6312 SubVector, DemandedSubElts, InterestedClasses, Depth + 1);
6313 Known = DemandedSrcElts.isZero() ? SubKnown : (Known | SubKnown);
6314 }
6315 } else {
6316 Known = computeKnownFPClass(SubVector, InterestedClasses, Depth + 1);
6317 if (!Known.isUnknown())
6318 Known |= computeKnownFPClass(BaseVector, InterestedClasses, Depth + 1);
6319 }
6320 break;
6321 }
6322 case ISD::SELECT:
6323 case ISD::VSELECT: {
6324 // TODO: Add adjustKnownFPClassForSelectArm clamp recognition as in
6325 // IR-level ValueTracking.
6326 KnownFPClass KnownFalseClass = computeKnownFPClass(
6327 Op.getOperand(2), DemandedElts, InterestedClasses, Depth + 1);
6328 if (KnownFalseClass.isUnknown())
6329 break;
6330 KnownFPClass KnownTrueClass = computeKnownFPClass(
6331 Op.getOperand(1), DemandedElts, InterestedClasses, Depth + 1);
6332 Known = KnownTrueClass.intersectWith(KnownFalseClass);
6333 break;
6334 }
6335 default:
6336 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6337 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
6338 TLI->computeKnownFPClassForTargetNode(Op, Known, DemandedElts, *this,
6339 Depth);
6340 }
6341 break;
6342 }
6343
6344 return Known;
6345}
6346
6348 unsigned Depth) const {
6349 APInt DemandedElts = getDemandAllEltsMask(Op);
6350 return isKnownNeverNaN(Op, DemandedElts, SNaN, Depth);
6351}
6352
6354 bool SNaN, unsigned Depth) const {
6355 assert(!DemandedElts.isZero() && "No demanded elements");
6356
6357 // If we're told that NaNs won't happen, assume they won't.
6358 if (Op->getFlags().hasNoNaNs())
6359 return true;
6360
6361 if (Depth >= MaxRecursionDepth)
6362 return false; // Limit search depth.
6363
6364 unsigned Opcode = Op.getOpcode();
6365 switch (Opcode) {
6366 case ISD::FADD:
6367 case ISD::FSUB:
6368 case ISD::FMUL:
6369 case ISD::FDIV:
6370 case ISD::FREM:
6371 case ISD::FSIN:
6372 case ISD::FCOS:
6373 case ISD::FTAN:
6374 case ISD::FASIN:
6375 case ISD::FACOS:
6376 case ISD::FATAN:
6377 case ISD::FATAN2:
6378 case ISD::FSINH:
6379 case ISD::FCOSH:
6380 case ISD::FTANH:
6381 case ISD::FMA:
6382 case ISD::FMULADD:
6383 case ISD::FMAD: {
6384 if (SNaN)
6385 return true;
6386 // TODO: Need isKnownNeverInfinity
6387 return false;
6388 }
6389 case ISD::FCANONICALIZE:
6390 case ISD::FEXP:
6391 case ISD::FEXP2:
6392 case ISD::FEXP10:
6393 case ISD::FTRUNC:
6394 case ISD::FFLOOR:
6395 case ISD::FCEIL:
6396 case ISD::FROUND:
6397 case ISD::FROUNDEVEN:
6398 case ISD::LROUND:
6399 case ISD::LLROUND:
6400 case ISD::FRINT:
6401 case ISD::LRINT:
6402 case ISD::LLRINT:
6403 case ISD::FNEARBYINT:
6404 case ISD::FLDEXP: {
6405 if (SNaN)
6406 return true;
6407 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6408 }
6409 case ISD::FABS:
6410 case ISD::FNEG:
6411 case ISD::FCOPYSIGN: {
6412 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6413 }
6414 case ISD::SELECT:
6415 return isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1) &&
6416 isKnownNeverNaN(Op.getOperand(2), DemandedElts, SNaN, Depth + 1);
6417 case ISD::FP_EXTEND:
6418 case ISD::FP_ROUND: {
6419 if (SNaN)
6420 return true;
6421 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6422 }
6423 case ISD::SINT_TO_FP:
6424 case ISD::UINT_TO_FP:
6425 return true;
6426 case ISD::FSQRT: // Need is known positive
6427 case ISD::FLOG:
6428 case ISD::FLOG2:
6429 case ISD::FLOG10:
6430 case ISD::FPOWI:
6431 case ISD::FPOW: {
6432 if (SNaN)
6433 return true;
6434 // TODO: Refine on operand
6435 return false;
6436 }
6437 case ISD::FMINNUM:
6438 case ISD::FMAXNUM:
6439 case ISD::FMINIMUMNUM:
6440 case ISD::FMAXIMUMNUM: {
6441 // Only one needs to be known not-nan, since it will be returned if the
6442 // other ends up being one.
6443 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) ||
6444 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6445 }
6446 case ISD::FMINNUM_IEEE:
6447 case ISD::FMAXNUM_IEEE: {
6448 if (SNaN)
6449 return true;
6450 // This can return a NaN if either operand is an sNaN, or if both operands
6451 // are NaN.
6452 return (isKnownNeverNaN(Op.getOperand(0), DemandedElts, false, Depth + 1) &&
6453 isKnownNeverSNaN(Op.getOperand(1), DemandedElts, Depth + 1)) ||
6454 (isKnownNeverNaN(Op.getOperand(1), DemandedElts, false, Depth + 1) &&
6455 isKnownNeverSNaN(Op.getOperand(0), DemandedElts, Depth + 1));
6456 }
6457 case ISD::FMINIMUM:
6458 case ISD::FMAXIMUM: {
6459 // TODO: Does this quiet or return the origina NaN as-is?
6460 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) &&
6461 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6462 }
6464 SDValue Src = Op.getOperand(0);
6465 auto *Idx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6466 EVT SrcVT = Src.getValueType();
6467 if (SrcVT.isFixedLengthVector() && Idx &&
6468 Idx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6469 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
6470 Idx->getZExtValue());
6471 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6472 }
6473 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6474 }
6476 SDValue Src = Op.getOperand(0);
6477 if (Src.getValueType().isFixedLengthVector()) {
6478 unsigned Idx = Op.getConstantOperandVal(1);
6479 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
6480 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
6481 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6482 }
6483 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6484 }
6485 case ISD::INSERT_SUBVECTOR: {
6486 SDValue BaseVector = Op.getOperand(0);
6487 SDValue SubVector = Op.getOperand(1);
6488 EVT BaseVectorVT = BaseVector.getValueType();
6489 if (BaseVectorVT.isFixedLengthVector()) {
6490 unsigned Idx = Op.getConstantOperandVal(2);
6491 unsigned NumBaseElts = BaseVectorVT.getVectorNumElements();
6492 unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
6493
6494 // Clear/Extract the bits at the position where the subvector will be
6495 // inserted.
6496 APInt DemandedMask =
6497 APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
6498 APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
6499 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
6500
6501 bool NeverNaN = true;
6502 if (!DemandedSrcElts.isZero())
6503 NeverNaN &=
6504 isKnownNeverNaN(BaseVector, DemandedSrcElts, SNaN, Depth + 1);
6505 if (NeverNaN && !DemandedSubElts.isZero())
6506 NeverNaN &=
6507 isKnownNeverNaN(SubVector, DemandedSubElts, SNaN, Depth + 1);
6508 return NeverNaN;
6509 }
6510 return isKnownNeverNaN(BaseVector, SNaN, Depth + 1) &&
6511 isKnownNeverNaN(SubVector, SNaN, Depth + 1);
6512 }
6513 case ISD::BUILD_VECTOR: {
6514 unsigned NumElts = Op.getNumOperands();
6515 for (unsigned I = 0; I != NumElts; ++I)
6516 if (DemandedElts[I] &&
6517 !isKnownNeverNaN(Op.getOperand(I), SNaN, Depth + 1))
6518 return false;
6519 return true;
6520 }
6521 case ISD::SPLAT_VECTOR:
6522 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
6523 case ISD::AssertNoFPClass: {
6524 FPClassTest NoFPClass =
6525 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
6526 if ((NoFPClass & fcNan) == fcNan)
6527 return true;
6528 if (SNaN && (NoFPClass & fcSNan) == fcSNan)
6529 return true;
6530 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6531 }
6532 default:
6533 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6534 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
6535 return TLI->isKnownNeverNaNForTargetNode(Op, DemandedElts, *this, SNaN,
6536 Depth);
6537 }
6538 break;
6539 }
6540
6541 FPClassTest NanMask = SNaN ? fcSNan : fcNan;
6542 KnownFPClass Known = computeKnownFPClass(Op, DemandedElts, NanMask, Depth);
6543 return Known.isKnownNever(NanMask);
6544}
6545
6547 APInt DemandedElts = getDemandAllEltsMask(Op);
6548 return isKnownNeverLogicalZero(Op, DemandedElts, Depth);
6549}
6550
6552 const APInt &DemandedElts,
6553 unsigned Depth) const {
6554 assert(!DemandedElts.isZero() && "No demanded elements");
6555 EVT VT = Op.getValueType();
6557 computeKnownFPClass(Op, DemandedElts, fcZero | fcSubnormal, Depth);
6558 return Known.isKnownNeverLogicalZero(getDenormalMode(VT));
6559}
6560
6562 APInt DemandedElts = getDemandAllEltsMask(Op);
6563 return isKnownNeverZero(Op, DemandedElts, Depth);
6564}
6565
6567 unsigned Depth) const {
6568 if (Depth >= MaxRecursionDepth)
6569 return false; // Limit search depth.
6570
6571 EVT OpVT = Op.getValueType();
6572 unsigned BitWidth = OpVT.getScalarSizeInBits();
6573
6574 assert(!Op.getValueType().isFloatingPoint() &&
6575 "Floating point types unsupported - use isKnownNeverLogicalZero");
6576
6577 // If the value is a constant, we can obviously see if it is a zero or not.
6578 auto IsNeverZero = [BitWidth](const ConstantSDNode *C) {
6579 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
6580 return !V.isZero();
6581 };
6582
6583 if (ISD::matchUnaryPredicate(Op, DemandedElts, IsNeverZero,
6584 /*AllowUndefs=*/false, /*AllowTruncation=*/true))
6585 return true;
6586
6587 // TODO: Recognize more cases here. Most of the cases are also incomplete to
6588 // some degree.
6589 switch (Op.getOpcode()) {
6590 default:
6591 break;
6592
6594 SDValue InVec = Op.getOperand(0);
6595 SDValue EltNo = Op.getOperand(1);
6596 EVT VecVT = InVec.getValueType();
6597
6598 // Skip scalable vectors or implicit extensions.
6599 if (VecVT.isScalableVector() ||
6600 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
6601 break;
6602
6603 // If we know the element index, just demand that vector element, else for
6604 // an unknown element index, ignore DemandedElts and demand them all.
6605 const unsigned NumSrcElts = VecVT.getVectorNumElements();
6606 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
6607 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
6608 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
6609 DemandedSrcElts =
6610 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
6611
6612 return isKnownNeverZero(InVec, DemandedSrcElts, Depth + 1);
6613 }
6614
6615 case ISD::OR:
6616 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6617 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6618
6619 case ISD::VSELECT:
6620 case ISD::SELECT:
6621 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6622 isKnownNeverZero(Op.getOperand(2), DemandedElts, Depth + 1);
6623
6624 case ISD::SHL: {
6625 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6626 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6627 KnownBits ValKnown =
6628 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6629 // 1 << X is never zero.
6630 if (ValKnown.One[0])
6631 return true;
6632 // If max shift cnt of known ones is non-zero, result is non-zero.
6633 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6634 .getMaxValue();
6635 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6636 !ValKnown.One.shl(MaxCnt).isZero())
6637 return true;
6638 break;
6639 }
6640
6641 case ISD::VECTOR_SHUFFLE: {
6642 if (Op.getValueType().isScalableVector())
6643 return false;
6644
6645 unsigned NumElts = DemandedElts.getBitWidth();
6646
6647 // All demanded elements from LHS and RHS must be known non-zero.
6648 // Demanded elements with undef shuffle mask elements are unknown.
6649
6650 APInt DemandedLHS, DemandedRHS;
6651 auto *SVN = cast<ShuffleVectorSDNode>(Op);
6652 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
6653 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
6654 DemandedLHS, DemandedRHS))
6655 return false;
6656
6657 return (!DemandedLHS ||
6658 isKnownNeverZero(Op.getOperand(0), DemandedLHS, Depth + 1)) &&
6659 (!DemandedRHS ||
6660 isKnownNeverZero(Op.getOperand(1), DemandedRHS, Depth + 1));
6661 }
6662
6663 case ISD::UADDSAT:
6664 case ISD::UMAX:
6665 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6666 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6667
6668 case ISD::UMIN:
6669 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6670 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6671
6672 // For smin/smax: If either operand is known negative/positive
6673 // respectively we don't need the other to be known at all.
6674 case ISD::SMAX: {
6675 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6676 if (Op1.isStrictlyPositive())
6677 return true;
6678
6679 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6680 if (Op0.isStrictlyPositive())
6681 return true;
6682
6683 if (Op1.isNonZero() && Op0.isNonZero())
6684 return true;
6685
6686 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6687 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6688 }
6689 case ISD::SMIN: {
6690 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6691 if (Op1.isNegative())
6692 return true;
6693
6694 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6695 if (Op0.isNegative())
6696 return true;
6697
6698 if (Op1.isNonZero() && Op0.isNonZero())
6699 return true;
6700
6701 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6702 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6703 }
6704
6705 case ISD::ROTL:
6706 case ISD::ROTR:
6707 case ISD::BITREVERSE:
6708 case ISD::BSWAP:
6709 case ISD::CTPOP:
6710 case ISD::ABS:
6712 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6713
6714 case ISD::SRA:
6715 case ISD::SRL: {
6716 if (Op->getFlags().hasExact())
6717 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6718 KnownBits ValKnown =
6719 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6720 if (ValKnown.isNegative())
6721 return true;
6722 // If max shift cnt of known ones is non-zero, result is non-zero.
6723 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6724 .getMaxValue();
6725 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6726 !ValKnown.One.lshr(MaxCnt).isZero())
6727 return true;
6728 break;
6729 }
6730 case ISD::UDIV:
6731 case ISD::SDIV:
6732 // div exact can only produce a zero if the dividend is zero.
6733 // TODO: For udiv this is also true if Op1 u<= Op0
6734 if (Op->getFlags().hasExact())
6735 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6736 break;
6737
6738 case ISD::ADD:
6739 if (Op->getFlags().hasNoUnsignedWrap())
6740 if (isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6741 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1))
6742 return true;
6743 // TODO: There are a lot more cases we can prove for add.
6744 break;
6745
6746 case ISD::SUB: {
6747 if (isNullConstant(Op.getOperand(0)))
6748 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1);
6749
6750 std::optional<bool> ne = KnownBits::ne(
6751 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1),
6752 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1));
6753 return ne && *ne;
6754 }
6755
6756 case ISD::MUL:
6757 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6758 if (isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
6759 isKnownNeverZero(Op.getOperand(0), Depth + 1))
6760 return true;
6761 break;
6762
6763 case ISD::ZERO_EXTEND:
6764 case ISD::SIGN_EXTEND:
6765 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6766 case ISD::VSCALE: {
6768 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
6769 ConstantRange CR =
6770 getVScaleRange(&F, Op.getScalarValueSizeInBits()).multiply(Multiplier);
6771 if (!CR.contains(APInt(CR.getBitWidth(), 0)))
6772 return true;
6773 break;
6774 }
6775 }
6776
6777 return computeKnownBits(Op, DemandedElts, Depth).isNonZero();
6778}
6779
6781 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Op, true))
6782 return !C1->isNegative();
6783
6784 switch (Op.getOpcode()) {
6785 case ISD::FABS:
6786 case ISD::FEXP:
6787 case ISD::FEXP2:
6788 case ISD::FEXP10:
6789 return true;
6790 default:
6791 return false;
6792 }
6793
6794 llvm_unreachable("covered opcode switch");
6795}
6796
6798 assert(Use.getValueType().isFloatingPoint());
6799 const SDNode *User = Use.getUser();
6800 if (User->getFlags().hasNoSignedZeros())
6801 return true;
6802
6803 unsigned OperandNo = Use.getOperandNo();
6804 // Check if this use is insensitive to the sign of zero
6805 switch (User->getOpcode()) {
6806 case ISD::SETCC:
6807 // Comparisons: IEEE-754 specifies +0.0 == -0.0.
6808 case ISD::FABS:
6809 // fabs always produces +0.0.
6810 return true;
6811 case ISD::FCOPYSIGN:
6812 // copysign overwrites the sign bit of the first operand.
6813 return OperandNo == 0;
6814 case ISD::FADD:
6815 case ISD::FSUB: {
6816 // Arithmetic with non-zero constants fixes the uncertainty around the
6817 // sign bit.
6818 SDValue Other = User->getOperand(1 - OperandNo);
6820 }
6821 case ISD::FP_TO_SINT:
6822 case ISD::FP_TO_UINT:
6823 // fp-to-int conversions normalize signed zeros.
6824 return true;
6825 default:
6826 return false;
6827 }
6828}
6829
6831 if (Op->getFlags().hasNoSignedZeros())
6832 return true;
6833 // FIXME: Limit the amount of checked uses to not introduce a compile-time
6834 // regression. Ideally, this should be implemented as a demanded-bits
6835 // optimization that stems from the users.
6836 if (Op->use_size() > 2)
6837 return false;
6838 return all_of(Op->uses(),
6839 [&](const SDUse &Use) { return canIgnoreSignBitOfZero(Use); });
6840}
6841
6843 // Check the obvious case.
6844 if (A == B) return true;
6845
6846 // For negative and positive zero.
6849 if (CA->isZero() && CB->isZero()) return true;
6850
6851 // Otherwise they may not be equal.
6852 return false;
6853}
6854
6855// Only bits set in Mask must be negated, other bits may be arbitrary.
6857 if (isBitwiseNot(V, AllowUndefs))
6858 return V.getOperand(0);
6859
6860 // Handle any_extend (not (truncate X)) pattern, where Mask only sets
6861 // bits in the non-extended part.
6862 ConstantSDNode *MaskC = isConstOrConstSplat(Mask);
6863 if (!MaskC || V.getOpcode() != ISD::ANY_EXTEND)
6864 return SDValue();
6865 SDValue ExtArg = V.getOperand(0);
6866 if (ExtArg.getScalarValueSizeInBits() >=
6867 MaskC->getAPIntValue().getActiveBits() &&
6868 isBitwiseNot(ExtArg, AllowUndefs) &&
6869 ExtArg.getOperand(0).getOpcode() == ISD::TRUNCATE &&
6870 ExtArg.getOperand(0).getOperand(0).getValueType() == V.getValueType())
6871 return ExtArg.getOperand(0).getOperand(0);
6872 return SDValue();
6873}
6874
6876 // Match masked merge pattern (X & ~M) op (Y & M)
6877 // Including degenerate case (X & ~M) op M
6878 auto MatchNoCommonBitsPattern = [&](SDValue Not, SDValue Mask,
6879 SDValue Other) {
6880 if (SDValue NotOperand =
6881 getBitwiseNotOperand(Not, Mask, /* AllowUndefs */ true)) {
6882 if (NotOperand->getOpcode() == ISD::ZERO_EXTEND ||
6883 NotOperand->getOpcode() == ISD::TRUNCATE)
6884 NotOperand = NotOperand->getOperand(0);
6885
6886 if (Other == NotOperand)
6887 return true;
6888 if (Other->getOpcode() == ISD::AND)
6889 return NotOperand == Other->getOperand(0) ||
6890 NotOperand == Other->getOperand(1);
6891 }
6892 return false;
6893 };
6894
6895 if (A->getOpcode() == ISD::ZERO_EXTEND || A->getOpcode() == ISD::TRUNCATE)
6896 A = A->getOperand(0);
6897
6898 if (B->getOpcode() == ISD::ZERO_EXTEND || B->getOpcode() == ISD::TRUNCATE)
6899 B = B->getOperand(0);
6900
6901 if (A->getOpcode() == ISD::AND)
6902 return MatchNoCommonBitsPattern(A->getOperand(0), A->getOperand(1), B) ||
6903 MatchNoCommonBitsPattern(A->getOperand(1), A->getOperand(0), B);
6904 return false;
6905}
6906
6907// FIXME: unify with llvm::haveNoCommonBitsSet.
6909 assert(A.getValueType() == B.getValueType() &&
6910 "Values must have the same type");
6913 return true;
6916}
6917
6918static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step,
6919 SelectionDAG &DAG) {
6920 if (cast<ConstantSDNode>(Step)->isZero())
6921 return DAG.getConstant(0, DL, VT);
6922
6923 return SDValue();
6924}
6925
6928 SelectionDAG &DAG) {
6929 int NumOps = Ops.size();
6930 assert(NumOps != 0 && "Can't build an empty vector!");
6931 assert(!VT.isScalableVector() &&
6932 "BUILD_VECTOR cannot be used with scalable types");
6933 assert(VT.getVectorNumElements() == (unsigned)NumOps &&
6934 "Incorrect element count in BUILD_VECTOR!");
6935
6936 // BUILD_VECTOR of UNDEFs is UNDEF.
6937 bool AllPoison = true;
6938 if (llvm::all_of(Ops, [&AllPoison](SDValue Op) {
6939 AllPoison &= Op.getOpcode() == ISD::POISON;
6940 return Op.isUndef();
6941 }))
6942 return AllPoison ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
6943
6944 // BUILD_VECTOR of seq extract/insert from the same vector + type is Identity.
6945 SDValue IdentitySrc;
6946 bool IsIdentity = true;
6947 for (int i = 0; i != NumOps; ++i) {
6948 if (Ops[i].getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
6949 Ops[i].getOperand(0).getValueType() != VT ||
6950 (IdentitySrc && Ops[i].getOperand(0) != IdentitySrc) ||
6951 !isa<ConstantSDNode>(Ops[i].getOperand(1)) ||
6952 Ops[i].getConstantOperandAPInt(1) != i) {
6953 IsIdentity = false;
6954 break;
6955 }
6956 IdentitySrc = Ops[i].getOperand(0);
6957 }
6958 if (IsIdentity)
6959 return IdentitySrc;
6960
6961 return SDValue();
6962}
6963
6964/// Try to simplify vector concatenation to an input value, undef, or build
6965/// vector.
6968 SelectionDAG &DAG) {
6969 assert(!Ops.empty() && "Can't concatenate an empty list of vectors!");
6971 [Ops](SDValue Op) {
6972 return Ops[0].getValueType() == Op.getValueType();
6973 }) &&
6974 "Concatenation of vectors with inconsistent value types!");
6975 assert((Ops[0].getValueType().getVectorElementCount() * Ops.size()) ==
6976 VT.getVectorElementCount() &&
6977 "Incorrect element count in vector concatenation!");
6978
6979 if (Ops.size() == 1)
6980 return Ops[0];
6981
6982 // Concat of UNDEFs is UNDEF.
6983 bool AllPoison = true;
6984 if (llvm::all_of(Ops, [&AllPoison](SDValue Op) {
6985 AllPoison &= Op.getOpcode() == ISD::POISON;
6986 return Op.isUndef();
6987 }))
6988 return AllPoison ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
6989
6990 // Scan the operands and look for extract operations from a single source
6991 // that correspond to insertion at the same location via this concatenation:
6992 // concat (extract X, 0*subvec_elts), (extract X, 1*subvec_elts), ...
6993 SDValue IdentitySrc;
6994 bool IsIdentity = true;
6995 for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
6996 SDValue Op = Ops[i];
6997 unsigned IdentityIndex = i * Op.getValueType().getVectorMinNumElements();
6998 if (Op.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
6999 Op.getOperand(0).getValueType() != VT ||
7000 (IdentitySrc && Op.getOperand(0) != IdentitySrc) ||
7001 Op.getConstantOperandVal(1) != IdentityIndex) {
7002 IsIdentity = false;
7003 break;
7004 }
7005 assert((!IdentitySrc || IdentitySrc == Op.getOperand(0)) &&
7006 "Unexpected identity source vector for concat of extracts");
7007 IdentitySrc = Op.getOperand(0);
7008 }
7009 if (IsIdentity) {
7010 assert(IdentitySrc && "Failed to set source vector of extracts");
7011 return IdentitySrc;
7012 }
7013
7014 // The code below this point is only designed to work for fixed width
7015 // vectors, so we bail out for now.
7016 if (VT.isScalableVector())
7017 return SDValue();
7018
7019 // A CONCAT_VECTOR of scalar sources, such as UNDEF, BUILD_VECTOR and
7020 // single-element INSERT_VECTOR_ELT operands can be simplified to one big
7021 // BUILD_VECTOR.
7022 // FIXME: Add support for SCALAR_TO_VECTOR as well.
7023 EVT SVT = VT.getScalarType();
7025 for (SDValue Op : Ops) {
7026 EVT OpVT = Op.getValueType();
7027 if (Op.getOpcode() == ISD::POISON)
7028 Elts.append(OpVT.getVectorNumElements(), DAG.getPOISON(SVT));
7029 else if (Op.getOpcode() == ISD::UNDEF)
7030 Elts.append(OpVT.getVectorNumElements(), DAG.getUNDEF(SVT));
7031 else if (Op.getOpcode() == ISD::BUILD_VECTOR)
7032 Elts.append(Op->op_begin(), Op->op_end());
7033 else if (Op.getOpcode() == ISD::INSERT_VECTOR_ELT &&
7034 OpVT.getVectorNumElements() == 1 &&
7035 isNullConstant(Op.getOperand(2)))
7036 Elts.push_back(Op.getOperand(1));
7037 else
7038 return SDValue();
7039 }
7040
7041 // BUILD_VECTOR requires all inputs to be of the same type, find the
7042 // maximum type and extend them all.
7043 for (SDValue Op : Elts)
7044 SVT = (SVT.bitsLT(Op.getValueType()) ? Op.getValueType() : SVT);
7045
7046 if (SVT.bitsGT(VT.getScalarType())) {
7047 for (SDValue &Op : Elts) {
7048 if (Op.getOpcode() == ISD::POISON)
7049 Op = DAG.getPOISON(SVT);
7050 else if (Op.getOpcode() == ISD::UNDEF)
7051 Op = DAG.getUNDEF(SVT);
7052 else
7053 Op = DAG.getTargetLoweringInfo().isZExtFree(Op.getValueType(), SVT)
7054 ? DAG.getZExtOrTrunc(Op, DL, SVT)
7055 : DAG.getSExtOrTrunc(Op, DL, SVT);
7056 }
7057 }
7058
7059 SDValue V = DAG.getBuildVector(VT, DL, Elts);
7060 NewSDValueDbgMsg(V, "New node fold concat vectors: ", &DAG);
7061 return V;
7062}
7063
7064/// Gets or creates the specified node.
7065SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT) {
7066 SDVTList VTs = getVTList(VT);
7067 SDNodeKey ID(Opcode, VTs, {});
7068 FoldingSetInsertToken InsertToken;
7069 if (SDNode *E = lookupNode(ID, DL, InsertToken))
7070 return SDValue(E, 0);
7071
7072 auto *N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7073 CSEMap.insert(N, InsertToken);
7074
7075 InsertNode(N);
7076 SDValue V = SDValue(N, 0);
7077 NewSDValueDbgMsg(V, "Creating new node: ", this);
7078 return V;
7079}
7080
7081SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7082 SDValue N1) {
7083 SDNodeFlags Flags;
7084 if (Inserter)
7085 Flags = Inserter->getFlags();
7086 return getNode(Opcode, DL, VT, N1, Flags);
7087}
7088
7089SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7090 SDValue N1, const SDNodeFlags Flags) {
7091 assert(N1.getOpcode() != ISD::DELETED_NODE && "Operand is DELETED_NODE!");
7092
7093 // Constant fold unary operations with a vector integer or float operand.
7094 switch (Opcode) {
7095 default:
7096 // FIXME: Entirely reasonable to perform folding of other unary
7097 // operations here as the need arises.
7098 break;
7099 case ISD::FNEG:
7100 case ISD::FABS:
7101 case ISD::FCEIL:
7102 case ISD::FTRUNC:
7103 case ISD::FFLOOR:
7104 case ISD::FP_EXTEND:
7105 case ISD::FP_TO_SINT:
7106 case ISD::FP_TO_UINT:
7107 case ISD::FP_TO_FP16:
7108 case ISD::FP_TO_BF16:
7109 case ISD::TRUNCATE:
7110 case ISD::ANY_EXTEND:
7111 case ISD::ZERO_EXTEND:
7112 case ISD::SIGN_EXTEND:
7113 case ISD::UINT_TO_FP:
7114 case ISD::SINT_TO_FP:
7115 case ISD::FP16_TO_FP:
7116 case ISD::BF16_TO_FP:
7117 case ISD::BITCAST:
7118 case ISD::ABS:
7120 case ISD::BITREVERSE:
7121 case ISD::BSWAP:
7122 case ISD::CTLZ:
7124 case ISD::CTTZ:
7126 case ISD::CTPOP:
7127 case ISD::PARITY:
7128 case ISD::CTLS:
7129 case ISD::VECREDUCE_ADD:
7134 case ISD::VECREDUCE_MUL:
7135 case ISD::VECREDUCE_AND:
7136 case ISD::VECREDUCE_OR:
7137 case ISD::VECREDUCE_XOR:
7138 case ISD::STEP_VECTOR: {
7139 SDValue Ops = {N1};
7140 if (SDValue Fold = FoldConstantArithmetic(Opcode, DL, VT, Ops))
7141 return Fold;
7142 }
7143 }
7144
7145 unsigned OpOpcode = N1.getNode()->getOpcode();
7146 switch (Opcode) {
7147 case ISD::STEP_VECTOR:
7148 assert(VT.isScalableVector() &&
7149 "STEP_VECTOR can only be used with scalable types");
7150 assert(OpOpcode == ISD::TargetConstant &&
7151 VT.getVectorElementType() == N1.getValueType() &&
7152 "Unexpected step operand");
7153 break;
7154 case ISD::FREEZE:
7155 assert(VT == N1.getValueType() && "Unexpected VT!");
7157 return N1;
7158 break;
7159 case ISD::TokenFactor:
7160 case ISD::MERGE_VALUES:
7162 return N1; // Factor, merge or concat of one node? No need.
7163 case ISD::BUILD_VECTOR: {
7164 // Attempt to simplify BUILD_VECTOR.
7165 SDValue Ops[] = {N1};
7166 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
7167 return V;
7168 break;
7169 }
7170 case ISD::FP_ROUND: llvm_unreachable("Invalid method to make FP_ROUND node");
7171 case ISD::FP_EXTEND:
7173 "Invalid FP cast!");
7174 if (N1.getValueType() == VT) return N1; // noop conversion.
7175 assert((!VT.isVector() || VT.getVectorElementCount() ==
7177 "Vector element count mismatch!");
7178 assert(N1.getValueType().bitsLT(VT) && "Invalid fpext node, dst < src!");
7179 if (N1.isUndef())
7180 return getUNDEF(VT);
7181 break;
7182 case ISD::FP_TO_SINT:
7183 case ISD::FP_TO_UINT:
7184 if (N1.isUndef())
7185 return getUNDEF(VT);
7186 break;
7187 case ISD::SINT_TO_FP:
7188 case ISD::UINT_TO_FP:
7189 // [us]itofp(undef) = 0, because the result value is bounded.
7190 if (N1.isUndef())
7191 return getConstantFP(0.0, DL, VT);
7192 break;
7193 case ISD::SIGN_EXTEND:
7194 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7195 "Invalid SIGN_EXTEND!");
7196 assert(VT.isVector() == N1.getValueType().isVector() &&
7197 "SIGN_EXTEND result type type should be vector iff the operand "
7198 "type is vector!");
7199 if (N1.getValueType() == VT) return N1; // noop extension
7200 assert((!VT.isVector() || VT.getVectorElementCount() ==
7202 "Vector element count mismatch!");
7203 assert(N1.getValueType().bitsLT(VT) && "Invalid sext node, dst < src!");
7204 if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND) {
7205 SDNodeFlags Flags;
7206 if (OpOpcode == ISD::ZERO_EXTEND)
7207 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7208 SDValue NewVal = getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7209 transferDbgValues(N1, NewVal);
7210 return NewVal;
7211 }
7212
7213 if (OpOpcode == ISD::POISON)
7214 return getPOISON(VT);
7215
7216 if (N1.isUndef())
7217 // sext(undef) = 0, because the top bits will all be the same.
7218 return getConstant(0, DL, VT);
7219
7220 // Skip unnecessary sext_inreg pattern:
7221 // (sext (trunc x)) -> x iff the upper bits are all signbits.
7222 if (OpOpcode == ISD::TRUNCATE) {
7223 SDValue OpOp = N1.getOperand(0);
7224 if (OpOp.getValueType() == VT) {
7225 unsigned NumSignExtBits =
7227 if (ComputeNumSignBits(OpOp) > NumSignExtBits) {
7228 transferDbgValues(N1, OpOp);
7229 return OpOp;
7230 }
7231 }
7232 }
7233 break;
7234 case ISD::ZERO_EXTEND:
7235 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7236 "Invalid ZERO_EXTEND!");
7237 assert(VT.isVector() == N1.getValueType().isVector() &&
7238 "ZERO_EXTEND result type type should be vector iff the operand "
7239 "type is vector!");
7240 if (N1.getValueType() == VT) return N1; // noop extension
7241 assert((!VT.isVector() || VT.getVectorElementCount() ==
7243 "Vector element count mismatch!");
7244 assert(N1.getValueType().bitsLT(VT) && "Invalid zext node, dst < src!");
7245 if (OpOpcode == ISD::ZERO_EXTEND) { // (zext (zext x)) -> (zext x)
7246 SDNodeFlags Flags;
7247 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7248 SDValue NewVal =
7249 getNode(ISD::ZERO_EXTEND, DL, VT, N1.getOperand(0), Flags);
7250 transferDbgValues(N1, NewVal);
7251 return NewVal;
7252 }
7253
7254 if (OpOpcode == ISD::POISON)
7255 return getPOISON(VT);
7256
7257 if (N1.isUndef())
7258 // zext(undef) = 0, because the top bits will be zero.
7259 return getConstant(0, DL, VT);
7260
7261 // Skip unnecessary zext_inreg pattern:
7262 // (zext (trunc x)) -> x iff the upper bits are known zero.
7263 // TODO: Remove (zext (trunc (and x, c))) exception which some targets
7264 // use to recognise zext_inreg patterns.
7265 if (OpOpcode == ISD::TRUNCATE) {
7266 SDValue OpOp = N1.getOperand(0);
7267 if (OpOp.getValueType() == VT) {
7268 if (OpOp.getOpcode() != ISD::AND) {
7271 if (MaskedValueIsZero(OpOp, HiBits)) {
7272 transferDbgValues(N1, OpOp);
7273 return OpOp;
7274 }
7275 }
7276 }
7277 }
7278 break;
7279 case ISD::ANY_EXTEND:
7280 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7281 "Invalid ANY_EXTEND!");
7282 assert(VT.isVector() == N1.getValueType().isVector() &&
7283 "ANY_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 anyext node, dst < src!");
7290
7291 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7292 OpOpcode == ISD::ANY_EXTEND) {
7293 SDNodeFlags Flags;
7294 if (OpOpcode == ISD::ZERO_EXTEND)
7295 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7296 // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x)
7297 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7298 }
7299 if (N1.isUndef())
7300 return getUNDEF(VT);
7301
7302 // (ext (trunc x)) -> x
7303 if (OpOpcode == ISD::TRUNCATE) {
7304 SDValue OpOp = N1.getOperand(0);
7305 if (OpOp.getValueType() == VT) {
7306 transferDbgValues(N1, OpOp);
7307 return OpOp;
7308 }
7309 }
7310 break;
7311 case ISD::TRUNCATE:
7312 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7313 "Invalid TRUNCATE!");
7314 assert(VT.isVector() == N1.getValueType().isVector() &&
7315 "TRUNCATE result type type should be vector iff the operand "
7316 "type is vector!");
7317 if (N1.getValueType() == VT) return N1; // noop truncate
7318 assert((!VT.isVector() || VT.getVectorElementCount() ==
7320 "Vector element count mismatch!");
7321 assert(N1.getValueType().bitsGT(VT) && "Invalid truncate node, src < dst!");
7322 if (OpOpcode == ISD::TRUNCATE)
7323 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7324 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7325 OpOpcode == ISD::ANY_EXTEND) {
7326 // If the source is smaller than the dest, we still need an extend.
7328 VT.getScalarType())) {
7329 SDNodeFlags Flags;
7330 if (OpOpcode == ISD::ZERO_EXTEND)
7331 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7332 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7333 }
7334 if (N1.getOperand(0).getValueType().bitsGT(VT))
7335 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7336 return N1.getOperand(0);
7337 }
7338 if (N1.isUndef())
7339 return getUNDEF(VT);
7340 if (OpOpcode == ISD::VSCALE && !NewNodesMustHaveLegalTypes)
7341 return getVScale(DL, VT,
7343 break;
7347 assert(VT.isVector() && "This DAG node is restricted to vector types.");
7348 assert(N1.getValueType().bitsLE(VT) &&
7349 "The input must be the same size or smaller than the result.");
7352 "The destination vector type must have fewer lanes than the input.");
7353 break;
7354 case ISD::ABS:
7355 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid ABS!");
7356 if (N1.isUndef())
7357 return getConstant(0, DL, VT);
7358 break;
7360 assert(VT.isInteger() && VT == N1.getValueType() &&
7361 "Invalid ABS_MIN_POISON!");
7362 if (N1.isUndef())
7363 return getConstant(0, DL, VT);
7364 break;
7365 case ISD::BSWAP:
7366 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BSWAP!");
7367 assert((VT.getScalarSizeInBits() % 16 == 0) &&
7368 "BSWAP types must be a multiple of 16 bits!");
7369 if (N1.isUndef())
7370 return getUNDEF(VT);
7371 // bswap(bswap(X)) -> X.
7372 if (OpOpcode == ISD::BSWAP)
7373 return N1.getOperand(0);
7374 break;
7375 case ISD::BITREVERSE:
7376 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BITREVERSE!");
7377 if (N1.isUndef())
7378 return getUNDEF(VT);
7379 break;
7380 case ISD::BITCAST:
7382 "Cannot BITCAST between types of different sizes!");
7383 if (VT == N1.getValueType()) return N1; // noop conversion.
7384 if (OpOpcode == ISD::BITCAST) // bitconv(bitconv(x)) -> bitconv(x)
7385 return getNode(ISD::BITCAST, DL, VT, N1.getOperand(0));
7386 if (N1.isUndef())
7387 return getUNDEF(VT);
7388 break;
7390 assert(VT.isVector() && !N1.getValueType().isVector() &&
7391 (VT.getVectorElementType() == N1.getValueType() ||
7393 N1.getValueType().isInteger() &&
7395 "Illegal SCALAR_TO_VECTOR node!");
7396 if (N1.isUndef())
7397 return getUNDEF(VT);
7398 // scalar_to_vector(extract_vector_elt V, 0) -> V, top bits are undefined.
7399 if (OpOpcode == ISD::EXTRACT_VECTOR_ELT &&
7401 N1.getConstantOperandVal(1) == 0 &&
7402 N1.getOperand(0).getValueType() == VT)
7403 return N1.getOperand(0);
7404 break;
7405 case ISD::FNEG:
7406 // Negation of an unknown bag of bits is still completely undefined.
7407 if (N1.isUndef())
7408 return getUNDEF(VT);
7409
7410 if (OpOpcode == ISD::FNEG) // --X -> X
7411 return N1.getOperand(0);
7412 break;
7413 case ISD::FABS:
7414 if (OpOpcode == ISD::FNEG) // abs(-X) -> abs(X)
7415 return getNode(ISD::FABS, DL, VT, N1.getOperand(0));
7416 break;
7417 case ISD::VSCALE:
7418 assert(VT == N1.getValueType() && "Unexpected VT!");
7419 break;
7420 case ISD::CTPOP:
7421 if (N1.getValueType().getScalarType() == MVT::i1)
7422 return N1;
7423 break;
7424 case ISD::CTLZ:
7425 case ISD::CTTZ:
7426 if (N1.getValueType().getScalarType() == MVT::i1)
7427 return getNOT(DL, N1, N1.getValueType());
7428 break;
7429 case ISD::CTLS:
7430 if (N1.getValueType().getScalarType() == MVT::i1)
7431 return getConstant(0, DL, VT);
7432 break;
7433 case ISD::VECREDUCE_ADD:
7434 if (N1.getValueType().getScalarType() == MVT::i1)
7435 return getNode(ISD::VECREDUCE_XOR, DL, VT, N1);
7436 break;
7439 if (N1.getValueType().getScalarType() == MVT::i1)
7440 return getNode(ISD::VECREDUCE_OR, DL, VT, N1);
7441 break;
7444 if (N1.getValueType().getScalarType() == MVT::i1)
7445 return getNode(ISD::VECREDUCE_AND, DL, VT, N1);
7446 break;
7447 case ISD::SPLAT_VECTOR:
7448 assert(VT.isVector() && "Wrong return type!");
7449 // FIXME: Hexagon uses i32 scalar for a floating point zero vector so allow
7450 // that for now.
7452 (VT.isFloatingPoint() && N1.getValueType() == MVT::i32) ||
7454 N1.getValueType().isInteger() &&
7456 "Wrong operand type!");
7457 break;
7458 }
7459
7460 SDNode *N;
7461 SDVTList VTs = getVTList(VT);
7462 SDValue Ops[] = {N1};
7463 if (VT != MVT::Glue) { // Don't CSE glue producing nodes
7464 SDNodeKey ID(Opcode, VTs, Ops);
7465 FoldingSetInsertToken InsertToken;
7466 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
7467 E->intersectFlagsWith(Flags);
7468 return SDValue(E, 0);
7469 }
7470
7471 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7472 N->setFlags(Flags);
7473 createOperands(N, Ops);
7474 CSEMap.insert(N, InsertToken);
7475 } else {
7476 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7477 createOperands(N, Ops);
7478 }
7479
7480 InsertNode(N);
7481 SDValue V = SDValue(N, 0);
7482 NewSDValueDbgMsg(V, "Creating new node: ", this);
7483 return V;
7484}
7485
7486static APInt getIntegerIdentity(unsigned Opcode, unsigned BitWidth) {
7487 switch (Opcode) {
7488 default:
7489 llvm_unreachable("Unexpected integer identity opcode");
7490 case ISD::ADD:
7491 case ISD::OR:
7492 case ISD::XOR:
7493 case ISD::UMAX:
7494 return APInt::getZero(BitWidth);
7495 case ISD::MUL:
7496 return APInt(BitWidth, 1);
7497 case ISD::AND:
7498 case ISD::UMIN:
7500 case ISD::SMAX:
7502 case ISD::SMIN:
7504 }
7505}
7506
7507static std::optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
7508 const APInt &C2) {
7509 switch (Opcode) {
7510 case ISD::ADD: return C1 + C2;
7511 case ISD::SUB: return C1 - C2;
7512 case ISD::MUL: return C1 * C2;
7513 case ISD::AND: return C1 & C2;
7514 case ISD::OR: return C1 | C2;
7515 case ISD::XOR: return C1 ^ C2;
7516 case ISD::SHL: return C1 << C2;
7517 case ISD::SRL: return C1.lshr(C2);
7518 case ISD::SRA: return C1.ashr(C2);
7519 case ISD::ROTL: return C1.rotl(C2);
7520 case ISD::ROTR: return C1.rotr(C2);
7521 case ISD::SMIN: return C1.sle(C2) ? C1 : C2;
7522 case ISD::SMAX: return C1.sge(C2) ? C1 : C2;
7523 case ISD::UMIN: return C1.ule(C2) ? C1 : C2;
7524 case ISD::UMAX: return C1.uge(C2) ? C1 : C2;
7525 case ISD::SADDSAT: return C1.sadd_sat(C2);
7526 case ISD::UADDSAT: return C1.uadd_sat(C2);
7527 case ISD::SSUBSAT: return C1.ssub_sat(C2);
7528 case ISD::USUBSAT: return C1.usub_sat(C2);
7529 case ISD::SSHLSAT: return C1.sshl_sat(C2);
7530 case ISD::USHLSAT: return C1.ushl_sat(C2);
7531 case ISD::UDIV:
7532 if (!C2.getBoolValue())
7533 break;
7534 return C1.udiv(C2);
7535 case ISD::UREM:
7536 if (!C2.getBoolValue())
7537 break;
7538 return C1.urem(C2);
7539 case ISD::SDIV:
7540 if (!C2.getBoolValue())
7541 break;
7542 return C1.sdiv(C2);
7543 case ISD::SREM:
7544 if (!C2.getBoolValue())
7545 break;
7546 return C1.srem(C2);
7547 case ISD::AVGFLOORS:
7548 return APIntOps::avgFloorS(C1, C2);
7549 case ISD::AVGFLOORU:
7550 return APIntOps::avgFloorU(C1, C2);
7551 case ISD::AVGCEILS:
7552 return APIntOps::avgCeilS(C1, C2);
7553 case ISD::AVGCEILU:
7554 return APIntOps::avgCeilU(C1, C2);
7555 case ISD::ABDS:
7556 return APIntOps::abds(C1, C2);
7557 case ISD::ABDU:
7558 return APIntOps::abdu(C1, C2);
7559 case ISD::MULHS:
7560 return APIntOps::mulhs(C1, C2);
7561 case ISD::MULHU:
7562 return APIntOps::mulhu(C1, C2);
7563 case ISD::CLMUL:
7564 return APIntOps::clmul(C1, C2);
7565 case ISD::CLMULR:
7566 return APIntOps::clmulr(C1, C2);
7567 case ISD::CLMULH:
7568 return APIntOps::clmulh(C1, C2);
7569 case ISD::PEXT:
7570 return APIntOps::pext(C1, C2);
7571 case ISD::PDEP:
7572 return APIntOps::pdep(C1, C2);
7573 }
7574 return std::nullopt;
7575}
7576// Handle constant folding with UNDEF.
7577// TODO: Handle more cases.
7578static std::optional<APInt> FoldValueWithUndef(unsigned Opcode, const APInt &C1,
7579 bool IsUndef1, const APInt &C2,
7580 bool IsUndef2) {
7581 if (!(IsUndef1 || IsUndef2))
7582 return FoldValue(Opcode, C1, C2);
7583
7584 // Fold and(x, undef) -> 0
7585 // Fold mul(x, undef) -> 0
7586 if (Opcode == ISD::AND || Opcode == ISD::MUL)
7587 return APInt::getZero(C1.getBitWidth());
7588
7589 return std::nullopt;
7590}
7591
7593 const GlobalAddressSDNode *GA,
7594 const SDNode *N2) {
7595 if (GA->getOpcode() != ISD::GlobalAddress)
7596 return SDValue();
7597 if (!TLI->isOffsetFoldingLegal(GA))
7598 return SDValue();
7599 auto *C2 = dyn_cast<ConstantSDNode>(N2);
7600 if (!C2)
7601 return SDValue();
7602 int64_t Offset = C2->getSExtValue();
7603 switch (Opcode) {
7604 case ISD::ADD:
7605 case ISD::PTRADD:
7606 break;
7607 case ISD::SUB: Offset = -uint64_t(Offset); break;
7608 default: return SDValue();
7609 }
7610 return getGlobalAddress(GA->getGlobal(), SDLoc(C2), VT,
7611 GA->getOffset() + uint64_t(Offset));
7612}
7613
7615 switch (Opcode) {
7616 case ISD::SDIV:
7617 case ISD::UDIV:
7618 case ISD::SREM:
7619 case ISD::UREM: {
7620 // If a divisor is zero/undef or any element of a divisor vector is
7621 // zero/undef, the whole op is undef.
7622 assert(Ops.size() == 2 && "Div/rem should have 2 operands");
7623 SDValue Divisor = Ops[1];
7624 if (Divisor.isUndef() || isNullConstant(Divisor))
7625 return true;
7626
7627 return ISD::isBuildVectorOfConstantSDNodes(Divisor.getNode()) &&
7628 llvm::any_of(Divisor->op_values(),
7629 [](SDValue V) { return V.isUndef() ||
7630 isNullConstant(V); });
7631 // TODO: Handle signed overflow.
7632 }
7633 // TODO: Handle oversized shifts.
7634 default:
7635 return false;
7636 }
7637}
7638
7641 SDNodeFlags Flags) {
7642 // If the opcode is a target-specific ISD node, there's nothing we can
7643 // do here and the operand rules may not line up with the below, so
7644 // bail early.
7645 // We can't create a scalar CONCAT_VECTORS so skip it. It will break
7646 // for concats involving SPLAT_VECTOR. Concats of BUILD_VECTORS are handled by
7647 // foldCONCAT_VECTORS in getNode before this is called.
7648 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::CONCAT_VECTORS)
7649 return SDValue();
7650
7651 unsigned NumOps = Ops.size();
7652 if (NumOps == 0)
7653 return SDValue();
7654
7655 if (isUndef(Opcode, Ops))
7656 return getUNDEF(VT);
7657
7658 // Handle unary special cases.
7659 if (NumOps == 1) {
7660 SDValue N1 = Ops[0];
7661
7662 // Constant fold unary operations with an integer constant operand. Even
7663 // opaque constant will be folded, because the folding of unary operations
7664 // doesn't create new constants with different values. Nevertheless, the
7665 // opaque flag is preserved during folding to prevent future folding with
7666 // other constants.
7667 if (auto *C = dyn_cast<ConstantSDNode>(N1)) {
7668 const APInt &Val = C->getAPIntValue();
7669 switch (Opcode) {
7670 case ISD::SIGN_EXTEND:
7671 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7672 C->isTargetOpcode(), C->isOpaque());
7673 case ISD::TRUNCATE:
7674 if (C->isOpaque())
7675 break;
7676 [[fallthrough]];
7677 case ISD::ZERO_EXTEND:
7678 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7679 C->isTargetOpcode(), C->isOpaque());
7680 case ISD::ANY_EXTEND:
7681 // Some targets like RISCV prefer to sign extend some types.
7682 if (TLI->isSExtCheaperThanZExt(N1.getValueType(), VT))
7683 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7684 C->isTargetOpcode(), C->isOpaque());
7685 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7686 C->isTargetOpcode(), C->isOpaque());
7687 case ISD::ABS:
7688 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7689 C->isOpaque());
7691 if (Val.isMinSignedValue())
7692 return getPOISON(VT);
7693 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7694 C->isOpaque());
7695 case ISD::BITREVERSE:
7696 return getConstant(Val.reverseBits(), DL, VT, C->isTargetOpcode(),
7697 C->isOpaque());
7698 case ISD::BSWAP:
7699 return getConstant(Val.byteSwap(), DL, VT, C->isTargetOpcode(),
7700 C->isOpaque());
7701 case ISD::CTPOP:
7702 return getConstant(Val.popcount(), DL, VT, C->isTargetOpcode(),
7703 C->isOpaque());
7704 case ISD::PARITY:
7705 return getConstant(Val.popcount() & 1, DL, VT, C->isTargetOpcode(),
7706 C->isOpaque());
7707 case ISD::CTLZ:
7709 return getConstant(Val.countl_zero(), DL, VT, C->isTargetOpcode(),
7710 C->isOpaque());
7711 case ISD::CTTZ:
7713 return getConstant(Val.countr_zero(), DL, VT, C->isTargetOpcode(),
7714 C->isOpaque());
7715 case ISD::CTLS:
7716 // CTLS returns the number of extra sign bits so subtract one.
7717 return getConstant(Val.getNumSignBits() - 1, DL, VT,
7718 C->isTargetOpcode(), C->isOpaque());
7719 case ISD::UINT_TO_FP:
7720 case ISD::SINT_TO_FP: {
7722 (void)FPV.convertFromAPInt(Val, Opcode == ISD::SINT_TO_FP,
7724 return getConstantFP(FPV, DL, VT);
7725 }
7726 case ISD::FP16_TO_FP:
7727 case ISD::BF16_TO_FP: {
7728 bool Ignored;
7729 APFloat FPV(Opcode == ISD::FP16_TO_FP ? APFloat::IEEEhalf()
7730 : APFloat::BFloat(),
7731 (Val.getBitWidth() == 16) ? Val : Val.trunc(16));
7732
7733 // This can return overflow, underflow, or inexact; we don't care.
7734 // FIXME need to be more flexible about rounding mode.
7736 &Ignored);
7737 return getConstantFP(FPV, DL, VT);
7738 }
7739 case ISD::STEP_VECTOR:
7740 if (SDValue V = FoldSTEP_VECTOR(DL, VT, N1, *this))
7741 return V;
7742 break;
7743 case ISD::BITCAST:
7744 if (VT == MVT::f16 && C->getValueType(0) == MVT::i16)
7745 return getConstantFP(APFloat(APFloat::IEEEhalf(), Val), DL, VT);
7746 if (VT == MVT::f32 && C->getValueType(0) == MVT::i32)
7747 return getConstantFP(APFloat(APFloat::IEEEsingle(), Val), DL, VT);
7748 if (VT == MVT::f64 && C->getValueType(0) == MVT::i64)
7749 return getConstantFP(APFloat(APFloat::IEEEdouble(), Val), DL, VT);
7750 if (VT == MVT::f128 && C->getValueType(0) == MVT::i128)
7751 return getConstantFP(APFloat(APFloat::IEEEquad(), Val), DL, VT);
7752 break;
7753 }
7754 }
7755
7756 // Constant fold unary operations with a floating point constant operand.
7757 if (auto *C = dyn_cast<ConstantFPSDNode>(N1)) {
7758 APFloat V = C->getValueAPF(); // make copy
7759 switch (Opcode) {
7760 case ISD::FNEG:
7761 V.changeSign();
7762 return getConstantFP(V, DL, VT);
7763 case ISD::FABS:
7764 V.clearSign();
7765 return getConstantFP(V, DL, VT);
7766 case ISD::FCEIL: {
7767 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardPositive);
7769 return getConstantFP(V, DL, VT);
7770 return SDValue();
7771 }
7772 case ISD::FTRUNC: {
7773 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardZero);
7775 return getConstantFP(V, DL, VT);
7776 return SDValue();
7777 }
7778 case ISD::FFLOOR: {
7779 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardNegative);
7781 return getConstantFP(V, DL, VT);
7782 return SDValue();
7783 }
7784 case ISD::FP_EXTEND: {
7785 bool ignored;
7786 // This can return overflow, underflow, or inexact; we don't care.
7787 // FIXME need to be more flexible about rounding mode.
7788 (void)V.convert(VT.getFltSemantics(), APFloat::rmNearestTiesToEven,
7789 &ignored);
7790 return getConstantFP(V, DL, VT);
7791 }
7792 case ISD::FP_TO_SINT:
7793 case ISD::FP_TO_UINT: {
7794 bool ignored;
7795 APSInt IntVal(VT.getSizeInBits(), Opcode == ISD::FP_TO_UINT);
7796 // FIXME need to be more flexible about rounding mode.
7798 V.convertToInteger(IntVal, APFloat::rmTowardZero, &ignored);
7799 if (s == APFloat::opInvalidOp) // inexact is OK, in fact usual
7800 break;
7801 return getConstant(IntVal, DL, VT);
7802 }
7803 case ISD::FP_TO_FP16:
7804 case ISD::FP_TO_BF16: {
7805 bool Ignored;
7806 // This can return overflow, underflow, or inexact; we don't care.
7807 // FIXME need to be more flexible about rounding mode.
7808 (void)V.convert(Opcode == ISD::FP_TO_FP16 ? APFloat::IEEEhalf()
7809 : APFloat::BFloat(),
7811 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7812 }
7813 case ISD::BITCAST:
7814 if (VT == MVT::i16 && C->getValueType(0) == MVT::f16)
7815 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7816 VT);
7817 if (VT == MVT::i16 && C->getValueType(0) == MVT::bf16)
7818 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7819 VT);
7820 if (VT == MVT::i32 && C->getValueType(0) == MVT::f32)
7821 return getConstant((uint32_t)V.bitcastToAPInt().getZExtValue(), DL,
7822 VT);
7823 if (VT == MVT::i64 && C->getValueType(0) == MVT::f64)
7824 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7825 break;
7826 }
7827 }
7828
7829 // Early-out if we failed to constant fold a bitcast.
7830 if (Opcode == ISD::BITCAST)
7831 return SDValue();
7832
7833 // Constant fold integer vector reductions with constant BUILD_VECTORs.
7834 if ((Opcode == ISD::VECREDUCE_ADD || Opcode == ISD::VECREDUCE_SMAX ||
7835 Opcode == ISD::VECREDUCE_SMIN || Opcode == ISD::VECREDUCE_UMAX ||
7836 Opcode == ISD::VECREDUCE_UMIN || Opcode == ISD::VECREDUCE_MUL ||
7837 Opcode == ISD::VECREDUCE_OR || Opcode == ISD::VECREDUCE_XOR ||
7838 Opcode == ISD::VECREDUCE_AND) &&
7840 unsigned EltBits = N1.getValueType().getScalarSizeInBits();
7841 unsigned BaseOpcode = ISD::getVecReduceBaseOpcode(Opcode);
7842 APInt Acc = getIntegerIdentity(BaseOpcode, EltBits);
7843 for (SDValue Elt : N1->op_values()) {
7844 if (Elt.getOpcode() == ISD::POISON)
7845 return getPOISON(VT);
7846 if (Elt.isUndef() || cast<ConstantSDNode>(Elt)->isOpaque())
7847 return SDValue();
7848 APInt Value = cast<ConstantSDNode>(Elt)->getAPIntValue().trunc(EltBits);
7849 std::optional<APInt> Folded = FoldValue(BaseOpcode, Acc, Value);
7850 assert(Folded &&
7851 "Expected vector reduction base opcode to be foldable");
7852 Acc = *Folded;
7853 }
7854 EVT EltVT = N1.getValueType().getScalarType();
7855 return getAnyExtOrTrunc(getConstant(Acc, DL, EltVT), DL, VT);
7856 }
7857 }
7858
7859 // Handle binops special cases.
7860 if (NumOps == 2) {
7861 if (SDValue CFP = foldConstantFPMath(Opcode, DL, VT, Ops))
7862 return CFP;
7863
7864 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7865 if (auto *C2 = dyn_cast<ConstantSDNode>(Ops[1])) {
7866 if (C1->isOpaque() || C2->isOpaque())
7867 return SDValue();
7868
7869 std::optional<APInt> FoldAttempt =
7870 FoldValue(Opcode, C1->getAPIntValue(), C2->getAPIntValue());
7871 if (!FoldAttempt)
7872 return SDValue();
7873
7874 SDValue Folded = getConstant(*FoldAttempt, DL, VT);
7875 assert((!Folded || !VT.isVector()) &&
7876 "Can't fold vectors ops with scalar operands");
7877 return Folded;
7878 }
7879 }
7880
7881 // fold (add Sym, c) -> Sym+c
7883 return FoldSymbolOffset(Opcode, VT, GA, Ops[1].getNode());
7884 if (TLI->isCommutativeBinOp(Opcode))
7886 return FoldSymbolOffset(Opcode, VT, GA, Ops[0].getNode());
7887
7888 // fold (sext_in_reg c1) -> c2
7889 if (Opcode == ISD::SIGN_EXTEND_INREG) {
7890 EVT EVT = cast<VTSDNode>(Ops[1])->getVT();
7891
7892 auto SignExtendInReg = [&](APInt Val, llvm::EVT ConstantVT) {
7893 unsigned FromBits = EVT.getScalarSizeInBits();
7894 Val <<= Val.getBitWidth() - FromBits;
7895 Val.ashrInPlace(Val.getBitWidth() - FromBits);
7896 return getConstant(Val, DL, ConstantVT);
7897 };
7898
7899 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7900 const APInt &Val = C1->getAPIntValue();
7901 return SignExtendInReg(Val, VT);
7902 }
7903
7905 SmallVector<SDValue, 8> ScalarOps;
7906 llvm::EVT OpVT = Ops[0].getOperand(0).getValueType();
7907 for (int I = 0, E = VT.getVectorNumElements(); I != E; ++I) {
7908 SDValue Op = Ops[0].getOperand(I);
7909 if (Op.isUndef()) {
7910 ScalarOps.push_back(getUNDEF(OpVT));
7911 continue;
7912 }
7913 const APInt &Val = cast<ConstantSDNode>(Op)->getAPIntValue();
7914 ScalarOps.push_back(SignExtendInReg(Val, OpVT));
7915 }
7916 return getBuildVector(VT, DL, ScalarOps);
7917 }
7918
7919 if (Ops[0].getOpcode() == ISD::SPLAT_VECTOR &&
7920 isa<ConstantSDNode>(Ops[0].getOperand(0)))
7921 return getNode(ISD::SPLAT_VECTOR, DL, VT,
7922 SignExtendInReg(Ops[0].getConstantOperandAPInt(0),
7923 Ops[0].getOperand(0).getValueType()));
7924 }
7925 }
7926
7927 // Handle fshl/fshr special cases.
7928 if (Opcode == ISD::FSHL || Opcode == ISD::FSHR) {
7929 auto *C1 = dyn_cast<ConstantSDNode>(Ops[0]);
7930 auto *C2 = dyn_cast<ConstantSDNode>(Ops[1]);
7931 auto *C3 = dyn_cast<ConstantSDNode>(Ops[2]);
7932
7933 if (C1 && C2 && C3) {
7934 if (C1->isOpaque() || C2->isOpaque() || C3->isOpaque())
7935 return SDValue();
7936 const APInt &V1 = C1->getAPIntValue(), &V2 = C2->getAPIntValue(),
7937 &V3 = C3->getAPIntValue();
7938
7939 APInt FoldedVal = Opcode == ISD::FSHL ? APIntOps::fshl(V1, V2, V3)
7940 : APIntOps::fshr(V1, V2, V3);
7941 return getConstant(FoldedVal, DL, VT);
7942 }
7943 }
7944
7945 // Handle fma/fmad special cases.
7946 if (Opcode == ISD::FMA || Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7947 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
7948 assert(Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
7949 Ops[2].getValueType() == VT && "FMA types must match!");
7953 if (C1 && C2 && C3) {
7954 APFloat V1 = C1->getValueAPF();
7955 const APFloat &V2 = C2->getValueAPF();
7956 const APFloat &V3 = C3->getValueAPF();
7957 if (Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7958 V1.multiply(V2, APFloat::rmNearestTiesToEven);
7960 } else
7961 V1.fusedMultiplyAdd(V2, V3, APFloat::rmNearestTiesToEven);
7962 return getConstantFP(V1, DL, VT);
7963 }
7964 }
7965
7966 // This is for vector folding only from here on.
7967 if (!VT.isVector())
7968 return SDValue();
7969
7970 // Constant fold integer partial reductions with constant BUILD_VECTOR
7971 // operands. The reduction order is deliberately unspecified. Use the same
7972 // subvector layout as TargetLowering::expandPartialReduceMLA(), where input
7973 // lane I contributes to accumulator lane I % NumAccElts.
7974 if (Opcode == ISD::PARTIAL_REDUCE_SMLA ||
7975 Opcode == ISD::PARTIAL_REDUCE_UMLA ||
7976 Opcode == ISD::PARTIAL_REDUCE_SUMLA) {
7977 // These nodes have no scalar form, so unsupported cases must not fall
7978 // through to generic per-lane vector folding.
7979 if (!llvm::all_of(Ops, [](SDValue Op) {
7980 return ISD::isBuildVectorOfConstantSDNodes(Op.getNode());
7981 }))
7982 return SDValue();
7983
7984 unsigned AccEltBits = VT.getScalarSizeInBits();
7985 unsigned InputEltBits = Ops[1].getScalarValueSizeInBits();
7986 unsigned NumAccElts = VT.getVectorNumElements();
7987 unsigned NumInputElts = Ops[1].getValueType().getVectorNumElements();
7988 SmallVector<APInt, 8> Results(NumAccElts, APInt::getZero(AccEltBits));
7989 BitVector PoisonElts(NumAccElts);
7990
7991 for (unsigned I = 0; I != NumAccElts; ++I) {
7992 SDValue Elt = Ops[0].getOperand(I);
7993 if (Elt.getOpcode() == ISD::POISON) {
7994 PoisonElts.set(I);
7995 continue;
7996 }
7997 auto *C = dyn_cast<ConstantSDNode>(Elt);
7998 if (!C || C->isOpaque())
7999 return SDValue();
8000 Results[I] = C->getAPIntValue().trunc(AccEltBits);
8001 }
8002
8003 bool IsLHSSigned = Opcode != ISD::PARTIAL_REDUCE_UMLA;
8004 bool IsRHSSigned = Opcode == ISD::PARTIAL_REDUCE_SMLA;
8005 for (unsigned I = 0; I != NumInputElts; ++I) {
8006 const unsigned AccIdx = I % NumAccElts;
8007 SDValue LHSElt = Ops[1].getOperand(I);
8008 SDValue RHSElt = Ops[2].getOperand(I);
8009 if (LHSElt.getOpcode() == ISD::POISON ||
8010 RHSElt.getOpcode() == ISD::POISON) {
8011 PoisonElts.set(AccIdx);
8012 continue;
8013 }
8014
8015 auto *LHS = dyn_cast<ConstantSDNode>(LHSElt);
8016 auto *RHS = dyn_cast<ConstantSDNode>(RHSElt);
8017 if (!LHS || !RHS || LHS->isOpaque() || RHS->isOpaque())
8018 return SDValue();
8019
8020 APInt LHSVal = LHS->getAPIntValue().trunc(InputEltBits);
8021 APInt RHSVal = RHS->getAPIntValue().trunc(InputEltBits);
8022 LHSVal = IsLHSSigned ? LHSVal.sext(AccEltBits) : LHSVal.zext(AccEltBits);
8023 RHSVal = IsRHSSigned ? RHSVal.sext(AccEltBits) : RHSVal.zext(AccEltBits);
8024 Results[AccIdx] += LHSVal * RHSVal;
8025 }
8026
8027 // After type legalization the vector element type may not be a legal
8028 // scalar type (e.g. i16 on AArch64). Create the folded constants in the
8029 // promoted legal scalar type instead, matching the generic per-lane path
8030 // below. Bail out if legalization would narrow the type, since the lane
8031 // value would not fit.
8032 EVT AccEltVT = VT.getVectorElementType();
8033 EVT LegalSVT = AccEltVT;
8034 if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
8035 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
8036 if (LegalSVT.bitsLT(AccEltVT))
8037 return SDValue();
8038 }
8039
8040 SmallVector<SDValue, 8> ResultOps;
8041 for (unsigned I = 0; I != NumAccElts; ++I)
8042 ResultOps.push_back(
8043 PoisonElts[I] ? getPOISON(LegalSVT)
8044 : getConstant(Results[I].sext(LegalSVT.getSizeInBits()),
8045 DL, LegalSVT));
8046 return getBuildVector(VT, DL, ResultOps);
8047 }
8048
8049 ElementCount NumElts = VT.getVectorElementCount();
8050
8051 // See if we can fold through any bitcasted integer ops.
8052 if (NumOps == 2 && VT.isFixedLengthVector() && VT.isInteger() &&
8053 Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
8054 (Ops[0].getOpcode() == ISD::BITCAST ||
8055 Ops[1].getOpcode() == ISD::BITCAST)) {
8058 auto *BV1 = dyn_cast<BuildVectorSDNode>(N1);
8059 auto *BV2 = dyn_cast<BuildVectorSDNode>(N2);
8060 if (BV1 && BV2 && N1.getValueType().isInteger() &&
8061 N2.getValueType().isInteger()) {
8062 bool IsLE = getDataLayout().isLittleEndian();
8063 unsigned EltBits = VT.getScalarSizeInBits();
8064 SmallVector<APInt> RawBits1, RawBits2;
8065 BitVector UndefElts1, UndefElts2;
8066 if (BV1->getConstantRawBits(IsLE, EltBits, RawBits1, UndefElts1) &&
8067 BV2->getConstantRawBits(IsLE, EltBits, RawBits2, UndefElts2)) {
8068 SmallVector<APInt> RawBits;
8069 for (unsigned I = 0, E = NumElts.getFixedValue(); I != E; ++I) {
8070 std::optional<APInt> Fold = FoldValueWithUndef(
8071 Opcode, RawBits1[I], UndefElts1[I], RawBits2[I], UndefElts2[I]);
8072 if (!Fold)
8073 break;
8074 RawBits.push_back(*Fold);
8075 }
8076 if (RawBits.size() == NumElts.getFixedValue()) {
8077 // We have constant folded, but we might need to cast this again back
8078 // to the original (possibly legalized) type.
8079 EVT BVVT, BVEltVT;
8080 if (N1.getValueType() == VT) {
8081 BVVT = N1.getValueType();
8082 BVEltVT = BV1->getOperand(0).getValueType();
8083 } else {
8084 BVVT = N2.getValueType();
8085 BVEltVT = BV2->getOperand(0).getValueType();
8086 }
8087 unsigned BVEltBits = BVEltVT.getSizeInBits();
8088 SmallVector<APInt> DstBits;
8089 BitVector DstUndefs;
8091 DstBits, RawBits, DstUndefs,
8092 BitVector(RawBits.size(), false));
8093 SmallVector<SDValue> Ops(DstBits.size(), getUNDEF(BVEltVT));
8094 for (unsigned I = 0, E = DstBits.size(); I != E; ++I) {
8095 if (DstUndefs[I])
8096 continue;
8097 Ops[I] = getConstant(DstBits[I].sext(BVEltBits), DL, BVEltVT);
8098 }
8099 return getBitcast(VT, getBuildVector(BVVT, DL, Ops));
8100 }
8101 }
8102 }
8103 // Logic ops can be folded from raw integer bits - mainly for AVX512 masks.
8104 if (ISD::isBitwiseLogicOp(Opcode) && isa<ConstantSDNode>(N1) &&
8105 isa<ConstantSDNode>(N2)) {
8106 if (SDValue Res = FoldConstantArithmetic(Opcode, DL, N1.getValueType(),
8107 {N1, N2}, Flags))
8108 return getBitcast(VT, Res);
8109 }
8110 }
8111
8112 // Fold (mul step_vector(C0), C1) to (step_vector(C0 * C1)).
8113 // (shl step_vector(C0), C1) -> (step_vector(C0 << C1))
8114 if ((Opcode == ISD::MUL || Opcode == ISD::SHL) &&
8115 Ops[0].getOpcode() == ISD::STEP_VECTOR) {
8116 APInt RHSVal;
8117 if (ISD::isConstantSplatVector(Ops[1].getNode(), RHSVal)) {
8118 APInt NewStep = Opcode == ISD::MUL
8119 ? Ops[0].getConstantOperandAPInt(0) * RHSVal
8120 : Ops[0].getConstantOperandAPInt(0) << RHSVal;
8121 return getStepVector(DL, VT, NewStep);
8122 }
8123 }
8124
8125 auto IsScalarOrSameVectorSize = [NumElts](const SDValue &Op) {
8126 return !Op.getValueType().isVector() ||
8127 Op.getValueType().getVectorElementCount() == NumElts;
8128 };
8129
8130 auto IsBuildVectorSplatVectorOrUndef = [](const SDValue &Op) {
8131 return Op.isUndef() || Op.getOpcode() == ISD::CONDCODE ||
8132 Op.getOpcode() == ISD::BUILD_VECTOR ||
8133 Op.getOpcode() == ISD::SPLAT_VECTOR;
8134 };
8135
8136 // All operands must be vector types with the same number of elements as
8137 // the result type and must be either UNDEF or a build/splat vector
8138 // or UNDEF scalars.
8139 if (!llvm::all_of(Ops, IsBuildVectorSplatVectorOrUndef) ||
8140 !llvm::all_of(Ops, IsScalarOrSameVectorSize))
8141 return SDValue();
8142
8143 // If we are comparing vectors, then the result needs to be a i1 boolean that
8144 // is then extended back to the legal result type depending on how booleans
8145 // are represented.
8146 EVT SVT = (Opcode == ISD::SETCC ? MVT::i1 : VT.getScalarType());
8147 ISD::NodeType ExtendCode =
8148 (Opcode == ISD::SETCC && SVT != VT.getScalarType())
8149 ? TargetLowering::getExtendForContent(TLI->getBooleanContents(VT))
8151
8152 // Find legal integer scalar type for constant promotion and
8153 // ensure that its scalar size is at least as large as source.
8154 EVT LegalSVT = VT.getScalarType();
8155 if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
8156 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
8157 if (LegalSVT.bitsLT(VT.getScalarType()))
8158 return SDValue();
8159 }
8160
8161 // For scalable vector types we know we're dealing with SPLAT_VECTORs. We
8162 // only have one operand to check. For fixed-length vector types we may have
8163 // a combination of BUILD_VECTOR and SPLAT_VECTOR.
8164 unsigned NumVectorElts = NumElts.isScalable() ? 1 : NumElts.getFixedValue();
8165
8166 // Constant fold each scalar lane separately.
8167 SmallVector<SDValue, 4> ScalarResults;
8168 for (unsigned I = 0; I != NumVectorElts; I++) {
8169 SmallVector<SDValue, 4> ScalarOps;
8170 for (SDValue Op : Ops) {
8171 EVT InSVT = Op.getValueType().getScalarType();
8172 if (Op.getOpcode() != ISD::BUILD_VECTOR &&
8173 Op.getOpcode() != ISD::SPLAT_VECTOR) {
8174 if (Op.isUndef())
8175 ScalarOps.push_back(getUNDEF(InSVT));
8176 else
8177 ScalarOps.push_back(Op);
8178 continue;
8179 }
8180
8181 SDValue ScalarOp =
8182 Op.getOperand(Op.getOpcode() == ISD::SPLAT_VECTOR ? 0 : I);
8183 EVT ScalarVT = ScalarOp.getValueType();
8184
8185 // Build vector (integer) scalar operands may need implicit
8186 // truncation - do this before constant folding.
8187 if (ScalarVT.isInteger() && ScalarVT.bitsGT(InSVT)) {
8188 // Don't create illegally-typed nodes unless they're constants or undef
8189 // - if we fail to constant fold we can't guarantee the (dead) nodes
8190 // we're creating will be cleaned up before being visited for
8191 // legalization.
8192 if (NewNodesMustHaveLegalTypes && !ScalarOp.isUndef() &&
8193 !isa<ConstantSDNode>(ScalarOp) &&
8194 TLI->getTypeAction(*getContext(), InSVT) !=
8196 return SDValue();
8197 ScalarOp = getNode(ISD::TRUNCATE, DL, InSVT, ScalarOp);
8198 }
8199
8200 ScalarOps.push_back(ScalarOp);
8201 }
8202
8203 // Constant fold the scalar operands.
8204 SDValue ScalarResult = getNode(Opcode, DL, SVT, ScalarOps, Flags);
8205
8206 // Scalar folding only succeeded if the result is a constant or UNDEF.
8207 if (!ScalarResult.isUndef() && ScalarResult.getOpcode() != ISD::Constant &&
8208 ScalarResult.getOpcode() != ISD::ConstantFP)
8209 return SDValue();
8210
8211 // Legalize the (integer) scalar constant if necessary. We only do
8212 // this once we know the folding succeeded, since otherwise we would
8213 // get a node with illegal type which has a user.
8214 if (LegalSVT != SVT)
8215 ScalarResult = getNode(ExtendCode, DL, LegalSVT, ScalarResult);
8216
8217 ScalarResults.push_back(ScalarResult);
8218 }
8219
8220 SDValue V = NumElts.isScalable() ? getSplatVector(VT, DL, ScalarResults[0])
8221 : getBuildVector(VT, DL, ScalarResults);
8222 NewSDValueDbgMsg(V, "New node fold constant vector: ", this);
8223 return V;
8224}
8225
8228 // TODO: Add support for unary/ternary fp opcodes.
8229 if (Ops.size() != 2)
8230 return SDValue();
8231
8232 // TODO: We don't do any constant folding for strict FP opcodes here, but we
8233 // should. That will require dealing with a potentially non-default
8234 // rounding mode, checking the "opStatus" return value from the APFloat
8235 // math calculations, and possibly other variations.
8236 SDValue N1 = Ops[0];
8237 SDValue N2 = Ops[1];
8238 ConstantFPSDNode *N1CFP = isConstOrConstSplatFP(N1, /*AllowUndefs*/ false);
8239 ConstantFPSDNode *N2CFP = isConstOrConstSplatFP(N2, /*AllowUndefs*/ false);
8240 if (N1CFP && N2CFP) {
8241 APFloat C1 = N1CFP->getValueAPF(); // make copy
8242 const APFloat &C2 = N2CFP->getValueAPF();
8243 switch (Opcode) {
8244 case ISD::FADD:
8246 return getConstantFP(C1, DL, VT);
8247 case ISD::FSUB:
8249 return getConstantFP(C1, DL, VT);
8250 case ISD::FMUL:
8252 return getConstantFP(C1, DL, VT);
8253 case ISD::FDIV:
8255 return getConstantFP(C1, DL, VT);
8256 case ISD::FREM:
8257 C1.mod(C2);
8258 return getConstantFP(C1, DL, VT);
8259 case ISD::FCOPYSIGN:
8260 C1.copySign(C2);
8261 return getConstantFP(C1, DL, VT);
8262 case ISD::FMINNUM:
8263 return getConstantFP(minnum(C1, C2), DL, VT);
8264 case ISD::FMAXNUM:
8265 return getConstantFP(maxnum(C1, C2), DL, VT);
8266 case ISD::FMINIMUM:
8267 return getConstantFP(minimum(C1, C2), DL, VT);
8268 case ISD::FMAXIMUM:
8269 return getConstantFP(maximum(C1, C2), DL, VT);
8270 case ISD::FMINIMUMNUM:
8271 return getConstantFP(minimumnum(C1, C2), DL, VT);
8272 case ISD::FMAXIMUMNUM:
8273 return getConstantFP(maximumnum(C1, C2), DL, VT);
8274 default: break;
8275 }
8276 }
8277 if (N1CFP && Opcode == ISD::FP_ROUND) {
8278 APFloat C1 = N1CFP->getValueAPF(); // make copy
8279 bool Unused;
8280 // This can return overflow, underflow, or inexact; we don't care.
8281 // FIXME need to be more flexible about rounding mode.
8283 &Unused);
8284 return getConstantFP(C1, DL, VT);
8285 }
8286
8287 switch (Opcode) {
8288 case ISD::FSUB:
8289 // -0.0 - undef --> undef (consistent with "fneg undef")
8290 if (ConstantFPSDNode *N1C = isConstOrConstSplatFP(N1, /*AllowUndefs*/ true))
8291 if (N1C && N1C->getValueAPF().isNegZero() && N2.isUndef())
8292 return getUNDEF(VT);
8293 [[fallthrough]];
8294
8295 case ISD::FADD:
8296 case ISD::FMUL:
8297 case ISD::FDIV:
8298 case ISD::FREM:
8299 // If both operands are undef, the result is undef. If 1 operand is undef,
8300 // the result is NaN. This should match the behavior of the IR optimizer.
8301 if (N1.isUndef() && N2.isUndef())
8302 return getUNDEF(VT);
8303 if (N1.isUndef() || N2.isUndef())
8305 }
8306 return SDValue();
8307}
8308
8310 const SDLoc &DL, EVT DstEltVT) {
8311 EVT SrcEltVT = BV->getValueType(0).getVectorElementType();
8312
8313 // If this is already the right type, we're done.
8314 if (SrcEltVT == DstEltVT)
8315 return SDValue(BV, 0);
8316
8317 unsigned SrcBitSize = SrcEltVT.getSizeInBits();
8318 unsigned DstBitSize = DstEltVT.getSizeInBits();
8319
8320 // If this is a conversion of N elements of one type to N elements of another
8321 // type, convert each element. This handles FP<->INT cases.
8322 if (SrcBitSize == DstBitSize) {
8324 for (SDValue Op : BV->op_values()) {
8325 // If the vector element type is not legal, the BUILD_VECTOR operands
8326 // are promoted and implicitly truncated. Make that explicit here.
8327 if (Op.getValueType() != SrcEltVT)
8328 Op = getNode(ISD::TRUNCATE, DL, SrcEltVT, Op);
8329 Ops.push_back(getBitcast(DstEltVT, Op));
8330 }
8331 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT,
8333 return getBuildVector(VT, DL, Ops);
8334 }
8335
8336 // Otherwise, we're growing or shrinking the elements. To avoid having to
8337 // handle annoying details of growing/shrinking FP values, we convert them to
8338 // int first.
8339 if (SrcEltVT.isFloatingPoint()) {
8340 // Convert the input float vector to a int vector where the elements are the
8341 // same sizes.
8342 EVT IntEltVT = EVT::getIntegerVT(*getContext(), SrcEltVT.getSizeInBits());
8343 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8345 DstEltVT);
8346 return SDValue();
8347 }
8348
8349 // Now we know the input is an integer vector. If the output is a FP type,
8350 // convert to integer first, then to FP of the right size.
8351 if (DstEltVT.isFloatingPoint()) {
8352 EVT IntEltVT = EVT::getIntegerVT(*getContext(), DstEltVT.getSizeInBits());
8353 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8355 DstEltVT);
8356 return SDValue();
8357 }
8358
8359 // Okay, we know the src/dst types are both integers of differing types.
8360 assert(SrcEltVT.isInteger() && DstEltVT.isInteger());
8361
8362 // Extract the constant raw bit data.
8363 BitVector UndefElements;
8364 SmallVector<APInt> RawBits;
8365 bool IsLE = getDataLayout().isLittleEndian();
8366 if (!BV->getConstantRawBits(IsLE, DstBitSize, RawBits, UndefElements))
8367 return SDValue();
8368
8370 for (unsigned I = 0, E = RawBits.size(); I != E; ++I) {
8371 if (UndefElements[I])
8372 Ops.push_back(getUNDEF(DstEltVT));
8373 else
8374 Ops.push_back(getConstant(RawBits[I], DL, DstEltVT));
8375 }
8376
8377 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT, Ops.size());
8378 return getBuildVector(VT, DL, Ops);
8379}
8380
8382 assert(Val.getValueType().isInteger() && "Invalid AssertAlign!");
8383
8384 // There's no need to assert on a byte-aligned pointer. All pointers are at
8385 // least byte aligned.
8386 if (A == Align(1))
8387 return Val;
8388
8389 SDVTList VTs = getVTList(Val.getValueType());
8390 SDValue Ops[] = {Val};
8391 SDNodeKey ID(ISD::AssertAlign, VTs, Ops);
8392 ID.AddInteger(A.value());
8393
8394 FoldingSetInsertToken InsertToken;
8395 if (SDNode *E = lookupNode(ID, DL, InsertToken))
8396 return SDValue(E, 0);
8397
8398 auto *N =
8399 newSDNode<AssertAlignSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, A);
8400 createOperands(N, {Val});
8401
8402 CSEMap.insert(N, InsertToken);
8403 InsertNode(N);
8404
8405 SDValue V(N, 0);
8406 NewSDValueDbgMsg(V, "Creating new node: ", this);
8407 return V;
8408}
8409
8410SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8411 SDValue N1, SDValue N2) {
8412 SDNodeFlags Flags;
8413 if (Inserter)
8414 Flags = Inserter->getFlags();
8415 return getNode(Opcode, DL, VT, N1, N2, Flags);
8416}
8417
8419 SDValue &N2) const {
8420 if (!TLI->isCommutativeBinOp(Opcode))
8421 return;
8422
8423 // Canonicalize:
8424 // binop(const, nonconst) -> binop(nonconst, const)
8427 bool N1CFP = isConstantFPBuildVectorOrConstantFP(N1);
8428 bool N2CFP = isConstantFPBuildVectorOrConstantFP(N2);
8429 if ((N1C && !N2C) || (N1CFP && !N2CFP))
8430 std::swap(N1, N2);
8431
8432 // Canonicalize:
8433 // binop(splat(x), step_vector) -> binop(step_vector, splat(x))
8434 else if (N1.getOpcode() == ISD::SPLAT_VECTOR &&
8436 std::swap(N1, N2);
8437}
8438
8439SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8440 SDValue N1, SDValue N2, const SDNodeFlags Flags) {
8442 N2.getOpcode() != ISD::DELETED_NODE &&
8443 "Operand is DELETED_NODE!");
8444
8445 canonicalizeCommutativeBinop(Opcode, N1, N2);
8446
8447 auto *N1C = dyn_cast<ConstantSDNode>(N1);
8448 auto *N2C = dyn_cast<ConstantSDNode>(N2);
8449
8450 // Don't allow undefs in vector splats - we might be returning N2 when folding
8451 // to zero etc.
8452 ConstantSDNode *N2CV =
8453 isConstOrConstSplat(N2, /*AllowUndefs*/ false, /*AllowTruncation*/ true);
8454
8455 switch (Opcode) {
8456 default: break;
8457 case ISD::TokenFactor:
8458 assert(VT == MVT::Other && N1.getValueType() == MVT::Other &&
8459 N2.getValueType() == MVT::Other && "Invalid token factor!");
8460 // Fold trivial token factors.
8461 if (N1.getOpcode() == ISD::EntryToken) return N2;
8462 if (N2.getOpcode() == ISD::EntryToken) return N1;
8463 if (N1 == N2) return N1;
8464 break;
8465 case ISD::BUILD_VECTOR: {
8466 // Attempt to simplify BUILD_VECTOR.
8467 SDValue Ops[] = {N1, N2};
8468 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
8469 return V;
8470 break;
8471 }
8472 case ISD::CONCAT_VECTORS: {
8473 SDValue Ops[] = {N1, N2};
8474 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
8475 return V;
8476 break;
8477 }
8478 case ISD::AND:
8479 assert(VT.isInteger() && "This operator does not apply to FP types!");
8480 assert(N1.getValueType() == N2.getValueType() &&
8481 N1.getValueType() == VT && "Binary operator types must match!");
8482 // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's
8483 // worth handling here.
8484 if (N2CV && N2CV->isZero())
8485 return N2;
8486 if (N2CV && N2CV->isAllOnes()) // X & -1 -> X
8487 return N1;
8488 break;
8489 case ISD::OR:
8490 case ISD::XOR:
8491 case ISD::ADD:
8492 case ISD::PTRADD:
8493 case ISD::SUB:
8494 assert(VT.isInteger() && "This operator does not apply to FP types!");
8495 assert(N1.getValueType() == N2.getValueType() &&
8496 N1.getValueType() == VT && "Binary operator types must match!");
8497 // The equal operand types requirement is unnecessarily strong for PTRADD.
8498 // However, the SelectionDAGBuilder does not generate PTRADDs with different
8499 // operand types, and we'd need to re-implement GEP's non-standard wrapping
8500 // logic everywhere where PTRADDs may be folded or combined to properly
8501 // support them. If/when we introduce pointer types to the SDAG, we will
8502 // need to relax this constraint.
8503
8504 // (X ^|+- 0) -> X. This commonly occurs when legalizing i64 values, so
8505 // it's worth handling here.
8506 if (N2CV && N2CV->isZero())
8507 return N1;
8508 if ((Opcode == ISD::ADD || Opcode == ISD::SUB) &&
8509 VT.getScalarType() == MVT::i1)
8510 return getNode(ISD::XOR, DL, VT, N1, N2);
8511 // Fold (add (vscale * C0), (vscale * C1)) to (vscale * (C0 + C1)).
8512 if (Opcode == ISD::ADD && N1.getOpcode() == ISD::VSCALE &&
8513 N2.getOpcode() == ISD::VSCALE) {
8514 const APInt &C1 = N1->getConstantOperandAPInt(0);
8515 const APInt &C2 = N2->getConstantOperandAPInt(0);
8516 return getVScale(DL, VT, C1 + C2);
8517 }
8518 break;
8519 case ISD::MUL:
8520 assert(VT.isInteger() && "This operator does not apply to FP types!");
8521 assert(N1.getValueType() == N2.getValueType() &&
8522 N1.getValueType() == VT && "Binary operator types must match!");
8523 if (VT.getScalarType() == MVT::i1)
8524 return getNode(ISD::AND, DL, VT, N1, N2);
8525 if (N2CV && N2CV->isZero())
8526 return N2;
8527 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8528 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8529 const APInt &N2CImm = N2C->getAPIntValue();
8530 return getVScale(DL, VT, MulImm * N2CImm);
8531 }
8532 break;
8533 case ISD::UDIV:
8534 case ISD::UREM:
8535 case ISD::MULHU:
8536 case ISD::MULHS:
8537 case ISD::SDIV:
8538 case ISD::SREM:
8539 case ISD::SADDSAT:
8540 case ISD::SSUBSAT:
8541 case ISD::UADDSAT:
8542 case ISD::USUBSAT:
8543 assert(VT.isInteger() && "This operator does not apply to FP types!");
8544 assert(N1.getValueType() == N2.getValueType() &&
8545 N1.getValueType() == VT && "Binary operator types must match!");
8546 if (VT.getScalarType() == MVT::i1) {
8547 // fold (add_sat x, y) -> (or x, y) for bool types.
8548 if (Opcode == ISD::SADDSAT || Opcode == ISD::UADDSAT)
8549 return getNode(ISD::OR, DL, VT, N1, N2);
8550 // fold (sub_sat x, y) -> (and x, ~y) for bool types.
8551 if (Opcode == ISD::SSUBSAT || Opcode == ISD::USUBSAT)
8552 return getNode(ISD::AND, DL, VT, N1, getNOT(DL, N2, VT));
8553 }
8554 break;
8555 case ISD::SCMP:
8556 case ISD::UCMP:
8557 assert(N1.getValueType() == N2.getValueType() &&
8558 "Types of operands of UCMP/SCMP must match");
8559 assert(N1.getValueType().isVector() == VT.isVector() &&
8560 "Operands and return type of must both be scalars or vectors");
8561 if (VT.isVector())
8564 "Result and operands must have the same number of elements");
8565 break;
8566 case ISD::AVGFLOORS:
8567 case ISD::AVGFLOORU:
8568 case ISD::AVGCEILS:
8569 case ISD::AVGCEILU:
8570 assert(VT.isInteger() && "This operator does not apply to FP types!");
8571 assert(N1.getValueType() == N2.getValueType() &&
8572 N1.getValueType() == VT && "Binary operator types must match!");
8573 break;
8574 case ISD::ABDS:
8575 case ISD::ABDU:
8576 assert(VT.isInteger() && "This operator does not apply to FP types!");
8577 assert(N1.getValueType() == N2.getValueType() &&
8578 N1.getValueType() == VT && "Binary operator types must match!");
8579 if (VT.getScalarType() == MVT::i1)
8580 return getNode(ISD::XOR, DL, VT, N1, N2);
8581 break;
8582 case ISD::SMIN:
8583 case ISD::UMAX:
8584 assert(VT.isInteger() && "This operator does not apply to FP types!");
8585 assert(N1.getValueType() == N2.getValueType() &&
8586 N1.getValueType() == VT && "Binary operator types must match!");
8587 if (VT.getScalarType() == MVT::i1)
8588 return getNode(ISD::OR, DL, VT, N1, N2);
8589 break;
8590 case ISD::SMAX:
8591 case ISD::UMIN:
8592 assert(VT.isInteger() && "This operator does not apply to FP types!");
8593 assert(N1.getValueType() == N2.getValueType() &&
8594 N1.getValueType() == VT && "Binary operator types must match!");
8595 if (VT.getScalarType() == MVT::i1)
8596 return getNode(ISD::AND, DL, VT, N1, N2);
8597 break;
8598 case ISD::FADD:
8599 case ISD::FSUB:
8600 case ISD::FMUL:
8601 case ISD::FDIV:
8602 case ISD::FREM:
8603 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
8604 assert(N1.getValueType() == N2.getValueType() &&
8605 N1.getValueType() == VT && "Binary operator types must match!");
8606 if (SDValue V = simplifyFPBinop(Opcode, N1, N2, Flags))
8607 return V;
8608 break;
8609 case ISD::FCOPYSIGN: // N1 and result must match. N1/N2 need not match.
8610 assert(N1.getValueType() == VT &&
8613 "Invalid FCOPYSIGN!");
8614 break;
8615 case ISD::SHL:
8616 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8617 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8618 const APInt &ShiftImm = N2C->getAPIntValue();
8619 return getVScale(DL, VT, MulImm << ShiftImm);
8620 }
8621 [[fallthrough]];
8622 case ISD::SRA:
8623 case ISD::SRL:
8624 if (SDValue V = simplifyShift(N1, N2))
8625 return V;
8626 [[fallthrough]];
8627 case ISD::ROTL:
8628 case ISD::ROTR:
8629 case ISD::SSHLSAT:
8630 case ISD::USHLSAT:
8631 assert(VT == N1.getValueType() &&
8632 "Shift operators return type must be the same as their first arg");
8633 assert(VT.isInteger() && N2.getValueType().isInteger() &&
8634 "Shifts only work on integers");
8635 assert((!VT.isVector() || VT == N2.getValueType()) &&
8636 "Vector shift amounts must be in the same as their first arg");
8637 // Verify that the shift amount VT is big enough to hold valid shift
8638 // amounts. This catches things like trying to shift an i1024 value by an
8639 // i8, which is easy to fall into in generic code that uses
8640 // TLI.getShiftAmount().
8643 "Invalid use of small shift amount with oversized value!");
8644
8645 // Always fold shifts of i1 values so the code generator doesn't need to
8646 // handle them. Since we know the size of the shift has to be less than the
8647 // size of the value, the shift/rotate count is guaranteed to be zero.
8648 if (VT == MVT::i1)
8649 return N1;
8650 if (N2CV && N2CV->isZero())
8651 return N1;
8652 break;
8653 case ISD::FP_ROUND:
8655 VT.bitsLE(N1.getValueType()) && N2C &&
8656 (N2C->getZExtValue() == 0 || N2C->getZExtValue() == 1) &&
8657 N2.getOpcode() == ISD::TargetConstant && "Invalid FP_ROUND!");
8658 if (N1.getValueType() == VT) return N1; // noop conversion.
8659 break;
8660 case ISD::IS_FPCLASS: {
8662 "IS_FPCLASS is used for a non-floating type");
8663 assert(isa<ConstantSDNode>(N2) && "FPClassTest is not Constant");
8664 // is.fpclass(poison, mask) -> poison
8665 if (N1.getOpcode() == ISD::POISON)
8666 return getPOISON(VT);
8667 FPClassTest Mask = static_cast<FPClassTest>(N2->getAsZExtVal());
8668 // If all tests are made, it doesn't matter what the value is.
8669 if ((Mask & fcAllFlags) == fcAllFlags)
8670 return getBoolConstant(true, DL, VT, N1.getValueType());
8671 if ((Mask & fcAllFlags) == 0)
8672 return getBoolConstant(false, DL, VT, N1.getValueType());
8673 break;
8674 }
8675 case ISD::AssertNoFPClass: {
8677 "AssertNoFPClass is used for a non-floating type");
8678 assert(isa<ConstantSDNode>(N2) && "NoFPClass is not Constant");
8679 FPClassTest NoFPClass = static_cast<FPClassTest>(N2->getAsZExtVal());
8680 assert(llvm::to_underlying(NoFPClass) <=
8682 "FPClassTest value too large");
8683 (void)NoFPClass;
8684 break;
8685 }
8686 case ISD::AssertSext:
8687 case ISD::AssertZext: {
8688 EVT EVT = cast<VTSDNode>(N2)->getVT();
8689 assert(VT == N1.getValueType() && "Not an inreg extend!");
8690 assert(VT.isInteger() && EVT.isInteger() &&
8691 "Cannot *_EXTEND_INREG FP types");
8692 assert(!EVT.isVector() &&
8693 "AssertSExt/AssertZExt type should be the vector element type "
8694 "rather than the vector type!");
8695 assert(EVT.bitsLE(VT.getScalarType()) && "Not extending!");
8696 if (VT.getScalarType() == EVT) return N1; // noop assertion.
8697 break;
8698 }
8700 EVT EVT = cast<VTSDNode>(N2)->getVT();
8701 assert(VT == N1.getValueType() && "Not an inreg extend!");
8702 assert(VT.isInteger() && EVT.isInteger() &&
8703 "Cannot *_EXTEND_INREG FP types");
8704 assert(EVT.isVector() == VT.isVector() &&
8705 "SIGN_EXTEND_INREG type should be vector iff the operand "
8706 "type is vector!");
8707 assert((!EVT.isVector() ||
8709 "Vector element counts must match in SIGN_EXTEND_INREG");
8710 assert(EVT.getScalarType().bitsLE(VT.getScalarType()) && "Not extending!");
8711 if (EVT == VT) return N1; // Not actually extending
8712 break;
8713 }
8715 case ISD::FP_TO_UINT_SAT: {
8716 assert(VT.isInteger() && cast<VTSDNode>(N2)->getVT().isInteger() &&
8717 N1.getValueType().isFloatingPoint() && "Invalid FP_TO_*INT_SAT");
8718 assert(N1.getValueType().isVector() == VT.isVector() &&
8719 "FP_TO_*INT_SAT type should be vector iff the operand type is "
8720 "vector!");
8721 assert((!VT.isVector() || VT.getVectorElementCount() ==
8723 "Vector element counts must match in FP_TO_*INT_SAT");
8724 assert(!cast<VTSDNode>(N2)->getVT().isVector() &&
8725 "Type to saturate to must be a scalar.");
8726 assert(cast<VTSDNode>(N2)->getVT().bitsLE(VT.getScalarType()) &&
8727 "Not extending!");
8728 break;
8729 }
8732 "The result of EXTRACT_VECTOR_ELT must be at least as wide as the \
8733 element type of the vector.");
8734
8735 // Extract from an undefined value or using an undefined index is undefined.
8736 if (N1.isUndef() || N2.isUndef())
8737 return getUNDEF(VT);
8738
8739 // EXTRACT_VECTOR_ELT of out-of-bounds element is POISON for fixed length
8740 // vectors. For scalable vectors we will provide appropriate support for
8741 // dealing with arbitrary indices.
8742 if (N2C && N1.getValueType().isFixedLengthVector() &&
8743 N2C->getAPIntValue().uge(N1.getValueType().getVectorNumElements()))
8744 return getPOISON(VT);
8745
8746 // EXTRACT_VECTOR_ELT of CONCAT_VECTORS is often formed while lowering is
8747 // expanding copies of large vectors from registers. This only works for
8748 // fixed length vectors, since we need to know the exact number of
8749 // elements.
8750 if (N2C && N1.getOpcode() == ISD::CONCAT_VECTORS &&
8752 unsigned Factor = N1.getOperand(0).getValueType().getVectorNumElements();
8753 return getExtractVectorElt(DL, VT,
8754 N1.getOperand(N2C->getZExtValue() / Factor),
8755 N2C->getZExtValue() % Factor);
8756 }
8757
8758 // EXTRACT_VECTOR_ELT of BUILD_VECTOR or SPLAT_VECTOR is often formed while
8759 // lowering is expanding large vector constants.
8760 if (N2C && (N1.getOpcode() == ISD::BUILD_VECTOR ||
8761 N1.getOpcode() == ISD::SPLAT_VECTOR)) {
8764 "BUILD_VECTOR used for scalable vectors");
8765 unsigned Index =
8766 N1.getOpcode() == ISD::BUILD_VECTOR ? N2C->getZExtValue() : 0;
8767 SDValue Elt = N1.getOperand(Index);
8768
8769 if (VT != Elt.getValueType())
8770 // If the vector element type is not legal, the BUILD_VECTOR operands
8771 // are promoted and implicitly truncated, and the result implicitly
8772 // extended. Make that explicit here.
8773 Elt = getAnyExtOrTrunc(Elt, DL, VT);
8774
8775 return Elt;
8776 }
8777
8778 // EXTRACT_VECTOR_ELT of INSERT_VECTOR_ELT is often formed when vector
8779 // operations are lowered to scalars.
8780 if (N1.getOpcode() == ISD::INSERT_VECTOR_ELT) {
8781 // If the indices are the same, return the inserted element else
8782 // if the indices are known different, extract the element from
8783 // the original vector.
8784 SDValue N1Op2 = N1.getOperand(2);
8786
8787 if (N1Op2C && N2C) {
8788 if (N1Op2C->getZExtValue() == N2C->getZExtValue()) {
8789 if (VT == N1.getOperand(1).getValueType())
8790 return N1.getOperand(1);
8791 if (VT.isFloatingPoint()) {
8793 return getFPExtendOrRound(N1.getOperand(1), DL, VT);
8794 }
8795 return getSExtOrTrunc(N1.getOperand(1), DL, VT);
8796 }
8797 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0), N2);
8798 }
8799 }
8800
8801 // EXTRACT_VECTOR_ELT of v1iX EXTRACT_SUBVECTOR could be formed
8802 // when vector types are scalarized and v1iX is legal.
8803 // vextract (v1iX extract_subvector(vNiX, Idx)) -> vextract(vNiX,Idx).
8804 // Here we are completely ignoring the extract element index (N2),
8805 // which is fine for fixed width vectors, since any index other than 0
8806 // is undefined anyway. However, this cannot be ignored for scalable
8807 // vectors - in theory we could support this, but we don't want to do this
8808 // without a profitability check.
8809 if (N1.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
8811 N1.getValueType().getVectorNumElements() == 1) {
8812 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0),
8813 N1.getOperand(1));
8814 }
8815 break;
8817 assert(N2C && (unsigned)N2C->getZExtValue() < 2 && "Bad EXTRACT_ELEMENT!");
8818 assert(!N1.getValueType().isVector() && !VT.isVector() &&
8819 (N1.getValueType().isInteger() == VT.isInteger()) &&
8820 N1.getValueType() != VT &&
8821 "Wrong types for EXTRACT_ELEMENT!");
8822
8823 // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding
8824 // 64-bit integers into 32-bit parts. Instead of building the extract of
8825 // the BUILD_PAIR, only to have legalize rip it apart, just do it now.
8826 if (N1.getOpcode() == ISD::BUILD_PAIR)
8827 return N1.getOperand(N2C->getZExtValue());
8828
8829 // EXTRACT_ELEMENT of a constant int is also very common.
8830 if (N1C) {
8831 unsigned ElementSize = VT.getSizeInBits();
8832 unsigned Shift = ElementSize * N2C->getZExtValue();
8833 const APInt &Val = N1C->getAPIntValue();
8834 return getConstant(Val.extractBits(ElementSize, Shift), DL, VT);
8835 }
8836 break;
8838 EVT N1VT = N1.getValueType();
8839 assert(VT.isVector() && N1VT.isVector() &&
8840 "Extract subvector VTs must be vectors!");
8842 "Extract subvector VTs must have the same element type!");
8843 assert((VT.isFixedLengthVector() || N1VT.isScalableVector()) &&
8844 "Cannot extract a scalable vector from a fixed length vector!");
8845 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8847 "Extract subvector must be from larger vector to smaller vector!");
8848 assert(N2C && "Extract subvector index must be a constant");
8849 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8850 (VT.getVectorMinNumElements() + N2C->getZExtValue()) <=
8851 N1VT.getVectorMinNumElements()) &&
8852 "Extract subvector overflow!");
8853 assert(N2C->getAPIntValue().getBitWidth() ==
8854 TLI->getVectorIdxWidth(getDataLayout()) &&
8855 "Constant index for EXTRACT_SUBVECTOR has an invalid size");
8856 assert(N2C->getZExtValue() % VT.getVectorMinNumElements() == 0 &&
8857 "Extract index is not a multiple of the output vector length");
8858
8859 // Trivial extraction.
8860 if (VT == N1VT)
8861 return N1;
8862
8863 // EXTRACT_SUBVECTOR of an UNDEF is an UNDEF.
8864 if (N1.isUndef())
8865 return getUNDEF(VT);
8866
8867 // EXTRACT_SUBVECTOR of CONCAT_VECTOR can be simplified if the pieces of
8868 // the concat have the same type as the extract.
8869 if (N1.getOpcode() == ISD::CONCAT_VECTORS &&
8870 VT == N1.getOperand(0).getValueType()) {
8871 unsigned Factor = VT.getVectorMinNumElements();
8872 return N1.getOperand(N2C->getZExtValue() / Factor);
8873 }
8874
8875 // EXTRACT_SUBVECTOR of INSERT_SUBVECTOR is often created
8876 // during shuffle legalization.
8877 if (N1.getOpcode() == ISD::INSERT_SUBVECTOR && N2 == N1.getOperand(2) &&
8878 VT == N1.getOperand(1).getValueType())
8879 return N1.getOperand(1);
8880 break;
8881 }
8882 }
8883
8884 if (N1.getOpcode() == ISD::POISON || N2.getOpcode() == ISD::POISON) {
8885 switch (Opcode) {
8886 case ISD::XOR:
8887 case ISD::ADD:
8888 case ISD::PTRADD:
8889 case ISD::SUB:
8891 case ISD::UDIV:
8892 case ISD::SDIV:
8893 case ISD::UREM:
8894 case ISD::SREM:
8895 case ISD::MUL:
8896 case ISD::AND:
8897 case ISD::SSUBSAT:
8898 case ISD::USUBSAT:
8899 case ISD::UMIN:
8900 case ISD::OR:
8901 case ISD::SADDSAT:
8902 case ISD::UADDSAT:
8903 case ISD::UMAX:
8904 case ISD::SMAX:
8905 case ISD::SMIN:
8906 // fold op(arg1, poison) -> poison, fold op(poison, arg2) -> poison.
8907 return N2.getOpcode() == ISD::POISON ? N2 : N1;
8908 }
8909 }
8910
8911 // Canonicalize an UNDEF to the RHS, even over a constant.
8912 if (N1.getOpcode() == ISD::UNDEF && N2.getOpcode() != ISD::UNDEF) {
8913 if (TLI->isCommutativeBinOp(Opcode)) {
8914 std::swap(N1, N2);
8915 } else {
8916 switch (Opcode) {
8917 case ISD::PTRADD:
8918 case ISD::SUB:
8919 // fold op(undef, non_undef_arg2) -> undef.
8920 return N1;
8922 case ISD::UDIV:
8923 case ISD::SDIV:
8924 case ISD::UREM:
8925 case ISD::SREM:
8926 case ISD::SSUBSAT:
8927 case ISD::USUBSAT:
8928 // fold op(undef, non_undef_arg2) -> 0.
8929 return getConstant(0, DL, VT);
8930 }
8931 }
8932 }
8933
8934 // Fold a bunch of operators when the RHS is undef.
8935 if (N2.getOpcode() == ISD::UNDEF) {
8936 switch (Opcode) {
8937 case ISD::XOR:
8938 if (N1.getOpcode() == ISD::UNDEF)
8939 // Handle undef ^ undef -> 0 special case. This is a common
8940 // idiom (misuse).
8941 return getConstant(0, DL, VT);
8942 [[fallthrough]];
8943 case ISD::ADD:
8944 case ISD::PTRADD:
8945 case ISD::SUB:
8946 // fold op(arg1, undef) -> undef.
8947 return N2;
8948 case ISD::UDIV:
8949 case ISD::SDIV:
8950 case ISD::UREM:
8951 case ISD::SREM:
8952 // fold op(arg1, undef) -> poison.
8953 return getPOISON(VT);
8954 case ISD::MUL:
8955 case ISD::AND:
8956 case ISD::SSUBSAT:
8957 case ISD::USUBSAT:
8958 case ISD::UMIN:
8959 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> 0.
8960 return N1.getOpcode() == ISD::UNDEF ? N2 : getConstant(0, DL, VT);
8961 case ISD::OR:
8962 case ISD::SADDSAT:
8963 case ISD::UADDSAT:
8964 case ISD::UMAX:
8965 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> -1.
8966 return N1.getOpcode() == ISD::UNDEF ? N2 : getAllOnesConstant(DL, VT);
8967 case ISD::SMAX:
8968 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MAX_INT.
8969 return N1.getOpcode() == ISD::UNDEF
8970 ? N2
8971 : getConstant(
8973 VT);
8974 case ISD::SMIN:
8975 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MIN_INT.
8976 return N1.getOpcode() == ISD::UNDEF
8977 ? N2
8978 : getConstant(
8980 VT);
8981 }
8982 }
8983
8984 // Perform trivial constant folding.
8985 if (SDValue SV = FoldConstantArithmetic(Opcode, DL, VT, {N1, N2}, Flags))
8986 return SV;
8987
8988 // Memoize this node if possible.
8989 SDNode *N;
8990 SDVTList VTs = getVTList(VT);
8991 SDValue Ops[] = {N1, N2};
8992 if (VT != MVT::Glue) {
8993 SDNodeKey ID(Opcode, VTs, Ops);
8994 FoldingSetInsertToken InsertToken;
8995 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
8996 E->intersectFlagsWith(Flags);
8997 return SDValue(E, 0);
8998 }
8999
9000 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9001 N->setFlags(Flags);
9002 createOperands(N, Ops);
9003 CSEMap.insert(N, InsertToken);
9004 } else {
9005 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9006 createOperands(N, Ops);
9007 }
9008
9009 InsertNode(N);
9010 SDValue V = SDValue(N, 0);
9011 NewSDValueDbgMsg(V, "Creating new node: ", this);
9012 return V;
9013}
9014
9015SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9016 SDValue N1, SDValue N2, SDValue N3) {
9017 SDNodeFlags Flags;
9018 if (Inserter)
9019 Flags = Inserter->getFlags();
9020 return getNode(Opcode, DL, VT, N1, N2, N3, Flags);
9021}
9022
9023SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9024 SDValue N1, SDValue N2, SDValue N3,
9025 const SDNodeFlags Flags) {
9027 N2.getOpcode() != ISD::DELETED_NODE &&
9028 N3.getOpcode() != ISD::DELETED_NODE &&
9029 "Operand is DELETED_NODE!");
9030 // Perform various simplifications.
9031 switch (Opcode) {
9032 case ISD::BUILD_VECTOR: {
9033 // Attempt to simplify BUILD_VECTOR.
9034 SDValue Ops[] = {N1, N2, N3};
9035 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
9036 return V;
9037 break;
9038 }
9039 case ISD::CONCAT_VECTORS: {
9040 SDValue Ops[] = {N1, N2, N3};
9041 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
9042 return V;
9043 break;
9044 }
9045 case ISD::SETCC: {
9046 assert(VT.isInteger() && "SETCC result type must be an integer!");
9047 assert(N1.getValueType() == N2.getValueType() &&
9048 "SETCC operands must have the same type!");
9049 assert(VT.isVector() == N1.getValueType().isVector() &&
9050 "SETCC type should be vector iff the operand type is vector!");
9051 assert((!VT.isVector() || VT.getVectorElementCount() ==
9053 "SETCC vector element counts must match!");
9054 // Use FoldSetCC to simplify SETCC's.
9055 if (SDValue V =
9056 FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get(), DL, Flags))
9057 return V;
9058 break;
9059 }
9060 case ISD::SELECT:
9061 case ISD::VSELECT:
9062 if (SDValue V = simplifySelect(N1, N2, N3))
9063 return V;
9064 break;
9066 llvm_unreachable("should use getVectorShuffle constructor!");
9068 if (isNullConstant(N3))
9069 return N1;
9070 break;
9072 if (isNullConstant(N3))
9073 return N2;
9074 break;
9076 assert(VT.isVector() && VT == N1.getValueType() &&
9077 "INSERT_VECTOR_ELT vector type mismatch");
9079 "INSERT_VECTOR_ELT scalar fp/int mismatch");
9080 assert((!VT.isFloatingPoint() ||
9081 VT.getVectorElementType() == N2.getValueType()) &&
9082 "INSERT_VECTOR_ELT fp scalar type mismatch");
9083 assert((!VT.isInteger() ||
9085 "INSERT_VECTOR_ELT int scalar size mismatch");
9086
9087 auto *N3C = dyn_cast<ConstantSDNode>(N3);
9088 // INSERT_VECTOR_ELT into out-of-bounds element is an UNDEF, except
9089 // for scalable vectors where we will generate appropriate code to
9090 // deal with out-of-bounds cases correctly.
9091 if (N3C && VT.isFixedLengthVector() &&
9092 N3C->getZExtValue() >= VT.getVectorNumElements())
9093 return getUNDEF(VT);
9094
9095 // Undefined index can be assumed out-of-bounds, so that's UNDEF too.
9096 if (N3.isUndef())
9097 return getUNDEF(VT);
9098
9099 // If inserting poison, just use the input vector.
9100 if (N2.getOpcode() == ISD::POISON)
9101 return N1;
9102
9103 // Inserting undef into undef/poison is still undef.
9104 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
9105 return getUNDEF(VT);
9106
9107 // If the inserted element is an UNDEF, just use the input vector.
9108 // But not if skipping the insert could make the result more poisonous.
9109 if (N2.isUndef()) {
9110 if (N3C && VT.isFixedLengthVector()) {
9111 APInt EltMask =
9112 APInt::getOneBitSet(VT.getVectorNumElements(), N3C->getZExtValue());
9113 if (isGuaranteedNotToBePoison(N1, EltMask))
9114 return N1;
9115 } else if (isGuaranteedNotToBePoison(N1))
9116 return N1;
9117 }
9118 break;
9119 }
9120 case ISD::INSERT_SUBVECTOR: {
9121 // If inserting poison, just use the input vector,
9122 if (N2.getOpcode() == ISD::POISON)
9123 return N1;
9124
9125 // Inserting undef into undef/poison is still undef.
9126 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
9127 return getUNDEF(VT);
9128
9129 EVT N2VT = N2.getValueType();
9130 assert(VT == N1.getValueType() &&
9131 "Dest and insert subvector source types must match!");
9132 assert(VT.isVector() && N2VT.isVector() &&
9133 "Insert subvector VTs must be vectors!");
9135 "Insert subvector VTs must have the same element type!");
9136 assert((VT.isScalableVector() || N2VT.isFixedLengthVector()) &&
9137 "Cannot insert a scalable vector into a fixed length vector!");
9138 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
9140 "Insert subvector must be from smaller vector to larger vector!");
9142 "Insert subvector index must be constant");
9143 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
9144 (N2VT.getVectorMinNumElements() + N3->getAsZExtVal()) <=
9146 "Insert subvector overflow!");
9148 TLI->getVectorIdxWidth(getDataLayout()) &&
9149 "Constant index for INSERT_SUBVECTOR has an invalid size");
9150
9151 // Trivial insertion.
9152 if (VT == N2VT)
9153 return N2;
9154
9155 // If this is an insert of an extracted vector into an undef/poison vector,
9156 // we can just use the input to the extract. But not if skipping the
9157 // extract+insert could make the result more poisonous.
9158 if (N1.isUndef() && N2.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
9159 N2.getOperand(1) == N3 && N2.getOperand(0).getValueType() == VT) {
9160 if (N1.getOpcode() == ISD::POISON)
9161 return N2.getOperand(0);
9162 if (VT.isFixedLengthVector() && N2VT.isFixedLengthVector()) {
9163 unsigned LoBit = N3->getAsZExtVal();
9164 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
9165 APInt EltMask =
9166 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
9167 if (isGuaranteedNotToBePoison(N2.getOperand(0), ~EltMask))
9168 return N2.getOperand(0);
9169 } else if (isGuaranteedNotToBePoison(N2.getOperand(0)))
9170 return N2.getOperand(0);
9171 }
9172
9173 // If the inserted subvector is UNDEF, just use the input vector.
9174 // But not if skipping the insert could make the result more poisonous.
9175 if (N2.isUndef()) {
9176 if (VT.isFixedLengthVector()) {
9177 unsigned LoBit = N3->getAsZExtVal();
9178 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
9179 APInt EltMask =
9180 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
9181 if (isGuaranteedNotToBePoison(N1, EltMask))
9182 return N1;
9183 } else if (isGuaranteedNotToBePoison(N1))
9184 return N1;
9185 }
9186 break;
9187 }
9188 case ISD::BITCAST:
9189 // Fold bit_convert nodes from a type to themselves.
9190 if (N1.getValueType() == VT)
9191 return N1;
9192 break;
9193 case ISD::VECTOR_COMPRESS: {
9194 [[maybe_unused]] EVT VecVT = N1.getValueType();
9195 [[maybe_unused]] EVT MaskVT = N2.getValueType();
9196 [[maybe_unused]] EVT PassthruVT = N3.getValueType();
9197 assert(VT == VecVT && "Vector and result type don't match.");
9198 assert(VecVT.isVector() && MaskVT.isVector() && PassthruVT.isVector() &&
9199 "All inputs must be vectors.");
9200 assert(VecVT == PassthruVT && "Vector and passthru types don't match.");
9202 "Vector and mask must have same number of elements.");
9203
9204 if (N1.isUndef() || N2.isUndef())
9205 return N3;
9206
9207 break;
9208 }
9213 [[maybe_unused]] EVT AccVT = N1.getValueType();
9214 [[maybe_unused]] EVT Input1VT = N2.getValueType();
9215 [[maybe_unused]] EVT Input2VT = N3.getValueType();
9216 assert(Input1VT.isVector() && Input1VT == Input2VT &&
9217 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
9218 "node to have the same type!");
9219 assert(VT.isVector() && VT == AccVT &&
9220 "Expected the first operand of the PARTIAL_REDUCE_MLA node to have "
9221 "the same type as its result!");
9223 AccVT.getVectorElementCount()) &&
9224 "Expected the element count of the second and third operands of the "
9225 "PARTIAL_REDUCE_MLA node to be a positive integer multiple of the "
9226 "element count of the first operand and the result!");
9228 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
9229 "node to have an element type which is the same as or smaller than "
9230 "the element type of the first operand and result!");
9231 break;
9232 }
9233 }
9234
9235 // Perform trivial constant folding for arithmetic operators.
9236 switch (Opcode) {
9240 case ISD::FMA:
9241 case ISD::FMAD:
9242 case ISD::SETCC:
9243 case ISD::FSHL:
9244 case ISD::FSHR:
9245 if (SDValue SV =
9246 FoldConstantArithmetic(Opcode, DL, VT, {N1, N2, N3}, Flags))
9247 return SV;
9248 break;
9249 }
9250
9251 // Memoize node if it doesn't produce a glue result.
9252 SDNode *N;
9253 SDVTList VTs = getVTList(VT);
9254 SDValue Ops[] = {N1, N2, N3};
9255 if (VT != MVT::Glue) {
9256 SDNodeKey ID(Opcode, VTs, Ops);
9257 FoldingSetInsertToken InsertToken;
9258 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
9259 E->intersectFlagsWith(Flags);
9260 return SDValue(E, 0);
9261 }
9262
9263 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9264 N->setFlags(Flags);
9265 createOperands(N, Ops);
9266 CSEMap.insert(N, InsertToken);
9267 } else {
9268 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9269 createOperands(N, Ops);
9270 }
9271
9272 InsertNode(N);
9273 SDValue V = SDValue(N, 0);
9274 NewSDValueDbgMsg(V, "Creating new node: ", this);
9275 return V;
9276}
9277
9278SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9279 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9280 const SDNodeFlags Flags) {
9281 SDValue Ops[] = { N1, N2, N3, N4 };
9282 return getNode(Opcode, DL, VT, Ops, Flags);
9283}
9284
9285SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9286 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
9287 SDNodeFlags Flags;
9288 if (Inserter)
9289 Flags = Inserter->getFlags();
9290 return getNode(Opcode, DL, VT, N1, N2, N3, N4, Flags);
9291}
9292
9293SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9294 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9295 SDValue N5, const SDNodeFlags Flags) {
9296 SDValue Ops[] = { N1, N2, N3, N4, N5 };
9297 return getNode(Opcode, DL, VT, Ops, Flags);
9298}
9299
9300SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9301 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9302 SDValue N5) {
9303 SDNodeFlags Flags;
9304 if (Inserter)
9305 Flags = Inserter->getFlags();
9306 return getNode(Opcode, DL, VT, N1, N2, N3, N4, N5, Flags);
9307}
9308
9309/// getStackArgumentTokenFactor - Compute a TokenFactor to force all
9310/// the incoming stack arguments to be loaded from the stack.
9312 SmallVector<SDValue, 8> ArgChains;
9313
9314 // Include the original chain at the beginning of the list. When this is
9315 // used by target LowerCall hooks, this helps legalize find the
9316 // CALLSEQ_BEGIN node.
9317 ArgChains.push_back(Chain);
9318
9319 // Add a chain value for each stack argument.
9320 for (SDNode *U : getEntryNode().getNode()->users())
9321 if (LoadSDNode *L = dyn_cast<LoadSDNode>(U))
9322 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(L->getBasePtr()))
9323 if (FI->getIndex() < 0)
9324 ArgChains.push_back(SDValue(L, 1));
9325
9326 // Build a tokenfactor for all the chains.
9327 return getNode(ISD::TokenFactor, SDLoc(Chain), MVT::Other, ArgChains);
9328}
9329
9330/// getMemsetValue - Vectorized representation of the memset value
9331/// operand.
9333 const SDLoc &dl) {
9334 assert(!Value.isUndef());
9335
9336 unsigned NumBits = VT.getScalarSizeInBits();
9338 assert(C->getAPIntValue().getBitWidth() == 8);
9339 APInt Val = APInt::getSplat(NumBits, C->getAPIntValue());
9340 if (VT.isInteger()) {
9341 bool IsOpaque = VT.getSizeInBits() > 64 ||
9342 !DAG.getTargetLoweringInfo().isLegalStoreImmediate(C->getSExtValue());
9343 return DAG.getConstant(Val, dl, VT, false, IsOpaque);
9344 }
9345 return DAG.getConstantFP(APFloat(VT.getFltSemantics(), Val), dl, VT);
9346 }
9347
9348 assert(Value.getValueType() == MVT::i8 && "memset with non-byte fill value?");
9349 EVT IntVT = VT.getScalarType();
9350 if (!IntVT.isInteger())
9351 IntVT = EVT::getIntegerVT(*DAG.getContext(), IntVT.getSizeInBits());
9352
9353 Value = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, Value);
9354 if (NumBits > 8) {
9355 // Use a multiplication with 0x010101... to extend the input to the
9356 // required length.
9357 APInt Magic = APInt::getSplat(NumBits, APInt(8, 0x01));
9358 Value = DAG.getNode(ISD::MUL, dl, IntVT, Value,
9359 DAG.getConstant(Magic, dl, IntVT));
9360 }
9361
9362 if (VT != Value.getValueType() && !VT.isInteger())
9363 Value = DAG.getBitcast(VT.getScalarType(), Value);
9364 if (VT != Value.getValueType())
9365 Value = DAG.getSplatBuildVector(VT, dl, Value);
9366
9367 return Value;
9368}
9369
9370/// getMemsetStringVal - Similar to getMemsetValue. Except this is only
9371/// used when a memcpy is turned into a memset when the source is a constant
9372/// string ptr.
9374 const TargetLowering &TLI,
9375 const ConstantDataArraySlice &Slice) {
9376 // Handle vector with all elements zero.
9377 if (Slice.Array == nullptr) {
9378 if (VT.isInteger())
9379 return DAG.getConstant(0, dl, VT);
9380 return DAG.getNode(ISD::BITCAST, dl, VT,
9381 DAG.getConstant(0, dl, VT.changeTypeToInteger()));
9382 }
9383
9384 assert(!VT.isVector() && "Can't handle vector type here!");
9385 unsigned NumVTBits = VT.getSizeInBits();
9386 unsigned NumVTBytes = NumVTBits / 8;
9387 unsigned NumBytes = std::min(NumVTBytes, unsigned(Slice.Length));
9388
9389 APInt Val(NumVTBits, 0);
9390 if (DAG.getDataLayout().isLittleEndian()) {
9391 for (unsigned i = 0; i != NumBytes; ++i)
9392 Val |= (uint64_t)(unsigned char)Slice[i] << i*8;
9393 } else {
9394 for (unsigned i = 0; i != NumBytes; ++i)
9395 Val |= (uint64_t)(unsigned char)Slice[i] << (NumVTBytes-i-1)*8;
9396 }
9397
9398 // If the "cost" of materializing the integer immediate is less than the cost
9399 // of a load, then it is cost effective to turn the load into the immediate.
9400 Type *Ty = VT.getTypeForEVT(*DAG.getContext());
9401 if (TLI.shouldConvertConstantLoadToIntImm(Val, Ty))
9402 return DAG.getConstant(Val, dl, VT);
9403 return SDValue();
9404}
9405
9407 const SDLoc &DL,
9408 const SDNodeFlags Flags) {
9409 SDValue Index = getTypeSize(DL, Base.getValueType(), Offset);
9410 return getMemBasePlusOffset(Base, Index, DL, Flags);
9411}
9412
9414 const SDLoc &DL,
9415 const SDNodeFlags Flags) {
9416 assert(Offset.getValueType().isInteger());
9417 EVT BasePtrVT = Ptr.getValueType();
9418 if (TLI->shouldPreservePtrArith(this->getMachineFunction().getFunction(),
9419 BasePtrVT))
9420 return getNode(ISD::PTRADD, DL, BasePtrVT, Ptr, Offset, Flags);
9421 // InBounds only applies to PTRADD, don't set it if we generate ADD.
9422 SDNodeFlags AddFlags = Flags;
9423 AddFlags.setInBounds(false);
9424 return getNode(ISD::ADD, DL, BasePtrVT, Ptr, Offset, AddFlags);
9425}
9426
9427/// Returns true if memcpy source is constant data.
9429 uint64_t SrcDelta = 0;
9430 GlobalAddressSDNode *G = nullptr;
9431 if (Src.getOpcode() == ISD::GlobalAddress)
9433 else if (Src->isAnyAdd() &&
9434 Src.getOperand(0).getOpcode() == ISD::GlobalAddress &&
9435 Src.getOperand(1).getOpcode() == ISD::Constant) {
9436 G = cast<GlobalAddressSDNode>(Src.getOperand(0));
9437 SrcDelta = Src.getConstantOperandVal(1);
9438 }
9439 if (!G)
9440 return false;
9441
9442 return getConstantDataArrayInfo(G->getGlobal(), Slice, 8,
9443 SrcDelta + G->getOffset());
9444}
9445
9447 SelectionDAG &DAG) {
9448 // On Darwin, -Os means optimize for size without hurting performance, so
9449 // only really optimize for size when -Oz (MinSize) is used.
9451 return MF.getFunction().hasMinSize();
9452 return DAG.shouldOptForSize();
9453}
9454
9456 SmallVector<SDValue, 32> &OutChains, unsigned From,
9457 unsigned To, SmallVector<SDValue, 16> &OutLoadChains,
9458 SmallVector<SDValue, 16> &OutStoreChains) {
9459 assert(OutLoadChains.size() && "Missing loads in memcpy inlining");
9460 assert(OutStoreChains.size() && "Missing stores in memcpy inlining");
9461 SmallVector<SDValue, 16> GluedLoadChains;
9462 for (unsigned i = From; i < To; ++i) {
9463 OutChains.push_back(OutLoadChains[i]);
9464 GluedLoadChains.push_back(OutLoadChains[i]);
9465 }
9466
9467 // Chain for all loads.
9468 SDValue LoadToken = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
9469 GluedLoadChains);
9470
9471 for (unsigned i = From; i < To; ++i) {
9472 StoreSDNode *ST = dyn_cast<StoreSDNode>(OutStoreChains[i]);
9473 SDValue NewStore = DAG.getTruncStore(LoadToken, dl, ST->getValue(),
9474 ST->getBasePtr(), ST->getMemoryVT(),
9475 ST->getMemOperand());
9476 OutChains.push_back(NewStore);
9477 }
9478}
9479
9480static SDValue
9482 SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign,
9483 Align SrcAlign, bool isVol, bool AlwaysInline,
9484 MachinePointerInfo DstPtrInfo,
9485 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo,
9486 BatchAAResults *BatchAA, const MDNode *DstMemCacheHint,
9487 const MDNode *SrcMemCacheHint) {
9488 // Turn a memcpy of undef to nop.
9489 // FIXME: We need to honor volatile even is Src is undef.
9490 if (Src.isUndef())
9491 return Chain;
9492
9493 // Expand memcpy to a series of load and store ops if the size operand falls
9494 // below a certain threshold.
9495 // TODO: In the AlwaysInline case, if the size is big then generate a loop
9496 // rather than maybe a humongous number of loads and stores.
9497 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9498 const DataLayout &DL = DAG.getDataLayout();
9499 LLVMContext &C = *DAG.getContext();
9500 std::vector<EVT> MemOps;
9501 bool DstAlignCanChange = false;
9503 MachineFrameInfo &MFI = MF.getFrameInfo();
9504 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9506 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9507 DstAlignCanChange = true;
9508 SrcAlign = std::max(SrcAlign, DAG.InferPtrAlign(Src).valueOrOne());
9510 // If marked as volatile, perform a copy even when marked as constant.
9511 bool CopyFromConstant = !isVol && isMemSrcFromConstant(Src, Slice);
9512 bool isZeroConstant = CopyFromConstant && Slice.Array == nullptr;
9513 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemcpy(OptSize);
9514 const MemOp Op = isZeroConstant
9515 ? MemOp::Set(Size, DstAlignCanChange, DstAlign,
9516 /*IsZeroMemset*/ true, isVol)
9517 : MemOp::Copy(Size, DstAlignCanChange, DstAlign,
9518 SrcAlign, isVol, CopyFromConstant);
9519 if (!TLI.findOptimalMemOpLowering(
9520 C, MemOps, Limit, Op, DstPtrInfo.getAddrSpace(),
9521 SrcPtrInfo.getAddrSpace(), MF.getFunction().getAttributes(), nullptr))
9522 return SDValue();
9523
9524 if (DstAlignCanChange) {
9525 Type *Ty = MemOps[0].getTypeForEVT(C);
9526 Align NewDstAlign = DL.getABITypeAlign(Ty);
9527
9528 // Don't promote to an alignment that would require dynamic stack
9529 // realignment which may conflict with optimizations such as tail call
9530 // optimization.
9532 if (!TRI->hasStackRealignment(MF))
9533 if (MaybeAlign StackAlign = DL.getStackAlignment())
9534 NewDstAlign = std::min(NewDstAlign, *StackAlign);
9535
9536 if (NewDstAlign > DstAlign) {
9537 // Give the stack frame object a larger alignment if needed.
9538 if (MFI.getObjectAlign(FI->getIndex()) < NewDstAlign)
9539 MFI.setObjectAlignment(FI->getIndex(), NewDstAlign);
9540 DstAlign = NewDstAlign;
9541 }
9542 }
9543
9544 // Prepare AAInfo for loads/stores after lowering this memcpy.
9545 AAMDNodes NewAAInfo = AAInfo;
9546 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9547
9548 const Value *SrcVal = dyn_cast_if_present<const Value *>(SrcPtrInfo.V);
9549 bool isConstant =
9550 BatchAA && SrcVal &&
9551 BatchAA->pointsToConstantMemory(MemoryLocation(SrcVal, Size, AAInfo));
9552
9553 MachineMemOperand::Flags MMOFlags =
9555 SmallVector<SDValue, 16> OutLoadChains;
9556 SmallVector<SDValue, 16> OutStoreChains;
9557 SmallVector<SDValue, 32> OutChains;
9558 unsigned NumMemOps = MemOps.size();
9559 uint64_t SrcOff = 0, DstOff = 0;
9560 for (unsigned i = 0; i != NumMemOps; ++i) {
9561 EVT VT = MemOps[i];
9562 unsigned VTSize = VT.getSizeInBits() / 8;
9564
9565 if (VTSize > Size) {
9566 // Issuing an unaligned load / store pair that overlaps with the previous
9567 // pair. Adjust the offset accordingly.
9568 assert(i == NumMemOps-1 && i != 0);
9569 SrcOff -= VTSize - Size;
9570 DstOff -= VTSize - Size;
9571 }
9572
9573 if (CopyFromConstant &&
9574 (isZeroConstant || (VT.isInteger() && !VT.isVector()))) {
9575 // It's unlikely a store of a vector immediate can be done in a single
9576 // instruction. It would require a load from a constantpool first.
9577 // We only handle zero vectors here.
9578 // FIXME: Handle other cases where store of vector immediate is done in
9579 // a single instruction.
9580 ConstantDataArraySlice SubSlice;
9581 if (SrcOff < Slice.Length) {
9582 SubSlice = Slice;
9583 SubSlice.move(SrcOff);
9584 } else {
9585 // This is an out-of-bounds access and hence UB. Pretend we read zero.
9586 SubSlice.Array = nullptr;
9587 SubSlice.Offset = 0;
9588 SubSlice.Length = VTSize;
9589 }
9590 Value = getMemsetStringVal(VT, dl, DAG, TLI, SubSlice);
9591 if (Value.getNode()) {
9592 Store = DAG.getStore(
9593 Chain, dl, Value,
9594 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9595 DstPtrInfo.getWithOffset(DstOff), DstAlign, MMOFlags,
9596 MMOMetadata(NewAAInfo, /*Ranges=*/nullptr, DstMemCacheHint));
9597 OutChains.push_back(Store);
9598 }
9599 }
9600
9601 if (!Store.getNode()) {
9602 // The type might not be legal for the target. This should only happen
9603 // if the type is smaller than a legal type, as on PPC, so the right
9604 // thing to do is generate a LoadExt/StoreTrunc pair. These simplify
9605 // to Load/Store if NVT==VT.
9606 // FIXME does the case above also need this?
9607 EVT NVT = TLI.getTypeToTransformTo(C, VT);
9608 assert(NVT.bitsGE(VT));
9609
9610 bool isDereferenceable =
9611 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9612 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9613 if (isDereferenceable)
9615 if (isConstant)
9616 SrcMMOFlags |= MachineMemOperand::MOInvariant;
9617
9618 Value = DAG.getExtLoad(
9619 ISD::EXTLOAD, dl, NVT, Chain,
9620 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9621 SrcPtrInfo.getWithOffset(SrcOff), VT,
9622 commonAlignment(SrcAlign, SrcOff), SrcMMOFlags,
9623 MMOMetadata(NewAAInfo, /*Ranges=*/nullptr, SrcMemCacheHint));
9624 OutLoadChains.push_back(Value.getValue(1));
9625
9626 Store = DAG.getTruncStore(
9627 Chain, dl, Value,
9628 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9629 DstPtrInfo.getWithOffset(DstOff), VT, DstAlign, MMOFlags,
9630 MMOMetadata(NewAAInfo, /*Ranges=*/nullptr, DstMemCacheHint));
9631 OutStoreChains.push_back(Store);
9632 }
9633 SrcOff += VTSize;
9634 DstOff += VTSize;
9635 Size -= VTSize;
9636 }
9637
9638 unsigned GluedLdStLimit = MaxLdStGlue == 0 ?
9640 unsigned NumLdStInMemcpy = OutStoreChains.size();
9641
9642 if (NumLdStInMemcpy) {
9643 // It may be that memcpy might be converted to memset if it's memcpy
9644 // of constants. In such a case, we won't have loads and stores, but
9645 // just stores. In the absence of loads, there is nothing to gang up.
9646 if ((GluedLdStLimit <= 1) || !EnableMemCpyDAGOpt) {
9647 // If target does not care, just leave as it.
9648 for (unsigned i = 0; i < NumLdStInMemcpy; ++i) {
9649 OutChains.push_back(OutLoadChains[i]);
9650 OutChains.push_back(OutStoreChains[i]);
9651 }
9652 } else {
9653 // Ld/St less than/equal limit set by target.
9654 if (NumLdStInMemcpy <= GluedLdStLimit) {
9655 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, 0,
9656 NumLdStInMemcpy, OutLoadChains,
9657 OutStoreChains);
9658 } else {
9659 unsigned NumberLdChain = NumLdStInMemcpy / GluedLdStLimit;
9660 unsigned RemainingLdStInMemcpy = NumLdStInMemcpy % GluedLdStLimit;
9661 unsigned GlueIter = 0;
9662
9663 // Residual ld/st.
9664 if (RemainingLdStInMemcpy) {
9666 DAG, dl, OutChains, NumLdStInMemcpy - RemainingLdStInMemcpy,
9667 NumLdStInMemcpy, OutLoadChains, OutStoreChains);
9668 }
9669
9670 for (unsigned cnt = 0; cnt < NumberLdChain; ++cnt) {
9671 unsigned IndexFrom = NumLdStInMemcpy - RemainingLdStInMemcpy -
9672 GlueIter - GluedLdStLimit;
9673 unsigned IndexTo = NumLdStInMemcpy - RemainingLdStInMemcpy - GlueIter;
9674 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, IndexFrom, IndexTo,
9675 OutLoadChains, OutStoreChains);
9676 GlueIter += GluedLdStLimit;
9677 }
9678 }
9679 }
9680 }
9681 return DAG.getTokenFactor(dl, OutChains);
9682}
9683
9685 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
9686 uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol,
9687 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9688 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo) {
9689 // Turn a memmove of undef to nop.
9690 // FIXME: We need to honor volatile even is Src is undef.
9691 if (Src.isUndef())
9692 return Chain;
9693
9694 // Expand memmove to a series of load and store ops if the size operand falls
9695 // below a certain threshold.
9696 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9697 const DataLayout &DL = DAG.getDataLayout();
9698 LLVMContext &C = *DAG.getContext();
9699 std::vector<EVT> MemOps;
9700 bool DstAlignCanChange = false;
9702 MachineFrameInfo &MFI = MF.getFrameInfo();
9703 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9705 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9706 DstAlignCanChange = true;
9707 SrcAlign = std::max(SrcAlign, DAG.InferPtrAlign(Src).valueOrOne());
9708 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemmove(OptSize);
9709 if (!TLI.findOptimalMemOpLowering(
9710 C, MemOps, Limit,
9711 MemOp::Move(Size, DstAlignCanChange, DstAlign, SrcAlign, isVol),
9712 DstPtrInfo.getAddrSpace(), SrcPtrInfo.getAddrSpace(),
9713 MF.getFunction().getAttributes(), nullptr))
9714 return SDValue();
9715
9716 if (DstAlignCanChange) {
9717 Type *Ty = MemOps[0].getTypeForEVT(C);
9718 Align NewDstAlign = DL.getABITypeAlign(Ty);
9719
9720 // Don't promote to an alignment that would require dynamic stack
9721 // realignment which may conflict with optimizations such as tail call
9722 // optimization.
9724 if (!TRI->hasStackRealignment(MF))
9725 if (MaybeAlign StackAlign = DL.getStackAlignment())
9726 NewDstAlign = std::min(NewDstAlign, *StackAlign);
9727
9728 if (NewDstAlign > DstAlign) {
9729 // Give the stack frame object a larger alignment if needed.
9730 if (MFI.getObjectAlign(FI->getIndex()) < NewDstAlign)
9731 MFI.setObjectAlignment(FI->getIndex(), NewDstAlign);
9732 DstAlign = NewDstAlign;
9733 }
9734 }
9735
9736 // Prepare AAInfo for loads/stores after lowering this memmove.
9737 AAMDNodes NewAAInfo = AAInfo;
9738 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9739
9740 MachineMemOperand::Flags MMOFlags =
9742 uint64_t SrcOff = 0;
9743 SmallVector<SDValue, 8> LoadValues;
9744 SmallVector<SDValue, 8> LoadChains;
9745 SmallVector<SDValue, 8> OutChains;
9746 unsigned NumMemOps = MemOps.size();
9747 for (unsigned i = 0; i < NumMemOps; i++) {
9748 EVT VT = MemOps[i];
9749 unsigned VTSize = VT.getSizeInBits() / 8;
9750 SDValue Value;
9751 bool IsOverlapping = false;
9752
9753 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - SrcOff) {
9754 // Issuing an unaligned load / store pair that overlaps with the previous
9755 // pair. Adjust the offset accordingly.
9756 SrcOff = Size - VTSize;
9757 IsOverlapping = true;
9758 }
9759
9760 // Calculate the actual alignment at the current offset. The alignment at
9761 // SrcOff may be lower than the base alignment, especially when using
9762 // overlapping loads.
9763 Align SrcAlignAtOffset = commonAlignment(SrcAlign, SrcOff);
9764 if (IsOverlapping) {
9765 // Verify that the target allows misaligned memory accesses at the
9766 // adjusted offset when using overlapping loads.
9767 unsigned Fast;
9768 if (!TLI.allowsMisalignedMemoryAccesses(VT, SrcPtrInfo.getAddrSpace(),
9769 SrcAlignAtOffset, MMOFlags,
9770 &Fast) ||
9771 !Fast) {
9772 // This should have been caught by findOptimalMemOpLowering, but verify
9773 // here for safety.
9774 return SDValue();
9775 }
9776 }
9777
9778 bool isDereferenceable =
9779 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9780 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9781 if (isDereferenceable)
9783 Value =
9784 DAG.getLoad(VT, dl, Chain,
9785 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9786 SrcPtrInfo.getWithOffset(SrcOff), SrcAlignAtOffset,
9787 SrcMMOFlags, NewAAInfo);
9788 LoadValues.push_back(Value);
9789 LoadChains.push_back(Value.getValue(1));
9790 SrcOff += VTSize;
9791 }
9792 Chain = DAG.getTokenFactor(dl, LoadChains);
9793 OutChains.clear();
9794 uint64_t DstOff = 0;
9795 for (unsigned i = 0; i < NumMemOps; i++) {
9796 EVT VT = MemOps[i];
9797 unsigned VTSize = VT.getSizeInBits() / 8;
9798 SDValue Store;
9799 bool IsOverlapping = false;
9800
9801 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - DstOff) {
9802 // Issuing an unaligned load / store pair that overlaps with the previous
9803 // pair. Adjust the offset accordingly.
9804 DstOff = Size - VTSize;
9805 IsOverlapping = true;
9806 }
9807
9808 // Calculate the actual alignment at the current offset. The alignment at
9809 // DstOff may be lower than the base alignment, especially when using
9810 // overlapping stores.
9811 Align DstAlignAtOffset = commonAlignment(DstAlign, DstOff);
9812 if (IsOverlapping) {
9813 // Verify that the target allows misaligned memory accesses at the
9814 // adjusted offset when using overlapping stores.
9815 unsigned Fast;
9816 if (!TLI.allowsMisalignedMemoryAccesses(VT, DstPtrInfo.getAddrSpace(),
9817 DstAlignAtOffset, MMOFlags,
9818 &Fast) ||
9819 !Fast) {
9820 // This should have been caught by findOptimalMemOpLowering, but verify
9821 // here for safety.
9822 return SDValue();
9823 }
9824 }
9825 Store = DAG.getStore(
9826 Chain, dl, LoadValues[i],
9827 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9828 DstPtrInfo.getWithOffset(DstOff), DstAlignAtOffset, MMOFlags,
9829 NewAAInfo);
9830 OutChains.push_back(Store);
9831 DstOff += VTSize;
9832 }
9833
9834 return DAG.getTokenFactor(dl, OutChains);
9835}
9836
9837/// Lower the call to 'memset' intrinsic function into a series of store
9838/// operations.
9839///
9840/// \param DAG Selection DAG where lowered code is placed.
9841/// \param dl Link to corresponding IR location.
9842/// \param Chain Control flow dependency.
9843/// \param Dst Pointer to destination memory location.
9844/// \param Src Value of byte to write into the memory.
9845/// \param Size Number of bytes to write.
9846/// \param Alignment Alignment of the destination in bytes.
9847/// \param isVol True if destination is volatile.
9848/// \param AlwaysInline Makes sure no function call is generated.
9849/// \param DstPtrInfo IR information on the memory pointer.
9850/// \returns New head in the control flow, if lowering was successful, empty
9851/// SDValue otherwise.
9852///
9853/// The function tries to replace 'llvm.memset' intrinsic with several store
9854/// operations and value calculation code. This is usually profitable for small
9855/// memory size or when the semantic requires inlining.
9857 SDValue Chain, SDValue Dst, SDValue Src,
9858 uint64_t Size, Align Alignment, bool isVol,
9859 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9860 const AAMDNodes &AAInfo) {
9861 // Turn a memset of undef to nop.
9862 // FIXME: We need to honor volatile even is Src is undef.
9863 if (Src.isUndef())
9864 return Chain;
9865
9866 // Expand memset to a series of load/store ops if the size operand
9867 // falls below a certain threshold.
9868 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9869 std::vector<EVT> MemOps;
9870 bool DstAlignCanChange = false;
9871 LLVMContext &C = *DAG.getContext();
9873 MachineFrameInfo &MFI = MF.getFrameInfo();
9874 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9876 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9877 DstAlignCanChange = true;
9878 bool IsZeroVal = isNullConstant(Src);
9879 unsigned Limit = AlwaysInline ? ~0 : TLI.getMaxStoresPerMemset(OptSize);
9880
9881 EVT LargestVT;
9882 if (!TLI.findOptimalMemOpLowering(
9883 C, MemOps, Limit,
9884 MemOp::Set(Size, DstAlignCanChange, Alignment, IsZeroVal, isVol),
9885 DstPtrInfo.getAddrSpace(), ~0u, MF.getFunction().getAttributes(),
9886 &LargestVT))
9887 return SDValue();
9888
9889 if (DstAlignCanChange) {
9890 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext());
9891 const DataLayout &DL = DAG.getDataLayout();
9892 Align NewAlign = DL.getABITypeAlign(Ty);
9893
9894 // Don't promote to an alignment that would require dynamic stack
9895 // realignment which may conflict with optimizations such as tail call
9896 // optimization.
9898 if (!TRI->hasStackRealignment(MF))
9899 if (MaybeAlign StackAlign = DL.getStackAlignment())
9900 NewAlign = std::min(NewAlign, *StackAlign);
9901
9902 if (NewAlign > Alignment) {
9903 // Give the stack frame object a larger alignment if needed.
9904 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
9905 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
9906 Alignment = NewAlign;
9907 }
9908 }
9909
9910 SmallVector<SDValue, 8> OutChains;
9911 uint64_t DstOff = 0;
9912 unsigned NumMemOps = MemOps.size();
9913
9914 // Find the largest store and generate the bit pattern for it.
9915 // If target didn't set LargestVT, compute it from MemOps.
9916 if (!LargestVT.isSimple()) {
9917 LargestVT = MemOps[0];
9918 for (unsigned i = 1; i < NumMemOps; i++)
9919 if (MemOps[i].bitsGT(LargestVT))
9920 LargestVT = MemOps[i];
9921 }
9922 SDValue MemSetValue = getMemsetValue(Src, LargestVT, DAG, dl);
9923
9924 // Prepare AAInfo for loads/stores after lowering this memset.
9925 AAMDNodes NewAAInfo = AAInfo;
9926 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9927
9928 for (unsigned i = 0; i < NumMemOps; i++) {
9929 EVT VT = MemOps[i];
9930 unsigned VTSize = VT.getSizeInBits() / 8;
9931 // The target should specify store types that exactly cover the memset size
9932 // (with the last store potentially being oversized for overlapping stores).
9933 assert(Size > 0 && "Target specified more stores than needed in "
9934 "findOptimalMemOpLowering");
9935 if (VTSize > Size) {
9936 // Issuing an unaligned load / store pair that overlaps with the previous
9937 // pair. Adjust the offset accordingly.
9938 assert(i == NumMemOps-1 && i != 0);
9939 DstOff -= VTSize - Size;
9940 }
9941
9942 // If this store is smaller than the largest store see whether we can get
9943 // the smaller value for free with a truncate or extract vector element and
9944 // then store.
9945 SDValue Value = MemSetValue;
9946 if (VT.bitsLT(LargestVT)) {
9947 unsigned Index;
9948 unsigned NElts = LargestVT.getSizeInBits() / VT.getSizeInBits();
9949 EVT SVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(), NElts);
9950 if (!LargestVT.isVector() && !VT.isVector() &&
9951 TLI.isTruncateFree(LargestVT, VT))
9952 Value = DAG.getNode(ISD::TRUNCATE, dl, VT, MemSetValue);
9953 else if (LargestVT.isVector() && !VT.isVector() &&
9955 LargestVT.getTypeForEVT(*DAG.getContext()),
9956 VT.getSizeInBits(), Index) &&
9957 TLI.isTypeLegal(SVT) &&
9958 LargestVT.getSizeInBits() == SVT.getSizeInBits()) {
9959 // Target which can combine store(extractelement VectorTy, Idx) can get
9960 // the smaller value for free.
9961 SDValue TailValue = DAG.getNode(ISD::BITCAST, dl, SVT, MemSetValue);
9962 Value = DAG.getExtractVectorElt(dl, VT, TailValue, Index);
9963 } else
9964 Value = getMemsetValue(Src, VT, DAG, dl);
9965 }
9966 assert(Value.getValueType() == VT && "Value with wrong type.");
9967 SDValue Store = DAG.getStore(
9968 Chain, dl, Value,
9969 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9970 DstPtrInfo.getWithOffset(DstOff), Alignment,
9972 NewAAInfo);
9973 OutChains.push_back(Store);
9974 DstOff += VT.getSizeInBits() / 8;
9975 // For oversized overlapping stores, only subtract the remaining bytes.
9976 // For normal stores, subtract the full store size.
9977 if (VTSize > Size) {
9978 Size = 0;
9979 } else {
9980 Size -= VTSize;
9981 }
9982 }
9983
9984 // After processing all stores, Size should be exactly 0. Any remaining bytes
9985 // indicate a bug in the target's findOptimalMemOpLowering implementation.
9986 assert(Size == 0 && "Target's findOptimalMemOpLowering did not specify "
9987 "stores that exactly cover the memset size");
9988
9989 return DAG.getTokenFactor(dl, OutChains);
9990}
9991
9993 unsigned AS) {
9994 // Lowering memcpy / memset / memmove intrinsics to calls is only valid if all
9995 // pointer operands can be losslessly bitcasted to pointers of address space 0
9996 if (AS != 0 && !TLI->getTargetMachine().isNoopAddrSpaceCast(AS, 0)) {
9997 report_fatal_error("cannot lower memory intrinsic in address space " +
9998 Twine(AS));
9999 }
10000}
10001
10003 const SelectionDAG *SelDAG,
10004 bool AllowReturnsFirstArg) {
10005 if (!CI || !CI->isTailCall())
10006 return false;
10007 // TODO: Fix "returns-first-arg" determination so it doesn't depend on which
10008 // helper symbol we lower to.
10009 return isInTailCallPosition(*CI, SelDAG->getTarget(),
10010 AllowReturnsFirstArg &&
10012}
10013
10014static std::pair<SDValue, SDValue>
10017 const CallInst *CI, RTLIB::Libcall Call,
10018 SelectionDAG *DAG, const TargetLowering *TLI) {
10019 RTLIB::LibcallImpl LCImpl = DAG->getLibcalls().getLibcallImpl(Call);
10020
10021 if (LCImpl == RTLIB::Unsupported)
10022 return {};
10023
10025 bool IsTailCall =
10026 isInTailCallPositionWrapper(CI, DAG, /*AllowReturnsFirstArg=*/true) &&
10027 // Lowering doesn't support tail calling inside a function with
10028 // a swifterror argument yet.
10029 !DAG->hasSwiftErrorArg();
10030 SDValue Callee =
10031 DAG->getExternalSymbol(LCImpl, TLI->getPointerTy(DAG->getDataLayout()));
10032
10033 CLI.setDebugLoc(dl)
10034 .setChain(Chain)
10036 CI->getType(), Callee, std::move(Args))
10037 .setTailCall(IsTailCall);
10038
10039 return TLI->LowerCallTo(CLI);
10040}
10041
10042std::pair<SDValue, SDValue> SelectionDAG::getStrcmp(SDValue Chain,
10043 const SDLoc &dl, SDValue S1,
10044 SDValue S2,
10045 const CallInst *CI) {
10047 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
10048 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10049 RTLIB::STRCMP, this, TLI);
10050}
10051
10052std::pair<SDValue, SDValue> SelectionDAG::getStrstr(SDValue Chain,
10053 const SDLoc &dl, SDValue S1,
10054 SDValue S2,
10055 const CallInst *CI) {
10057 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
10058 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10059 RTLIB::STRSTR, this, TLI);
10060}
10061
10062std::pair<SDValue, SDValue> SelectionDAG::getMemccpy(SDValue Chain,
10063 const SDLoc &dl,
10064 SDValue Dst, SDValue Src,
10066 const CallInst *CI) {
10068
10070 {Dst, PT},
10071 {Src, PT},
10074 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10075 RTLIB::MEMCCPY, this, TLI);
10076}
10077
10078std::pair<SDValue, SDValue>
10080 SDValue Mem1, SDValue Size, const CallInst *CI) {
10083 {Mem0, PT},
10084 {Mem1, PT},
10086 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10087 RTLIB::MEMCMP, this, TLI);
10088}
10089
10090std::pair<SDValue, SDValue> SelectionDAG::getStrcpy(SDValue Chain,
10091 const SDLoc &dl,
10092 SDValue Dst, SDValue Src,
10093 const CallInst *CI) {
10095 TargetLowering::ArgListTy Args = {{Dst, PT}, {Src, PT}};
10096 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10097 RTLIB::STRCPY, this, TLI);
10098}
10099
10100std::pair<SDValue, SDValue> SelectionDAG::getStrlen(SDValue Chain,
10101 const SDLoc &dl,
10102 SDValue Src,
10103 const CallInst *CI) {
10104 // Emit a library call.
10107 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10108 RTLIB::STRLEN, this, TLI);
10109}
10110
10112 return TLI->supportSwiftError() &&
10113 MF->getFunction().getAttributes().hasAttrSomewhere(
10114 Attribute::SwiftError);
10115}
10116
10118 SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size,
10119 Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline,
10120 const CallInst *CI, std::optional<bool> OverrideTailCall,
10121 MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo,
10122 const AAMDNodes &AAInfo, BatchAAResults *BatchAA) {
10123 // Check to see if we should lower the memcpy to loads and stores first.
10124 // For cases within the target-specified limits, this is the best choice.
10125 const MDNode *DstMemCacheHint =
10126 CI ? getMemCacheHintMetadata(*CI, /*OperandNo=*/0) : nullptr;
10127 const MDNode *SrcMemCacheHint =
10128 CI ? getMemCacheHintMetadata(*CI, /*OperandNo=*/1) : nullptr;
10129
10131 if (ConstantSize) {
10132 // Memcpy with size zero? Just return the original chain.
10133 if (ConstantSize->isZero())
10134 return Chain;
10135
10137 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10138 SrcAlign, isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA,
10139 DstMemCacheHint, SrcMemCacheHint);
10140 if (Result.getNode())
10141 return Result;
10142 }
10143
10144 // Then check to see if we should lower the memcpy with target-specific
10145 // code. If the target chooses to do this, this is the next best.
10146 if (TSI) {
10147 SDValue Result = TSI->EmitTargetCodeForMemcpy(
10148 *this, dl, Chain, Dst, Src, Size, DstAlign, SrcAlign, isVol,
10149 AlwaysInline, DstPtrInfo, SrcPtrInfo);
10150 if (Result.getNode())
10151 return Result;
10152 }
10153
10154 // If we really need inline code and the target declined to provide it,
10155 // use a (potentially long) sequence of loads and stores.
10156 if (AlwaysInline) {
10157 assert(ConstantSize && "AlwaysInline requires a constant size!");
10159 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10160 SrcAlign, isVol, true, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA,
10161 DstMemCacheHint, SrcMemCacheHint);
10162 }
10163
10166
10167 // FIXME: If the memcpy is volatile (isVol), lowering it to a plain libc
10168 // memcpy is not guaranteed to be safe. libc memcpys aren't required to
10169 // respect volatile, so they may do things like read or write memory
10170 // beyond the given memory regions. But fixing this isn't easy, and most
10171 // people don't care.
10172
10173 // Emit a library call.
10176 Args.emplace_back(Dst, PtrTy);
10177 Args.emplace_back(Src, PtrTy);
10178 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
10179 // FIXME: pass in SDLoc
10181 bool IsTailCall = false;
10182 RTLIB::LibcallImpl MemCpyImpl = TLI->getMemcpyImpl();
10183
10184 if (OverrideTailCall.has_value()) {
10185 IsTailCall = *OverrideTailCall;
10186 } else {
10187 bool LowersToMemcpy = MemCpyImpl == RTLIB::impl_memcpy;
10188 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemcpy);
10189 }
10190 // Lowering doesn't support tail calling inside a function with a
10191 // swifterror argument yet.
10192 IsTailCall &= !hasSwiftErrorArg();
10193
10194 CLI.setDebugLoc(dl)
10195 .setChain(Chain)
10196 .setLibCallee(
10197 Libcalls->getLibcallImplCallingConv(MemCpyImpl),
10198 Dst.getValueType().getTypeForEVT(*getContext()),
10199 getExternalSymbol(MemCpyImpl, TLI->getPointerTy(getDataLayout())),
10200 std::move(Args))
10202 .setTailCall(IsTailCall);
10203
10204 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
10205 return CallResult.second;
10206}
10207
10209 SDValue Dst, SDValue Src, SDValue Size,
10210 Type *SizeTy, unsigned ElemSz,
10211 bool isTailCall,
10212 MachinePointerInfo DstPtrInfo,
10213 MachinePointerInfo SrcPtrInfo) {
10214 // Lowering doesn't support tail calling inside a function with a
10215 // swifterror argument yet.
10216 isTailCall &= !hasSwiftErrorArg();
10217
10218 // Emit a library call.
10221 Args.emplace_back(Dst, ArgTy);
10222 Args.emplace_back(Src, ArgTy);
10223 Args.emplace_back(Size, SizeTy);
10224
10225 RTLIB::Libcall LibraryCall =
10227 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10228 if (LibcallImpl == RTLIB::Unsupported)
10229 report_fatal_error("Unsupported element size");
10230
10232 CLI.setDebugLoc(dl)
10233 .setChain(Chain)
10234 .setLibCallee(
10235 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10237 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10238 std::move(Args))
10240 .setTailCall(isTailCall);
10241
10242 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10243 return CallResult.second;
10244}
10245
10247 SDValue Src, SDValue Size, Align DstAlign,
10248 Align SrcAlign, bool isVol, const CallInst *CI,
10249 std::optional<bool> OverrideTailCall,
10250 MachinePointerInfo DstPtrInfo,
10251 MachinePointerInfo SrcPtrInfo,
10252 const AAMDNodes &AAInfo,
10253 BatchAAResults *BatchAA) {
10254 // Check to see if we should lower the memmove to loads and stores first.
10255 // For cases within the target-specified limits, this is the best choice.
10257 if (ConstantSize) {
10258 // Memmove with size zero? Just return the original chain.
10259 if (ConstantSize->isZero())
10260 return Chain;
10261
10263 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10264 SrcAlign, isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo);
10265 if (Result.getNode())
10266 return Result;
10267 }
10268
10269 // Then check to see if we should lower the memmove with target-specific
10270 // code. If the target chooses to do this, this is the next best.
10271 if (TSI) {
10272 SDValue Result = TSI->EmitTargetCodeForMemmove(
10273 *this, dl, Chain, Dst, Src, Size, DstAlign, SrcAlign, isVol, DstPtrInfo,
10274 SrcPtrInfo);
10275 if (Result.getNode())
10276 return Result;
10277 }
10278
10281
10282 // FIXME: If the memmove is volatile, lowering it to plain libc memmove may
10283 // not be safe. See memcpy above for more details.
10284
10285 // Emit a library call.
10288 Args.emplace_back(Dst, PtrTy);
10289 Args.emplace_back(Src, PtrTy);
10290 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
10291 // FIXME: pass in SDLoc
10293
10294 RTLIB::LibcallImpl MemmoveImpl = Libcalls->getLibcallImpl(RTLIB::MEMMOVE);
10295
10296 bool IsTailCall = false;
10297 if (OverrideTailCall.has_value()) {
10298 IsTailCall = *OverrideTailCall;
10299 } else {
10300 bool LowersToMemmove = MemmoveImpl == RTLIB::impl_memmove;
10301 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemmove);
10302 }
10303 // Lowering doesn't support tail calling inside a function with a
10304 // swifterror argument yet.
10305 IsTailCall &= !hasSwiftErrorArg();
10306
10307 CLI.setDebugLoc(dl)
10308 .setChain(Chain)
10309 .setLibCallee(
10310 Libcalls->getLibcallImplCallingConv(MemmoveImpl),
10311 Dst.getValueType().getTypeForEVT(*getContext()),
10312 getExternalSymbol(MemmoveImpl, TLI->getPointerTy(getDataLayout())),
10313 std::move(Args))
10315 .setTailCall(IsTailCall);
10316
10317 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
10318 return CallResult.second;
10319}
10320
10322 SDValue Dst, SDValue Src, SDValue Size,
10323 Type *SizeTy, unsigned ElemSz,
10324 bool isTailCall,
10325 MachinePointerInfo DstPtrInfo,
10326 MachinePointerInfo SrcPtrInfo) {
10327 // Lowering doesn't support tail calling inside a function with a
10328 // swifterror argument yet.
10329 isTailCall &= !hasSwiftErrorArg();
10330
10331 // Emit a library call.
10334 Args.emplace_back(Dst, IntPtrTy);
10335 Args.emplace_back(Src, IntPtrTy);
10336 Args.emplace_back(Size, SizeTy);
10337
10338 RTLIB::Libcall LibraryCall =
10340 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10341 if (LibcallImpl == RTLIB::Unsupported)
10342 report_fatal_error("Unsupported element size");
10343
10345 CLI.setDebugLoc(dl)
10346 .setChain(Chain)
10347 .setLibCallee(
10348 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10350 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10351 std::move(Args))
10353 .setTailCall(isTailCall);
10354
10355 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10356 return CallResult.second;
10357}
10358
10360 SDValue Src, SDValue Size, Align Alignment,
10361 bool isVol, bool AlwaysInline,
10362 const CallInst *CI,
10363 MachinePointerInfo DstPtrInfo,
10364 const AAMDNodes &AAInfo) {
10365 // Check to see if we should lower the memset to stores first.
10366 // For cases within the target-specified limits, this is the best choice.
10368 if (ConstantSize) {
10369 // Memset with size zero? Just return the original chain.
10370 if (ConstantSize->isZero())
10371 return Chain;
10372
10373 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10374 ConstantSize->getZExtValue(), Alignment,
10375 isVol, false, DstPtrInfo, AAInfo);
10376
10377 if (Result.getNode())
10378 return Result;
10379 }
10380
10381 // Then check to see if we should lower the memset with target-specific
10382 // code. If the target chooses to do this, this is the next best.
10383 if (TSI) {
10384 SDValue Result = TSI->EmitTargetCodeForMemset(
10385 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline, DstPtrInfo);
10386 if (Result.getNode())
10387 return Result;
10388 }
10389
10390 // If we really need inline code and the target declined to provide it,
10391 // use a (potentially long) sequence of loads and stores.
10392 if (AlwaysInline) {
10393 assert(ConstantSize && "AlwaysInline requires a constant size!");
10394 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10395 ConstantSize->getZExtValue(), Alignment,
10396 isVol, true, DstPtrInfo, AAInfo);
10397 assert(Result &&
10398 "getMemsetStores must return a valid sequence when AlwaysInline");
10399 return Result;
10400 }
10401
10403
10404 // Emit a library call.
10405 auto &Ctx = *getContext();
10406 const auto& DL = getDataLayout();
10407
10409 // FIXME: pass in SDLoc
10410 CLI.setDebugLoc(dl).setChain(Chain);
10411
10412 RTLIB::LibcallImpl BzeroImpl = Libcalls->getLibcallImpl(RTLIB::BZERO);
10413 bool UseBZero = BzeroImpl != RTLIB::Unsupported && isNullConstant(Src);
10414
10415 // If zeroing out and bzero is present, use it.
10416 if (UseBZero) {
10418 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10419 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10420 CLI.setLibCallee(
10421 Libcalls->getLibcallImplCallingConv(BzeroImpl), Type::getVoidTy(Ctx),
10422 getExternalSymbol(BzeroImpl, TLI->getPointerTy(DL)), std::move(Args));
10423 } else {
10424 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10425
10427 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10428 Args.emplace_back(Src, Src.getValueType().getTypeForEVT(Ctx));
10429 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10430 CLI.setLibCallee(Libcalls->getLibcallImplCallingConv(MemsetImpl),
10431 Dst.getValueType().getTypeForEVT(Ctx),
10432 getExternalSymbol(MemsetImpl, TLI->getPointerTy(DL)),
10433 std::move(Args));
10434 }
10435
10436 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10437 bool LowersToMemset = MemsetImpl == RTLIB::impl_memset;
10438
10439 // If we're going to use bzero, make sure not to tail call unless the
10440 // subsequent return doesn't need a value, as bzero doesn't return the first
10441 // arg unlike memset.
10442 bool ReturnsFirstArg = CI && funcReturnsFirstArgOfCall(*CI) && !UseBZero;
10443 bool IsTailCall = CI && CI->isTailCall() &&
10445 ReturnsFirstArg && LowersToMemset) &&
10446 // Lowering doesn't support tail calling inside a function
10447 // with a swifterror argument yet.
10449 CLI.setDiscardResult().setTailCall(IsTailCall);
10450
10451 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10452 return CallResult.second;
10453}
10454
10457 Type *SizeTy, unsigned ElemSz,
10458 bool isTailCall,
10459 MachinePointerInfo DstPtrInfo) {
10460 // Lowering doesn't support tail calling inside a function with a
10461 // swifterror argument yet.
10462 isTailCall &= !hasSwiftErrorArg();
10463
10464 // Emit a library call.
10466 Args.emplace_back(Dst, getDataLayout().getIntPtrType(*getContext()));
10467 Args.emplace_back(Value, Type::getInt8Ty(*getContext()));
10468 Args.emplace_back(Size, SizeTy);
10469
10470 RTLIB::Libcall LibraryCall =
10472 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10473 if (LibcallImpl == RTLIB::Unsupported)
10474 report_fatal_error("Unsupported element size");
10475
10477 CLI.setDebugLoc(dl)
10478 .setChain(Chain)
10479 .setLibCallee(
10480 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10482 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10483 std::move(Args))
10485 .setTailCall(isTailCall);
10486
10487 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10488 return CallResult.second;
10489}
10490
10491SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10493 MachineMemOperand *MMO,
10494 ISD::LoadExtType ExtType) {
10495 SDNodeKey ID(Opcode, VTList, Ops);
10496 ID.AddInteger(MemVT.getRawBits());
10497 ID.AddInteger(getSyntheticNodeSubclassData<AtomicSDNode>(
10498 dl.getIROrder(), Opcode, VTList, MemVT, MMO, ExtType));
10499 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10500 ID.AddInteger(MMO->getFlags());
10501 FoldingSetInsertToken InsertToken;
10502 if (auto *E = cast_or_null<AtomicSDNode>(lookupNode(ID, dl, InsertToken))) {
10503 E->refineAlignment(MMO);
10504 E->refineMMOMetadata(MMO);
10505 return SDValue(E, 0);
10506 }
10507
10508 auto *N = newSDNode<AtomicSDNode>(dl.getIROrder(), dl.getDebugLoc(), Opcode,
10509 VTList, MemVT, MMO, ExtType);
10510 createOperands(N, Ops);
10511
10512 CSEMap.insert(N, InsertToken);
10513 InsertNode(N);
10514 SDValue V(N, 0);
10515 NewSDValueDbgMsg(V, "Creating new node: ", this);
10516 return V;
10517}
10518
10520 EVT MemVT, SDVTList VTs, SDValue Chain,
10521 SDValue Ptr, SDValue Cmp, SDValue Swp,
10522 MachineMemOperand *MMO) {
10523 assert(Opcode == ISD::ATOMIC_CMP_SWAP ||
10525 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types");
10526
10527 SDValue Ops[] = {Chain, Ptr, Cmp, Swp};
10528 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10529}
10530
10531SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10532 SDValue Chain, SDValue Ptr, SDValue Val,
10533 MachineMemOperand *MMO) {
10534 assert((Opcode == ISD::ATOMIC_LOAD_ADD || Opcode == ISD::ATOMIC_LOAD_SUB ||
10535 Opcode == ISD::ATOMIC_LOAD_AND || Opcode == ISD::ATOMIC_LOAD_CLR ||
10536 Opcode == ISD::ATOMIC_LOAD_OR || Opcode == ISD::ATOMIC_LOAD_XOR ||
10537 Opcode == ISD::ATOMIC_LOAD_NAND || Opcode == ISD::ATOMIC_LOAD_MIN ||
10538 Opcode == ISD::ATOMIC_LOAD_MAX || Opcode == ISD::ATOMIC_LOAD_UMIN ||
10539 Opcode == ISD::ATOMIC_LOAD_UMAX || Opcode == ISD::ATOMIC_LOAD_FADD ||
10540 Opcode == ISD::ATOMIC_LOAD_FSUB || Opcode == ISD::ATOMIC_LOAD_FMAX ||
10541 Opcode == ISD::ATOMIC_LOAD_FMIN ||
10542 Opcode == ISD::ATOMIC_LOAD_FMINIMUM ||
10543 Opcode == ISD::ATOMIC_LOAD_FMAXIMUM ||
10544 Opcode == ISD::ATOMIC_LOAD_UINC_WRAP ||
10545 Opcode == ISD::ATOMIC_LOAD_UDEC_WRAP ||
10546 Opcode == ISD::ATOMIC_LOAD_USUB_COND ||
10547 Opcode == ISD::ATOMIC_LOAD_USUB_SAT || Opcode == ISD::ATOMIC_SWAP ||
10548 Opcode == ISD::ATOMIC_STORE) &&
10549 "Invalid Atomic Op");
10550
10551 EVT VT = Val.getValueType();
10552
10553 SDVTList VTs = Opcode == ISD::ATOMIC_STORE ? getVTList(MVT::Other) :
10554 getVTList(VT, MVT::Other);
10555 SDValue Ops[] = {Chain, Ptr, Val};
10556 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10557}
10558
10560 EVT MemVT, EVT VT, SDValue Chain,
10561 SDValue Ptr, MachineMemOperand *MMO) {
10562 SDVTList VTs = getVTList(VT, MVT::Other);
10563 SDValue Ops[] = {Chain, Ptr};
10564 return getAtomic(ISD::ATOMIC_LOAD, dl, MemVT, VTs, Ops, MMO, ExtType);
10565}
10566
10567/// getMergeValues - Create a MERGE_VALUES node from the given operands.
10569 if (Ops.size() == 1)
10570 return Ops[0];
10571
10573 VTs.reserve(Ops.size());
10574 for (const SDValue &Op : Ops)
10575 VTs.push_back(Op.getValueType());
10576 return getNode(ISD::MERGE_VALUES, dl, getVTList(VTs), Ops);
10577}
10578
10580 SDValue Chain, const SDLoc &dl) {
10581 SmallVector<SDValue, 4> RetValues;
10582 RetValues.reserve(ResultTypes.size());
10583 for (EVT VT : ResultTypes)
10584 RetValues.push_back(VT == MVT::Other ? Chain : getPOISON(VT));
10585 return getMergeValues(RetValues, dl);
10586}
10587
10589 unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef<SDValue> Ops,
10590 EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment,
10592 const AAMDNodes &AAInfo) {
10593 if (Size.hasValue() && !Size.getValue())
10595
10597 MachineMemOperand *MMO =
10598 MF.getMachineMemOperand(PtrInfo, Flags, Size, Alignment, AAInfo);
10599
10600 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, MMO);
10601}
10602
10604 SDVTList VTList,
10605 ArrayRef<SDValue> Ops, EVT MemVT,
10606 MachineMemOperand *MMO) {
10607 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, ArrayRef(MMO));
10608}
10609
10611 SDVTList VTList,
10612 ArrayRef<SDValue> Ops, EVT MemVT,
10614 assert(!MMOs.empty() && "Must have at least one MMO");
10615 assert(
10616 (Opcode == ISD::INTRINSIC_VOID || Opcode == ISD::INTRINSIC_W_CHAIN ||
10617 Opcode == ISD::PREFETCH ||
10618 (Opcode <= (unsigned)std::numeric_limits<int>::max() &&
10619 Opcode >= ISD::BUILTIN_OP_END && TSI->isTargetMemoryOpcode(Opcode))) &&
10620 "Opcode is not a memory-accessing opcode!");
10621
10623 if (MMOs.size() == 1) {
10624 MemRefs = MMOs[0];
10625 } else {
10626 // Allocate: [size_t count][MMO*][MMO*]...
10627 size_t AllocSize =
10628 sizeof(size_t) + MMOs.size() * sizeof(MachineMemOperand *);
10629 void *Buffer = Allocator.Allocate(AllocSize, alignof(size_t));
10630 size_t *CountPtr = static_cast<size_t *>(Buffer);
10631 *CountPtr = MMOs.size();
10632 MachineMemOperand **Array =
10633 reinterpret_cast<MachineMemOperand **>(CountPtr + 1);
10634 llvm::copy(MMOs, Array);
10635 MemRefs = Array;
10636 }
10637
10638 // Memoize the node unless it returns a glue result.
10640 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
10641 SDNodeKey ID(Opcode, VTList, Ops);
10642 ID.AddInteger(getSyntheticNodeSubclassData<MemIntrinsicSDNode>(
10643 Opcode, dl.getIROrder(), VTList, MemVT, MemRefs));
10644 ID.AddInteger(MemVT.getRawBits());
10645 for (const MachineMemOperand *MMO : MMOs) {
10646 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10647 ID.AddInteger(MMO->getFlags());
10648 }
10649 FoldingSetInsertToken InsertToken;
10650 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
10651 cast<MemIntrinsicSDNode>(E)->refineAlignment(MMOs);
10652 return SDValue(E, 0);
10653 }
10654
10655 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10656 VTList, MemVT, MemRefs);
10657 createOperands(N, Ops);
10658 CSEMap.insert(N, InsertToken);
10659 } else {
10660 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10661 VTList, MemVT, MemRefs);
10662 createOperands(N, Ops);
10663 }
10664 InsertNode(N);
10665 SDValue V(N, 0);
10666 NewSDValueDbgMsg(V, "Creating new node: ", this);
10667 return V;
10668}
10669
10671 SDValue Chain, int FrameIndex) {
10672 const unsigned Opcode = IsStart ? ISD::LIFETIME_START : ISD::LIFETIME_END;
10673 const auto VTs = getVTList(MVT::Other);
10674 SDValue Ops[2] = {
10675 Chain,
10676 getFrameIndex(FrameIndex,
10677 getTargetLoweringInfo().getFrameIndexTy(getDataLayout()),
10678 true)};
10679
10680 SDNodeKey ID(Opcode, VTs, Ops);
10681 FoldingSetInsertToken InsertToken;
10682 if (SDNode *E = lookupNode(ID, dl, InsertToken))
10683 return SDValue(E, 0);
10684
10685 LifetimeSDNode *N =
10686 newSDNode<LifetimeSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), VTs);
10687 createOperands(N, Ops);
10688 CSEMap.insert(N, InsertToken);
10689 InsertNode(N);
10690 SDValue V(N, 0);
10691 NewSDValueDbgMsg(V, "Creating new node: ", this);
10692 return V;
10693}
10694
10696 uint64_t Guid, uint64_t Index,
10697 uint32_t Attr) {
10698 const unsigned Opcode = ISD::PSEUDO_PROBE;
10699 const auto VTs = getVTList(MVT::Other);
10700 SDValue Ops[] = {Chain};
10701 SDNodeKey ID(Opcode, VTs, Ops);
10702 ID.AddInteger(Guid);
10703 ID.AddInteger(Index);
10704 ID.AddInteger(Attr);
10705 FoldingSetInsertToken InsertToken;
10706 if (SDNode *E = lookupNode(ID, Dl, InsertToken))
10707 return SDValue(E, 0);
10708
10709 auto *N = newSDNode<PseudoProbeSDNode>(
10710 Opcode, Dl.getIROrder(), Dl.getDebugLoc(), VTs, Guid, Index, Attr);
10711 createOperands(N, Ops);
10712 CSEMap.insert(N, InsertToken);
10713 InsertNode(N);
10714 SDValue V(N, 0);
10715 NewSDValueDbgMsg(V, "Creating new node: ", this);
10716 return V;
10717}
10718
10719/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10720/// MachinePointerInfo record from it. This is particularly useful because the
10721/// code generator has many cases where it doesn't bother passing in a
10722/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10724 SelectionDAG &DAG, SDValue Ptr,
10725 int64_t Offset = 0) {
10726 // If this is FI+Offset, we can model it.
10727 if (const FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr))
10729 FI->getIndex(), Offset);
10730
10731 // If this is (FI+Offset1)+Offset2, we can model it.
10732 if (Ptr.getOpcode() != ISD::ADD ||
10735 return Info;
10736
10737 int FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
10739 DAG.getMachineFunction(), FI,
10740 Offset + cast<ConstantSDNode>(Ptr.getOperand(1))->getSExtValue());
10741}
10742
10743/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10744/// MachinePointerInfo record from it. This is particularly useful because the
10745/// code generator has many cases where it doesn't bother passing in a
10746/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10748 SelectionDAG &DAG, SDValue Ptr,
10749 SDValue OffsetOp) {
10750 // If the 'Offset' value isn't a constant, we can't handle this.
10752 return InferPointerInfo(Info, DAG, Ptr, OffsetNode->getSExtValue());
10753 if (OffsetOp.isUndef())
10754 return InferPointerInfo(Info, DAG, Ptr);
10755 return Info;
10756}
10757
10759 EVT VT, const SDLoc &dl, SDValue Chain,
10760 SDValue Ptr, SDValue Offset,
10761 MachinePointerInfo PtrInfo, EVT MemVT,
10762 Align Alignment,
10763 MachineMemOperand::Flags MMOFlags,
10764 const MMOMetadata &Metadata) {
10765 assert(Chain.getValueType() == MVT::Other &&
10766 "Invalid chain type");
10767
10768 MMOFlags |= MachineMemOperand::MOLoad;
10769 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10770 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10771 // clients.
10772 if (PtrInfo.V.isNull())
10773 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10774
10775 TypeSize Size = MemVT.getStoreSize();
10777 MachineMemOperand *MMO =
10778 MF.getMachineMemOperand(PtrInfo, MMOFlags, Size, Alignment, Metadata);
10779 return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO);
10780}
10781
10783 EVT VT, const SDLoc &dl, SDValue Chain,
10784 SDValue Ptr, SDValue Offset, EVT MemVT,
10785 MachineMemOperand *MMO) {
10786 if (VT == MemVT) {
10787 ExtType = ISD::NON_EXTLOAD;
10788 } else if (ExtType == ISD::NON_EXTLOAD) {
10789 assert(VT == MemVT && "Non-extending load from different memory type!");
10790 } else {
10791 // Extending load.
10792 assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) &&
10793 "Should only be an extending load, not truncating!");
10794 assert(VT.isInteger() == MemVT.isInteger() &&
10795 "Cannot convert from FP to Int or Int -> FP!");
10796 assert(VT.isVector() == MemVT.isVector() &&
10797 "Cannot use an ext load to convert to or from a vector!");
10798 assert((!VT.isVector() ||
10800 "Cannot use an ext load to change the number of vector elements!");
10801 }
10802
10803 assert((!MMO->getRanges() ||
10805 ->getBitWidth() == MemVT.getScalarSizeInBits() &&
10806 MemVT.isInteger())) &&
10807 "Range metadata and load type must match!");
10808
10809 bool Indexed = AM != ISD::UNINDEXED;
10810 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
10811 "Unindexed load with an offset!");
10812
10813 SDVTList VTs = Indexed ?
10814 getVTList(VT, Ptr.getValueType(), MVT::Other) : getVTList(VT, MVT::Other);
10815 SDValue Ops[] = { Chain, Ptr, Offset };
10816 SDNodeKey ID(ISD::LOAD, VTs, Ops);
10817 ID.AddInteger(MemVT.getRawBits());
10818 ID.AddInteger(getSyntheticNodeSubclassData<LoadSDNode>(
10819 dl.getIROrder(), VTs, AM, ExtType, MemVT, MMO));
10820 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10821 ID.AddInteger(MMO->getFlags());
10822 FoldingSetInsertToken InsertToken;
10823 if (auto *E = cast_or_null<LoadSDNode>(lookupNode(ID, dl, InsertToken))) {
10824 E->refineAlignment(MMO);
10825 E->refineMMOMetadata(MMO);
10826 return SDValue(E, 0);
10827 }
10828 auto *N = newSDNode<LoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10829 ExtType, MemVT, MMO);
10830 createOperands(N, Ops);
10831
10832 CSEMap.insert(N, InsertToken);
10833 InsertNode(N);
10834 SDValue V(N, 0);
10835 NewSDValueDbgMsg(V, "Creating new node: ", this);
10836 return V;
10837}
10838
10840 SDValue Ptr, MachinePointerInfo PtrInfo,
10841 MaybeAlign Alignment,
10842 MachineMemOperand::Flags MMOFlags,
10843 const MMOMetadata &Metadata) {
10845 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10846 PtrInfo, VT, Alignment, MMOFlags, Metadata);
10847}
10848
10850 SDValue Ptr, MachineMemOperand *MMO) {
10852 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10853 VT, MMO);
10854}
10855
10857 EVT VT, SDValue Chain, SDValue Ptr,
10858 MachinePointerInfo PtrInfo, EVT MemVT,
10859 MaybeAlign Alignment,
10860 MachineMemOperand::Flags MMOFlags,
10861 const MMOMetadata &Metadata) {
10863 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, PtrInfo,
10864 MemVT, Alignment, MMOFlags, Metadata);
10865}
10866
10868 EVT VT, SDValue Chain, SDValue Ptr, EVT MemVT,
10869 MachineMemOperand *MMO) {
10871 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef,
10872 MemVT, MMO);
10873}
10874
10878 LoadSDNode *LD = cast<LoadSDNode>(OrigLoad);
10879 assert(LD->getOffset().getOpcode() == ISD::POISON &&
10880 "Load is already a indexed load!");
10881 // Don't propagate the invariant or dereferenceable flags.
10882 auto MMOFlags =
10883 LD->getMemOperand()->getFlags() &
10885 return getLoad(
10886 AM, LD->getExtensionType(), OrigLoad.getValueType(), dl, LD->getChain(),
10887 Base, Offset, LD->getPointerInfo(), LD->getMemoryVT(), LD->getAlign(),
10888 MMOFlags,
10889 MMOMetadata(LD->getAAInfo(), LD->getRanges(), LD->getMemCacheHint()));
10890}
10891
10893 SDValue Ptr, MachinePointerInfo PtrInfo,
10894 Align Alignment,
10895 MachineMemOperand::Flags MMOFlags,
10896 const MMOMetadata &Metadata) {
10897 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10898
10899 MMOFlags |= MachineMemOperand::MOStore;
10900 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10901 assert(!Metadata.Ranges && "range metadata is invalid for stores");
10902
10903 if (PtrInfo.V.isNull())
10904 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10905
10908 MachineMemOperand *MMO =
10909 MF.getMachineMemOperand(PtrInfo, MMOFlags, Size, Alignment, Metadata);
10910 return getStore(Chain, dl, Val, Ptr, MMO);
10911}
10912
10914 SDValue Ptr, MachineMemOperand *MMO) {
10916 return getStore(Chain, dl, Val, Ptr, Undef, Val.getValueType(), MMO,
10918}
10919
10921 SDValue Ptr, SDValue Offset, EVT SVT,
10923 bool IsTruncating) {
10924 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10925 EVT VT = Val.getValueType();
10926 if (VT == SVT) {
10927 IsTruncating = false;
10928 } else if (!IsTruncating) {
10929 assert(VT == SVT && "No-truncating store from different memory type!");
10930 } else {
10932 "Should only be a truncating store, not extending!");
10933 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
10934 assert(VT.isVector() == SVT.isVector() &&
10935 "Cannot use trunc store to convert to or from a vector!");
10936 assert((!VT.isVector() ||
10938 "Cannot use trunc store to change the number of vector elements!");
10939 }
10940
10941 bool Indexed = AM != ISD::UNINDEXED;
10942 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
10943 "Unindexed store with an offset!");
10944 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10945 : getVTList(MVT::Other);
10946 SDValue Ops[] = {Chain, Val, Ptr, Offset};
10947 SDNodeKey ID(ISD::STORE, VTs, Ops);
10948 ID.AddInteger(SVT.getRawBits());
10949 ID.AddInteger(getSyntheticNodeSubclassData<StoreSDNode>(
10950 dl.getIROrder(), VTs, AM, IsTruncating, SVT, MMO));
10951 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10952 ID.AddInteger(MMO->getFlags());
10953 FoldingSetInsertToken InsertToken;
10954 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
10955 cast<StoreSDNode>(E)->refineAlignment(MMO);
10956 cast<StoreSDNode>(E)->refineMMOMetadata(MMO);
10957 return SDValue(E, 0);
10958 }
10959 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10960 IsTruncating, SVT, MMO);
10961 createOperands(N, Ops);
10962
10963 CSEMap.insert(N, InsertToken);
10964 InsertNode(N);
10965 SDValue V(N, 0);
10966 NewSDValueDbgMsg(V, "Creating new node: ", this);
10967 return V;
10968}
10969
10971 SDValue Ptr, SDValue Offset,
10972 MachinePointerInfo PtrInfo, EVT SVT,
10973 Align Alignment,
10974 MachineMemOperand::Flags MMOFlags,
10975 const MMOMetadata &Metadata) {
10976 assert(Chain.getValueType() == MVT::Other &&
10977 "Invalid chain type");
10978
10979 MMOFlags |= MachineMemOperand::MOStore;
10980 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10981 assert(!Metadata.Ranges && "range metadata is invalid for stores");
10982
10983 if (PtrInfo.V.isNull())
10984 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10985
10987 MachineMemOperand *MMO = MF.getMachineMemOperand(
10988 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, Metadata);
10989 return getTruncStore(Chain, dl, Val, Ptr, Offset, SVT, MMO);
10990}
10991
10993 SDValue Ptr, MachinePointerInfo PtrInfo,
10994 EVT SVT, Align Alignment,
10995 MachineMemOperand::Flags MMOFlags,
10996 const MMOMetadata &Metadata) {
10997 return getTruncStore(Chain, dl, Val, Ptr, getPOISON(Ptr.getValueType()),
10998 PtrInfo, SVT, Alignment, MMOFlags, Metadata);
10999}
11000
11002 SDValue Ptr, SDValue Offset, EVT SVT,
11003 MachineMemOperand *MMO) {
11004 return getStore(Chain, dl, Val, Ptr, Offset, SVT, MMO, ISD::UNINDEXED, true);
11005}
11006
11008 SDValue Ptr, EVT SVT,
11009 MachineMemOperand *MMO) {
11010 return getStore(Chain, dl, Val, Ptr, getPOISON(Ptr.getValueType()), SVT, MMO,
11011 ISD::UNINDEXED, true);
11012}
11013
11017 StoreSDNode *ST = cast<StoreSDNode>(OrigStore);
11018 assert(ST->getOffset().getOpcode() == ISD::POISON &&
11019 "Store is already a indexed store!");
11020 return getStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
11021 ST->getMemoryVT(), ST->getMemOperand(), AM,
11022 ST->isTruncatingStore());
11023}
11024
11026 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl,
11027 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL,
11028 MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment,
11029 MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo,
11030 const MDNode *Ranges, bool IsExpanding) {
11031 MMOFlags |= MachineMemOperand::MOLoad;
11032 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
11033 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
11034 // clients.
11035 if (PtrInfo.V.isNull())
11036 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
11037
11038 TypeSize Size = MemVT.getStoreSize();
11040 MachineMemOperand *MMO = MF.getMachineMemOperand(
11041 PtrInfo, MMOFlags, Size, Alignment, MMOMetadata(AAInfo, Ranges));
11042 return getLoadVP(AM, ExtType, VT, dl, Chain, Ptr, Offset, Mask, EVL, MemVT,
11043 MMO, IsExpanding);
11044}
11045
11047 ISD::LoadExtType ExtType, EVT VT,
11048 const SDLoc &dl, SDValue Chain, SDValue Ptr,
11049 SDValue Offset, SDValue Mask, SDValue EVL,
11050 EVT MemVT, MachineMemOperand *MMO,
11051 bool IsExpanding) {
11052 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11053 assert(Mask.getValueType().getVectorElementCount() ==
11054 VT.getVectorElementCount() &&
11055 "Vector width mismatch between mask and data");
11056
11057 bool Indexed = AM != ISD::UNINDEXED;
11058 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11059 "Unindexed load with an offset!");
11060
11061 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
11062 : getVTList(VT, MVT::Other);
11063 SDValue Ops[] = {Chain, Ptr, Offset, Mask, EVL};
11064 SDNodeKey ID(ISD::VP_LOAD, VTs, Ops);
11065 ID.AddInteger(MemVT.getRawBits());
11066 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadSDNode>(
11067 dl.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
11068 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11069 ID.AddInteger(MMO->getFlags());
11070 FoldingSetInsertToken InsertToken;
11071 if (auto *E = cast_or_null<VPLoadSDNode>(lookupNode(ID, dl, InsertToken))) {
11072 E->refineAlignment(MMO);
11073 E->refineMMOMetadata(MMO);
11074 return SDValue(E, 0);
11075 }
11076 auto *N = newSDNode<VPLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11077 ExtType, IsExpanding, MemVT, MMO);
11078 createOperands(N, Ops);
11079
11080 CSEMap.insert(N, InsertToken);
11081 InsertNode(N);
11082 SDValue V(N, 0);
11083 NewSDValueDbgMsg(V, "Creating new node: ", this);
11084 return V;
11085}
11086
11088 SDValue Ptr, SDValue Mask, SDValue EVL,
11089 MachinePointerInfo PtrInfo,
11090 MaybeAlign Alignment,
11091 MachineMemOperand::Flags MMOFlags,
11092 const AAMDNodes &AAInfo, const MDNode *Ranges,
11093 bool IsExpanding) {
11095 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
11096 Mask, EVL, PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges,
11097 IsExpanding);
11098}
11099
11101 SDValue Ptr, SDValue Mask, SDValue EVL,
11102 MachineMemOperand *MMO, bool IsExpanding) {
11104 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
11105 Mask, EVL, VT, MMO, IsExpanding);
11106}
11107
11109 EVT VT, SDValue Chain, SDValue Ptr,
11110 SDValue Mask, SDValue EVL,
11111 MachinePointerInfo PtrInfo, EVT MemVT,
11112 MaybeAlign Alignment,
11113 MachineMemOperand::Flags MMOFlags,
11114 const AAMDNodes &AAInfo, bool IsExpanding) {
11116 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
11117 EVL, PtrInfo, MemVT, Alignment, MMOFlags, AAInfo, nullptr,
11118 IsExpanding);
11119}
11120
11122 EVT VT, SDValue Chain, SDValue Ptr,
11123 SDValue Mask, SDValue EVL, EVT MemVT,
11124 MachineMemOperand *MMO, bool IsExpanding) {
11126 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
11127 EVL, MemVT, MMO, IsExpanding);
11128}
11129
11131 SDValue Ptr, SDValue Offset, SDValue Mask,
11132 SDValue EVL, EVT MemVT, MachineMemOperand *MMO,
11133 ISD::MemIndexedMode AM, bool IsTruncating,
11134 bool IsCompressing) {
11135 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11136 assert(Mask.getValueType().getVectorElementCount() ==
11138 "Vector width mismatch between mask and data");
11139
11140 bool Indexed = AM != ISD::UNINDEXED;
11141 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11142 "Unindexed vp_store with an offset!");
11143 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
11144 : getVTList(MVT::Other);
11145 SDValue Ops[] = {Chain, Val, Ptr, Offset, Mask, EVL};
11146 SDNodeKey ID(ISD::VP_STORE, VTs, Ops);
11147 ID.AddInteger(MemVT.getRawBits());
11148 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
11149 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11150 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11151 ID.AddInteger(MMO->getFlags());
11152 FoldingSetInsertToken InsertToken;
11153 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11154 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
11155 return SDValue(E, 0);
11156 }
11157 auto *N = newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11158 IsTruncating, IsCompressing, MemVT, MMO);
11159 createOperands(N, Ops);
11160
11161 CSEMap.insert(N, InsertToken);
11162 InsertNode(N);
11163 SDValue V(N, 0);
11164 NewSDValueDbgMsg(V, "Creating new node: ", this);
11165 return V;
11166}
11167
11169 SDValue Val, SDValue Ptr, SDValue Mask,
11170 SDValue EVL, MachinePointerInfo PtrInfo,
11171 EVT SVT, Align Alignment,
11172 MachineMemOperand::Flags MMOFlags,
11173 const AAMDNodes &AAInfo,
11174 bool IsCompressing) {
11175 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11176
11177 MMOFlags |= MachineMemOperand::MOStore;
11178 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
11179
11180 if (PtrInfo.V.isNull())
11181 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
11182
11184 MachineMemOperand *MMO = MF.getMachineMemOperand(
11185 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
11186 return getTruncStoreVP(Chain, dl, Val, Ptr, Mask, EVL, SVT, MMO,
11187 IsCompressing);
11188}
11189
11191 SDValue Val, SDValue Ptr, SDValue Mask,
11192 SDValue EVL, EVT SVT,
11193 MachineMemOperand *MMO,
11194 bool IsCompressing) {
11195 EVT VT = Val.getValueType();
11196
11197 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11198 if (VT == SVT)
11199 return getStoreVP(Chain, dl, Val, Ptr, getPOISON(Ptr.getValueType()), Mask,
11200 EVL, VT, MMO, ISD::UNINDEXED,
11201 /*IsTruncating*/ false, IsCompressing);
11202
11204 "Should only be a truncating store, not extending!");
11205 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
11206 assert(VT.isVector() == SVT.isVector() &&
11207 "Cannot use trunc store to convert to or from a vector!");
11208 assert((!VT.isVector() ||
11210 "Cannot use trunc store to change the number of vector elements!");
11211
11212 SDVTList VTs = getVTList(MVT::Other);
11214 SDValue Ops[] = {Chain, Val, Ptr, Undef, Mask, EVL};
11215 SDNodeKey ID(ISD::VP_STORE, VTs, Ops);
11216 ID.AddInteger(SVT.getRawBits());
11217 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
11218 dl.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
11219 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11220 ID.AddInteger(MMO->getFlags());
11221 FoldingSetInsertToken InsertToken;
11222 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11223 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
11224 return SDValue(E, 0);
11225 }
11226 auto *N =
11227 newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11228 ISD::UNINDEXED, true, IsCompressing, SVT, MMO);
11229 createOperands(N, Ops);
11230
11231 CSEMap.insert(N, InsertToken);
11232 InsertNode(N);
11233 SDValue V(N, 0);
11234 NewSDValueDbgMsg(V, "Creating new node: ", this);
11235 return V;
11236}
11237
11239 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL,
11240 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask,
11241 SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding) {
11242 bool Indexed = AM != ISD::UNINDEXED;
11243 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11244 "Unindexed load with an offset!");
11245
11246 SDValue Ops[] = {Chain, Ptr, Offset, Stride, Mask, EVL};
11247 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
11248 : getVTList(VT, MVT::Other);
11249 SDNodeKey ID(ISD::EXPERIMENTAL_VP_STRIDED_LOAD, VTs, Ops);
11250 ID.AddInteger(MemVT.getRawBits());
11251 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedLoadSDNode>(
11252 DL.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
11253 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11254
11255 FoldingSetInsertToken InsertToken;
11256 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
11257 cast<VPStridedLoadSDNode>(E)->refineAlignment(MMO);
11258 return SDValue(E, 0);
11259 }
11260
11261 auto *N =
11262 newSDNode<VPStridedLoadSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, AM,
11263 ExtType, IsExpanding, MemVT, MMO);
11264 createOperands(N, Ops);
11265 CSEMap.insert(N, InsertToken);
11266 InsertNode(N);
11267 SDValue V(N, 0);
11268 NewSDValueDbgMsg(V, "Creating new node: ", this);
11269 return V;
11270}
11271
11273 SDValue Ptr, SDValue Stride,
11274 SDValue Mask, SDValue EVL,
11275 MachineMemOperand *MMO,
11276 bool IsExpanding) {
11278 return getStridedLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, DL, Chain, Ptr,
11279 Undef, Stride, Mask, EVL, VT, MMO, IsExpanding);
11280}
11281
11283 ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain,
11284 SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT,
11285 MachineMemOperand *MMO, bool IsExpanding) {
11287 return getStridedLoadVP(ISD::UNINDEXED, ExtType, VT, DL, Chain, Ptr, Undef,
11288 Stride, Mask, EVL, MemVT, MMO, IsExpanding);
11289}
11290
11292 SDValue Val, SDValue Ptr,
11293 SDValue Offset, SDValue Stride,
11294 SDValue Mask, SDValue EVL, EVT MemVT,
11295 MachineMemOperand *MMO,
11297 bool IsTruncating, bool IsCompressing) {
11298 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11299 bool Indexed = AM != ISD::UNINDEXED;
11300 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11301 "Unindexed vp_store with an offset!");
11302 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
11303 : getVTList(MVT::Other);
11304 SDValue Ops[] = {Chain, Val, Ptr, Offset, Stride, Mask, EVL};
11305 SDNodeKey ID(ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
11306 ID.AddInteger(MemVT.getRawBits());
11307 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
11308 DL.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11309 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11310 FoldingSetInsertToken InsertToken;
11311 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
11312 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
11313 return SDValue(E, 0);
11314 }
11315 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
11316 VTs, AM, IsTruncating,
11317 IsCompressing, MemVT, MMO);
11318 createOperands(N, Ops);
11319
11320 CSEMap.insert(N, InsertToken);
11321 InsertNode(N);
11322 SDValue V(N, 0);
11323 NewSDValueDbgMsg(V, "Creating new node: ", this);
11324 return V;
11325}
11326
11329 ISD::MemIndexType IndexType) {
11330 assert(Ops.size() == 6 && "Incompatible number of operands");
11331
11332 SDNodeKey ID(ISD::VP_GATHER, VTs, Ops);
11333 ID.AddInteger(VT.getRawBits());
11334 ID.AddInteger(getSyntheticNodeSubclassData<VPGatherSDNode>(
11335 dl.getIROrder(), VTs, VT, MMO, IndexType));
11336 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11337 ID.AddInteger(MMO->getFlags());
11338 FoldingSetInsertToken InsertToken;
11339 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11340 cast<VPGatherSDNode>(E)->refineAlignment(MMO);
11341 return SDValue(E, 0);
11342 }
11343
11344 auto *N = newSDNode<VPGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11345 VT, MMO, IndexType);
11346 createOperands(N, Ops);
11347
11348 assert(N->getMask().getValueType().getVectorElementCount() ==
11349 N->getValueType(0).getVectorElementCount() &&
11350 "Vector width mismatch between mask and data");
11351 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11352 N->getValueType(0).getVectorElementCount().isScalable() &&
11353 "Scalable flags of index and data do not match");
11355 N->getIndex().getValueType().getVectorElementCount(),
11356 N->getValueType(0).getVectorElementCount()) &&
11357 "Vector width mismatch between index and data");
11358 assert(isa<ConstantSDNode>(N->getScale()) &&
11359 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11360 "Scale should be a constant power of 2");
11361
11362 CSEMap.insert(N, InsertToken);
11363 InsertNode(N);
11364 SDValue V(N, 0);
11365 NewSDValueDbgMsg(V, "Creating new node: ", this);
11366 return V;
11367}
11368
11371 MachineMemOperand *MMO,
11372 ISD::MemIndexType IndexType) {
11373 assert(Ops.size() == 7 && "Incompatible number of operands");
11374
11375 SDNodeKey ID(ISD::VP_SCATTER, VTs, Ops);
11376 ID.AddInteger(VT.getRawBits());
11377 ID.AddInteger(getSyntheticNodeSubclassData<VPScatterSDNode>(
11378 dl.getIROrder(), VTs, VT, MMO, IndexType));
11379 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11380 ID.AddInteger(MMO->getFlags());
11381 FoldingSetInsertToken InsertToken;
11382 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11383 cast<VPScatterSDNode>(E)->refineAlignment(MMO);
11384 return SDValue(E, 0);
11385 }
11386 auto *N = newSDNode<VPScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11387 VT, MMO, IndexType);
11388 createOperands(N, Ops);
11389
11390 assert(N->getMask().getValueType().getVectorElementCount() ==
11391 N->getValue().getValueType().getVectorElementCount() &&
11392 "Vector width mismatch between mask and data");
11393 assert(
11394 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11395 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11396 "Scalable flags of index and data do not match");
11398 N->getIndex().getValueType().getVectorElementCount(),
11399 N->getValue().getValueType().getVectorElementCount()) &&
11400 "Vector width mismatch between index and data");
11401 assert(isa<ConstantSDNode>(N->getScale()) &&
11402 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11403 "Scale should be a constant power of 2");
11404
11405 CSEMap.insert(N, InsertToken);
11406 InsertNode(N);
11407 SDValue V(N, 0);
11408 NewSDValueDbgMsg(V, "Creating new node: ", this);
11409 return V;
11410}
11411
11414 SDValue PassThru, EVT MemVT,
11415 MachineMemOperand *MMO,
11417 ISD::LoadExtType ExtTy, bool isExpanding) {
11418 bool Indexed = AM != ISD::UNINDEXED;
11419 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11420 "Unindexed masked load with an offset!");
11421 SDVTList VTs = Indexed ? getVTList(VT, Base.getValueType(), MVT::Other)
11422 : getVTList(VT, MVT::Other);
11423 SDValue Ops[] = {Chain, Base, Offset, Mask, PassThru};
11424 SDNodeKey ID(ISD::MLOAD, VTs, Ops);
11425 ID.AddInteger(MemVT.getRawBits());
11426 ID.AddInteger(getSyntheticNodeSubclassData<MaskedLoadSDNode>(
11427 dl.getIROrder(), VTs, AM, ExtTy, isExpanding, MemVT, MMO));
11428 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11429 ID.AddInteger(MMO->getFlags());
11430 FoldingSetInsertToken InsertToken;
11431 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11432 cast<MaskedLoadSDNode>(E)->refineAlignment(MMO);
11433 return SDValue(E, 0);
11434 }
11435 auto *N = newSDNode<MaskedLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11436 AM, ExtTy, isExpanding, MemVT, MMO);
11437 createOperands(N, Ops);
11438
11439 CSEMap.insert(N, InsertToken);
11440 InsertNode(N);
11441 SDValue V(N, 0);
11442 NewSDValueDbgMsg(V, "Creating new node: ", this);
11443 return V;
11444}
11445
11450 assert(LD->getOffset().getOpcode() == ISD::POISON &&
11451 "Masked load is already a indexed load!");
11452 return getMaskedLoad(OrigLoad.getValueType(), dl, LD->getChain(), Base,
11453 Offset, LD->getMask(), LD->getPassThru(),
11454 LD->getMemoryVT(), LD->getMemOperand(), AM,
11455 LD->getExtensionType(), LD->isExpandingLoad());
11456}
11457
11460 SDValue Mask, EVT MemVT,
11461 MachineMemOperand *MMO,
11462 ISD::MemIndexedMode AM, bool IsTruncating,
11463 bool IsCompressing) {
11464 assert(Chain.getValueType() == MVT::Other &&
11465 "Invalid chain type");
11466 bool Indexed = AM != ISD::UNINDEXED;
11467 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11468 "Unindexed masked store with an offset!");
11469 SDVTList VTs = Indexed ? getVTList(Base.getValueType(), MVT::Other)
11470 : getVTList(MVT::Other);
11471 SDValue Ops[] = {Chain, Val, Base, Offset, Mask};
11472 SDNodeKey ID(ISD::MSTORE, VTs, Ops);
11473 ID.AddInteger(MemVT.getRawBits());
11474 ID.AddInteger(getSyntheticNodeSubclassData<MaskedStoreSDNode>(
11475 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11476 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11477 ID.AddInteger(MMO->getFlags());
11478 FoldingSetInsertToken InsertToken;
11479 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11480 cast<MaskedStoreSDNode>(E)->refineAlignment(MMO);
11481 return SDValue(E, 0);
11482 }
11483 auto *N =
11484 newSDNode<MaskedStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11485 IsTruncating, IsCompressing, MemVT, MMO);
11486 createOperands(N, Ops);
11487
11488 CSEMap.insert(N, InsertToken);
11489 InsertNode(N);
11490 SDValue V(N, 0);
11491 NewSDValueDbgMsg(V, "Creating new node: ", this);
11492 return V;
11493}
11494
11499 assert(ST->getOffset().getOpcode() == ISD::POISON &&
11500 "Masked store is already a indexed store!");
11501 return getMaskedStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
11502 ST->getMask(), ST->getMemoryVT(), ST->getMemOperand(),
11503 AM, ST->isTruncatingStore(), ST->isCompressingStore());
11504}
11505
11508 MachineMemOperand *MMO,
11509 ISD::MemIndexType IndexType,
11510 ISD::LoadExtType ExtTy) {
11511 assert(Ops.size() == 6 && "Incompatible number of operands");
11512
11513 SDNodeKey ID(ISD::MGATHER, VTs, Ops);
11514 ID.AddInteger(MemVT.getRawBits());
11515 ID.AddInteger(getSyntheticNodeSubclassData<MaskedGatherSDNode>(
11516 dl.getIROrder(), VTs, MemVT, MMO, IndexType, ExtTy));
11517 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11518 ID.AddInteger(MMO->getFlags());
11519 FoldingSetInsertToken InsertToken;
11520 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11521 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11522 return SDValue(E, 0);
11523 }
11524
11525 auto *N = newSDNode<MaskedGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11526 VTs, MemVT, MMO, IndexType, ExtTy);
11527 createOperands(N, Ops);
11528
11529 assert(N->getPassThru().getValueType() == N->getValueType(0) &&
11530 "Incompatible type of the PassThru value in MaskedGatherSDNode");
11531 assert(N->getMask().getValueType().getVectorElementCount() ==
11532 N->getValueType(0).getVectorElementCount() &&
11533 "Vector width mismatch between mask and data");
11534 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11535 N->getValueType(0).getVectorElementCount().isScalable() &&
11536 "Scalable flags of index and data do not match");
11538 N->getIndex().getValueType().getVectorElementCount(),
11539 N->getValueType(0).getVectorElementCount()) &&
11540 "Vector width mismatch between index and data");
11541 assert(isa<ConstantSDNode>(N->getScale()) &&
11542 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11543 "Scale should be a constant power of 2");
11544
11545 CSEMap.insert(N, InsertToken);
11546 InsertNode(N);
11547 SDValue V(N, 0);
11548 NewSDValueDbgMsg(V, "Creating new node: ", this);
11549 return V;
11550}
11551
11554 MachineMemOperand *MMO,
11555 ISD::MemIndexType IndexType,
11556 bool IsTrunc) {
11557 assert(Ops.size() == 6 && "Incompatible number of operands");
11558
11559 SDNodeKey ID(ISD::MSCATTER, VTs, Ops);
11560 ID.AddInteger(MemVT.getRawBits());
11561 ID.AddInteger(getSyntheticNodeSubclassData<MaskedScatterSDNode>(
11562 dl.getIROrder(), VTs, MemVT, MMO, IndexType, IsTrunc));
11563 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11564 ID.AddInteger(MMO->getFlags());
11565 FoldingSetInsertToken InsertToken;
11566 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11567 cast<MaskedScatterSDNode>(E)->refineAlignment(MMO);
11568 return SDValue(E, 0);
11569 }
11570
11571 auto *N = newSDNode<MaskedScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11572 VTs, MemVT, MMO, IndexType, IsTrunc);
11573 createOperands(N, Ops);
11574
11575 assert(N->getMask().getValueType().getVectorElementCount() ==
11576 N->getValue().getValueType().getVectorElementCount() &&
11577 "Vector width mismatch between mask and data");
11578 assert(
11579 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11580 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11581 "Scalable flags of index and data do not match");
11583 N->getIndex().getValueType().getVectorElementCount(),
11584 N->getValue().getValueType().getVectorElementCount()) &&
11585 "Vector width mismatch between index and data");
11586 assert(isa<ConstantSDNode>(N->getScale()) &&
11587 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11588 "Scale should be a constant power of 2");
11589
11590 CSEMap.insert(N, InsertToken);
11591 InsertNode(N);
11592 SDValue V(N, 0);
11593 NewSDValueDbgMsg(V, "Creating new node: ", this);
11594 return V;
11595}
11596
11598 const SDLoc &dl, ArrayRef<SDValue> Ops,
11599 MachineMemOperand *MMO,
11600 ISD::MemIndexType IndexType) {
11601 assert(Ops.size() == 7 && "Incompatible number of operands");
11602
11604 ID.AddInteger(MemVT.getRawBits());
11605 ID.AddInteger(getSyntheticNodeSubclassData<MaskedHistogramSDNode>(
11606 dl.getIROrder(), VTs, MemVT, MMO, IndexType));
11607 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11608 ID.AddInteger(MMO->getFlags());
11609 FoldingSetInsertToken InsertToken;
11610 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11611 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11612 return SDValue(E, 0);
11613 }
11614
11615 auto *N = newSDNode<MaskedHistogramSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11616 VTs, MemVT, MMO, IndexType);
11617 createOperands(N, Ops);
11618
11619 assert(N->getMask().getValueType().getVectorElementCount() ==
11620 N->getIndex().getValueType().getVectorElementCount() &&
11621 "Vector width mismatch between mask and data");
11622 assert(isa<ConstantSDNode>(N->getScale()) &&
11623 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11624 "Scale should be a constant power of 2");
11625 assert(N->getInc().getValueType().isInteger() && "Non integer update value");
11626
11627 CSEMap.insert(N, InsertToken);
11628 InsertNode(N);
11629 SDValue V(N, 0);
11630 NewSDValueDbgMsg(V, "Creating new node: ", this);
11631 return V;
11632}
11633
11635 SDValue Ptr, SDValue Mask, SDValue EVL,
11636 MachineMemOperand *MMO) {
11637 SDVTList VTs = getVTList(VT, EVL.getValueType(), MVT::Other);
11638 SDValue Ops[] = {Chain, Ptr, Mask, EVL};
11639 SDNodeKey ID(ISD::VP_LOAD_FF, VTs, Ops);
11640 ID.AddInteger(VT.getRawBits());
11641 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadFFSDNode>(DL.getIROrder(),
11642 VTs, VT, MMO));
11643 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11644 ID.AddInteger(MMO->getFlags());
11645 FoldingSetInsertToken InsertToken;
11646 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
11647 cast<VPLoadFFSDNode>(E)->refineAlignment(MMO);
11648 return SDValue(E, 0);
11649 }
11650 auto *N = newSDNode<VPLoadFFSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs,
11651 VT, MMO);
11652 createOperands(N, Ops);
11653
11654 CSEMap.insert(N, InsertToken);
11655 InsertNode(N);
11656 SDValue V(N, 0);
11657 NewSDValueDbgMsg(V, "Creating new node: ", this);
11658 return V;
11659}
11660
11662 EVT MemVT, MachineMemOperand *MMO) {
11663 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11664 SDVTList VTs = getVTList(MVT::Other);
11665 SDValue Ops[] = {Chain, Ptr};
11667 ID.AddInteger(MemVT.getRawBits());
11668 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11669 ISD::GET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11670 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11671 ID.AddInteger(MMO->getFlags());
11672 FoldingSetInsertToken InsertToken;
11673 if (SDNode *E = lookupNode(ID, dl, InsertToken))
11674 return SDValue(E, 0);
11675
11676 auto *N = newSDNode<FPStateAccessSDNode>(ISD::GET_FPENV_MEM, dl.getIROrder(),
11677 dl.getDebugLoc(), VTs, MemVT, MMO);
11678 createOperands(N, Ops);
11679
11680 CSEMap.insert(N, InsertToken);
11681 InsertNode(N);
11682 SDValue V(N, 0);
11683 NewSDValueDbgMsg(V, "Creating new node: ", this);
11684 return V;
11685}
11686
11688 EVT MemVT, MachineMemOperand *MMO) {
11689 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11690 SDVTList VTs = getVTList(MVT::Other);
11691 SDValue Ops[] = {Chain, Ptr};
11693 ID.AddInteger(MemVT.getRawBits());
11694 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11695 ISD::SET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11696 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11697 ID.AddInteger(MMO->getFlags());
11698 FoldingSetInsertToken InsertToken;
11699 if (SDNode *E = lookupNode(ID, dl, InsertToken))
11700 return SDValue(E, 0);
11701
11702 auto *N = newSDNode<FPStateAccessSDNode>(ISD::SET_FPENV_MEM, dl.getIROrder(),
11703 dl.getDebugLoc(), VTs, MemVT, MMO);
11704 createOperands(N, Ops);
11705
11706 CSEMap.insert(N, InsertToken);
11707 InsertNode(N);
11708 SDValue V(N, 0);
11709 NewSDValueDbgMsg(V, "Creating new node: ", this);
11710 return V;
11711}
11712
11714 // select undef, T, F --> T (if T is a constant), otherwise F
11715 // select, ?, undef, F --> F
11716 // select, ?, T, undef --> T
11717 if (Cond.isUndef())
11718 return isConstantValueOfAnyType(T) ? T : F;
11719 if (T.isUndef())
11721 if (F.isUndef())
11723
11724 // select true, T, F --> T
11725 // select false, T, F --> F
11726 if (auto C = isBoolConstant(Cond))
11727 return *C ? T : F;
11728
11729 // select ?, T, T --> T
11730 if (T == F)
11731 return T;
11732
11733 return SDValue();
11734}
11735
11737 // shift undef, Y --> 0 (can always assume that the undef value is 0)
11738 if (X.isUndef())
11739 return getConstant(0, SDLoc(X.getNode()), X.getValueType());
11740 // shift X, undef --> undef (because it may shift by the bitwidth)
11741 if (Y.isUndef())
11742 return getUNDEF(X.getValueType());
11743
11744 // shift 0, Y --> 0
11745 // shift X, 0 --> X
11747 return X;
11748
11749 // shift X, C >= bitwidth(X) --> undef
11750 // All vector elements must be too big (or undef) to avoid partial undefs.
11751 auto isShiftTooBig = [X](ConstantSDNode *Val) {
11752 return !Val || Val->getAPIntValue().uge(X.getScalarValueSizeInBits());
11753 };
11754 if (ISD::matchUnaryPredicate(Y, isShiftTooBig, true))
11755 return getUNDEF(X.getValueType());
11756
11757 // shift i1/vXi1 X, Y --> X (any non-zero shift amount is undefined).
11758 if (X.getValueType().getScalarType() == MVT::i1)
11759 return X;
11760
11761 return SDValue();
11762}
11763
11765 SDNodeFlags Flags) {
11766 // If this operation has 'nnan' or 'ninf' and at least 1 disallowed operand
11767 // (an undef operand can be chosen to be Nan/Inf), then the result of this
11768 // operation is poison. That result can be relaxed to undef.
11769 ConstantFPSDNode *XC = isConstOrConstSplatFP(X, /* AllowUndefs */ true);
11770 ConstantFPSDNode *YC = isConstOrConstSplatFP(Y, /* AllowUndefs */ true);
11771 bool HasNan = (XC && XC->getValueAPF().isNaN()) ||
11772 (YC && YC->getValueAPF().isNaN());
11773 bool HasInf = (XC && XC->getValueAPF().isInfinity()) ||
11774 (YC && YC->getValueAPF().isInfinity());
11775
11776 if (Flags.hasNoNaNs() && (HasNan || X.isUndef() || Y.isUndef()))
11777 return getUNDEF(X.getValueType());
11778
11779 if (Flags.hasNoInfs() && (HasInf || X.isUndef() || Y.isUndef()))
11780 return getUNDEF(X.getValueType());
11781
11782 if (!YC)
11783 return SDValue();
11784
11785 // X + -0.0 --> X
11786 if (Opcode == ISD::FADD)
11787 if (YC->getValueAPF().isNegZero())
11788 return X;
11789
11790 // X - +0.0 --> X
11791 if (Opcode == ISD::FSUB)
11792 if (YC->getValueAPF().isPosZero())
11793 return X;
11794
11795 // X * 1.0 --> X
11796 // X / 1.0 --> X
11797 if (Opcode == ISD::FMUL || Opcode == ISD::FDIV)
11798 if (YC->getValueAPF().isOne())
11799 return X;
11800
11801 // X * 0.0 --> 0.0
11802 if (Opcode == ISD::FMUL && Flags.hasNoNaNs() && Flags.hasNoSignedZeros())
11803 if (YC->getValueAPF().isZero())
11804 return getConstantFP(0.0, SDLoc(Y), Y.getValueType());
11805
11806 return SDValue();
11807}
11808
11810 SDValue Ptr, SDValue SV, unsigned Align) {
11811 SDValue Ops[] = { Chain, Ptr, SV, getTargetConstant(Align, dl, MVT::i32) };
11812 return getNode(ISD::VAARG, dl, getVTList(VT, MVT::Other), Ops);
11813}
11814
11815SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11817 switch (Ops.size()) {
11818 case 0: return getNode(Opcode, DL, VT);
11819 case 1: return getNode(Opcode, DL, VT, Ops[0].get());
11820 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]);
11821 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]);
11822 default: break;
11823 }
11824
11825 // Copy from an SDUse array into an SDValue array for use with
11826 // the regular getNode logic.
11828 return getNode(Opcode, DL, VT, NewOps);
11829}
11830
11831SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11833 SDNodeFlags Flags;
11834 if (Inserter)
11835 Flags = Inserter->getFlags();
11836 return getNode(Opcode, DL, VT, Ops, Flags);
11837}
11838
11839SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11840 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11841 unsigned NumOps = Ops.size();
11842 switch (NumOps) {
11843 case 0: return getNode(Opcode, DL, VT);
11844 case 1: return getNode(Opcode, DL, VT, Ops[0], Flags);
11845 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Flags);
11846 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2], Flags);
11847 default: break;
11848 }
11849
11850#ifndef NDEBUG
11851 for (const auto &Op : Ops)
11852 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11853 "Operand is DELETED_NODE!");
11854#endif
11855
11856 switch (Opcode) {
11857 default: break;
11858 case ISD::BUILD_VECTOR:
11859 // Attempt to simplify BUILD_VECTOR.
11860 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
11861 return V;
11862 break;
11864 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
11865 return V;
11866 break;
11867 case ISD::SELECT_CC:
11868 assert(NumOps == 5 && "SELECT_CC takes 5 operands!");
11869 assert(Ops[0].getValueType() == Ops[1].getValueType() &&
11870 "LHS and RHS of condition must have same type!");
11871 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11872 "True and False arms of SelectCC must have same type!");
11873 assert(Ops[2].getValueType() == VT &&
11874 "select_cc node must be of same type as true and false value!");
11875 assert((!Ops[0].getValueType().isVector() ||
11876 Ops[0].getValueType().getVectorElementCount() ==
11877 VT.getVectorElementCount()) &&
11878 "Expected select_cc with vector result to have the same sized "
11879 "comparison type!");
11880 break;
11881 case ISD::BR_CC:
11882 assert(NumOps == 5 && "BR_CC takes 5 operands!");
11883 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11884 "LHS/RHS of comparison should match types!");
11885 break;
11886 case ISD::VP_REDUCE_MUL:
11887 // If it is VP_REDUCE_MUL mask operation then turn it to VP_REDUCE_AND
11888 if (VT == MVT::i1)
11889 Opcode = ISD::VP_REDUCE_AND;
11890 break;
11891 case ISD::VP_REDUCE_ADD:
11892 // If it is VP_REDUCE_ADD mask operation then turn it to VP_REDUCE_XOR
11893 if (VT == MVT::i1)
11894 Opcode = ISD::VP_REDUCE_XOR;
11895 break;
11896 case ISD::VP_REDUCE_SMAX:
11897 case ISD::VP_REDUCE_UMIN:
11898 // If it is VP_REDUCE_SMAX/VP_REDUCE_UMIN mask operation then turn it to
11899 // VP_REDUCE_AND.
11900 if (VT == MVT::i1)
11901 Opcode = ISD::VP_REDUCE_AND;
11902 break;
11903 case ISD::VP_REDUCE_SMIN:
11904 case ISD::VP_REDUCE_UMAX:
11905 // If it is VP_REDUCE_SMIN/VP_REDUCE_UMAX mask operation then turn it to
11906 // VP_REDUCE_OR.
11907 if (VT == MVT::i1)
11908 Opcode = ISD::VP_REDUCE_OR;
11909 break;
11910 }
11911
11912 // Memoize nodes.
11913 SDNode *N;
11914 SDVTList VTs = getVTList(VT);
11915
11916 if (VT != MVT::Glue) {
11917 SDNodeKey ID(Opcode, VTs, Ops);
11918 FoldingSetInsertToken InsertToken;
11919
11920 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
11921 E->intersectFlagsWith(Flags);
11922 return SDValue(E, 0);
11923 }
11924
11925 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11926 createOperands(N, Ops);
11927
11928 CSEMap.insert(N, InsertToken);
11929 } else {
11930 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11931 createOperands(N, Ops);
11932 }
11933
11934 N->setFlags(Flags);
11935 InsertNode(N);
11936 SDValue V(N, 0);
11937 NewSDValueDbgMsg(V, "Creating new node: ", this);
11938 return V;
11939}
11940
11941SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11942 ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops) {
11943 SDNodeFlags Flags;
11944 if (Inserter)
11945 Flags = Inserter->getFlags();
11946 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11947}
11948
11949SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11951 const SDNodeFlags Flags) {
11952 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11953}
11954
11955SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11957 SDNodeFlags Flags;
11958 if (Inserter)
11959 Flags = Inserter->getFlags();
11960 return getNode(Opcode, DL, VTList, Ops, Flags);
11961}
11962
11963SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11964 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11965 if (VTList.NumVTs == 1)
11966 return getNode(Opcode, DL, VTList.VTs[0], Ops, Flags);
11967
11968#ifndef NDEBUG
11969 for (const auto &Op : Ops)
11970 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11971 "Operand is DELETED_NODE!");
11972#endif
11973
11974 switch (Opcode) {
11975 case ISD::SADDO:
11976 case ISD::UADDO:
11977 case ISD::SSUBO:
11978 case ISD::USUBO: {
11979 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
11980 "Invalid add/sub overflow op!");
11981 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
11982 Ops[0].getValueType() == Ops[1].getValueType() &&
11983 Ops[0].getValueType() == VTList.VTs[0] &&
11984 "Binary operator types must match!");
11985 SDValue N1 = Ops[0], N2 = Ops[1];
11986 canonicalizeCommutativeBinop(Opcode, N1, N2);
11987
11988 // (X +- 0) -> X with zero-overflow.
11989 ConstantSDNode *N2CV = isConstOrConstSplat(N2, /*AllowUndefs*/ false,
11990 /*AllowTruncation*/ true);
11991 if (N2CV && N2CV->isZero()) {
11992 SDValue ZeroOverFlow = getConstant(0, DL, VTList.VTs[1]);
11993 return getNode(ISD::MERGE_VALUES, DL, VTList, {N1, ZeroOverFlow}, Flags);
11994 }
11995
11996 if (VTList.VTs[0].getScalarType() == MVT::i1 &&
11997 VTList.VTs[1].getScalarType() == MVT::i1) {
11998 SDValue F1 = getFreeze(N1);
11999 SDValue F2 = getFreeze(N2);
12000 // {vXi1,vXi1} (u/s)addo(vXi1 x, vXi1y) -> {xor(x,y),and(x,y)}
12001 if (Opcode == ISD::UADDO || Opcode == ISD::SADDO)
12002 return getNode(ISD::MERGE_VALUES, DL, VTList,
12003 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
12004 getNode(ISD::AND, DL, VTList.VTs[1], F1, F2)},
12005 Flags);
12006 // {vXi1,vXi1} (u/s)subo(vXi1 x, vXi1y) -> {xor(x,y),and(~x,y)}
12007 if (Opcode == ISD::USUBO || Opcode == ISD::SSUBO) {
12008 SDValue NotF1 = getNOT(DL, F1, VTList.VTs[0]);
12009 return getNode(ISD::MERGE_VALUES, DL, VTList,
12010 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
12011 getNode(ISD::AND, DL, VTList.VTs[1], NotF1, F2)},
12012 Flags);
12013 }
12014 }
12015 break;
12016 }
12017 case ISD::SADDO_CARRY:
12018 case ISD::UADDO_CARRY:
12019 case ISD::SSUBO_CARRY:
12020 case ISD::USUBO_CARRY:
12021 assert(VTList.NumVTs == 2 && Ops.size() == 3 &&
12022 "Invalid add/sub overflow op!");
12023 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
12024 Ops[0].getValueType() == Ops[1].getValueType() &&
12025 Ops[0].getValueType() == VTList.VTs[0] &&
12026 Ops[2].getValueType() == VTList.VTs[1] &&
12027 "Binary operator types must match!");
12028 break;
12029 case ISD::SMUL_LOHI:
12030 case ISD::UMUL_LOHI: {
12031 assert(VTList.NumVTs == 2 && Ops.size() == 2 && "Invalid mul lo/hi op!");
12032 assert(VTList.VTs[0].isInteger() && VTList.VTs[0] == VTList.VTs[1] &&
12033 VTList.VTs[0] == Ops[0].getValueType() &&
12034 VTList.VTs[0] == Ops[1].getValueType() &&
12035 "Binary operator types must match!");
12036 // Constant fold.
12039 if (LHS && RHS) {
12040 unsigned Width = VTList.VTs[0].getScalarSizeInBits();
12041 unsigned OutWidth = Width * 2;
12042 APInt Val = LHS->getAPIntValue();
12043 APInt Mul = RHS->getAPIntValue();
12044 if (Opcode == ISD::SMUL_LOHI) {
12045 Val = Val.sext(OutWidth);
12046 Mul = Mul.sext(OutWidth);
12047 } else {
12048 Val = Val.zext(OutWidth);
12049 Mul = Mul.zext(OutWidth);
12050 }
12051 Val *= Mul;
12052
12053 SDValue Hi =
12054 getConstant(Val.extractBits(Width, Width), DL, VTList.VTs[0]);
12055 SDValue Lo = getConstant(Val.trunc(Width), DL, VTList.VTs[0]);
12056 return getNode(ISD::MERGE_VALUES, DL, VTList, {Lo, Hi}, Flags);
12057 }
12058 break;
12059 }
12060 case ISD::FFREXP: {
12061 assert(VTList.NumVTs == 2 && Ops.size() == 1 && "Invalid ffrexp op!");
12062 assert(VTList.VTs[0].isFloatingPoint() && VTList.VTs[1].isInteger() &&
12063 VTList.VTs[0] == Ops[0].getValueType() && "frexp type mismatch");
12064
12066 int FrexpExp;
12067 APFloat FrexpMant =
12068 frexp(C->getValueAPF(), FrexpExp, APFloat::rmNearestTiesToEven);
12069 SDValue Result0 = getConstantFP(FrexpMant, DL, VTList.VTs[0]);
12070 SDValue Result1 = getSignedConstant(FrexpMant.isFinite() ? FrexpExp : 0,
12071 DL, VTList.VTs[1]);
12072 return getNode(ISD::MERGE_VALUES, DL, VTList, {Result0, Result1}, Flags);
12073 }
12074
12075 break;
12076 }
12078 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
12079 "Invalid STRICT_FP_EXTEND!");
12080 assert(VTList.VTs[0].isFloatingPoint() &&
12081 Ops[1].getValueType().isFloatingPoint() && "Invalid FP cast!");
12082 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
12083 "STRICT_FP_EXTEND result type should be vector iff the operand "
12084 "type is vector!");
12085 assert((!VTList.VTs[0].isVector() ||
12086 VTList.VTs[0].getVectorElementCount() ==
12087 Ops[1].getValueType().getVectorElementCount()) &&
12088 "Vector element count mismatch!");
12089 assert(Ops[1].getValueType().bitsLT(VTList.VTs[0]) &&
12090 "Invalid fpext node, dst <= src!");
12091 break;
12093 assert(VTList.NumVTs == 2 && Ops.size() == 3 && "Invalid STRICT_FP_ROUND!");
12094 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
12095 "STRICT_FP_ROUND result type should be vector iff the operand "
12096 "type is vector!");
12097 assert((!VTList.VTs[0].isVector() ||
12098 VTList.VTs[0].getVectorElementCount() ==
12099 Ops[1].getValueType().getVectorElementCount()) &&
12100 "Vector element count mismatch!");
12101 assert(VTList.VTs[0].isFloatingPoint() &&
12102 Ops[1].getValueType().isFloatingPoint() &&
12103 VTList.VTs[0].bitsLT(Ops[1].getValueType()) &&
12104 Ops[2].getOpcode() == ISD::TargetConstant &&
12105 (Ops[2]->getAsZExtVal() == 0 || Ops[2]->getAsZExtVal() == 1) &&
12106 "Invalid STRICT_FP_ROUND!");
12107 break;
12108 }
12109
12110 // Memoize the node unless it returns a glue result.
12111 SDNode *N;
12112 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
12113 SDNodeKey ID(Opcode, VTList, Ops);
12114 FoldingSetInsertToken InsertToken;
12115 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
12116 E->intersectFlagsWith(Flags);
12117 return SDValue(E, 0);
12118 }
12119
12120 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
12121 createOperands(N, Ops);
12122 CSEMap.insert(N, InsertToken);
12123 } else {
12124 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
12125 createOperands(N, Ops);
12126 }
12127
12128 N->setFlags(Flags);
12129 InsertNode(N);
12130 SDValue V(N, 0);
12131 NewSDValueDbgMsg(V, "Creating new node: ", this);
12132 return V;
12133}
12134
12135SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
12136 SDVTList VTList) {
12137 return getNode(Opcode, DL, VTList, ArrayRef<SDValue>());
12138}
12139
12140SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12141 SDValue N1) {
12142 SDValue Ops[] = { N1 };
12143 return getNode(Opcode, DL, VTList, Ops);
12144}
12145
12146SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12147 SDValue N1, SDValue N2) {
12148 SDValue Ops[] = { N1, N2 };
12149 return getNode(Opcode, DL, VTList, Ops);
12150}
12151
12152SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12153 SDValue N1, SDValue N2, SDValue N3) {
12154 SDValue Ops[] = { N1, N2, N3 };
12155 return getNode(Opcode, DL, VTList, Ops);
12156}
12157
12158SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12159 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
12160 SDValue Ops[] = { N1, N2, N3, N4 };
12161 return getNode(Opcode, DL, VTList, Ops);
12162}
12163
12164SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12165 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
12166 SDValue N5) {
12167 SDValue Ops[] = { N1, N2, N3, N4, N5 };
12168 return getNode(Opcode, DL, VTList, Ops);
12169}
12170
12172 if (!VT.isExtended())
12173 return makeVTList(SDNode::getValueTypeList(VT.getSimpleVT()), 1);
12174
12175 EVT VTs[] = {VT};
12176 return getVTList(VTs);
12177}
12178
12180 EVT VTs[] = {VT1, VT2};
12181 return getVTList(VTs);
12182}
12183
12185 EVT VTs[] = {VT1, VT2, VT3};
12186 return getVTList(VTs);
12187}
12188
12190 EVT VTs[] = {VT1, VT2, VT3, VT4};
12191 return getVTList(VTs);
12192}
12193
12195 auto It = VTLists.find(VTs);
12196 if (It == VTLists.end()) {
12197 EVT *Array = Allocator.Allocate<EVT>(VTs.size());
12198 llvm::copy(VTs, Array);
12199 It = VTLists.insert(ArrayRef(Array, VTs.size())).first;
12200 }
12201 return makeVTList(It->data(), It->size());
12202}
12203
12204/// UpdateNodeOperands - *Mutate* the specified node in-place to have the
12205/// specified operands. If the resultant node already exists in the DAG,
12206/// this does not modify the specified node, instead it returns the node that
12207/// already exists. If the resultant node does not exist in the DAG, the
12208/// input node is returned. As a degenerate case, if you specify the same
12209/// input operands as the node already has, the input node is returned.
12211 assert(N->getNumOperands() == 1 && "Update with wrong number of operands");
12212
12213 // Check to see if there is no change.
12214 if (Op == N->getOperand(0)) return N;
12215
12216 // See if the modified node already exists.
12217 FoldingSetInsertToken InsertToken;
12218 if (SDNode *Existing = FindModifiedNodeSlot(N, Op, InsertToken))
12219 return Existing;
12220
12221 // Nope it doesn't. Remove the node from its current place in the maps.
12222 if (InsertToken)
12223 if (!RemoveNodeFromCSEMaps(N))
12224 InsertToken = {};
12225
12226 // Now we update the operands.
12227 N->OperandList[0].set(Op);
12228
12230 // If this gets put into a CSE map, add it.
12231 if (InsertToken)
12232 CSEMap.insert(N, InsertToken);
12233 return N;
12234}
12235
12237 assert(N->getNumOperands() == 2 && "Update with wrong number of operands");
12238
12239 // Check to see if there is no change.
12240 if (Op1 == N->getOperand(0) && Op2 == N->getOperand(1))
12241 return N; // No operands changed, just return the input node.
12242
12243 // See if the modified node already exists.
12244 FoldingSetInsertToken InsertToken;
12245 if (SDNode *Existing = FindModifiedNodeSlot(N, Op1, Op2, InsertToken))
12246 return Existing;
12247
12248 // Nope it doesn't. Remove the node from its current place in the maps.
12249 if (InsertToken)
12250 if (!RemoveNodeFromCSEMaps(N))
12251 InsertToken = {};
12252
12253 // Now we update the operands.
12254 if (N->OperandList[0] != Op1)
12255 N->OperandList[0].set(Op1);
12256 if (N->OperandList[1] != Op2)
12257 N->OperandList[1].set(Op2);
12258
12260 // If this gets put into a CSE map, add it.
12261 if (InsertToken)
12262 CSEMap.insert(N, InsertToken);
12263 return N;
12264}
12265
12268 SDValue Ops[] = { Op1, Op2, Op3 };
12269 return UpdateNodeOperands(N, Ops);
12270}
12271
12274 SDValue Op3, SDValue Op4) {
12275 SDValue Ops[] = { Op1, Op2, Op3, Op4 };
12276 return UpdateNodeOperands(N, Ops);
12277}
12278
12281 SDValue Op3, SDValue Op4, SDValue Op5) {
12282 SDValue Ops[] = { Op1, Op2, Op3, Op4, Op5 };
12283 return UpdateNodeOperands(N, Ops);
12284}
12285
12288 unsigned NumOps = Ops.size();
12289 assert(N->getNumOperands() == NumOps &&
12290 "Update with wrong number of operands");
12291
12292 // If no operands changed just return the input node.
12293 if (std::equal(Ops.begin(), Ops.end(), N->op_begin()))
12294 return N;
12295
12296 // See if the modified node already exists.
12297 FoldingSetInsertToken InsertToken;
12298 if (SDNode *Existing = FindModifiedNodeSlot(N, Ops, InsertToken))
12299 return Existing;
12300
12301 // Nope it doesn't. Remove the node from its current place in the maps.
12302 if (InsertToken)
12303 if (!RemoveNodeFromCSEMaps(N))
12304 InsertToken = {};
12305
12306 // Now we update the operands.
12307 for (unsigned i = 0; i != NumOps; ++i)
12308 if (N->OperandList[i] != Ops[i])
12309 N->OperandList[i].set(Ops[i]);
12310
12312 // If this gets put into a CSE map, add it.
12313 if (InsertToken)
12314 CSEMap.insert(N, InsertToken);
12315 return N;
12316}
12317
12318/// DropOperands - Release the operands and set this node to have
12319/// zero operands.
12321 // Unlike the code in MorphNodeTo that does this, we don't need to
12322 // watch for dead nodes here.
12323 for (op_iterator I = op_begin(), E = op_end(); I != E; ) {
12324 SDUse &Use = *I++;
12325 Use.set(SDValue());
12326 }
12327}
12328
12330 ArrayRef<MachineMemOperand *> NewMemRefs) {
12331 if (NewMemRefs.empty()) {
12332 N->clearMemRefs();
12333 return;
12334 }
12335
12336 // Check if we can avoid allocating by storing a single reference directly.
12337 if (NewMemRefs.size() == 1) {
12338 N->MemRefs = NewMemRefs[0];
12339 N->NumMemRefs = 1;
12340 return;
12341 }
12342
12343 MachineMemOperand **MemRefsBuffer =
12344 Allocator.template Allocate<MachineMemOperand *>(NewMemRefs.size());
12345 llvm::copy(NewMemRefs, MemRefsBuffer);
12346 N->MemRefs = MemRefsBuffer;
12347 N->NumMemRefs = static_cast<int>(NewMemRefs.size());
12348}
12349
12350/// SelectNodeTo - These are wrappers around MorphNodeTo that accept a
12351/// machine opcode.
12352///
12354 EVT VT) {
12355 SDVTList VTs = getVTList(VT);
12356 return SelectNodeTo(N, MachineOpc, VTs, {});
12357}
12358
12360 EVT VT, SDValue Op1) {
12361 SDVTList VTs = getVTList(VT);
12362 SDValue Ops[] = { Op1 };
12363 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12364}
12365
12367 EVT VT, SDValue Op1,
12368 SDValue Op2) {
12369 SDVTList VTs = getVTList(VT);
12370 SDValue Ops[] = { Op1, Op2 };
12371 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12372}
12373
12375 EVT VT, SDValue Op1,
12376 SDValue Op2, SDValue Op3) {
12377 SDVTList VTs = getVTList(VT);
12378 SDValue Ops[] = { Op1, Op2, Op3 };
12379 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12380}
12381
12384 SDVTList VTs = getVTList(VT);
12385 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12386}
12387
12389 EVT VT1, EVT VT2, ArrayRef<SDValue> Ops) {
12390 SDVTList VTs = getVTList(VT1, VT2);
12391 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12392}
12393
12395 EVT VT1, EVT VT2) {
12396 SDVTList VTs = getVTList(VT1, VT2);
12397 return SelectNodeTo(N, MachineOpc, VTs, {});
12398}
12399
12401 EVT VT1, EVT VT2, EVT VT3,
12403 SDVTList VTs = getVTList(VT1, VT2, VT3);
12404 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12405}
12406
12408 EVT VT1, EVT VT2,
12409 SDValue Op1, SDValue Op2) {
12410 SDVTList VTs = getVTList(VT1, VT2);
12411 SDValue Ops[] = { Op1, Op2 };
12412 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12413}
12414
12417 SDNode *New = MorphNodeTo(N, ~MachineOpc, VTs, Ops);
12418 // Reset the NodeID to -1.
12419 New->setNodeId(-1);
12420 if (New != N) {
12421 ReplaceAllUsesWith(N, New);
12423 }
12424 return New;
12425}
12426
12427/// UpdateSDLocOnMergeSDNode - If the opt level is -O0 then it throws away
12428/// the line number information on the merged node since it is not possible to
12429/// preserve the information that operation is associated with multiple lines.
12430/// This will make the debugger working better at -O0, were there is a higher
12431/// probability having other instructions associated with that line.
12432///
12433/// For IROrder, we keep the smaller of the two
12434SDNode *SelectionDAG::UpdateSDLocOnMergeSDNode(SDNode *N, const SDLoc &OLoc) {
12435 DebugLoc NLoc = N->getDebugLoc();
12436 if (NLoc && OptLevel == CodeGenOptLevel::None && OLoc.getDebugLoc() != NLoc) {
12437 N->setDebugLoc(DebugLoc());
12438 }
12439 unsigned Order = std::min(N->getIROrder(), OLoc.getIROrder());
12440 N->setIROrder(Order);
12441 return N;
12442}
12443
12444/// MorphNodeTo - This *mutates* the specified node to have the specified
12445/// return type, opcode, and operands.
12446///
12447/// Note that MorphNodeTo returns the resultant node. If there is already a
12448/// node of the specified opcode and operands, it returns that node instead of
12449/// the current one. Note that the SDLoc need not be the same.
12450///
12451/// Using MorphNodeTo is faster than creating a new node and swapping it in
12452/// with ReplaceAllUsesWith both because it often avoids allocating a new
12453/// node, and because it doesn't require CSE recalculation for any of
12454/// the node's users.
12455///
12456/// However, note that MorphNodeTo recursively deletes dead nodes from the DAG.
12457/// As a consequence it isn't appropriate to use from within the DAG combiner or
12458/// the legalizer which maintain worklists that would need to be updated when
12459/// deleting things.
12462 // If an identical node already exists, use it.
12463 FoldingSetInsertToken InsertToken;
12464 if (VTs.VTs[VTs.NumVTs-1] != MVT::Glue) {
12465 SDNodeKey ID(Opc, VTs, Ops);
12466 AddNodeIDCustom(ID.Tail, N, Opc);
12467 if (SDNode *ON = lookupNode(ID, SDLoc(N), InsertToken))
12468 return UpdateSDLocOnMergeSDNode(ON, SDLoc(N));
12469 }
12470
12471 if (!RemoveNodeFromCSEMaps(N))
12472 InsertToken = {};
12473
12474 // Start the morphing.
12475 N->NodeType = Opc;
12476 N->ValueList = VTs.VTs;
12477 N->NumValues = VTs.NumVTs;
12478
12479 // Clear the operands list, updating used nodes to remove this from their
12480 // use list. Keep track of any operands that become dead as a result.
12481 SmallPtrSet<SDNode*, 16> DeadNodeSet;
12482 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
12483 SDUse &Use = *I++;
12484 SDNode *Used = Use.getNode();
12485 Use.set(SDValue());
12486 if (Used->use_empty())
12487 DeadNodeSet.insert(Used);
12488 }
12489
12490 // For MachineNode, initialize the memory references information.
12492 MN->clearMemRefs();
12493
12494 // Swap for an appropriately sized array from the recycler.
12495 removeOperands(N);
12496 createOperands(N, Ops);
12497
12498 // Delete any nodes that are still dead after adding the uses for the
12499 // new operands.
12500 if (!DeadNodeSet.empty()) {
12501 SmallVector<SDNode *, 16> DeadNodes;
12502 for (SDNode *N : DeadNodeSet)
12503 if (N->use_empty())
12504 DeadNodes.push_back(N);
12505 RemoveDeadNodes(DeadNodes);
12506 }
12507
12508 if (InsertToken)
12509 CSEMap.insert(N, InsertToken); // Memoize the new node.
12510 return N;
12511}
12512
12514 unsigned OrigOpc = Node->getOpcode();
12515 unsigned NewOpc;
12516 switch (OrigOpc) {
12517 default:
12518 llvm_unreachable("mutateStrictFPToFP called with unexpected opcode!");
12519#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12520 case ISD::STRICT_##DAGN: NewOpc = ISD::DAGN; break;
12521#define CMP_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12522 case ISD::STRICT_##DAGN: NewOpc = ISD::SETCC; break;
12523#include "llvm/IR/ConstrainedOps.def"
12524 }
12525
12526 assert(Node->getNumValues() == 2 && "Unexpected number of results!");
12527
12528 // We're taking this node out of the chain, so we need to re-link things.
12529 SDValue InputChain = Node->getOperand(0);
12530 SDValue OutputChain = SDValue(Node, 1);
12531 ReplaceAllUsesOfValueWith(OutputChain, InputChain);
12532
12534 for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
12535 Ops.push_back(Node->getOperand(i));
12536
12537 SDVTList VTs = getVTList(Node->getValueType(0));
12538 SDNode *Res = MorphNodeTo(Node, NewOpc, VTs, Ops);
12539
12540 // MorphNodeTo can operate in two ways: if an existing node with the
12541 // specified operands exists, it can just return it. Otherwise, it
12542 // updates the node in place to have the requested operands.
12543 if (Res == Node) {
12544 // If we updated the node in place, reset the node ID. To the isel,
12545 // this should be just like a newly allocated machine node.
12546 Res->setNodeId(-1);
12547 } else {
12550 }
12551
12552 return Res;
12553}
12554
12555/// getMachineNode - These are used for target selectors to create a new node
12556/// with specified return type(s), MachineInstr opcode, and operands.
12557///
12558/// Note that getMachineNode returns the resultant node. If there is already a
12559/// node of the specified opcode and operands, it returns that node instead of
12560/// the current one.
12562 EVT VT) {
12563 SDVTList VTs = getVTList(VT);
12564 return getMachineNode(Opcode, dl, VTs, {});
12565}
12566
12568 EVT VT, SDValue Op1) {
12569 SDVTList VTs = getVTList(VT);
12570 SDValue Ops[] = { Op1 };
12571 return getMachineNode(Opcode, dl, VTs, Ops);
12572}
12573
12575 EVT VT, SDValue Op1, SDValue Op2) {
12576 SDVTList VTs = getVTList(VT);
12577 SDValue Ops[] = { Op1, Op2 };
12578 return getMachineNode(Opcode, dl, VTs, Ops);
12579}
12580
12582 EVT VT, SDValue Op1, SDValue Op2,
12583 SDValue Op3) {
12584 SDVTList VTs = getVTList(VT);
12585 SDValue Ops[] = { Op1, Op2, Op3 };
12586 return getMachineNode(Opcode, dl, VTs, Ops);
12587}
12588
12591 SDVTList VTs = getVTList(VT);
12592 return getMachineNode(Opcode, dl, VTs, Ops);
12593}
12594
12596 EVT VT1, EVT VT2, SDValue Op1,
12597 SDValue Op2) {
12598 SDVTList VTs = getVTList(VT1, VT2);
12599 SDValue Ops[] = { Op1, Op2 };
12600 return getMachineNode(Opcode, dl, VTs, Ops);
12601}
12602
12604 EVT VT1, EVT VT2, SDValue Op1,
12605 SDValue Op2, SDValue Op3) {
12606 SDVTList VTs = getVTList(VT1, VT2);
12607 SDValue Ops[] = { Op1, Op2, Op3 };
12608 return getMachineNode(Opcode, dl, VTs, Ops);
12609}
12610
12612 EVT VT1, EVT VT2,
12614 SDVTList VTs = getVTList(VT1, VT2);
12615 return getMachineNode(Opcode, dl, VTs, Ops);
12616}
12617
12619 EVT VT1, EVT VT2, EVT VT3,
12620 SDValue Op1, SDValue Op2) {
12621 SDVTList VTs = getVTList(VT1, VT2, VT3);
12622 SDValue Ops[] = { Op1, Op2 };
12623 return getMachineNode(Opcode, dl, VTs, Ops);
12624}
12625
12627 EVT VT1, EVT VT2, EVT VT3,
12628 SDValue Op1, SDValue Op2,
12629 SDValue Op3) {
12630 SDVTList VTs = getVTList(VT1, VT2, VT3);
12631 SDValue Ops[] = { Op1, Op2, Op3 };
12632 return getMachineNode(Opcode, dl, VTs, Ops);
12633}
12634
12636 EVT VT1, EVT VT2, EVT VT3,
12638 SDVTList VTs = getVTList(VT1, VT2, VT3);
12639 return getMachineNode(Opcode, dl, VTs, Ops);
12640}
12641
12643 ArrayRef<EVT> ResultTys,
12645 SDVTList VTs = getVTList(ResultTys);
12646 return getMachineNode(Opcode, dl, VTs, Ops);
12647}
12648
12650 SDVTList VTs,
12652 bool DoCSE = VTs.VTs[VTs.NumVTs-1] != MVT::Glue;
12654 FoldingSetInsertToken InsertToken;
12655
12656 if (DoCSE) {
12657 SDNodeKey ID(~Opcode, VTs, Ops);
12658 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
12659 return cast<MachineSDNode>(UpdateSDLocOnMergeSDNode(E, DL));
12660 }
12661 }
12662
12663 // Allocate a new MachineSDNode.
12664 N = newSDNode<MachineSDNode>(~Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
12665 createOperands(N, Ops);
12666
12667 if (DoCSE)
12668 CSEMap.insert(N, InsertToken);
12669
12670 InsertNode(N);
12671 NewSDValueDbgMsg(SDValue(N, 0), "Creating new machine node: ", this);
12672 return N;
12673}
12674
12675/// getTargetExtractSubreg - A convenience function for creating
12676/// TargetOpcode::EXTRACT_SUBREG nodes.
12678 SDValue Operand) {
12679 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12680 SDNode *Subreg = getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL,
12681 VT, Operand, SRIdxVal);
12682 return SDValue(Subreg, 0);
12683}
12684
12685/// getTargetInsertSubreg - A convenience function for creating
12686/// TargetOpcode::INSERT_SUBREG nodes.
12688 SDValue Operand, SDValue Subreg) {
12689 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12690 SDNode *Result = getMachineNode(TargetOpcode::INSERT_SUBREG, DL,
12691 VT, Operand, Subreg, SRIdxVal);
12692 return SDValue(Result, 0);
12693}
12694
12695/// getNodeIfExists - Get the specified node if it's already available, or
12696/// else return NULL.
12699 bool AllowCommute) {
12700 SDNodeFlags Flags;
12701 if (Inserter)
12702 Flags = Inserter->getFlags();
12703 return getNodeIfExists(Opcode, VTList, Ops, Flags, AllowCommute);
12704}
12705
12708 const SDNodeFlags Flags,
12709 bool AllowCommute) {
12710 if (VTList.VTs[VTList.NumVTs - 1] == MVT::Glue)
12711 return nullptr;
12712
12713 auto Lookup = [&](ArrayRef<SDValue> LookupOps) -> SDNode * {
12714 SDNodeKey ID(Opcode, VTList, LookupOps);
12715 FoldingSetInsertToken InsertToken;
12716 if (SDNode *E = lookupNode(ID, InsertToken)) {
12717 E->intersectFlagsWith(Flags);
12718 return E;
12719 }
12720 return nullptr;
12721 };
12722
12723 if (SDNode *Existing = Lookup(Ops))
12724 return Existing;
12725
12726 if (AllowCommute && TLI->isCommutativeBinOp(Opcode))
12727 return Lookup({Ops[1], Ops[0]});
12728
12729 return nullptr;
12730}
12731
12732/// doesNodeExist - Check if a node exists without modifying its flags.
12733bool SelectionDAG::doesNodeExist(unsigned Opcode, SDVTList VTList,
12735 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {
12736 SDNodeKey ID(Opcode, VTList, Ops);
12737 FoldingSetInsertToken InsertToken;
12738 if (lookupNode(ID, SDLoc(), InsertToken))
12739 return true;
12740 }
12741 return false;
12742}
12743
12744/// getDbgValue - Creates a SDDbgValue node.
12745///
12746/// SDNode
12748 SDNode *N, unsigned R, bool IsIndirect,
12749 const DebugLoc &DL, unsigned O) {
12750 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12751 "Expected inlined-at fields to agree");
12752 return new (DbgInfo->getAlloc())
12753 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromNode(N, R),
12754 {}, IsIndirect, DL, O,
12755 /*IsVariadic=*/false);
12756}
12757
12758/// Constant
12760 DIExpression *Expr,
12761 const Value *C,
12762 const DebugLoc &DL, unsigned O) {
12763 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12764 "Expected inlined-at fields to agree");
12765 return new (DbgInfo->getAlloc())
12766 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromConst(C), {},
12767 /*IsIndirect=*/false, DL, O,
12768 /*IsVariadic=*/false);
12769}
12770
12771/// FrameIndex
12773 DIExpression *Expr, unsigned FI,
12774 bool IsIndirect,
12775 const DebugLoc &DL,
12776 unsigned O) {
12777 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12778 "Expected inlined-at fields to agree");
12779 return getFrameIndexDbgValue(Var, Expr, FI, {}, IsIndirect, DL, O);
12780}
12781
12782/// FrameIndex with dependencies
12784 DIExpression *Expr, unsigned FI,
12785 ArrayRef<SDNode *> Dependencies,
12786 bool IsIndirect,
12787 const DebugLoc &DL,
12788 unsigned O) {
12789 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12790 "Expected inlined-at fields to agree");
12791 return new (DbgInfo->getAlloc())
12792 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromFrameIdx(FI),
12793 Dependencies, IsIndirect, DL, O,
12794 /*IsVariadic=*/false);
12795}
12796
12797/// VReg
12799 Register VReg, bool IsIndirect,
12800 const DebugLoc &DL, unsigned O) {
12801 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12802 "Expected inlined-at fields to agree");
12803 return new (DbgInfo->getAlloc())
12804 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromVReg(VReg),
12805 {}, IsIndirect, DL, O,
12806 /*IsVariadic=*/false);
12807}
12808
12811 ArrayRef<SDNode *> Dependencies,
12812 bool IsIndirect, const DebugLoc &DL,
12813 unsigned O, bool IsVariadic) {
12814 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12815 "Expected inlined-at fields to agree");
12816 return new (DbgInfo->getAlloc())
12817 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, Locs, Dependencies, IsIndirect,
12818 DL, O, IsVariadic);
12819}
12820
12822 unsigned OffsetInBits, unsigned SizeInBits,
12823 bool InvalidateDbg) {
12824 SDNode *FromNode = From.getNode();
12825 SDNode *ToNode = To.getNode();
12826 assert(FromNode && ToNode && "Can't modify dbg values");
12827
12828 // PR35338
12829 // TODO: assert(From != To && "Redundant dbg value transfer");
12830 // TODO: assert(FromNode != ToNode && "Intranode dbg value transfer");
12831 if (From == To || FromNode == ToNode)
12832 return;
12833
12834 if (!FromNode->getHasDebugValue())
12835 return;
12836
12837 SDDbgOperand FromLocOp =
12838 SDDbgOperand::fromNode(From.getNode(), From.getResNo());
12840
12842 for (SDDbgValue *Dbg : GetDbgValues(FromNode)) {
12843 if (Dbg->isInvalidated())
12844 continue;
12845
12846 // TODO: assert(!Dbg->isInvalidated() && "Transfer of invalid dbg value");
12847
12848 // Create a new location ops vector that is equal to the old vector, but
12849 // with each instance of FromLocOp replaced with ToLocOp.
12850 bool Changed = false;
12851 auto NewLocOps = Dbg->copyLocationOps();
12852 std::replace_if(
12853 NewLocOps.begin(), NewLocOps.end(),
12854 [&Changed, FromLocOp](const SDDbgOperand &Op) {
12855 bool Match = Op == FromLocOp;
12856 Changed |= Match;
12857 return Match;
12858 },
12859 ToLocOp);
12860 // Ignore this SDDbgValue if we didn't find a matching location.
12861 if (!Changed)
12862 continue;
12863
12864 DIVariable *Var = Dbg->getVariable();
12865 auto *Expr = Dbg->getExpression();
12866 // If a fragment is requested, update the expression.
12867 if (SizeInBits) {
12868 // When splitting a larger (e.g., sign-extended) value whose
12869 // lower bits are described with an SDDbgValue, do not attempt
12870 // to transfer the SDDbgValue to the upper bits.
12871 if (auto FI = Expr->getFragmentInfo())
12872 if (OffsetInBits + SizeInBits > FI->SizeInBits)
12873 continue;
12874 auto Fragment = DIExpression::createFragmentExpression(Expr, OffsetInBits,
12875 SizeInBits);
12876 if (!Fragment)
12877 continue;
12878 Expr = *Fragment;
12879 }
12880
12881 auto AdditionalDependencies = Dbg->getAdditionalDependencies();
12882 // Clone the SDDbgValue and move it to To.
12883 SDDbgValue *Clone = getDbgValueList(
12884 Var, Expr, NewLocOps, AdditionalDependencies, Dbg->isIndirect(),
12885 Dbg->getDebugLoc(), std::max(ToNode->getIROrder(), Dbg->getOrder()),
12886 Dbg->isVariadic());
12887 ClonedDVs.push_back(Clone);
12888
12889 if (InvalidateDbg) {
12890 // Invalidate value and indicate the SDDbgValue should not be emitted.
12891 Dbg->setIsInvalidated();
12892 Dbg->setIsEmitted();
12893 }
12894 }
12895
12896 for (SDDbgValue *Dbg : ClonedDVs) {
12897 assert(is_contained(Dbg->getSDNodes(), ToNode) &&
12898 "Transferred DbgValues should depend on the new SDNode");
12899 AddDbgValue(Dbg, false);
12900 }
12901}
12902
12904 if (!N.getHasDebugValue())
12905 return;
12906
12907 auto GetLocationOperand = [](SDNode *Node, unsigned ResNo) {
12908 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(Node))
12909 return SDDbgOperand::fromFrameIdx(FISDN->getIndex());
12910 return SDDbgOperand::fromNode(Node, ResNo);
12911 };
12912
12914 for (auto *DV : GetDbgValues(&N)) {
12915 if (DV->isInvalidated())
12916 continue;
12917 switch (N.getOpcode()) {
12918 default:
12919 break;
12920 case ISD::ADD: {
12921 SDValue N0 = N.getOperand(0);
12922 SDValue N1 = N.getOperand(1);
12923 if (!isa<ConstantSDNode>(N0)) {
12924 bool RHSConstant = isa<ConstantSDNode>(N1);
12925 uint64_t Offset;
12926 if (RHSConstant)
12927 Offset = N.getConstantOperandVal(1);
12928 // We are not allowed to turn indirect debug values variadic, so
12929 // don't salvage those.
12930 if (!RHSConstant && DV->isIndirect())
12931 continue;
12932
12933 // Rewrite an ADD constant node into a DIExpression. Since we are
12934 // performing arithmetic to compute the variable's *value* in the
12935 // DIExpression, we need to mark the expression with a
12936 // DW_OP_stack_value.
12937 auto *DIExpr = DV->getExpression();
12938 auto NewLocOps = DV->copyLocationOps();
12939 bool Changed = false;
12940 size_t OrigLocOpsSize = NewLocOps.size();
12941 for (size_t i = 0; i < OrigLocOpsSize; ++i) {
12942 // We're not given a ResNo to compare against because the whole
12943 // node is going away. We know that any ISD::ADD only has one
12944 // result, so we can assume any node match is using the result.
12945 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
12946 NewLocOps[i].getSDNode() != &N)
12947 continue;
12948 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
12949 if (RHSConstant) {
12952 DIExpr = DIExpression::appendOpsToArg(DIExpr, ExprOps, i, true);
12953 } else {
12954 // Convert to a variadic expression (if not already).
12955 // convertToVariadicExpression() returns a const pointer, so we use
12956 // a temporary const variable here.
12957 const auto *TmpDIExpr =
12961 ExprOps.push_back(NewLocOps.size());
12962 ExprOps.push_back(dwarf::DW_OP_plus);
12963 SDDbgOperand RHS =
12965 NewLocOps.push_back(RHS);
12966 DIExpr = DIExpression::appendOpsToArg(TmpDIExpr, ExprOps, i, true);
12967 }
12968 Changed = true;
12969 }
12970 (void)Changed;
12971 assert(Changed && "Salvage target doesn't use N");
12972
12973 bool IsVariadic =
12974 DV->isVariadic() || OrigLocOpsSize != NewLocOps.size();
12975
12976 auto AdditionalDependencies = DV->getAdditionalDependencies();
12977 SDDbgValue *Clone = getDbgValueList(
12978 DV->getVariable(), DIExpr, NewLocOps, AdditionalDependencies,
12979 DV->isIndirect(), DV->getDebugLoc(), DV->getOrder(), IsVariadic);
12980 ClonedDVs.push_back(Clone);
12981 DV->setIsInvalidated();
12982 DV->setIsEmitted();
12983 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting";
12984 N0.getNode()->dumprFull(this);
12985 dbgs() << " into " << *DIExpr << '\n');
12986 }
12987 break;
12988 }
12989 case ISD::TRUNCATE: {
12990 SDValue N0 = N.getOperand(0);
12991 TypeSize FromSize = N0.getValueSizeInBits();
12992 TypeSize ToSize = N.getValueSizeInBits(0);
12993
12994 DIExpression *DbgExpression = DV->getExpression();
12995 auto ExtOps = DIExpression::getExtOps(FromSize, ToSize, false);
12996 auto NewLocOps = DV->copyLocationOps();
12997 bool Changed = false;
12998 for (size_t i = 0; i < NewLocOps.size(); ++i) {
12999 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
13000 NewLocOps[i].getSDNode() != &N)
13001 continue;
13002
13003 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
13004 DbgExpression = DIExpression::appendOpsToArg(DbgExpression, ExtOps, i);
13005 Changed = true;
13006 }
13007 assert(Changed && "Salvage target doesn't use N");
13008 (void)Changed;
13009
13010 SDDbgValue *Clone =
13011 getDbgValueList(DV->getVariable(), DbgExpression, NewLocOps,
13012 DV->getAdditionalDependencies(), DV->isIndirect(),
13013 DV->getDebugLoc(), DV->getOrder(), DV->isVariadic());
13014
13015 ClonedDVs.push_back(Clone);
13016 DV->setIsInvalidated();
13017 DV->setIsEmitted();
13018 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting"; N0.getNode()->dumprFull(this);
13019 dbgs() << " into " << *DbgExpression << '\n');
13020 break;
13021 }
13022 }
13023 }
13024
13025 for (SDDbgValue *Dbg : ClonedDVs) {
13026 assert((!Dbg->getSDNodes().empty() ||
13027 llvm::any_of(Dbg->getLocationOps(),
13028 [&](const SDDbgOperand &Op) {
13029 return Op.getKind() == SDDbgOperand::FRAMEIX;
13030 })) &&
13031 "Salvaged DbgValue should depend on a new SDNode");
13032 AddDbgValue(Dbg, false);
13033 }
13034}
13035
13036/// Creates a SDDbgLabel node.
13038 const DebugLoc &DL, unsigned O) {
13039 assert(cast<DILabel>(Label)->isValidLocationForIntrinsic(DL) &&
13040 "Expected inlined-at fields to agree");
13041 return new (DbgInfo->getAlloc()) SDDbgLabel(Label, DL, O);
13042}
13043
13044namespace {
13045
13046/// RAUWUpdateListener - Helper for ReplaceAllUsesWith - When the node
13047/// pointed to by a use iterator is deleted, increment the use iterator
13048/// so that it doesn't dangle.
13049///
13050class RAUWUpdateListener : public SelectionDAG::DAGUpdateListener {
13053
13054 void NodeDeleted(SDNode *N, SDNode *E) override {
13055 // Increment the iterator as needed.
13056 while (UI != UE && N == UI->getUser())
13057 ++UI;
13058 }
13059
13060public:
13061 RAUWUpdateListener(SelectionDAG &d,
13064 : SelectionDAG::DAGUpdateListener(d), UI(ui), UE(ue) {}
13065};
13066
13067} // end anonymous namespace
13068
13069/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13070/// This can cause recursive merging of nodes in the DAG.
13071///
13072/// This version assumes From has a single result value.
13073///
13075 SDNode *From = FromN.getNode();
13076 assert(From->getNumValues() == 1 && FromN.getResNo() == 0 &&
13077 "Cannot replace with this method!");
13078 assert(From != To.getNode() && "Cannot replace uses of with self");
13079
13080 // Preserve Debug Values
13081 transferDbgValues(FromN, To);
13082 // Preserve extra info.
13083 copyExtraInfo(From, To.getNode());
13084
13085 // Iterate over all the existing uses of From. New uses will be added
13086 // to the beginning of the use list, which we avoid visiting.
13087 // This specifically avoids visiting uses of From that arise while the
13088 // replacement is happening, because any such uses would be the result
13089 // of CSE: If an existing node looks like From after one of its operands
13090 // is replaced by To, we don't want to replace of all its users with To
13091 // too. See PR3018 for more info.
13092 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13093 RAUWUpdateListener Listener(*this, UI, UE);
13094 while (UI != UE) {
13095 SDNode *User = UI->getUser();
13096
13097 // This node is about to morph, remove its old self from the CSE maps.
13098 RemoveNodeFromCSEMaps(User);
13099
13100 // A user can appear in a use list multiple times, and when this
13101 // happens the uses are usually next to each other in the list.
13102 // To help reduce the number of CSE recomputations, process all
13103 // the uses of this user that we can find this way.
13104 do {
13105 SDUse &Use = *UI;
13106 ++UI;
13107 Use.set(To);
13108 if (To->isDivergent() != From->isDivergent())
13110 } while (UI != UE && UI->getUser() == User);
13111 // Now that we have modified User, add it back to the CSE maps. If it
13112 // already exists there, recursively merge the results together.
13113 AddModifiedNodeToCSEMaps(User);
13114 }
13115
13116 // If we just RAUW'd the root, take note.
13117 if (FromN == getRoot())
13118 setRoot(To);
13119}
13120
13121/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13122/// This can cause recursive merging of nodes in the DAG.
13123///
13124/// This version assumes that for each value of From, there is a
13125/// corresponding value in To in the same position with the same type.
13126///
13128#ifndef NDEBUG
13129 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
13130 assert((!From->hasAnyUseOfValue(i) ||
13131 From->getValueType(i) == To->getValueType(i)) &&
13132 "Cannot use this version of ReplaceAllUsesWith!");
13133#endif
13134
13135 // Handle the trivial case.
13136 if (From == To)
13137 return;
13138
13139 // Preserve Debug Info. Only do this if there's a use.
13140 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
13141 if (From->hasAnyUseOfValue(i)) {
13142 assert((i < To->getNumValues()) && "Invalid To location");
13143 transferDbgValues(SDValue(From, i), SDValue(To, i));
13144 }
13145 // Preserve extra info.
13146 copyExtraInfo(From, To);
13147
13148 // Iterate over just the existing users of From. See the comments in
13149 // the ReplaceAllUsesWith above.
13150 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13151 RAUWUpdateListener Listener(*this, UI, UE);
13152 while (UI != UE) {
13153 SDNode *User = UI->getUser();
13154
13155 // This node is about to morph, remove its old self from the CSE maps.
13156 RemoveNodeFromCSEMaps(User);
13157
13158 // A user can appear in a use list multiple times, and when this
13159 // happens the uses are usually next to each other in the list.
13160 // To help reduce the number of CSE recomputations, process all
13161 // the uses of this user that we can find this way.
13162 do {
13163 SDUse &Use = *UI;
13164 ++UI;
13165 Use.setNode(To);
13166 if (To->isDivergent() != From->isDivergent())
13168 } while (UI != UE && UI->getUser() == User);
13169
13170 // Now that we have modified User, add it back to the CSE maps. If it
13171 // already exists there, recursively merge the results together.
13172 AddModifiedNodeToCSEMaps(User);
13173 }
13174
13175 // If we just RAUW'd the root, take note.
13176 if (From == getRoot().getNode())
13177 setRoot(SDValue(To, getRoot().getResNo()));
13178}
13179
13180/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13181/// This can cause recursive merging of nodes in the DAG.
13182///
13183/// This version can replace From with any result values. To must match the
13184/// number and types of values returned by From.
13186 if (From->getNumValues() == 1) // Handle the simple case efficiently.
13187 return ReplaceAllUsesWith(SDValue(From, 0), To[0]);
13188
13189 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) {
13190 // Preserve Debug Info.
13191 transferDbgValues(SDValue(From, i), To[i]);
13192 // Preserve extra info.
13193 copyExtraInfo(From, To[i].getNode());
13194 }
13195
13196 // Iterate over just the existing users of From. See the comments in
13197 // the ReplaceAllUsesWith above.
13198 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13199 RAUWUpdateListener Listener(*this, UI, UE);
13200 while (UI != UE) {
13201 SDNode *User = UI->getUser();
13202
13203 // This node is about to morph, remove its old self from the CSE maps.
13204 RemoveNodeFromCSEMaps(User);
13205
13206 // A user can appear in a use list multiple times, and when this happens the
13207 // uses are usually next to each other in the list. To help reduce the
13208 // number of CSE and divergence recomputations, process all the uses of this
13209 // user that we can find this way.
13210 bool To_IsDivergent = false;
13211 do {
13212 SDUse &Use = *UI;
13213 const SDValue &ToOp = To[Use.getResNo()];
13214 ++UI;
13215 Use.set(ToOp);
13216 if (ToOp.getValueType() != MVT::Other)
13217 To_IsDivergent |= ToOp->isDivergent();
13218 } while (UI != UE && UI->getUser() == User);
13219
13220 if (To_IsDivergent != From->isDivergent())
13222
13223 // Now that we have modified User, add it back to the CSE maps. If it
13224 // already exists there, recursively merge the results together.
13225 AddModifiedNodeToCSEMaps(User);
13226 }
13227
13228 // If we just RAUW'd the root, take note.
13229 if (From == getRoot().getNode())
13230 setRoot(SDValue(To[getRoot().getResNo()]));
13231}
13232
13233/// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
13234/// uses of other values produced by From.getNode() alone. The Deleted
13235/// vector is handled the same way as for ReplaceAllUsesWith.
13237 // Handle the really simple, really trivial case efficiently.
13238 if (From == To) return;
13239
13240 // Handle the simple, trivial, case efficiently.
13241 if (From.getNode()->getNumValues() == 1) {
13242 ReplaceAllUsesWith(From, To);
13243 return;
13244 }
13245
13246 // Preserve Debug Info.
13247 transferDbgValues(From, To);
13248 copyExtraInfo(From.getNode(), To.getNode());
13249
13250 // Iterate over just the existing users of From. See the comments in
13251 // the ReplaceAllUsesWith above.
13252 SDNode::use_iterator UI = From.getNode()->use_begin(),
13253 UE = From.getNode()->use_end();
13254 RAUWUpdateListener Listener(*this, UI, UE);
13255 while (UI != UE) {
13256 SDNode *User = UI->getUser();
13257 bool UserRemovedFromCSEMaps = false;
13258
13259 // A user can appear in a use list multiple times, and when this
13260 // happens the uses are usually next to each other in the list.
13261 // To help reduce the number of CSE recomputations, process all
13262 // the uses of this user that we can find this way.
13263 do {
13264 SDUse &Use = *UI;
13265
13266 // Skip uses of different values from the same node.
13267 if (Use.getResNo() != From.getResNo()) {
13268 ++UI;
13269 continue;
13270 }
13271
13272 // If this node hasn't been modified yet, it's still in the CSE maps,
13273 // so remove its old self from the CSE maps.
13274 if (!UserRemovedFromCSEMaps) {
13275 RemoveNodeFromCSEMaps(User);
13276 UserRemovedFromCSEMaps = true;
13277 }
13278
13279 ++UI;
13280 Use.set(To);
13281 if (To->isDivergent() != From->isDivergent())
13283 } while (UI != UE && UI->getUser() == User);
13284 // We are iterating over all uses of the From node, so if a use
13285 // doesn't use the specific value, no changes are made.
13286 if (!UserRemovedFromCSEMaps)
13287 continue;
13288
13289 // Now that we have modified User, add it back to the CSE maps. If it
13290 // already exists there, recursively merge the results together.
13291 AddModifiedNodeToCSEMaps(User);
13292 }
13293
13294 // If we just RAUW'd the root, take note.
13295 if (From == getRoot())
13296 setRoot(To);
13297}
13298
13299namespace {
13300
13301/// UseMemo - This class is used by SelectionDAG::ReplaceAllUsesOfValuesWith
13302/// to record information about a use.
13303struct UseMemo {
13304 SDNode *User;
13305 unsigned Index;
13306 SDUse *Use;
13307};
13308
13309/// operator< - Sort Memos by User.
13310bool operator<(const UseMemo &L, const UseMemo &R) {
13311 return (intptr_t)L.User < (intptr_t)R.User;
13312}
13313
13314/// RAUOVWUpdateListener - Helper for ReplaceAllUsesOfValuesWith - When the node
13315/// pointed to by a UseMemo is deleted, set the User to nullptr to indicate that
13316/// the node already has been taken care of recursively.
13317class RAUOVWUpdateListener : public SelectionDAG::DAGUpdateListener {
13318 SmallVectorImpl<UseMemo> &Uses;
13319
13320 void NodeDeleted(SDNode *N, SDNode *E) override {
13321 for (UseMemo &Memo : Uses)
13322 if (Memo.User == N)
13323 Memo.User = nullptr;
13324 }
13325
13326public:
13327 RAUOVWUpdateListener(SelectionDAG &d, SmallVectorImpl<UseMemo> &uses)
13328 : SelectionDAG::DAGUpdateListener(d), Uses(uses) {}
13329};
13330
13331} // end anonymous namespace
13332
13333/// Return true if a glue output should propagate divergence information.
13335 switch (Node->getOpcode()) {
13336 case ISD::CopyFromReg:
13337 case ISD::CopyToReg:
13338 return false;
13339 default:
13340 return true;
13341 }
13342
13343 llvm_unreachable("covered opcode switch");
13344}
13345
13347 if (TLI->isSDNodeAlwaysUniform(N)) {
13348 assert(!TLI->isSDNodeSourceOfDivergence(N, FLI, UA) &&
13349 "Conflicting divergence information!");
13350 return false;
13351 }
13352 if (TLI->isSDNodeSourceOfDivergence(N, FLI, UA))
13353 return true;
13354 for (const auto &Op : N->ops()) {
13355 EVT VT = Op.getValueType();
13356
13357 // Skip Chain. It does not carry divergence.
13358 if (VT != MVT::Other && Op.getNode()->isDivergent() &&
13359 (VT != MVT::Glue || gluePropagatesDivergence(Op.getNode())))
13360 return true;
13361 }
13362 return false;
13363}
13364
13366 SmallVector<SDNode *, 16> Worklist(1, N);
13367 do {
13368 N = Worklist.pop_back_val();
13369 bool IsDivergent = calculateDivergence(N);
13370 if (N->SDNodeBits.IsDivergent != IsDivergent) {
13371 N->SDNodeBits.IsDivergent = IsDivergent;
13372 llvm::append_range(Worklist, N->users());
13373 }
13374 } while (!Worklist.empty());
13375}
13376
13377void SelectionDAG::CreateTopologicalOrder(std::vector<SDNode *> &Order) {
13379 Order.reserve(AllNodes.size());
13380 for (auto &N : allnodes()) {
13381 unsigned NOps = N.getNumOperands();
13382 Degree[&N] = NOps;
13383 if (0 == NOps)
13384 Order.push_back(&N);
13385 }
13386 for (size_t I = 0; I != Order.size(); ++I) {
13387 SDNode *N = Order[I];
13388 for (auto *U : N->users()) {
13389 unsigned &UnsortedOps = Degree[U];
13390 if (0 == --UnsortedOps)
13391 Order.push_back(U);
13392 }
13393 }
13394}
13395
13396#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
13397void SelectionDAG::VerifyDAGDivergence() {
13398 std::vector<SDNode *> TopoOrder;
13399 CreateTopologicalOrder(TopoOrder);
13400 for (auto *N : TopoOrder) {
13401 assert(calculateDivergence(N) == N->isDivergent() &&
13402 "Divergence bit inconsistency detected");
13403 }
13404}
13405#endif
13406
13407/// ReplaceAllUsesOfValuesWith - Replace any uses of From with To, leaving
13408/// uses of other values produced by From.getNode() alone. The same value
13409/// may appear in both the From and To list. The Deleted vector is
13410/// handled the same way as for ReplaceAllUsesWith.
13412 const SDValue *To,
13413 unsigned Num){
13414 // Handle the simple, trivial case efficiently.
13415 if (Num == 1)
13416 return ReplaceAllUsesOfValueWith(*From, *To);
13417
13418 transferDbgValues(*From, *To);
13419 copyExtraInfo(From->getNode(), To->getNode());
13420
13421 // Read up all the uses and make records of them. This helps
13422 // processing new uses that are introduced during the
13423 // replacement process.
13425 for (unsigned i = 0; i != Num; ++i) {
13426 unsigned FromResNo = From[i].getResNo();
13427 SDNode *FromNode = From[i].getNode();
13428 for (SDUse &Use : FromNode->uses()) {
13429 if (Use.getResNo() == FromResNo) {
13430 UseMemo Memo = {Use.getUser(), i, &Use};
13431 Uses.push_back(Memo);
13432 }
13433 }
13434 }
13435
13436 // Sort the uses, so that all the uses from a given User are together.
13438 RAUOVWUpdateListener Listener(*this, Uses);
13439
13440 for (unsigned UseIndex = 0, UseIndexEnd = Uses.size();
13441 UseIndex != UseIndexEnd; ) {
13442 // We know that this user uses some value of From. If it is the right
13443 // value, update it.
13444 SDNode *User = Uses[UseIndex].User;
13445 // If the node has been deleted by recursive CSE updates when updating
13446 // another node, then just skip this entry.
13447 if (User == nullptr) {
13448 ++UseIndex;
13449 continue;
13450 }
13451
13452 // This node is about to morph, remove its old self from the CSE maps.
13453 RemoveNodeFromCSEMaps(User);
13454
13455 // The Uses array is sorted, so all the uses for a given User
13456 // are next to each other in the list.
13457 // To help reduce the number of CSE recomputations, process all
13458 // the uses of this user that we can find this way.
13459 do {
13460 unsigned i = Uses[UseIndex].Index;
13461 SDUse &Use = *Uses[UseIndex].Use;
13462 ++UseIndex;
13463
13464 Use.set(To[i]);
13465 } while (UseIndex != UseIndexEnd && Uses[UseIndex].User == User);
13466
13467 // Now that we have modified User, add it back to the CSE maps. If it
13468 // already exists there, recursively merge the results together.
13469 AddModifiedNodeToCSEMaps(User);
13470 }
13471}
13472
13473/// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
13474/// based on their topological order. It returns the maximum id and a vector
13475/// of the SDNodes* in assigned order by reference.
13477 unsigned DAGSize = 0;
13478
13479 // SortedPos tracks the progress of the algorithm. Nodes before it are
13480 // sorted, nodes after it are unsorted. When the algorithm completes
13481 // it is at the end of the list.
13482 allnodes_iterator SortedPos = allnodes_begin();
13483
13484 // Visit all the nodes. Move nodes with no operands to the front of
13485 // the list immediately. Annotate nodes that do have operands with their
13486 // operand count. Before we do this, the Node Id fields of the nodes
13487 // may contain arbitrary values. After, the Node Id fields for nodes
13488 // before SortedPos will contain the topological sort index, and the
13489 // Node Id fields for nodes At SortedPos and after will contain the
13490 // count of outstanding operands.
13492 checkForCycles(&N, this);
13493 unsigned Degree = N.getNumOperands();
13494 if (Degree == 0) {
13495 // A node with no uses, add it to the result array immediately.
13496 N.setNodeId(DAGSize++);
13497 allnodes_iterator Q(&N);
13498 if (Q != SortedPos)
13499 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(Q));
13500 assert(SortedPos != AllNodes.end() && "Overran node list");
13501 ++SortedPos;
13502 } else {
13503 // Temporarily use the Node Id as scratch space for the degree count.
13504 N.setNodeId(Degree);
13505 }
13506 }
13507
13508 // Visit all the nodes. As we iterate, move nodes into sorted order,
13509 // such that by the time the end is reached all nodes will be sorted.
13510 for (SDNode &Node : allnodes()) {
13511 SDNode *N = &Node;
13512 checkForCycles(N, this);
13513 // N is in sorted position, so all its uses have one less operand
13514 // that needs to be sorted.
13515 for (SDNode *P : N->users()) {
13516 unsigned Degree = P->getNodeId();
13517 assert(Degree != 0 && "Invalid node degree");
13518 --Degree;
13519 if (Degree == 0) {
13520 // All of P's operands are sorted, so P may sorted now.
13521 P->setNodeId(DAGSize++);
13522 if (P->getIterator() != SortedPos)
13523 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(P));
13524 assert(SortedPos != AllNodes.end() && "Overran node list");
13525 ++SortedPos;
13526 } else {
13527 // Update P's outstanding operand count.
13528 P->setNodeId(Degree);
13529 }
13530 }
13531 if (Node.getIterator() == SortedPos) {
13532#ifndef NDEBUG
13534 SDNode *S = &*++I;
13535 dbgs() << "Overran sorted position:\n";
13536 S->dumprFull(this); dbgs() << "\n";
13537 dbgs() << "Checking if this is due to cycles\n";
13538 checkForCycles(this, true);
13539#endif
13540 llvm_unreachable(nullptr);
13541 }
13542 }
13543
13544 assert(SortedPos == AllNodes.end() &&
13545 "Topological sort incomplete!");
13546 assert(AllNodes.front().getOpcode() == ISD::EntryToken &&
13547 "First node in topological sort is not the entry token!");
13548 assert(AllNodes.front().getNodeId() == 0 &&
13549 "First node in topological sort has non-zero id!");
13550 assert(AllNodes.front().getNumOperands() == 0 &&
13551 "First node in topological sort has operands!");
13552 assert(AllNodes.back().getNodeId() == (int)DAGSize-1 &&
13553 "Last node in topologic sort has unexpected id!");
13554 assert(AllNodes.back().use_empty() &&
13555 "Last node in topologic sort has users!");
13556 assert(DAGSize == allnodes_size() && "Node count mismatch!");
13557 return DAGSize;
13558}
13559
13561 SmallVectorImpl<const SDNode *> &SortedNodes) const {
13562 SortedNodes.clear();
13563 // Node -> remaining number of outstanding operands.
13564 DenseMap<const SDNode *, unsigned> RemainingOperands;
13565
13566 // Put nodes without any operands into SortedNodes first.
13567 for (const SDNode &N : allnodes()) {
13568 checkForCycles(&N, this);
13569 unsigned NumOperands = N.getNumOperands();
13570 if (NumOperands == 0)
13571 SortedNodes.push_back(&N);
13572 else
13573 // Record their total number of outstanding operands.
13574 RemainingOperands[&N] = NumOperands;
13575 }
13576
13577 // A node is pushed into SortedNodes when all of its operands (predecessors in
13578 // the graph) are also in SortedNodes.
13579 for (unsigned i = 0U; i < SortedNodes.size(); ++i) {
13580 const SDNode *N = SortedNodes[i];
13581 for (const SDNode *U : N->users()) {
13582 // HandleSDNode is never part of a DAG and therefore has no entry in
13583 // RemainingOperands.
13584 if (U->getOpcode() == ISD::HANDLENODE)
13585 continue;
13586 unsigned &NumRemOperands = RemainingOperands[U];
13587 assert(NumRemOperands && "Invalid number of remaining operands");
13588 --NumRemOperands;
13589 if (!NumRemOperands)
13590 SortedNodes.push_back(U);
13591 }
13592 }
13593
13594 assert(SortedNodes.size() == AllNodes.size() && "Node count mismatch");
13595 assert(SortedNodes.front()->getOpcode() == ISD::EntryToken &&
13596 "First node in topological sort is not the entry token");
13597 assert(SortedNodes.front()->getNumOperands() == 0 &&
13598 "First node in topological sort has operands");
13599}
13600
13601/// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the
13602/// value is produced by SD.
13603void SelectionDAG::AddDbgValue(SDDbgValue *DB, bool isParameter) {
13604 for (SDNode *SD : DB->getSDNodes()) {
13605 if (!SD)
13606 continue;
13607 assert(DbgInfo->getSDDbgValues(SD).empty() || SD->getHasDebugValue());
13608 SD->setHasDebugValue(true);
13609 }
13610 DbgInfo->add(DB, isParameter);
13611}
13612
13613void SelectionDAG::AddDbgLabel(SDDbgLabel *DB) { DbgInfo->add(DB); }
13614
13616 SDValue NewMemOpChain) {
13617 assert(isa<MemSDNode>(NewMemOpChain) && "Expected a memop node");
13618 assert(NewMemOpChain.getValueType() == MVT::Other && "Expected a token VT");
13619 // The new memory operation must have the same position as the old load in
13620 // terms of memory dependency. Create a TokenFactor for the old load and new
13621 // memory operation and update uses of the old load's output chain to use that
13622 // TokenFactor.
13623 if (OldChain == NewMemOpChain || OldChain.use_empty())
13624 return NewMemOpChain;
13625
13626 SDValue TokenFactor = getNode(ISD::TokenFactor, SDLoc(OldChain), MVT::Other,
13627 OldChain, NewMemOpChain);
13628 ReplaceAllUsesOfValueWith(OldChain, TokenFactor);
13629 UpdateNodeOperands(TokenFactor.getNode(), OldChain, NewMemOpChain);
13630 return TokenFactor;
13631}
13632
13634 SDValue NewMemOp) {
13635 assert(isa<MemSDNode>(NewMemOp.getNode()) && "Expected a memop node");
13636 SDValue OldChain = SDValue(OldLoad, 1);
13637 SDValue NewMemOpChain = NewMemOp.getValue(1);
13638 return makeEquivalentMemoryOrdering(OldChain, NewMemOpChain);
13639}
13640
13642 Function **OutFunction) {
13643 assert(isa<ExternalSymbolSDNode>(Op) && "Node should be an ExternalSymbol");
13644
13645 auto *Symbol = cast<ExternalSymbolSDNode>(Op)->getSymbol();
13646 auto *Module = MF->getFunction().getParent();
13647 auto *Function = Module->getFunction(Symbol);
13648
13649 if (OutFunction != nullptr)
13650 *OutFunction = Function;
13651
13652 if (Function != nullptr) {
13653 auto PtrTy = TLI->getPointerTy(getDataLayout(), Function->getAddressSpace());
13654 return getGlobalAddress(Function, SDLoc(Op), PtrTy);
13655 }
13656
13657 std::string ErrorStr;
13658 raw_string_ostream ErrorFormatter(ErrorStr);
13659 ErrorFormatter << "Undefined external symbol ";
13660 ErrorFormatter << '"' << Symbol << '"';
13661 report_fatal_error(Twine(ErrorStr));
13662}
13663
13664//===----------------------------------------------------------------------===//
13665// SDNode Class
13666//===----------------------------------------------------------------------===//
13667
13670 return Const != nullptr && Const->isZero();
13671}
13672
13674 return V.isUndef() || isNullConstant(V);
13675}
13676
13679 return Const != nullptr && Const->isZero() && !Const->isNegative();
13680}
13681
13684 return Const != nullptr && Const->isAllOnes();
13685}
13686
13689 return Const != nullptr && Const->isOne();
13690}
13691
13694 return Const != nullptr && Const->isMinSignedValue();
13695}
13696
13698 SDValue V, unsigned OperandNo,
13699 unsigned Depth) const {
13700 APInt DemandedElts = getDemandAllEltsMask(V);
13701 return isIdentityElement(Opcode, Flags, V, DemandedElts, OperandNo, Depth);
13702}
13703
13705 SDValue V, const APInt &DemandedElts,
13706 unsigned OperandNo, unsigned Depth) const {
13707 // NOTE: The cases should match with IR's ConstantExpr::getBinOpIdentity().
13708 // TODO: Target-specific opcodes could be added.
13709 if (V.getValueType().isInteger()) {
13710 KnownBits Known = computeKnownBits(V, DemandedElts, Depth);
13711 if (Known.isConstant()) {
13712 const APInt &Const = Known.getConstant();
13713 switch (Opcode) {
13714 case ISD::ADD:
13715 case ISD::OR:
13716 case ISD::XOR:
13717 case ISD::UMAX:
13718 return Const.isZero();
13719 case ISD::MUL:
13720 return Const.isOne();
13721 case ISD::AND:
13722 case ISD::UMIN:
13723 return Const.isAllOnes();
13724 case ISD::SMAX:
13725 return Const.isMinSignedValue();
13726 case ISD::SMIN:
13727 return Const.isMaxSignedValue();
13728 case ISD::SUB:
13729 case ISD::SHL:
13730 case ISD::SRA:
13731 case ISD::SRL:
13732 return OperandNo == 1 && Const.isZero();
13733 case ISD::UDIV:
13734 case ISD::SDIV:
13735 return OperandNo == 1 && Const.isOne();
13736 }
13737 }
13738 } else if (auto *ConstFP = isConstOrConstSplatFP(V, DemandedElts)) {
13739 switch (Opcode) {
13740 case ISD::FADD:
13741 return ConstFP->isZero() &&
13742 (Flags.hasNoSignedZeros() || ConstFP->isNegative());
13743 case ISD::FSUB:
13744 return OperandNo == 1 && ConstFP->isZero() &&
13745 (Flags.hasNoSignedZeros() || !ConstFP->isNegative());
13746 case ISD::FMUL:
13747 return ConstFP->isOne();
13748 case ISD::FDIV:
13749 return OperandNo == 1 && ConstFP->isOne();
13750 case ISD::FMINNUM:
13751 case ISD::FMAXNUM:
13752 case ISD::FMINIMUMNUM:
13753 case ISD::FMAXIMUMNUM: {
13754 // Neutral element for fminnum/fminimumnum is NaN, Inf or FLT_MAX,
13755 // depending on fast-math flags (FMF).
13756 EVT VT = V.getValueType();
13757 const fltSemantics &Semantics = VT.getFltSemantics();
13758 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics)
13759 : !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
13760 : APFloat::getLargest(Semantics);
13761 if (Opcode == ISD::FMAXNUM || Opcode == ISD::FMAXIMUMNUM)
13762 NeutralAF.changeSign();
13763
13764 return ConstFP->isExactlyValue(NeutralAF);
13765 }
13766 case ISD::FMINIMUM:
13767 case ISD::FMAXIMUM: {
13768 // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
13769 const APFloat &VAPF = ConstFP->getValueAPF();
13770 bool NeutralNegative = (Opcode == ISD::FMAXIMUM);
13771 if (Flags.hasNoInfs())
13772 return VAPF.isLargest() && VAPF.isNegative() == NeutralNegative;
13773 return VAPF.isInfinity() && VAPF.isNegative() == NeutralNegative;
13774 }
13775 }
13776 }
13777 return false;
13778}
13779
13781 while (V.getOpcode() == ISD::BITCAST)
13782 V = V.getOperand(0);
13783 return V;
13784}
13785
13787 while (V.getOpcode() == ISD::BITCAST && V.getOperand(0).hasOneUse())
13788 V = V.getOperand(0);
13789 return V;
13790}
13791
13793 while (V.getOpcode() == ISD::EXTRACT_SUBVECTOR)
13794 V = V.getOperand(0);
13795 return V;
13796}
13797
13799 while (V.getOpcode() == ISD::INSERT_VECTOR_ELT) {
13800 SDValue InVec = V.getOperand(0);
13801 SDValue EltNo = V.getOperand(2);
13802 EVT VT = InVec.getValueType();
13803 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
13804 if (IndexC && VT.isFixedLengthVector() &&
13805 IndexC->getAPIntValue().ult(VT.getVectorNumElements()) &&
13806 !DemandedElts[IndexC->getZExtValue()]) {
13807 V = InVec;
13808 continue;
13809 }
13810 break;
13811 }
13812 return V;
13813}
13814
13816 while (V.getOpcode() == ISD::TRUNCATE)
13817 V = V.getOperand(0);
13818 return V;
13819}
13820
13821bool llvm::isBitwiseNot(SDValue V, bool AllowUndefs) {
13822 if (V.getOpcode() != ISD::XOR)
13823 return false;
13824 V = peekThroughBitcasts(V.getOperand(1));
13825 unsigned NumBits = V.getScalarValueSizeInBits();
13826 ConstantSDNode *C =
13827 isConstOrConstSplat(V, AllowUndefs, /*AllowTruncation*/ true);
13828 return C && (C->getAPIntValue().countr_one() >= NumBits);
13829}
13830
13832 bool AllowTruncation) {
13833 APInt DemandedElts = getDemandAllEltsMask(N);
13834 return isConstOrConstSplat(N, DemandedElts, AllowUndefs, AllowTruncation);
13835}
13836
13838 bool AllowUndefs,
13839 bool AllowTruncation) {
13841 return CN;
13842
13843 // SplatVectors can truncate their operands. Ignore that case here unless
13844 // AllowTruncation is set.
13845 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
13846 EVT VecEltVT = N->getValueType(0).getVectorElementType();
13847 if (auto *CN = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
13848 EVT CVT = CN->getValueType(0);
13849 assert(CVT.bitsGE(VecEltVT) && "Illegal splat_vector element extension");
13850 if (AllowTruncation || CVT == VecEltVT)
13851 return CN;
13852 }
13853 }
13854
13856 BitVector UndefElements;
13857 ConstantSDNode *CN = BV->getConstantSplatNode(DemandedElts, &UndefElements);
13858
13859 // BuildVectors can truncate their operands. Ignore that case here unless
13860 // AllowTruncation is set.
13861 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13862 if (CN && (UndefElements.none() || AllowUndefs)) {
13863 EVT CVT = CN->getValueType(0);
13864 EVT NSVT = N.getValueType().getScalarType();
13865 assert(CVT.bitsGE(NSVT) && "Illegal build vector element extension");
13866 if (AllowTruncation || (CVT == NSVT))
13867 return CN;
13868 }
13869 }
13870
13871 return nullptr;
13872}
13873
13875 APInt DemandedElts = getDemandAllEltsMask(N);
13876 return isConstOrConstSplatFP(N, DemandedElts, AllowUndefs);
13877}
13878
13880 const APInt &DemandedElts,
13881 bool AllowUndefs) {
13883 return CN;
13884
13886 BitVector UndefElements;
13887 ConstantFPSDNode *CN =
13888 BV->getConstantFPSplatNode(DemandedElts, &UndefElements);
13889 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13890 if (CN && (UndefElements.none() || AllowUndefs))
13891 return CN;
13892 }
13893
13894 if (N.getOpcode() == ISD::SPLAT_VECTOR)
13895 if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N.getOperand(0)))
13896 return CN;
13897
13898 return nullptr;
13899}
13900
13901bool llvm::isNullOrNullSplat(SDValue N, bool AllowUndefs) {
13902 // TODO: may want to use peekThroughBitcast() here.
13903 ConstantSDNode *C =
13904 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
13905 return C && C->isZero();
13906}
13907
13908bool llvm::isOneOrOneSplat(SDValue N, bool AllowUndefs) {
13909 ConstantSDNode *C =
13910 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation*/ true);
13911 return C && C->isOne();
13912}
13913
13914bool llvm::isOneOrOneSplatFP(SDValue N, bool AllowUndefs) {
13915 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13916 return C && C->isOne();
13917}
13918
13919bool llvm::isAllOnesOrAllOnesSplat(SDValue N, bool AllowUndefs) {
13921 unsigned BitWidth = N.getScalarValueSizeInBits();
13922 ConstantSDNode *C =
13923 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
13924 return C && C->getAPIntValue().countTrailingOnes() >= BitWidth;
13925}
13926
13927bool llvm::isOnesOrOnesSplat(SDValue N, bool AllowUndefs) {
13928 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs);
13929 return C && APInt::isSameValue(C->getAPIntValue(),
13930 APInt(C->getAPIntValue().getBitWidth(), 1));
13931}
13932
13933bool llvm::isZeroOrZeroSplat(SDValue N, bool AllowUndefs) {
13935 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs, true);
13936 return C && C->isZero();
13937}
13938
13939bool llvm::isZeroOrZeroSplatFP(SDValue N, bool AllowUndefs) {
13940 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13941 return C && C->isZero();
13942}
13943
13947
13949 unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt,
13951 : SDNode(Opc, Order, dl, VTs), MemoryVT(memvt), MemRefs(memrefs) {
13952 bool IsVolatile = false;
13953 bool IsNonTemporal = false;
13954 bool IsDereferenceable = true;
13955 bool IsInvariant = true;
13956 for (const MachineMemOperand *MMO : memoperands()) {
13957 IsVolatile |= MMO->isVolatile();
13958 IsNonTemporal |= MMO->isNonTemporal();
13959 IsDereferenceable &= MMO->isDereferenceable();
13960 IsInvariant &= MMO->isInvariant();
13961 }
13962 MemSDNodeBits.IsVolatile = IsVolatile;
13963 MemSDNodeBits.IsNonTemporal = IsNonTemporal;
13964 MemSDNodeBits.IsDereferenceable = IsDereferenceable;
13965 MemSDNodeBits.IsInvariant = IsInvariant;
13966
13967 // For the single-MMO case, we check here that the size of the memory operand
13968 // fits within the size of the MMO. This is because the MMO might indicate
13969 // only a possible address range instead of specifying the affected memory
13970 // addresses precisely.
13973 getMemOperand()->getSize().getValue())) &&
13974 "Size mismatch!");
13975}
13976
13977namespace {
13978
13979 struct EVTArray {
13980 std::vector<EVT> VTs;
13981
13982 EVTArray() {
13983 VTs.reserve(MVT::VALUETYPE_SIZE);
13984 for (unsigned i = 0; i < MVT::VALUETYPE_SIZE; ++i)
13985 VTs.push_back(MVT((MVT::SimpleValueType)i));
13986 }
13987 };
13988
13989} // end anonymous namespace
13990
13991/// getValueTypeList - Return a pointer to the specified value type.
13992///
13993const EVT *SDNode::getValueTypeList(MVT VT) {
13994 static EVTArray SimpleVTArray;
13995
13996 assert(VT < MVT::VALUETYPE_SIZE && "Value type out of range!");
13997 return &SimpleVTArray.VTs[VT.SimpleTy];
13998}
13999
14000/// hasAnyUseOfValue - Return true if there are any use of the indicated
14001/// value. This method ignores uses of other values defined by this operation.
14002bool SDNode::hasAnyUseOfValue(unsigned Value) const {
14003 assert(Value < getNumValues() && "Bad value!");
14004
14005 for (SDUse &U : uses())
14006 if (U.getResNo() == Value)
14007 return true;
14008
14009 return false;
14010}
14011
14012/// isOnlyUserOf - Return true if this node is the only use of N.
14013bool SDNode::isOnlyUserOf(const SDNode *N) const {
14014 bool Seen = false;
14015 for (const SDNode *User : N->users()) {
14016 if (User == this)
14017 Seen = true;
14018 else
14019 return false;
14020 }
14021
14022 return Seen;
14023}
14024
14025/// Return true if the only users of N are contained in Nodes.
14027 bool Seen = false;
14028 for (const SDNode *User : N->users()) {
14029 if (llvm::is_contained(Nodes, User))
14030 Seen = true;
14031 else
14032 return false;
14033 }
14034
14035 return Seen;
14036}
14037
14038/// Return true if the referenced return value is an operand of N.
14039bool SDValue::isOperandOf(const SDNode *N) const {
14040 return is_contained(N->op_values(), *this);
14041}
14042
14043bool SDNode::isOperandOf(const SDNode *N) const {
14044 return any_of(N->op_values(),
14045 [this](SDValue Op) { return this == Op.getNode(); });
14046}
14047
14048/// reachesChainWithoutSideEffects - Return true if this operand (which must
14049/// be a chain) reaches the specified operand without crossing any
14050/// side-effecting instructions on any chain path. In practice, this looks
14051/// through token factors and non-volatile loads. In order to remain efficient,
14052/// this only looks a couple of nodes in, it does not do an exhaustive search.
14053///
14054/// Note that we only need to examine chains when we're searching for
14055/// side-effects; SelectionDAG requires that all side-effects are represented
14056/// by chains, even if another operand would force a specific ordering. This
14057/// constraint is necessary to allow transformations like splitting loads.
14059 unsigned Depth) const {
14060 if (*this == Dest) return true;
14061
14062 // Don't search too deeply, we just want to be able to see through
14063 // TokenFactor's etc.
14064 if (Depth == 0) return false;
14065
14066 // If this is a token factor, all inputs to the TF happen in parallel.
14067 if (getOpcode() == ISD::TokenFactor) {
14068 // First, try a shallow search.
14069 if (is_contained((*this)->ops(), Dest)) {
14070 // We found the chain we want as an operand of this TokenFactor.
14071 // Essentially, we reach the chain without side-effects if we could
14072 // serialize the TokenFactor into a simple chain of operations with
14073 // Dest as the last operation. This is automatically true if the
14074 // chain has one use: there are no other ordering constraints.
14075 // If the chain has more than one use, we give up: some other
14076 // use of Dest might force a side-effect between Dest and the current
14077 // node.
14078 if (Dest.hasOneUse())
14079 return true;
14080 }
14081 // Next, try a deep search: check whether every operand of the TokenFactor
14082 // reaches Dest.
14083 return llvm::all_of((*this)->ops(), [=](SDValue Op) {
14084 return Op.reachesChainWithoutSideEffects(Dest, Depth - 1);
14085 });
14086 }
14087
14088 // Loads don't have side effects, look through them.
14089 if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(*this)) {
14090 if (Ld->isUnordered())
14091 return Ld->getChain().reachesChainWithoutSideEffects(Dest, Depth-1);
14092 }
14093 return false;
14094}
14095
14096bool SDNode::hasPredecessor(const SDNode *N) const {
14099 Worklist.push_back(this);
14100 return hasPredecessorHelper(N, Visited, Worklist);
14101}
14102
14104 this->Flags &= Flags;
14105}
14106
14107SDValue
14109 ArrayRef<ISD::NodeType> CandidateBinOps,
14110 bool AllowPartials) {
14111 // The pattern must end in an extract from index 0.
14112 if (Extract->getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
14113 !isNullConstant(Extract->getOperand(1)))
14114 return SDValue();
14115
14116 // Match against one of the candidate binary ops.
14117 SDValue Op = Extract->getOperand(0);
14118 if (llvm::none_of(CandidateBinOps, [Op](ISD::NodeType BinOp) {
14119 return Op.getOpcode() == unsigned(BinOp);
14120 }))
14121 return SDValue();
14122
14123 // Floating-point reductions may require relaxed constraints on the final step
14124 // of the reduction because they may reorder intermediate operations.
14125 unsigned CandidateBinOp = Op.getOpcode();
14126 if (Op.getValueType().isFloatingPoint()) {
14127 SDNodeFlags Flags = Op->getFlags();
14128 switch (CandidateBinOp) {
14129 case ISD::FADD:
14130 if (!Flags.hasNoSignedZeros() || !Flags.hasAllowReassociation())
14131 return SDValue();
14132 break;
14133 default:
14134 llvm_unreachable("Unhandled FP opcode for binop reduction");
14135 }
14136 }
14137
14138 // Matching failed - attempt to see if we did enough stages that a partial
14139 // reduction from a subvector is possible.
14140 auto PartialReduction = [&](SDValue Op, unsigned NumSubElts) {
14141 if (!AllowPartials || !Op)
14142 return SDValue();
14143 EVT OpVT = Op.getValueType();
14144 EVT OpSVT = OpVT.getScalarType();
14145 EVT SubVT = EVT::getVectorVT(*getContext(), OpSVT, NumSubElts);
14146 if (TLI->getExtractSubvectorCost(SubVT, OpVT, 0) >
14148 return SDValue();
14149 BinOp = (ISD::NodeType)CandidateBinOp;
14150 return getExtractSubvector(SDLoc(Op), SubVT, Op, 0);
14151 };
14152
14153 // At each stage, we're looking for something that looks like:
14154 // %s = shufflevector <8 x i32> %op, <8 x i32> undef,
14155 // <8 x i32> <i32 2, i32 3, i32 undef, i32 undef,
14156 // i32 undef, i32 undef, i32 undef, i32 undef>
14157 // %a = binop <8 x i32> %op, %s
14158 // Where the mask changes according to the stage. E.g. for a 3-stage pyramid,
14159 // we expect something like:
14160 // <4,5,6,7,u,u,u,u>
14161 // <2,3,u,u,u,u,u,u>
14162 // <1,u,u,u,u,u,u,u>
14163 // While a partial reduction match would be:
14164 // <2,3,u,u,u,u,u,u>
14165 // <1,u,u,u,u,u,u,u>
14166 unsigned Stages = Log2_32(Op.getValueType().getVectorNumElements());
14167 SDValue PrevOp;
14168 for (unsigned i = 0; i < Stages; ++i) {
14169 unsigned MaskEnd = (1 << i);
14170
14171 if (Op.getOpcode() != CandidateBinOp)
14172 return PartialReduction(PrevOp, MaskEnd);
14173
14174 SDValue Op0 = Op.getOperand(0);
14175 SDValue Op1 = Op.getOperand(1);
14176
14178 if (Shuffle) {
14179 Op = Op1;
14180 } else {
14181 Shuffle = dyn_cast<ShuffleVectorSDNode>(Op1);
14182 Op = Op0;
14183 }
14184
14185 // The first operand of the shuffle should be the same as the other operand
14186 // of the binop.
14187 if (!Shuffle || Shuffle->getOperand(0) != Op)
14188 return PartialReduction(PrevOp, MaskEnd);
14189
14190 // Verify the shuffle has the expected (at this stage of the pyramid) mask.
14191 for (int Index = 0; Index < (int)MaskEnd; ++Index)
14192 if (Shuffle->getMaskElt(Index) != (int)(MaskEnd + Index))
14193 return PartialReduction(PrevOp, MaskEnd);
14194
14195 PrevOp = Op;
14196 }
14197
14198 // Handle subvector reductions, which tend to appear after the shuffle
14199 // reduction stages.
14200 while (Op.getOpcode() == CandidateBinOp) {
14201 unsigned NumElts = Op.getValueType().getVectorNumElements();
14202 SDValue Op0 = Op.getOperand(0);
14203 SDValue Op1 = Op.getOperand(1);
14204 if (Op0.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
14206 Op0.getOperand(0) != Op1.getOperand(0))
14207 break;
14208 SDValue Src = Op0.getOperand(0);
14209 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
14210 if (NumSrcElts != (2 * NumElts))
14211 break;
14212 if (!(Op0.getConstantOperandAPInt(1) == 0 &&
14213 Op1.getConstantOperandAPInt(1) == NumElts) &&
14214 !(Op1.getConstantOperandAPInt(1) == 0 &&
14215 Op0.getConstantOperandAPInt(1) == NumElts))
14216 break;
14217 Op = Src;
14218 }
14219
14220 BinOp = (ISD::NodeType)CandidateBinOp;
14221 return Op;
14222}
14223
14225 EVT VT = N->getValueType(0);
14226 EVT EltVT = VT.getVectorElementType();
14227 unsigned NE = getMaxRuntimeNumElements(VT);
14228
14229 if (VT.isScalableVector() && (NE == 0 || ResNE != 0))
14230 reportFatalUsageError("Cannot unroll scalable vector!");
14231
14232 assert(NE && "Nothing to unroll!");
14233 SDLoc dl(N);
14234
14235 // If ResNE is 0, fully unroll the vector op.
14236 if (ResNE == 0)
14237 ResNE = NE;
14238 else if (NE > ResNE)
14239 NE = ResNE;
14240
14241 if (N->getNumValues() == 2) {
14242 SmallVector<SDValue, 8> Scalars0, Scalars1;
14243 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14244 EVT VT1 = N->getValueType(1);
14245 EVT EltVT1 = VT1.getVectorElementType();
14246
14247 unsigned i;
14248 for (i = 0; i != NE; ++i) {
14249 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14250 SDValue Operand = N->getOperand(j);
14251 EVT OperandVT = Operand.getValueType();
14252
14253 // A vector operand; extract a single element.
14254 EVT OperandEltVT = OperandVT.getVectorElementType();
14255 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14256 }
14257
14258 SDValue EltOp = getNode(N->getOpcode(), dl, {EltVT, EltVT1}, Operands);
14259 Scalars0.push_back(EltOp);
14260 Scalars1.push_back(EltOp.getValue(1));
14261 }
14262
14263 for (; i < ResNE; ++i) {
14264 Scalars0.push_back(getUNDEF(EltVT));
14265 Scalars1.push_back(getUNDEF(EltVT1));
14266 }
14267
14269 : ElementCount::getFixed(ResNE);
14270 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResEC);
14271 EVT VecVT1 = EVT::getVectorVT(*getContext(), EltVT1, ResEC);
14272 SDValue Vec0 = buildVectorFromUnrolledParts(VecVT, dl, Scalars0);
14273 SDValue Vec1 = buildVectorFromUnrolledParts(VecVT1, dl, Scalars1);
14274 return getMergeValues({Vec0, Vec1}, dl);
14275 }
14276
14277 assert(N->getNumValues() == 1 &&
14278 "Can't unroll a vector with multiple results!");
14279
14281 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14282
14283 unsigned i;
14284 for (i= 0; i != NE; ++i) {
14285 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14286 SDValue Operand = N->getOperand(j);
14287 EVT OperandVT = Operand.getValueType();
14288 if (OperandVT.isVector()) {
14289 // A vector operand; extract a single element.
14290 EVT OperandEltVT = OperandVT.getVectorElementType();
14291 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14292 } else {
14293 // A scalar operand; just use it as is.
14294 Operands[j] = Operand;
14295 }
14296 }
14297
14298 switch (N->getOpcode()) {
14299 default: {
14300 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands,
14301 N->getFlags()));
14302 break;
14303 }
14304 case ISD::VSELECT:
14305 Scalars.push_back(
14306 getNode(ISD::SELECT, dl, EltVT, Operands, N->getFlags()));
14307 break;
14308 case ISD::SHL:
14309 case ISD::SRA:
14310 case ISD::SRL:
14311 case ISD::ROTL:
14312 case ISD::ROTR:
14313 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands[0],
14315 Operands[1])));
14316 break;
14318 EVT ExtVT = cast<VTSDNode>(Operands[1])->getVT().getVectorElementType();
14319 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT,
14320 Operands[0],
14321 getValueType(ExtVT)));
14322 break;
14323 }
14324 case ISD::ADDRSPACECAST: {
14325 const auto *ASC = cast<AddrSpaceCastSDNode>(N);
14326 Scalars.push_back(
14327 getAddrSpaceCast(dl, EltVT, Operands[0], ASC->getSrcAddressSpace(),
14328 ASC->getDestAddressSpace(), ASC->getFlags()));
14329 break;
14330 }
14331 }
14332 }
14333
14334 for (; i < ResNE; ++i)
14335 Scalars.push_back(getUNDEF(EltVT));
14336
14337 EVT VecVT = VT.isScalableVector()
14338 ? VT
14339 : EVT::getVectorVT(*getContext(), EltVT, ResNE);
14340 return buildVectorFromUnrolledParts(VecVT, dl, Scalars);
14341}
14342
14343std::pair<SDValue, SDValue> SelectionDAG::UnrollVectorOverflowOp(
14344 SDNode *N, unsigned ResNE) {
14345 unsigned Opcode = N->getOpcode();
14346 assert((Opcode == ISD::UADDO || Opcode == ISD::SADDO ||
14347 Opcode == ISD::USUBO || Opcode == ISD::SSUBO ||
14348 Opcode == ISD::UMULO || Opcode == ISD::SMULO) &&
14349 "Expected an overflow opcode");
14350
14351 EVT ResVT = N->getValueType(0);
14352 EVT OvVT = N->getValueType(1);
14353 EVT ResEltVT = ResVT.getVectorElementType();
14354 EVT OvEltVT = OvVT.getVectorElementType();
14355 SDLoc dl(N);
14356
14357 // If ResNE is 0, fully unroll the vector op.
14358 unsigned NE = ResVT.getVectorNumElements();
14359 if (ResNE == 0)
14360 ResNE = NE;
14361 else if (NE > ResNE)
14362 NE = ResNE;
14363
14364 SmallVector<SDValue, 8> LHSScalars;
14365 SmallVector<SDValue, 8> RHSScalars;
14366 ExtractVectorElements(N->getOperand(0), LHSScalars, 0, NE);
14367 ExtractVectorElements(N->getOperand(1), RHSScalars, 0, NE);
14368
14369 EVT SVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), ResEltVT);
14370 SDVTList VTs = getVTList(ResEltVT, SVT);
14371 SmallVector<SDValue, 8> ResScalars;
14372 SmallVector<SDValue, 8> OvScalars;
14373 for (unsigned i = 0; i < NE; ++i) {
14374 SDValue Res = getNode(Opcode, dl, VTs, LHSScalars[i], RHSScalars[i]);
14375 SDValue Ov =
14376 getSelect(dl, OvEltVT, Res.getValue(1),
14377 getBoolConstant(true, dl, OvEltVT, ResVT),
14378 getConstant(0, dl, OvEltVT));
14379
14380 ResScalars.push_back(Res);
14381 OvScalars.push_back(Ov);
14382 }
14383
14384 ResScalars.append(ResNE - NE, getUNDEF(ResEltVT));
14385 OvScalars.append(ResNE - NE, getUNDEF(OvEltVT));
14386
14387 EVT NewResVT = EVT::getVectorVT(*getContext(), ResEltVT, ResNE);
14388 EVT NewOvVT = EVT::getVectorVT(*getContext(), OvEltVT, ResNE);
14389 return std::make_pair(getBuildVector(NewResVT, dl, ResScalars),
14390 getBuildVector(NewOvVT, dl, OvScalars));
14391}
14392
14395 unsigned Bytes, int Dist,
14396 const SelectionDAG &DAG) {
14397 if (LS->isVolatile() || Base->isVolatile())
14398 return false;
14399 // TODO: probably too restrictive for atomics, revisit
14400 if (!LS->isSimple())
14401 return false;
14402 if (LS->isIndexed() || Base->isIndexed())
14403 return false;
14404 if (LS->getChain() != Base->getChain())
14405 return false;
14406 EVT VT = LS->getMemoryVT();
14407 if (VT.getSizeInBits() / 8 != Bytes)
14408 return false;
14409
14410 auto BaseLocDecomp = BaseIndexOffset::match(Base, DAG);
14411 auto LocDecomp = BaseIndexOffset::match(LS, DAG);
14412
14413 int64_t Offset = 0;
14414 if (BaseLocDecomp.equalBaseIndex(LocDecomp, DAG, Offset))
14415 return (Dist * (int64_t)Bytes == Offset);
14416 return false;
14417}
14418
14421 unsigned Bytes,
14422 int Dist) const {
14423 return areNonVolatileConsecutiveLoadsOrStores(LD, Base, Bytes, Dist, *this);
14424}
14425
14428 unsigned Bytes,
14429 int Dist) const {
14430 return areNonVolatileConsecutiveLoadsOrStores(ST, Base, Bytes, Dist, *this);
14431}
14432
14433/// InferPtrAlignment - Infer alignment of a load / store address. Return
14434/// std::nullopt if it cannot be inferred.
14436 // If this is a GlobalAddress + cst, return the alignment.
14437 const GlobalValue *GV = nullptr;
14438 int64_t GVOffset = 0;
14439 if (TLI->isGAPlusOffset(Ptr.getNode(), GV, GVOffset)) {
14440 unsigned PtrWidth = getDataLayout().getPointerTypeSizeInBits(GV->getType());
14441 KnownBits Known(PtrWidth);
14443 unsigned AlignBits = Known.countMinTrailingZeros();
14444 if (AlignBits)
14445 return commonAlignment(Align(1ull << std::min(31U, AlignBits)), GVOffset);
14446 }
14447
14448 // If this is a direct reference to a stack slot, use information about the
14449 // stack slot's alignment.
14450 int FrameIdx = INT_MIN;
14451 int64_t FrameOffset = 0;
14453 FrameIdx = FI->getIndex();
14454 } else if (isBaseWithConstantOffset(Ptr) &&
14456 // Handle FI+Cst
14457 FrameIdx = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
14458 FrameOffset = Ptr.getConstantOperandVal(1);
14459 }
14460
14461 if (FrameIdx != INT_MIN) {
14463 return commonAlignment(MFI.getObjectAlign(FrameIdx), FrameOffset);
14464 }
14465
14466 return std::nullopt;
14467}
14468
14469/// Split the scalar node with EXTRACT_ELEMENT using the provided
14470/// VTs and return the low/high part.
14471std::pair<SDValue, SDValue> SelectionDAG::SplitScalar(const SDValue &N,
14472 const SDLoc &DL,
14473 const EVT &LoVT,
14474 const EVT &HiVT) {
14475 assert(!LoVT.isVector() && !HiVT.isVector() && !N.getValueType().isVector() &&
14476 "Split node must be a scalar type");
14477 SDValue Lo =
14479 SDValue Hi =
14481 return std::make_pair(Lo, Hi);
14482}
14483
14484/// GetSplitDestVTs - Compute the VTs needed for the low/hi parts of a type
14485/// which is split (or expanded) into two not necessarily identical pieces.
14486std::pair<EVT, EVT> SelectionDAG::GetSplitDestVTs(const EVT &VT) const {
14487 // Currently all types are split in half.
14488 EVT LoVT, HiVT;
14489 if (!VT.isVector())
14490 LoVT = HiVT = TLI->getTypeToTransformTo(*getContext(), VT);
14491 else
14492 LoVT = HiVT = VT.getHalfNumVectorElementsVT(*getContext());
14493
14494 return std::make_pair(LoVT, HiVT);
14495}
14496
14497/// GetDependentSplitDestVTs - Compute the VTs needed for the low/hi parts of a
14498/// type, dependent on an enveloping VT that has been split into two identical
14499/// pieces. Sets the HiIsEmpty flag when hi type has zero storage size.
14500std::pair<EVT, EVT>
14502 bool *HiIsEmpty) const {
14503 EVT EltTp = VT.getVectorElementType();
14504 // Examples:
14505 // custom VL=8 with enveloping VL=8/8 yields 8/0 (hi empty)
14506 // custom VL=9 with enveloping VL=8/8 yields 8/1
14507 // custom VL=10 with enveloping VL=8/8 yields 8/2
14508 // etc.
14509 ElementCount VTNumElts = VT.getVectorElementCount();
14510 ElementCount EnvNumElts = EnvVT.getVectorElementCount();
14511 assert(VTNumElts.isScalable() == EnvNumElts.isScalable() &&
14512 "Mixing fixed width and scalable vectors when enveloping a type");
14513 EVT LoVT, HiVT;
14514 if (VTNumElts.getKnownMinValue() > EnvNumElts.getKnownMinValue()) {
14515 LoVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14516 HiVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts - EnvNumElts);
14517 *HiIsEmpty = false;
14518 } else {
14519 // Flag that hi type has zero storage size, but return split envelop type
14520 // (this would be easier if vector types with zero elements were allowed).
14521 LoVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts);
14522 HiVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14523 *HiIsEmpty = true;
14524 }
14525 return std::make_pair(LoVT, HiVT);
14526}
14527
14528/// SplitVector - Split the vector with EXTRACT_SUBVECTOR and return the
14529/// low/high part.
14530std::pair<SDValue, SDValue>
14531SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT,
14532 const EVT &HiVT) {
14533 assert(LoVT.isScalableVector() == HiVT.isScalableVector() &&
14534 LoVT.isScalableVector() == N.getValueType().isScalableVector() &&
14535 "Splitting vector with an invalid mixture of fixed and scalable "
14536 "vector types");
14538 N.getValueType().getVectorMinNumElements() &&
14539 "More vector elements requested than available!");
14540 SDValue Lo, Hi;
14541 Lo = getExtractSubvector(DL, LoVT, N, 0);
14542 // For scalable vectors it is safe to use LoVT.getVectorMinNumElements()
14543 // (rather than having to use ElementCount), because EXTRACT_SUBVECTOR scales
14544 // IDX with the runtime scaling factor of the result vector type. For
14545 // fixed-width result vectors, that runtime scaling factor is 1.
14547 return std::make_pair(Lo, Hi);
14548}
14549
14550std::pair<SDValue, SDValue> SelectionDAG::SplitEVL(SDValue N, EVT VecVT,
14551 const SDLoc &DL) {
14552 // Split the vector length parameter.
14553 // %evl -> umin(%evl, %halfnumelts) and usubsat(%evl - %halfnumelts).
14554 EVT VT = N.getValueType();
14556 "Expecting the mask to be an evenly-sized vector");
14557 SDValue HalfNumElts = getElementCount(
14559 SDValue Lo = getNode(ISD::UMIN, DL, VT, N, HalfNumElts);
14560 SDValue Hi = getNode(ISD::USUBSAT, DL, VT, N, HalfNumElts);
14561 return std::make_pair(Lo, Hi);
14562}
14563
14564/// Widen the vector up to the next power of two using INSERT_SUBVECTOR.
14566 EVT VT = N.getValueType();
14569 return getInsertSubvector(DL, getPOISON(WideVT), N, 0);
14570}
14571
14574 unsigned Start, unsigned Count,
14575 EVT EltVT) {
14576 EVT VT = Op.getValueType();
14577 if (Count == 0)
14579 if (EltVT == EVT())
14580 EltVT = VT.getVectorElementType();
14581 SDLoc SL(Op);
14582 for (unsigned i = Start, e = Start + Count; i != e; ++i) {
14583 Args.push_back(getExtractVectorElt(SL, EltVT, Op, i));
14584 }
14585}
14586
14587// getAddressSpace - Return the address space this GlobalAddress belongs to.
14589 return getGlobal()->getType()->getAddressSpace();
14590}
14591
14594 return Val.MachineCPVal->getType();
14595 return Val.ConstVal->getType();
14596}
14597
14598bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue, APInt &SplatUndef,
14599 unsigned &SplatBitSize,
14600 bool &HasAnyUndefs,
14601 unsigned MinSplatBits,
14602 bool IsBigEndian) const {
14603 EVT VT = getValueType(0);
14604 assert(VT.isVector() && "Expected a vector type");
14605 unsigned VecWidth = VT.getSizeInBits();
14606 if (MinSplatBits > VecWidth)
14607 return false;
14608
14609 // FIXME: The widths are based on this node's type, but build vectors can
14610 // truncate their operands.
14611 SplatValue = APInt(VecWidth, 0);
14612 SplatUndef = APInt(VecWidth, 0);
14613
14614 // Get the bits. Bits with undefined values (when the corresponding element
14615 // of the vector is an ISD::UNDEF value) are set in SplatUndef and cleared
14616 // in SplatValue. If any of the values are not constant, give up and return
14617 // false.
14618 unsigned int NumOps = getNumOperands();
14619 assert(NumOps > 0 && "isConstantSplat has 0-size build vector");
14620 unsigned EltWidth = VT.getScalarSizeInBits();
14621
14622 for (unsigned j = 0; j < NumOps; ++j) {
14623 unsigned i = IsBigEndian ? NumOps - 1 - j : j;
14624 SDValue OpVal = getOperand(i);
14625 unsigned BitPos = j * EltWidth;
14626
14627 if (OpVal.isUndef())
14628 SplatUndef.setBits(BitPos, BitPos + EltWidth);
14629 else if (auto *CN = dyn_cast<ConstantSDNode>(OpVal))
14630 SplatValue.insertBits(CN->getAPIntValue().zextOrTrunc(EltWidth), BitPos);
14631 else if (auto *CN = dyn_cast<ConstantFPSDNode>(OpVal))
14632 SplatValue.insertBits(CN->getValueAPF().bitcastToAPInt(), BitPos);
14633 else
14634 return false;
14635 }
14636
14637 // The build_vector is all constants or undefs. Find the smallest element
14638 // size that splats the vector.
14639 HasAnyUndefs = (SplatUndef != 0);
14640
14641 // FIXME: This does not work for vectors with elements less than 8 bits.
14642 while (VecWidth > 8) {
14643 // If we can't split in half, stop here.
14644 if (VecWidth & 1)
14645 break;
14646
14647 unsigned HalfSize = VecWidth / 2;
14648 APInt HighValue = SplatValue.extractBits(HalfSize, HalfSize);
14649 APInt LowValue = SplatValue.extractBits(HalfSize, 0);
14650 APInt HighUndef = SplatUndef.extractBits(HalfSize, HalfSize);
14651 APInt LowUndef = SplatUndef.extractBits(HalfSize, 0);
14652
14653 // If the two halves do not match (ignoring undef bits), stop here.
14654 if ((HighValue & ~LowUndef) != (LowValue & ~HighUndef) ||
14655 MinSplatBits > HalfSize)
14656 break;
14657
14658 SplatValue = HighValue | LowValue;
14659 SplatUndef = HighUndef & LowUndef;
14660
14661 VecWidth = HalfSize;
14662 }
14663
14664 // FIXME: The loop above only tries to split in halves. But if the input
14665 // vector for example is <3 x i16> it wouldn't be able to detect a
14666 // SplatBitSize of 16. No idea if that is a design flaw currently limiting
14667 // optimizations. I guess that back in the days when this helper was created
14668 // vectors normally was power-of-2 sized.
14669
14670 SplatBitSize = VecWidth;
14671 return true;
14672}
14673
14675 BitVector *UndefElements) const {
14676 unsigned NumOps = getNumOperands();
14677 if (UndefElements) {
14678 UndefElements->clear();
14679 UndefElements->resize(NumOps);
14680 }
14681 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14682 if (!DemandedElts)
14683 return SDValue();
14684 SDValue Splatted;
14685 for (unsigned i = 0; i != NumOps; ++i) {
14686 if (!DemandedElts[i])
14687 continue;
14688 SDValue Op = getOperand(i);
14689 if (Op.isUndef()) {
14690 if (UndefElements)
14691 (*UndefElements)[i] = true;
14692 } else if (!Splatted) {
14693 Splatted = Op;
14694 } else if (Splatted != Op) {
14695 return SDValue();
14696 }
14697 }
14698
14699 if (!Splatted) {
14700 unsigned FirstDemandedIdx = DemandedElts.countr_zero();
14701 assert(getOperand(FirstDemandedIdx).isUndef() &&
14702 "Can only have a splat without a constant for all undefs.");
14703 return getOperand(FirstDemandedIdx);
14704 }
14705
14706 return Splatted;
14707}
14708
14710 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14711 return getSplatValue(DemandedElts, UndefElements);
14712}
14713
14715 SmallVectorImpl<SDValue> &Sequence,
14716 BitVector *UndefElements) const {
14717 unsigned NumOps = getNumOperands();
14718 Sequence.clear();
14719 if (UndefElements) {
14720 UndefElements->clear();
14721 UndefElements->resize(NumOps);
14722 }
14723 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14724 if (!DemandedElts || NumOps < 2 || !isPowerOf2_32(NumOps))
14725 return false;
14726
14727 // Set the undefs even if we don't find a sequence (like getSplatValue).
14728 if (UndefElements)
14729 for (unsigned I = 0; I != NumOps; ++I)
14730 if (DemandedElts[I] && getOperand(I).isUndef())
14731 (*UndefElements)[I] = true;
14732
14733 // Iteratively widen the sequence length looking for repetitions.
14734 for (unsigned SeqLen = 1; SeqLen < NumOps; SeqLen *= 2) {
14735 Sequence.append(SeqLen, SDValue());
14736 for (unsigned I = 0; I != NumOps; ++I) {
14737 if (!DemandedElts[I])
14738 continue;
14739 SDValue &SeqOp = Sequence[I % SeqLen];
14741 if (Op.isUndef()) {
14742 if (!SeqOp)
14743 SeqOp = Op;
14744 continue;
14745 }
14746 if (SeqOp && !SeqOp.isUndef() && SeqOp != Op) {
14747 Sequence.clear();
14748 break;
14749 }
14750 SeqOp = Op;
14751 }
14752 if (!Sequence.empty())
14753 return true;
14754 }
14755
14756 assert(Sequence.empty() && "Failed to empty non-repeating sequence pattern");
14757 return false;
14758}
14759
14761 BitVector *UndefElements) const {
14762 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14763 return getRepeatedSequence(DemandedElts, Sequence, UndefElements);
14764}
14765
14768 BitVector *UndefElements) const {
14770 getSplatValue(DemandedElts, UndefElements));
14771}
14772
14775 return dyn_cast_or_null<ConstantSDNode>(getSplatValue(UndefElements));
14776}
14777
14780 BitVector *UndefElements) const {
14782 getSplatValue(DemandedElts, UndefElements));
14783}
14784
14789
14790int32_t
14792 uint32_t BitWidth) const {
14793 if (ConstantFPSDNode *CN =
14795 bool IsExact;
14796 APSInt IntVal(BitWidth);
14797 const APFloat &APF = CN->getValueAPF();
14798 if (APF.convertToInteger(IntVal, APFloat::rmTowardZero, &IsExact) !=
14799 APFloat::opOK ||
14800 !IsExact)
14801 return -1;
14802
14803 return IntVal.exactLogBase2();
14804 }
14805 return -1;
14806}
14807
14809 bool IsLittleEndian, unsigned DstEltSizeInBits,
14810 SmallVectorImpl<APInt> &RawBitElements, BitVector &UndefElements) const {
14811 // Early-out if this contains anything but Undef/Constant/ConstantFP.
14812 if (!isConstant())
14813 return false;
14814
14815 unsigned NumSrcOps = getNumOperands();
14816 unsigned SrcEltSizeInBits = getValueType(0).getScalarSizeInBits();
14817 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14818 "Invalid bitcast scale");
14819
14820 // Extract raw src bits.
14821 SmallVector<APInt> SrcBitElements(NumSrcOps,
14822 APInt::getZero(SrcEltSizeInBits));
14823 BitVector SrcUndeElements(NumSrcOps, false);
14824
14825 for (unsigned I = 0; I != NumSrcOps; ++I) {
14827 if (Op.isUndef()) {
14828 SrcUndeElements.set(I);
14829 continue;
14830 }
14831 auto *CInt = dyn_cast<ConstantSDNode>(Op);
14832 auto *CFP = dyn_cast<ConstantFPSDNode>(Op);
14833 assert((CInt || CFP) && "Unknown constant");
14834 SrcBitElements[I] = CInt ? CInt->getAPIntValue().trunc(SrcEltSizeInBits)
14835 : CFP->getValueAPF().bitcastToAPInt();
14836 }
14837
14838 // Recast to dst width.
14839 recastRawBits(IsLittleEndian, DstEltSizeInBits, RawBitElements,
14840 SrcBitElements, UndefElements, SrcUndeElements);
14841 return true;
14842}
14843
14844void BuildVectorSDNode::recastRawBits(bool IsLittleEndian,
14845 unsigned DstEltSizeInBits,
14846 SmallVectorImpl<APInt> &DstBitElements,
14847 ArrayRef<APInt> SrcBitElements,
14848 BitVector &DstUndefElements,
14849 const BitVector &SrcUndefElements) {
14850 unsigned NumSrcOps = SrcBitElements.size();
14851 unsigned SrcEltSizeInBits = SrcBitElements[0].getBitWidth();
14852 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14853 "Invalid bitcast scale");
14854 assert(NumSrcOps == SrcUndefElements.size() &&
14855 "Vector size mismatch");
14856
14857 unsigned NumDstOps = (NumSrcOps * SrcEltSizeInBits) / DstEltSizeInBits;
14858 DstUndefElements.clear();
14859 DstUndefElements.resize(NumDstOps, false);
14860 DstBitElements.assign(NumDstOps, APInt::getZero(DstEltSizeInBits));
14861
14862 // Concatenate src elements constant bits together into dst element.
14863 if (SrcEltSizeInBits <= DstEltSizeInBits) {
14864 unsigned Scale = DstEltSizeInBits / SrcEltSizeInBits;
14865 for (unsigned I = 0; I != NumDstOps; ++I) {
14866 DstUndefElements.set(I);
14867 APInt &DstBits = DstBitElements[I];
14868 for (unsigned J = 0; J != Scale; ++J) {
14869 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14870 if (SrcUndefElements[Idx])
14871 continue;
14872 DstUndefElements.reset(I);
14873 const APInt &SrcBits = SrcBitElements[Idx];
14874 assert(SrcBits.getBitWidth() == SrcEltSizeInBits &&
14875 "Illegal constant bitwidths");
14876 DstBits.insertBits(SrcBits, J * SrcEltSizeInBits);
14877 }
14878 }
14879 return;
14880 }
14881
14882 // Split src element constant bits into dst elements.
14883 unsigned Scale = SrcEltSizeInBits / DstEltSizeInBits;
14884 for (unsigned I = 0; I != NumSrcOps; ++I) {
14885 if (SrcUndefElements[I]) {
14886 DstUndefElements.set(I * Scale, (I + 1) * Scale);
14887 continue;
14888 }
14889 const APInt &SrcBits = SrcBitElements[I];
14890 for (unsigned J = 0; J != Scale; ++J) {
14891 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14892 APInt &DstBits = DstBitElements[Idx];
14893 DstBits = SrcBits.extractBits(DstEltSizeInBits, J * DstEltSizeInBits);
14894 }
14895 }
14896}
14897
14899 for (const SDValue &Op : op_values()) {
14900 unsigned Opc = Op.getOpcode();
14901 if (!Op.isUndef() && Opc != ISD::Constant && Opc != ISD::ConstantFP)
14902 return false;
14903 }
14904 return true;
14905}
14906
14907std::optional<std::pair<APInt, APInt>>
14909 unsigned NumOps = getNumOperands();
14910 if (NumOps < 2)
14911 return std::nullopt;
14912
14913 unsigned EltSize = getValueType(0).getScalarSizeInBits();
14914 APInt Start, Stride;
14915 int FirstIdx = -1, SecondIdx = -1;
14916
14917 // Find the first two non-undef constant elements to determine Start and
14918 // Stride, then verify all remaining elements match the sequence.
14919 for (unsigned I = 0; I < NumOps; ++I) {
14921 if (Op->isUndef())
14922 continue;
14923 if (!isa<ConstantSDNode>(Op))
14924 return std::nullopt;
14925
14926 APInt Val = getConstantOperandAPInt(I).trunc(EltSize);
14927 if (FirstIdx < 0) {
14928 FirstIdx = I;
14929 Start = Val;
14930 } else if (SecondIdx < 0) {
14931 SecondIdx = I;
14932 // Compute stride using modular arithmetic. Simple division would handle
14933 // common strides (1, 2, -1, etc.), but modular inverse maximizes matches.
14934 // Example: <0, poison, poison, 0xFF> has stride 0x55 since 3*0x55 = 0xFF
14935 // Note that modular arithmetic is agnostic to signed/unsigned.
14936 unsigned IdxDiff = I - FirstIdx;
14937 APInt ValDiff = Val - Start;
14938
14939 // Step 1: Factor out common powers of 2 from IdxDiff and ValDiff.
14940 unsigned CommonPow2Bits = llvm::countr_zero(IdxDiff);
14941 if (ValDiff.countr_zero() < CommonPow2Bits)
14942 return std::nullopt; // ValDiff not divisible by 2^CommonPow2Bits
14943 IdxDiff >>= CommonPow2Bits;
14944 ValDiff.lshrInPlace(CommonPow2Bits);
14945
14946 // Step 2: IdxDiff is now odd, so its inverse mod 2^EltSize exists.
14947 // TODO: There are 2^CommonPow2Bits valid strides; currently we only try
14948 // one, but we could try all candidates to handle more cases.
14949 Stride = ValDiff * APInt(EltSize, IdxDiff).multiplicativeInverse();
14950 if (Stride.isZero())
14951 return std::nullopt;
14952
14953 // Step 3: Adjust Start based on the first defined element's index.
14954 Start -= Stride * FirstIdx;
14955 } else {
14956 // Verify this element matches the sequence.
14957 if (Val != Start + Stride * I)
14958 return std::nullopt;
14959 }
14960 }
14961
14962 // Need at least two defined elements.
14963 if (SecondIdx < 0)
14964 return std::nullopt;
14965
14966 return std::make_pair(Start, Stride);
14967}
14968
14970 // Find the first non-undef value in the shuffle mask.
14971 unsigned i, e;
14972 for (i = 0, e = Mask.size(); i != e && Mask[i] < 0; ++i)
14973 /* search */;
14974
14975 // If all elements are undefined, this shuffle can be considered a splat
14976 // (although it should eventually get simplified away completely).
14977 if (i == e)
14978 return true;
14979
14980 // Make sure all remaining elements are either undef or the same as the first
14981 // non-undef value.
14982 for (int Idx = Mask[i]; i != e; ++i)
14983 if (Mask[i] >= 0 && Mask[i] != Idx)
14984 return false;
14985 return true;
14986}
14987
14988// Returns true if it is a constant integer BuildVector or constant integer,
14989// possibly hidden by a bitcast.
14991 SDValue N, bool AllowOpaques) const {
14993
14994 if (auto *C = dyn_cast<ConstantSDNode>(N))
14995 return AllowOpaques || !C->isOpaque();
14996
14998 return true;
14999
15000 // Treat a GlobalAddress supporting constant offset folding as a
15001 // constant integer.
15002 if (auto *GA = dyn_cast<GlobalAddressSDNode>(N))
15003 if (GA->getOpcode() == ISD::GlobalAddress &&
15004 TLI->isOffsetFoldingLegal(GA))
15005 return true;
15006
15007 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
15008 isa<ConstantSDNode>(N.getOperand(0)))
15009 return true;
15010 return false;
15011}
15012
15013// Returns true if it is a constant float BuildVector or constant float.
15016 return true;
15017
15019 return true;
15020
15021 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
15022 isa<ConstantFPSDNode>(N.getOperand(0)))
15023 return true;
15024
15025 return false;
15026}
15027
15028std::optional<bool> SelectionDAG::isBoolConstant(SDValue N) const {
15029 ConstantSDNode *Const =
15030 isConstOrConstSplat(N, false, /*AllowTruncation=*/true);
15031 if (!Const)
15032 return std::nullopt;
15033
15034 EVT VT = N->getValueType(0);
15035 const APInt CVal = Const->getAPIntValue().trunc(VT.getScalarSizeInBits());
15036 switch (TLI->getBooleanContents(N.getValueType())) {
15038 if (CVal.isOne())
15039 return true;
15040 if (CVal.isZero())
15041 return false;
15042 return std::nullopt;
15044 if (CVal.isAllOnes())
15045 return true;
15046 if (CVal.isZero())
15047 return false;
15048 return std::nullopt;
15050 return CVal[0];
15051 }
15052 llvm_unreachable("Unknown BooleanContent enum");
15053}
15054
15055void SelectionDAG::createOperands(SDNode *Node, ArrayRef<SDValue> Vals) {
15056 assert(!Node->OperandList && "Node already has operands");
15058 "too many operands to fit into SDNode");
15059 SDUse *Ops = OperandRecycler.allocate(
15060 ArrayRecycler<SDUse>::Capacity::get(Vals.size()), OperandAllocator);
15061
15062 bool IsDivergent = false;
15063 for (unsigned I = 0; I != Vals.size(); ++I) {
15064 Ops[I].setUser(Node);
15065 Ops[I].setInitial(Vals[I]);
15066 EVT VT = Ops[I].getValueType();
15067
15068 // Skip Chain. It does not carry divergence.
15069 if (VT != MVT::Other &&
15070 (VT != MVT::Glue || gluePropagatesDivergence(Ops[I].getNode())) &&
15071 Ops[I].getNode()->isDivergent()) {
15072 IsDivergent = true;
15073 }
15074 }
15075 Node->NumOperands = Vals.size();
15076 Node->OperandList = Ops;
15077 if (!TLI->isSDNodeAlwaysUniform(Node)) {
15078 IsDivergent |= TLI->isSDNodeSourceOfDivergence(Node, FLI, UA);
15079 Node->SDNodeBits.IsDivergent = IsDivergent;
15080 }
15081 checkForCycles(Node);
15082}
15083
15086 size_t Limit = SDNode::getMaxNumOperands();
15087 while (Vals.size() > Limit) {
15088 unsigned SliceIdx = Vals.size() - Limit;
15089 auto ExtractedTFs = ArrayRef<SDValue>(Vals).slice(SliceIdx, Limit);
15090 SDValue NewTF = getNode(ISD::TokenFactor, DL, MVT::Other, ExtractedTFs);
15091 Vals.erase(Vals.begin() + SliceIdx, Vals.end());
15092 Vals.emplace_back(NewTF);
15093 }
15094 return getNode(ISD::TokenFactor, DL, MVT::Other, Vals);
15095}
15096
15098 EVT VT, SDNodeFlags Flags) {
15099 switch (Opcode) {
15100 default:
15101 return SDValue();
15102 case ISD::ADD:
15103 case ISD::OR:
15104 case ISD::XOR:
15105 case ISD::UMAX:
15106 case ISD::MUL:
15107 case ISD::AND:
15108 case ISD::UMIN:
15109 case ISD::SMAX:
15110 case ISD::SMIN:
15112 VT);
15113 case ISD::FADD:
15114 // If flags allow, prefer positive zero since it's generally cheaper
15115 // to materialize on most targets.
15116 return getConstantFP(Flags.hasNoSignedZeros() ? 0.0 : -0.0, DL, VT);
15117 case ISD::FMUL:
15118 return getConstantFP(1.0, DL, VT);
15119 case ISD::FMINNUM:
15120 case ISD::FMAXNUM:
15121 case ISD::FMINIMUMNUM:
15122 case ISD::FMAXIMUMNUM: {
15123 // Neutral element for fminnum/fminimumnum is NaN, Inf or FLT_MAX,
15124 // depending on fast-math flags (FMF).
15125 const fltSemantics &Semantics = VT.getFltSemantics();
15126 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics) :
15127 !Flags.hasNoInfs() ? APFloat::getInf(Semantics) :
15128 APFloat::getLargest(Semantics);
15129 if (Opcode == ISD::FMAXNUM || Opcode == ISD::FMAXIMUMNUM)
15130 NeutralAF.changeSign();
15131
15132 return getConstantFP(NeutralAF, DL, VT);
15133 }
15134 case ISD::FMINIMUM:
15135 case ISD::FMAXIMUM: {
15136 // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
15137 const fltSemantics &Semantics = VT.getFltSemantics();
15138 APFloat NeutralAF = !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
15139 : APFloat::getLargest(Semantics);
15140 if (Opcode == ISD::FMAXIMUM)
15141 NeutralAF.changeSign();
15142
15143 return getConstantFP(NeutralAF, DL, VT);
15144 }
15145
15146 }
15147}
15148
15150 SDValue Acc, SDValue LHS,
15151 SDValue RHS) {
15152 EVT AccVT = Acc.getValueType();
15153 if (AccVT.isFloatingPoint()) {
15154 assert(Opc == ISD::PARTIAL_REDUCE_FMLA && "Unexpected opcode");
15155 SDValue NegRHS = getNode(ISD::FNEG, DL, RHS.getValueType(), RHS);
15156 return getNode(Opc, DL, AccVT, Acc, LHS, NegRHS);
15157 }
15160 "Unexpected opcode");
15161 SDValue NegAcc = getNegative(Acc, DL, AccVT);
15162 SDValue MLA = getNode(Opc, DL, AccVT, NegAcc, LHS, RHS);
15163 return getNegative(MLA, DL, AccVT);
15164}
15165
15166/// Helper used to make a call to a library function that has one argument of
15167/// pointer type.
15168///
15169/// Such functions include 'fegetmode', 'fesetenv' and some others, which are
15170/// used to get or set floating-point state. They have one argument of pointer
15171/// type, which points to the memory region containing bits of the
15172/// floating-point state. The value returned by such function is ignored in the
15173/// created call.
15174///
15175/// \param LibFunc Reference to library function (value of RTLIB::Libcall).
15176/// \param Ptr Pointer used to save/load state.
15177/// \param InChain Ingoing token chain.
15178/// \returns Outgoing chain token.
15180 SDValue InChain,
15181 const SDLoc &DLoc) {
15182 assert(InChain.getValueType() == MVT::Other && "Expected token chain");
15184 Args.emplace_back(Ptr, Ptr.getValueType().getTypeForEVT(*getContext()));
15185 RTLIB::LibcallImpl LibcallImpl =
15186 Libcalls->getLibcallImpl(static_cast<RTLIB::Libcall>(LibFunc));
15187 if (LibcallImpl == RTLIB::Unsupported)
15188 reportFatalUsageError("emitting call to unsupported libcall");
15189
15190 SDValue Callee =
15191 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout()));
15193 CLI.setDebugLoc(DLoc).setChain(InChain).setLibCallee(
15194 Libcalls->getLibcallImplCallingConv(LibcallImpl),
15195 Type::getVoidTy(*getContext()), Callee, std::move(Args));
15196 return TLI->LowerCallTo(CLI).second;
15197}
15198
15200 assert(From && To && "Invalid SDNode; empty source SDValue?");
15201 auto I = SDEI.find(From);
15202 if (I == SDEI.end())
15203 return;
15204
15205 // Use of operator[] on the DenseMap may cause an insertion, which invalidates
15206 // the iterator, hence the need to make a copy to prevent a use-after-free.
15207 NodeExtraInfo NEI = I->second;
15208 if (LLVM_LIKELY(!NEI.PCSections)) {
15209 // No deep copy required for the types of extra info set.
15210 //
15211 // FIXME: Investigate if other types of extra info also need deep copy. This
15212 // depends on the types of nodes they can be attached to: if some extra info
15213 // is only ever attached to nodes where a replacement To node is always the
15214 // node where later use and propagation of the extra info has the intended
15215 // semantics, no deep copy is required.
15216 SDEI[To] = std::move(NEI);
15217 return;
15218 }
15219
15220 const SDNode *EntrySDN = getEntryNode().getNode();
15221
15222 // We need to copy NodeExtraInfo to all _new_ nodes that are being introduced
15223 // through the replacement of From with To. Otherwise, replacements of a node
15224 // (From) with more complex nodes (To and its operands) may result in lost
15225 // extra info where the root node (To) is insignificant in further propagating
15226 // and using extra info when further lowering to MIR.
15227 //
15228 // In the first step pre-populate the visited set with the nodes reachable
15229 // from the old From node. This avoids copying NodeExtraInfo to parts of the
15230 // DAG that is not new and should be left untouched.
15231 SmallVector<const SDNode *> Leafs{From}; // Leafs reachable with VisitFrom.
15232 DenseSet<const SDNode *> FromReach; // The set of nodes reachable from From.
15233 auto VisitFrom = [&](auto &&Self, const SDNode *N, int MaxDepth) {
15234 if (MaxDepth == 0) {
15235 // Remember this node in case we need to increase MaxDepth and continue
15236 // populating FromReach from this node.
15237 Leafs.emplace_back(N);
15238 return;
15239 }
15240 if (!FromReach.insert(N).second)
15241 return;
15242 for (const SDValue &Op : N->op_values())
15243 Self(Self, Op.getNode(), MaxDepth - 1);
15244 };
15245
15246 // Copy extra info to To and all its transitive operands (that are new).
15248 auto DeepCopyTo = [&](auto &&Self, const SDNode *N) {
15249 if (FromReach.contains(N))
15250 return true;
15251 if (!Visited.insert(N).second)
15252 return true;
15253 if (EntrySDN == N)
15254 return false;
15255 for (const SDValue &Op : N->op_values()) {
15256 if (N == To && Op.getNode() == EntrySDN) {
15257 // Special case: New node's operand is the entry node; just need to
15258 // copy extra info to new node.
15259 break;
15260 }
15261 if (!Self(Self, Op.getNode()))
15262 return false;
15263 }
15264 // Copy only if entry node was not reached.
15265 SDEI[N] = std::move(NEI);
15266 return true;
15267 };
15268
15269 // We first try with a lower MaxDepth, assuming that the path to common
15270 // operands between From and To is relatively short. This significantly
15271 // improves performance in the common case. The initial MaxDepth is big
15272 // enough to avoid retry in the common case; the last MaxDepth is large
15273 // enough to avoid having to use the fallback below (and protects from
15274 // potential stack exhaustion from recursion).
15275 for (int PrevDepth = 0, MaxDepth = 16; MaxDepth <= 1024;
15276 PrevDepth = MaxDepth, MaxDepth *= 2, Visited.clear()) {
15277 // StartFrom is the previous (or initial) set of leafs reachable at the
15278 // previous maximum depth.
15280 std::swap(StartFrom, Leafs);
15281 for (const SDNode *N : StartFrom)
15282 VisitFrom(VisitFrom, N, MaxDepth - PrevDepth);
15283 if (LLVM_LIKELY(DeepCopyTo(DeepCopyTo, To)))
15284 return;
15285 // This should happen very rarely (reached the entry node).
15286 LLVM_DEBUG(dbgs() << __func__ << ": MaxDepth=" << MaxDepth << " too low\n");
15287 assert(!Leafs.empty());
15288 }
15289
15290 // This should not happen - but if it did, that means the subgraph reachable
15291 // from From has depth greater or equal to maximum MaxDepth, and VisitFrom()
15292 // could not visit all reachable common operands. Consequently, we were able
15293 // to reach the entry node.
15294 errs() << "warning: incomplete propagation of SelectionDAG::NodeExtraInfo\n";
15295 assert(false && "From subgraph too complex - increase max. MaxDepth?");
15296 // Best-effort fallback if assertions disabled.
15297 SDEI[To] = std::move(NEI);
15298}
15299
15301 assert(VT.isVector() && "Can only unroll vector types!");
15302 if (VT.isFixedLengthVector())
15303 return VT.getVectorNumElements();
15304
15305 const MachineFunction &MF = getMachineFunction();
15306 const Function &F = MF.getFunction();
15307
15308 APInt MaxVScale = getVScaleRange(&F, sizeof(unsigned) * 8).getUnsignedMax();
15309 if (MaxVScale.ugt(VScaleUnrollLimit))
15310 return 0;
15311
15312 bool Overflow;
15313 APInt MinNElts(sizeof(unsigned) * 8, VT.getVectorMinNumElements());
15314 APInt MaxNElts = MinNElts.umul_ov(MaxVScale, Overflow);
15315 if (Overflow)
15316 return 0;
15317
15318 return MaxNElts.getZExtValue();
15319}
15320
15322 ArrayRef<SDValue> Scalars) {
15323 assert(Scalars.size() == getMaxRuntimeNumElements(VT) &&
15324 "Element count mismatch!");
15325 if (VT.isFixedLengthVector())
15326 return getBuildVector(VT, DL, Scalars);
15327
15328 SDValue Vec = getPOISON(VT);
15329 // Iterate in reverse so result remains poison until we encounter a lane that
15330 // exists, after which all lower-numbered lanes must also exist.
15331 for (unsigned IdxVal : reverse(seq(Scalars.size())))
15332 Vec = getInsertVectorElt(DL, Vec, Scalars[IdxVal], IdxVal);
15333
15334 return Vec;
15335}
15336
15337#ifndef NDEBUG
15338static void checkForCyclesHelper(const SDNode *N,
15341 const llvm::SelectionDAG *DAG) {
15342 // If this node has already been checked, don't check it again.
15343 if (Checked.count(N))
15344 return;
15345
15346 // If a node has already been visited on this depth-first walk, reject it as
15347 // a cycle.
15348 if (!Visited.insert(N).second) {
15349 errs() << "Detected cycle in SelectionDAG\n";
15350 dbgs() << "Offending node:\n";
15351 N->dumprFull(DAG); dbgs() << "\n";
15352 abort();
15353 }
15354
15355 for (const SDValue &Op : N->op_values())
15356 checkForCyclesHelper(Op.getNode(), Visited, Checked, DAG);
15357
15358 Checked.insert(N);
15359 Visited.erase(N);
15360}
15361#endif
15362
15364 const llvm::SelectionDAG *DAG,
15365 bool force) {
15366#ifndef NDEBUG
15367 bool check = force;
15368#ifdef EXPENSIVE_CHECKS
15369 check = true;
15370#endif // EXPENSIVE_CHECKS
15371 if (check) {
15372 assert(N && "Checking nonexistent SDNode");
15375 checkForCyclesHelper(N, visited, checked, DAG);
15376 }
15377#endif // !NDEBUG
15378}
15379
15380void llvm::checkForCycles(const llvm::SelectionDAG *DAG, bool force) {
15381 checkForCycles(DAG->getRoot().getNode(), DAG, force);
15382}
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:609
#define LLVM_LIKELY(EXPR)
Definition Compiler.h:343
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 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 void checkAddrSpaceIsValidForLibcall(const TargetLowering *TLI, unsigned AS)
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:6032
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
static bool isSameValue(const APInt &I1, const APInt &I2, bool SignedCompare=false)
Determine if two APInts have the same value, after zero-extending or sign-extending (if SignedCompare...
Definition APInt.h:550
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.
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
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:68
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
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 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 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 makeStateFunctionCall(unsigned LibFunc, SDValue Ptr, SDValue InChain, const SDLoc &DLoc)
Helper used to make a call to a library function that has one argument of pointer type.
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 getBasicBlock(MachineBasicBlock *MBB)
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.
virtual bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const
Returns true if a cast between SrcAS and DestAS is a noop.
const Triple & getTargetTriple() const
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:723
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
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:24
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:41
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
Definition ISDOpcodes.h:829
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h:261
@ TargetConstantPool
Definition ISDOpcodes.h:189
@ 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:513
@ 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:45
@ POISON
POISON - A poison node.
Definition ISDOpcodes.h:236
@ PARTIAL_REDUCE_SMLA
PARTIAL_REDUCE_[U|S]MLA(Accumulator, Input1, Input2) The partial reduction nodes sign or zero extend ...
@ 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:540
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
Definition ISDOpcodes.h:275
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition ISDOpcodes.h:602
@ JUMP_TABLE_DEBUG_INFO
JUMP_TABLE_DEBUG_INFO - Jumptable debug info.
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:789
@ TargetBlockAddress
Definition ISDOpcodes.h:191
@ 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:294
@ FMAD
FMAD - Perform a * b + c, while getting the same result as the separately rounded operations.
Definition ISDOpcodes.h:524
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:264
@ 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:863
@ ATOMIC_LOAD_USUB_COND
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:520
@ FATAN2
FATAN2 - atan2, inspired by libm.
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition ISDOpcodes.h:220
@ GlobalAddress
Definition ISDOpcodes.h:88
@ 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:890
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:586
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:417
@ 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:749
@ SIGN_EXTEND_VECTOR_INREG
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
Definition ISDOpcodes.h:920
@ 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:530
@ 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:254
@ CLMUL
Carry-less multiplication operations.
Definition ISDOpcodes.h:780
@ 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:89
@ 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:798
@ ANNOTATION_LABEL
ANNOTATION_LABEL - Represents a mid basic block label used by annotations.
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:854
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
Definition ISDOpcodes.h:717
@ SCALAR_TO_VECTOR
SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a scalar value into element 0 of the...
Definition ISDOpcodes.h:667
@ TargetExternalSymbol
Definition ISDOpcodes.h:190
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
@ TargetJumpTable
Definition ISDOpcodes.h:188
@ TargetIndex
TargetIndex - Like a constant pool entry, but with completely target-dependent semantics.
Definition ISDOpcodes.h:198
@ PARTIAL_REDUCE_FMLA
@ PREFETCH
PREFETCH - This corresponds to a prefetch intrinsic.
@ TRUNCATE_SSAT_U
Definition ISDOpcodes.h:883
@ 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:837
@ FNEG
Perform various unary floating-point operations inspired by libm.
@ BR_CC
BR_CC - Conditional branch.
@ SSUBO
Same for subtraction.
Definition ISDOpcodes.h:352
@ STEP_VECTOR
STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised of a linear sequence of unsign...
Definition ISDOpcodes.h:693
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:543
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:550
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:374
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:806
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
@ UNDEF
UNDEF - An undefined node.
Definition ISDOpcodes.h:233
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition ISDOpcodes.h:247
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition ISDOpcodes.h:674
@ AssertAlign
AssertAlign - These nodes record if a register contains a value that has a known alignment and the tr...
Definition ISDOpcodes.h:69
@ 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:81
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition ISDOpcodes.h:230
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:348
@ TargetGlobalAddress
TargetGlobalAddress - Like GlobalAddress, but the DAG does no folding or anything else with this node...
Definition ISDOpcodes.h:185
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
@ CTLS
Count leading redundant sign bits.
Definition ISDOpcodes.h:802
@ 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:706
@ ATOMIC_LOAD_FMAXIMUM
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:771
@ AssertNoFPClass
AssertNoFPClass - These nodes record if a register contains a float value that is known to be not som...
Definition ISDOpcodes.h:78
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
Definition ISDOpcodes.h:651
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:616
@ 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:48
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:578
@ CopyToReg
CopyToReg - This node has three operands: a chain, a register number to set to this value,...
Definition ISDOpcodes.h:224
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:860
@ TargetConstantFP
Definition ISDOpcodes.h:180
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
Definition ISDOpcodes.h:821
@ 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:386
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:356
@ ATOMIC_LOAD_FMINIMUM
@ TargetFrameIndex
Definition ISDOpcodes.h:187
@ VECTOR_SPLICE_LEFT
VECTOR_SPLICE_LEFT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by OFFSET elements an...
Definition ISDOpcodes.h:655
@ ANY_EXTEND_VECTOR_INREG
ANY_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register any-extension of the low la...
Definition ISDOpcodes.h:909
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition ISDOpcodes.h:898
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:729
@ 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:988
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:815
@ UADDO_CARRY
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:328
@ 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:785
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition ISDOpcodes.h:502
@ 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:936
@ TargetConstant
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification,...
Definition ISDOpcodes.h:179
@ STRICT_FP_EXTEND
X = STRICT_FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:507
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:741
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:205
@ 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:737
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
Definition ISDOpcodes.h:712
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:659
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:304
@ SPLAT_VECTOR_PARTS
SPLAT_VECTOR_PARTS(SCALAR1, SCALAR2, ...) - Returns a vector with the scalar values joined together a...
Definition ISDOpcodes.h:683
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
Definition ISDOpcodes.h:241
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:567
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:53
@ 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:797
@ ExternalSymbol
Definition ISDOpcodes.h:93
@ 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:969
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:701
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
Definition ISDOpcodes.h:931
@ 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:955
@ VECREDUCE_FMINIMUM
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:866
@ 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:843
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:62
@ ATOMIC_LOAD_UINC_WRAP
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:536
@ PARTIAL_REDUCE_SUMLA
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:365
@ 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:881
@ ABDS
ABDS/ABDU - Absolute difference - Return the absolute difference between two numbers interpreted as s...
Definition ISDOpcodes.h:724
@ TRUNCATE_USAT_U
Definition ISDOpcodes.h:885
@ SADDO_CARRY
Carry-using overflow-aware nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:338
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition ISDOpcodes.h:213
@ TargetGlobalTLSAddress
Definition ISDOpcodes.h:186
@ ABS_MIN_POISON
ABS with a poison result for INT_MIN.
Definition ISDOpcodes.h:753
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:558
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(SDNode *N, const SelectionDAG *DAG, 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:237
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:1557
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
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:1539
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 void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=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...
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:539
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:719
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:201
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:197
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 isOnesOrOnesSplat(SDValue N, 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 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:77
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:106
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.
Definition Alignment.h:130
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)