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::CTLS:
7128 case ISD::VECREDUCE_ADD:
7133 case ISD::VECREDUCE_MUL:
7134 case ISD::VECREDUCE_AND:
7135 case ISD::VECREDUCE_OR:
7136 case ISD::VECREDUCE_XOR:
7137 case ISD::STEP_VECTOR: {
7138 SDValue Ops = {N1};
7139 if (SDValue Fold = FoldConstantArithmetic(Opcode, DL, VT, Ops))
7140 return Fold;
7141 }
7142 }
7143
7144 unsigned OpOpcode = N1.getNode()->getOpcode();
7145 switch (Opcode) {
7146 case ISD::STEP_VECTOR:
7147 assert(VT.isScalableVector() &&
7148 "STEP_VECTOR can only be used with scalable types");
7149 assert(OpOpcode == ISD::TargetConstant &&
7150 VT.getVectorElementType() == N1.getValueType() &&
7151 "Unexpected step operand");
7152 break;
7153 case ISD::FREEZE:
7154 assert(VT == N1.getValueType() && "Unexpected VT!");
7156 return N1;
7157 break;
7158 case ISD::TokenFactor:
7159 case ISD::MERGE_VALUES:
7161 return N1; // Factor, merge or concat of one node? No need.
7162 case ISD::BUILD_VECTOR: {
7163 // Attempt to simplify BUILD_VECTOR.
7164 SDValue Ops[] = {N1};
7165 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
7166 return V;
7167 break;
7168 }
7169 case ISD::FP_ROUND: llvm_unreachable("Invalid method to make FP_ROUND node");
7170 case ISD::FP_EXTEND:
7172 "Invalid FP cast!");
7173 if (N1.getValueType() == VT) return N1; // noop conversion.
7174 assert((!VT.isVector() || VT.getVectorElementCount() ==
7176 "Vector element count mismatch!");
7177 assert(N1.getValueType().bitsLT(VT) && "Invalid fpext node, dst < src!");
7178 if (N1.isUndef())
7179 return getUNDEF(VT);
7180 break;
7181 case ISD::FP_TO_SINT:
7182 case ISD::FP_TO_UINT:
7183 if (N1.isUndef())
7184 return getUNDEF(VT);
7185 break;
7186 case ISD::SINT_TO_FP:
7187 case ISD::UINT_TO_FP:
7188 // [us]itofp(undef) = 0, because the result value is bounded.
7189 if (N1.isUndef())
7190 return getConstantFP(0.0, DL, VT);
7191 break;
7192 case ISD::SIGN_EXTEND:
7193 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7194 "Invalid SIGN_EXTEND!");
7195 assert(VT.isVector() == N1.getValueType().isVector() &&
7196 "SIGN_EXTEND result type type should be vector iff the operand "
7197 "type is vector!");
7198 if (N1.getValueType() == VT) return N1; // noop extension
7199 assert((!VT.isVector() || VT.getVectorElementCount() ==
7201 "Vector element count mismatch!");
7202 assert(N1.getValueType().bitsLT(VT) && "Invalid sext node, dst < src!");
7203 if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND) {
7204 SDNodeFlags Flags;
7205 if (OpOpcode == ISD::ZERO_EXTEND)
7206 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7207 SDValue NewVal = getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7208 transferDbgValues(N1, NewVal);
7209 return NewVal;
7210 }
7211
7212 if (OpOpcode == ISD::POISON)
7213 return getPOISON(VT);
7214
7215 if (N1.isUndef())
7216 // sext(undef) = 0, because the top bits will all be the same.
7217 return getConstant(0, DL, VT);
7218
7219 // Skip unnecessary sext_inreg pattern:
7220 // (sext (trunc x)) -> x iff the upper bits are all signbits.
7221 if (OpOpcode == ISD::TRUNCATE) {
7222 SDValue OpOp = N1.getOperand(0);
7223 if (OpOp.getValueType() == VT) {
7224 unsigned NumSignExtBits =
7226 if (ComputeNumSignBits(OpOp) > NumSignExtBits) {
7227 transferDbgValues(N1, OpOp);
7228 return OpOp;
7229 }
7230 }
7231 }
7232 break;
7233 case ISD::ZERO_EXTEND:
7234 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7235 "Invalid ZERO_EXTEND!");
7236 assert(VT.isVector() == N1.getValueType().isVector() &&
7237 "ZERO_EXTEND result type type should be vector iff the operand "
7238 "type is vector!");
7239 if (N1.getValueType() == VT) return N1; // noop extension
7240 assert((!VT.isVector() || VT.getVectorElementCount() ==
7242 "Vector element count mismatch!");
7243 assert(N1.getValueType().bitsLT(VT) && "Invalid zext node, dst < src!");
7244 if (OpOpcode == ISD::ZERO_EXTEND) { // (zext (zext x)) -> (zext x)
7245 SDNodeFlags Flags;
7246 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7247 SDValue NewVal =
7248 getNode(ISD::ZERO_EXTEND, DL, VT, N1.getOperand(0), Flags);
7249 transferDbgValues(N1, NewVal);
7250 return NewVal;
7251 }
7252
7253 if (OpOpcode == ISD::POISON)
7254 return getPOISON(VT);
7255
7256 if (N1.isUndef())
7257 // zext(undef) = 0, because the top bits will be zero.
7258 return getConstant(0, DL, VT);
7259
7260 // Skip unnecessary zext_inreg pattern:
7261 // (zext (trunc x)) -> x iff the upper bits are known zero.
7262 // TODO: Remove (zext (trunc (and x, c))) exception which some targets
7263 // use to recognise zext_inreg patterns.
7264 if (OpOpcode == ISD::TRUNCATE) {
7265 SDValue OpOp = N1.getOperand(0);
7266 if (OpOp.getValueType() == VT) {
7267 if (OpOp.getOpcode() != ISD::AND) {
7270 if (MaskedValueIsZero(OpOp, HiBits)) {
7271 transferDbgValues(N1, OpOp);
7272 return OpOp;
7273 }
7274 }
7275 }
7276 }
7277 break;
7278 case ISD::ANY_EXTEND:
7279 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7280 "Invalid ANY_EXTEND!");
7281 assert(VT.isVector() == N1.getValueType().isVector() &&
7282 "ANY_EXTEND result type type should be vector iff the operand "
7283 "type is vector!");
7284 if (N1.getValueType() == VT) return N1; // noop extension
7285 assert((!VT.isVector() || VT.getVectorElementCount() ==
7287 "Vector element count mismatch!");
7288 assert(N1.getValueType().bitsLT(VT) && "Invalid anyext node, dst < src!");
7289
7290 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7291 OpOpcode == ISD::ANY_EXTEND) {
7292 SDNodeFlags Flags;
7293 if (OpOpcode == ISD::ZERO_EXTEND)
7294 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7295 // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x)
7296 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7297 }
7298 if (N1.isUndef())
7299 return getUNDEF(VT);
7300
7301 // (ext (trunc x)) -> x
7302 if (OpOpcode == ISD::TRUNCATE) {
7303 SDValue OpOp = N1.getOperand(0);
7304 if (OpOp.getValueType() == VT) {
7305 transferDbgValues(N1, OpOp);
7306 return OpOp;
7307 }
7308 }
7309 break;
7310 case ISD::TRUNCATE:
7311 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7312 "Invalid TRUNCATE!");
7313 assert(VT.isVector() == N1.getValueType().isVector() &&
7314 "TRUNCATE result type type should be vector iff the operand "
7315 "type is vector!");
7316 if (N1.getValueType() == VT) return N1; // noop truncate
7317 assert((!VT.isVector() || VT.getVectorElementCount() ==
7319 "Vector element count mismatch!");
7320 assert(N1.getValueType().bitsGT(VT) && "Invalid truncate node, src < dst!");
7321 if (OpOpcode == ISD::TRUNCATE)
7322 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7323 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7324 OpOpcode == ISD::ANY_EXTEND) {
7325 // If the source is smaller than the dest, we still need an extend.
7327 VT.getScalarType())) {
7328 SDNodeFlags Flags;
7329 if (OpOpcode == ISD::ZERO_EXTEND)
7330 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7331 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7332 }
7333 if (N1.getOperand(0).getValueType().bitsGT(VT))
7334 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7335 return N1.getOperand(0);
7336 }
7337 if (N1.isUndef())
7338 return getUNDEF(VT);
7339 if (OpOpcode == ISD::VSCALE && !NewNodesMustHaveLegalTypes)
7340 return getVScale(DL, VT,
7342 break;
7346 assert(VT.isVector() && "This DAG node is restricted to vector types.");
7347 assert(N1.getValueType().bitsLE(VT) &&
7348 "The input must be the same size or smaller than the result.");
7351 "The destination vector type must have fewer lanes than the input.");
7352 break;
7353 case ISD::ABS:
7354 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid ABS!");
7355 if (N1.isUndef())
7356 return getConstant(0, DL, VT);
7357 break;
7359 assert(VT.isInteger() && VT == N1.getValueType() &&
7360 "Invalid ABS_MIN_POISON!");
7361 if (N1.isUndef())
7362 return getConstant(0, DL, VT);
7363 break;
7364 case ISD::BSWAP:
7365 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BSWAP!");
7366 assert((VT.getScalarSizeInBits() % 16 == 0) &&
7367 "BSWAP types must be a multiple of 16 bits!");
7368 if (N1.isUndef())
7369 return getUNDEF(VT);
7370 // bswap(bswap(X)) -> X.
7371 if (OpOpcode == ISD::BSWAP)
7372 return N1.getOperand(0);
7373 break;
7374 case ISD::BITREVERSE:
7375 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BITREVERSE!");
7376 if (N1.isUndef())
7377 return getUNDEF(VT);
7378 break;
7379 case ISD::BITCAST:
7381 "Cannot BITCAST between types of different sizes!");
7382 if (VT == N1.getValueType()) return N1; // noop conversion.
7383 if (OpOpcode == ISD::BITCAST) // bitconv(bitconv(x)) -> bitconv(x)
7384 return getNode(ISD::BITCAST, DL, VT, N1.getOperand(0));
7385 if (N1.isUndef())
7386 return getUNDEF(VT);
7387 break;
7389 assert(VT.isVector() && !N1.getValueType().isVector() &&
7390 (VT.getVectorElementType() == N1.getValueType() ||
7392 N1.getValueType().isInteger() &&
7394 "Illegal SCALAR_TO_VECTOR node!");
7395 if (N1.isUndef())
7396 return getUNDEF(VT);
7397 // scalar_to_vector(extract_vector_elt V, 0) -> V, top bits are undefined.
7398 if (OpOpcode == ISD::EXTRACT_VECTOR_ELT &&
7400 N1.getConstantOperandVal(1) == 0 &&
7401 N1.getOperand(0).getValueType() == VT)
7402 return N1.getOperand(0);
7403 break;
7404 case ISD::FNEG:
7405 // Negation of an unknown bag of bits is still completely undefined.
7406 if (N1.isUndef())
7407 return getUNDEF(VT);
7408
7409 if (OpOpcode == ISD::FNEG) // --X -> X
7410 return N1.getOperand(0);
7411 break;
7412 case ISD::FABS:
7413 if (OpOpcode == ISD::FNEG) // abs(-X) -> abs(X)
7414 return getNode(ISD::FABS, DL, VT, N1.getOperand(0));
7415 break;
7416 case ISD::VSCALE:
7417 assert(VT == N1.getValueType() && "Unexpected VT!");
7418 break;
7419 case ISD::CTPOP:
7420 if (N1.getValueType().getScalarType() == MVT::i1)
7421 return N1;
7422 break;
7423 case ISD::CTLZ:
7424 case ISD::CTTZ:
7425 if (N1.getValueType().getScalarType() == MVT::i1)
7426 return getNOT(DL, N1, N1.getValueType());
7427 break;
7428 case ISD::CTLS:
7429 if (N1.getValueType().getScalarType() == MVT::i1)
7430 return getConstant(0, DL, VT);
7431 break;
7432 case ISD::VECREDUCE_ADD:
7433 if (N1.getValueType().getScalarType() == MVT::i1)
7434 return getNode(ISD::VECREDUCE_XOR, DL, VT, N1);
7435 break;
7438 if (N1.getValueType().getScalarType() == MVT::i1)
7439 return getNode(ISD::VECREDUCE_OR, DL, VT, N1);
7440 break;
7443 if (N1.getValueType().getScalarType() == MVT::i1)
7444 return getNode(ISD::VECREDUCE_AND, DL, VT, N1);
7445 break;
7446 case ISD::SPLAT_VECTOR:
7447 assert(VT.isVector() && "Wrong return type!");
7448 // FIXME: Hexagon uses i32 scalar for a floating point zero vector so allow
7449 // that for now.
7451 (VT.isFloatingPoint() && N1.getValueType() == MVT::i32) ||
7453 N1.getValueType().isInteger() &&
7455 "Wrong operand type!");
7456 break;
7457 }
7458
7459 SDNode *N;
7460 SDVTList VTs = getVTList(VT);
7461 SDValue Ops[] = {N1};
7462 if (VT != MVT::Glue) { // Don't CSE glue producing nodes
7463 SDNodeKey ID(Opcode, VTs, Ops);
7464 FoldingSetInsertToken InsertToken;
7465 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
7466 E->intersectFlagsWith(Flags);
7467 return SDValue(E, 0);
7468 }
7469
7470 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7471 N->setFlags(Flags);
7472 createOperands(N, Ops);
7473 CSEMap.insert(N, InsertToken);
7474 } else {
7475 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7476 createOperands(N, Ops);
7477 }
7478
7479 InsertNode(N);
7480 SDValue V = SDValue(N, 0);
7481 NewSDValueDbgMsg(V, "Creating new node: ", this);
7482 return V;
7483}
7484
7485static APInt getIntegerIdentity(unsigned Opcode, unsigned BitWidth) {
7486 switch (Opcode) {
7487 default:
7488 llvm_unreachable("Unexpected integer identity opcode");
7489 case ISD::ADD:
7490 case ISD::OR:
7491 case ISD::XOR:
7492 case ISD::UMAX:
7493 return APInt::getZero(BitWidth);
7494 case ISD::MUL:
7495 return APInt(BitWidth, 1);
7496 case ISD::AND:
7497 case ISD::UMIN:
7499 case ISD::SMAX:
7501 case ISD::SMIN:
7503 }
7504}
7505
7506static std::optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
7507 const APInt &C2) {
7508 switch (Opcode) {
7509 case ISD::ADD: return C1 + C2;
7510 case ISD::SUB: return C1 - C2;
7511 case ISD::MUL: return C1 * C2;
7512 case ISD::AND: return C1 & C2;
7513 case ISD::OR: return C1 | C2;
7514 case ISD::XOR: return C1 ^ C2;
7515 case ISD::SHL: return C1 << C2;
7516 case ISD::SRL: return C1.lshr(C2);
7517 case ISD::SRA: return C1.ashr(C2);
7518 case ISD::ROTL: return C1.rotl(C2);
7519 case ISD::ROTR: return C1.rotr(C2);
7520 case ISD::SMIN: return C1.sle(C2) ? C1 : C2;
7521 case ISD::SMAX: return C1.sge(C2) ? C1 : C2;
7522 case ISD::UMIN: return C1.ule(C2) ? C1 : C2;
7523 case ISD::UMAX: return C1.uge(C2) ? C1 : C2;
7524 case ISD::SADDSAT: return C1.sadd_sat(C2);
7525 case ISD::UADDSAT: return C1.uadd_sat(C2);
7526 case ISD::SSUBSAT: return C1.ssub_sat(C2);
7527 case ISD::USUBSAT: return C1.usub_sat(C2);
7528 case ISD::SSHLSAT: return C1.sshl_sat(C2);
7529 case ISD::USHLSAT: return C1.ushl_sat(C2);
7530 case ISD::UDIV:
7531 if (!C2.getBoolValue())
7532 break;
7533 return C1.udiv(C2);
7534 case ISD::UREM:
7535 if (!C2.getBoolValue())
7536 break;
7537 return C1.urem(C2);
7538 case ISD::SDIV:
7539 if (!C2.getBoolValue())
7540 break;
7541 return C1.sdiv(C2);
7542 case ISD::SREM:
7543 if (!C2.getBoolValue())
7544 break;
7545 return C1.srem(C2);
7546 case ISD::AVGFLOORS:
7547 return APIntOps::avgFloorS(C1, C2);
7548 case ISD::AVGFLOORU:
7549 return APIntOps::avgFloorU(C1, C2);
7550 case ISD::AVGCEILS:
7551 return APIntOps::avgCeilS(C1, C2);
7552 case ISD::AVGCEILU:
7553 return APIntOps::avgCeilU(C1, C2);
7554 case ISD::ABDS:
7555 return APIntOps::abds(C1, C2);
7556 case ISD::ABDU:
7557 return APIntOps::abdu(C1, C2);
7558 case ISD::MULHS:
7559 return APIntOps::mulhs(C1, C2);
7560 case ISD::MULHU:
7561 return APIntOps::mulhu(C1, C2);
7562 case ISD::CLMUL:
7563 return APIntOps::clmul(C1, C2);
7564 case ISD::CLMULR:
7565 return APIntOps::clmulr(C1, C2);
7566 case ISD::CLMULH:
7567 return APIntOps::clmulh(C1, C2);
7568 case ISD::PEXT:
7569 return APIntOps::pext(C1, C2);
7570 case ISD::PDEP:
7571 return APIntOps::pdep(C1, C2);
7572 }
7573 return std::nullopt;
7574}
7575// Handle constant folding with UNDEF.
7576// TODO: Handle more cases.
7577static std::optional<APInt> FoldValueWithUndef(unsigned Opcode, const APInt &C1,
7578 bool IsUndef1, const APInt &C2,
7579 bool IsUndef2) {
7580 if (!(IsUndef1 || IsUndef2))
7581 return FoldValue(Opcode, C1, C2);
7582
7583 // Fold and(x, undef) -> 0
7584 // Fold mul(x, undef) -> 0
7585 if (Opcode == ISD::AND || Opcode == ISD::MUL)
7586 return APInt::getZero(C1.getBitWidth());
7587
7588 return std::nullopt;
7589}
7590
7592 const GlobalAddressSDNode *GA,
7593 const SDNode *N2) {
7594 if (GA->getOpcode() != ISD::GlobalAddress)
7595 return SDValue();
7596 if (!TLI->isOffsetFoldingLegal(GA))
7597 return SDValue();
7598 auto *C2 = dyn_cast<ConstantSDNode>(N2);
7599 if (!C2)
7600 return SDValue();
7601 int64_t Offset = C2->getSExtValue();
7602 switch (Opcode) {
7603 case ISD::ADD:
7604 case ISD::PTRADD:
7605 break;
7606 case ISD::SUB: Offset = -uint64_t(Offset); break;
7607 default: return SDValue();
7608 }
7609 return getGlobalAddress(GA->getGlobal(), SDLoc(C2), VT,
7610 GA->getOffset() + uint64_t(Offset));
7611}
7612
7614 switch (Opcode) {
7615 case ISD::SDIV:
7616 case ISD::UDIV:
7617 case ISD::SREM:
7618 case ISD::UREM: {
7619 // If a divisor is zero/undef or any element of a divisor vector is
7620 // zero/undef, the whole op is undef.
7621 assert(Ops.size() == 2 && "Div/rem should have 2 operands");
7622 SDValue Divisor = Ops[1];
7623 if (Divisor.isUndef() || isNullConstant(Divisor))
7624 return true;
7625
7626 return ISD::isBuildVectorOfConstantSDNodes(Divisor.getNode()) &&
7627 llvm::any_of(Divisor->op_values(),
7628 [](SDValue V) { return V.isUndef() ||
7629 isNullConstant(V); });
7630 // TODO: Handle signed overflow.
7631 }
7632 // TODO: Handle oversized shifts.
7633 default:
7634 return false;
7635 }
7636}
7637
7640 SDNodeFlags Flags) {
7641 // If the opcode is a target-specific ISD node, there's nothing we can
7642 // do here and the operand rules may not line up with the below, so
7643 // bail early.
7644 // We can't create a scalar CONCAT_VECTORS so skip it. It will break
7645 // for concats involving SPLAT_VECTOR. Concats of BUILD_VECTORS are handled by
7646 // foldCONCAT_VECTORS in getNode before this is called.
7647 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::CONCAT_VECTORS)
7648 return SDValue();
7649
7650 unsigned NumOps = Ops.size();
7651 if (NumOps == 0)
7652 return SDValue();
7653
7654 if (isUndef(Opcode, Ops))
7655 return getUNDEF(VT);
7656
7657 // Handle unary special cases.
7658 if (NumOps == 1) {
7659 SDValue N1 = Ops[0];
7660
7661 // Constant fold unary operations with an integer constant operand. Even
7662 // opaque constant will be folded, because the folding of unary operations
7663 // doesn't create new constants with different values. Nevertheless, the
7664 // opaque flag is preserved during folding to prevent future folding with
7665 // other constants.
7666 if (auto *C = dyn_cast<ConstantSDNode>(N1)) {
7667 const APInt &Val = C->getAPIntValue();
7668 switch (Opcode) {
7669 case ISD::SIGN_EXTEND:
7670 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7671 C->isTargetOpcode(), C->isOpaque());
7672 case ISD::TRUNCATE:
7673 if (C->isOpaque())
7674 break;
7675 [[fallthrough]];
7676 case ISD::ZERO_EXTEND:
7677 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7678 C->isTargetOpcode(), C->isOpaque());
7679 case ISD::ANY_EXTEND:
7680 // Some targets like RISCV prefer to sign extend some types.
7681 if (TLI->isSExtCheaperThanZExt(N1.getValueType(), VT))
7682 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7683 C->isTargetOpcode(), C->isOpaque());
7684 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7685 C->isTargetOpcode(), C->isOpaque());
7686 case ISD::ABS:
7687 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7688 C->isOpaque());
7690 if (Val.isMinSignedValue())
7691 return getPOISON(VT);
7692 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7693 C->isOpaque());
7694 case ISD::BITREVERSE:
7695 return getConstant(Val.reverseBits(), DL, VT, C->isTargetOpcode(),
7696 C->isOpaque());
7697 case ISD::BSWAP:
7698 return getConstant(Val.byteSwap(), DL, VT, C->isTargetOpcode(),
7699 C->isOpaque());
7700 case ISD::CTPOP:
7701 return getConstant(Val.popcount(), DL, VT, C->isTargetOpcode(),
7702 C->isOpaque());
7703 case ISD::CTLZ:
7705 return getConstant(Val.countl_zero(), DL, VT, C->isTargetOpcode(),
7706 C->isOpaque());
7707 case ISD::CTTZ:
7709 return getConstant(Val.countr_zero(), DL, VT, C->isTargetOpcode(),
7710 C->isOpaque());
7711 case ISD::CTLS:
7712 // CTLS returns the number of extra sign bits so subtract one.
7713 return getConstant(Val.getNumSignBits() - 1, DL, VT,
7714 C->isTargetOpcode(), C->isOpaque());
7715 case ISD::UINT_TO_FP:
7716 case ISD::SINT_TO_FP: {
7718 (void)FPV.convertFromAPInt(Val, Opcode == ISD::SINT_TO_FP,
7720 return getConstantFP(FPV, DL, VT);
7721 }
7722 case ISD::FP16_TO_FP:
7723 case ISD::BF16_TO_FP: {
7724 bool Ignored;
7725 APFloat FPV(Opcode == ISD::FP16_TO_FP ? APFloat::IEEEhalf()
7726 : APFloat::BFloat(),
7727 (Val.getBitWidth() == 16) ? Val : Val.trunc(16));
7728
7729 // This can return overflow, underflow, or inexact; we don't care.
7730 // FIXME need to be more flexible about rounding mode.
7732 &Ignored);
7733 return getConstantFP(FPV, DL, VT);
7734 }
7735 case ISD::STEP_VECTOR:
7736 if (SDValue V = FoldSTEP_VECTOR(DL, VT, N1, *this))
7737 return V;
7738 break;
7739 case ISD::BITCAST:
7740 if (VT == MVT::f16 && C->getValueType(0) == MVT::i16)
7741 return getConstantFP(APFloat(APFloat::IEEEhalf(), Val), DL, VT);
7742 if (VT == MVT::f32 && C->getValueType(0) == MVT::i32)
7743 return getConstantFP(APFloat(APFloat::IEEEsingle(), Val), DL, VT);
7744 if (VT == MVT::f64 && C->getValueType(0) == MVT::i64)
7745 return getConstantFP(APFloat(APFloat::IEEEdouble(), Val), DL, VT);
7746 if (VT == MVT::f128 && C->getValueType(0) == MVT::i128)
7747 return getConstantFP(APFloat(APFloat::IEEEquad(), Val), DL, VT);
7748 break;
7749 }
7750 }
7751
7752 // Constant fold unary operations with a floating point constant operand.
7753 if (auto *C = dyn_cast<ConstantFPSDNode>(N1)) {
7754 APFloat V = C->getValueAPF(); // make copy
7755 switch (Opcode) {
7756 case ISD::FNEG:
7757 V.changeSign();
7758 return getConstantFP(V, DL, VT);
7759 case ISD::FABS:
7760 V.clearSign();
7761 return getConstantFP(V, DL, VT);
7762 case ISD::FCEIL: {
7763 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardPositive);
7765 return getConstantFP(V, DL, VT);
7766 return SDValue();
7767 }
7768 case ISD::FTRUNC: {
7769 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardZero);
7771 return getConstantFP(V, DL, VT);
7772 return SDValue();
7773 }
7774 case ISD::FFLOOR: {
7775 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardNegative);
7777 return getConstantFP(V, DL, VT);
7778 return SDValue();
7779 }
7780 case ISD::FP_EXTEND: {
7781 bool ignored;
7782 // This can return overflow, underflow, or inexact; we don't care.
7783 // FIXME need to be more flexible about rounding mode.
7784 (void)V.convert(VT.getFltSemantics(), APFloat::rmNearestTiesToEven,
7785 &ignored);
7786 return getConstantFP(V, DL, VT);
7787 }
7788 case ISD::FP_TO_SINT:
7789 case ISD::FP_TO_UINT: {
7790 bool ignored;
7791 APSInt IntVal(VT.getSizeInBits(), Opcode == ISD::FP_TO_UINT);
7792 // FIXME need to be more flexible about rounding mode.
7794 V.convertToInteger(IntVal, APFloat::rmTowardZero, &ignored);
7795 if (s == APFloat::opInvalidOp) // inexact is OK, in fact usual
7796 break;
7797 return getConstant(IntVal, DL, VT);
7798 }
7799 case ISD::FP_TO_FP16:
7800 case ISD::FP_TO_BF16: {
7801 bool Ignored;
7802 // This can return overflow, underflow, or inexact; we don't care.
7803 // FIXME need to be more flexible about rounding mode.
7804 (void)V.convert(Opcode == ISD::FP_TO_FP16 ? APFloat::IEEEhalf()
7805 : APFloat::BFloat(),
7807 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7808 }
7809 case ISD::BITCAST:
7810 if (VT == MVT::i16 && C->getValueType(0) == MVT::f16)
7811 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7812 VT);
7813 if (VT == MVT::i16 && C->getValueType(0) == MVT::bf16)
7814 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7815 VT);
7816 if (VT == MVT::i32 && C->getValueType(0) == MVT::f32)
7817 return getConstant((uint32_t)V.bitcastToAPInt().getZExtValue(), DL,
7818 VT);
7819 if (VT == MVT::i64 && C->getValueType(0) == MVT::f64)
7820 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7821 break;
7822 }
7823 }
7824
7825 // Early-out if we failed to constant fold a bitcast.
7826 if (Opcode == ISD::BITCAST)
7827 return SDValue();
7828
7829 // Constant fold integer vector reductions with constant BUILD_VECTORs.
7830 if ((Opcode == ISD::VECREDUCE_ADD || Opcode == ISD::VECREDUCE_SMAX ||
7831 Opcode == ISD::VECREDUCE_SMIN || Opcode == ISD::VECREDUCE_UMAX ||
7832 Opcode == ISD::VECREDUCE_UMIN || Opcode == ISD::VECREDUCE_MUL ||
7833 Opcode == ISD::VECREDUCE_OR || Opcode == ISD::VECREDUCE_XOR ||
7834 Opcode == ISD::VECREDUCE_AND) &&
7836 unsigned EltBits = N1.getValueType().getScalarSizeInBits();
7837 unsigned BaseOpcode = ISD::getVecReduceBaseOpcode(Opcode);
7838 APInt Acc = getIntegerIdentity(BaseOpcode, EltBits);
7839 for (SDValue Elt : N1->op_values()) {
7840 if (Elt.getOpcode() == ISD::POISON)
7841 return getPOISON(VT);
7842 if (Elt.isUndef() || cast<ConstantSDNode>(Elt)->isOpaque())
7843 return SDValue();
7844 APInt Value = cast<ConstantSDNode>(Elt)->getAPIntValue().trunc(EltBits);
7845 std::optional<APInt> Folded = FoldValue(BaseOpcode, Acc, Value);
7846 assert(Folded &&
7847 "Expected vector reduction base opcode to be foldable");
7848 Acc = *Folded;
7849 }
7850 EVT EltVT = N1.getValueType().getScalarType();
7851 return getAnyExtOrTrunc(getConstant(Acc, DL, EltVT), DL, VT);
7852 }
7853 }
7854
7855 // Handle binops special cases.
7856 if (NumOps == 2) {
7857 if (SDValue CFP = foldConstantFPMath(Opcode, DL, VT, Ops))
7858 return CFP;
7859
7860 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7861 if (auto *C2 = dyn_cast<ConstantSDNode>(Ops[1])) {
7862 if (C1->isOpaque() || C2->isOpaque())
7863 return SDValue();
7864
7865 std::optional<APInt> FoldAttempt =
7866 FoldValue(Opcode, C1->getAPIntValue(), C2->getAPIntValue());
7867 if (!FoldAttempt)
7868 return SDValue();
7869
7870 SDValue Folded = getConstant(*FoldAttempt, DL, VT);
7871 assert((!Folded || !VT.isVector()) &&
7872 "Can't fold vectors ops with scalar operands");
7873 return Folded;
7874 }
7875 }
7876
7877 // fold (add Sym, c) -> Sym+c
7879 return FoldSymbolOffset(Opcode, VT, GA, Ops[1].getNode());
7880 if (TLI->isCommutativeBinOp(Opcode))
7882 return FoldSymbolOffset(Opcode, VT, GA, Ops[0].getNode());
7883
7884 // fold (sext_in_reg c1) -> c2
7885 if (Opcode == ISD::SIGN_EXTEND_INREG) {
7886 EVT EVT = cast<VTSDNode>(Ops[1])->getVT();
7887
7888 auto SignExtendInReg = [&](APInt Val, llvm::EVT ConstantVT) {
7889 unsigned FromBits = EVT.getScalarSizeInBits();
7890 Val <<= Val.getBitWidth() - FromBits;
7891 Val.ashrInPlace(Val.getBitWidth() - FromBits);
7892 return getConstant(Val, DL, ConstantVT);
7893 };
7894
7895 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7896 const APInt &Val = C1->getAPIntValue();
7897 return SignExtendInReg(Val, VT);
7898 }
7899
7901 SmallVector<SDValue, 8> ScalarOps;
7902 llvm::EVT OpVT = Ops[0].getOperand(0).getValueType();
7903 for (int I = 0, E = VT.getVectorNumElements(); I != E; ++I) {
7904 SDValue Op = Ops[0].getOperand(I);
7905 if (Op.isUndef()) {
7906 ScalarOps.push_back(getUNDEF(OpVT));
7907 continue;
7908 }
7909 const APInt &Val = cast<ConstantSDNode>(Op)->getAPIntValue();
7910 ScalarOps.push_back(SignExtendInReg(Val, OpVT));
7911 }
7912 return getBuildVector(VT, DL, ScalarOps);
7913 }
7914
7915 if (Ops[0].getOpcode() == ISD::SPLAT_VECTOR &&
7916 isa<ConstantSDNode>(Ops[0].getOperand(0)))
7917 return getNode(ISD::SPLAT_VECTOR, DL, VT,
7918 SignExtendInReg(Ops[0].getConstantOperandAPInt(0),
7919 Ops[0].getOperand(0).getValueType()));
7920 }
7921 }
7922
7923 // Handle fshl/fshr special cases.
7924 if (Opcode == ISD::FSHL || Opcode == ISD::FSHR) {
7925 auto *C1 = dyn_cast<ConstantSDNode>(Ops[0]);
7926 auto *C2 = dyn_cast<ConstantSDNode>(Ops[1]);
7927 auto *C3 = dyn_cast<ConstantSDNode>(Ops[2]);
7928
7929 if (C1 && C2 && C3) {
7930 if (C1->isOpaque() || C2->isOpaque() || C3->isOpaque())
7931 return SDValue();
7932 const APInt &V1 = C1->getAPIntValue(), &V2 = C2->getAPIntValue(),
7933 &V3 = C3->getAPIntValue();
7934
7935 APInt FoldedVal = Opcode == ISD::FSHL ? APIntOps::fshl(V1, V2, V3)
7936 : APIntOps::fshr(V1, V2, V3);
7937 return getConstant(FoldedVal, DL, VT);
7938 }
7939 }
7940
7941 // Handle fma/fmad special cases.
7942 if (Opcode == ISD::FMA || Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7943 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
7944 assert(Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
7945 Ops[2].getValueType() == VT && "FMA types must match!");
7949 if (C1 && C2 && C3) {
7950 APFloat V1 = C1->getValueAPF();
7951 const APFloat &V2 = C2->getValueAPF();
7952 const APFloat &V3 = C3->getValueAPF();
7953 if (Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7954 V1.multiply(V2, APFloat::rmNearestTiesToEven);
7956 } else
7957 V1.fusedMultiplyAdd(V2, V3, APFloat::rmNearestTiesToEven);
7958 return getConstantFP(V1, DL, VT);
7959 }
7960 }
7961
7962 // This is for vector folding only from here on.
7963 if (!VT.isVector())
7964 return SDValue();
7965
7966 // Constant fold integer partial reductions with constant BUILD_VECTOR
7967 // operands. The reduction order is deliberately unspecified. Use the same
7968 // subvector layout as TargetLowering::expandPartialReduceMLA(), where input
7969 // lane I contributes to accumulator lane I % NumAccElts.
7970 if (Opcode == ISD::PARTIAL_REDUCE_SMLA ||
7971 Opcode == ISD::PARTIAL_REDUCE_UMLA ||
7972 Opcode == ISD::PARTIAL_REDUCE_SUMLA) {
7973 // These nodes have no scalar form, so unsupported cases must not fall
7974 // through to generic per-lane vector folding.
7975 if (!llvm::all_of(Ops, [](SDValue Op) {
7976 return ISD::isBuildVectorOfConstantSDNodes(Op.getNode());
7977 }))
7978 return SDValue();
7979
7980 unsigned AccEltBits = VT.getScalarSizeInBits();
7981 unsigned InputEltBits = Ops[1].getScalarValueSizeInBits();
7982 unsigned NumAccElts = VT.getVectorNumElements();
7983 unsigned NumInputElts = Ops[1].getValueType().getVectorNumElements();
7984 SmallVector<APInt, 8> Results(NumAccElts, APInt::getZero(AccEltBits));
7985 BitVector PoisonElts(NumAccElts);
7986
7987 for (unsigned I = 0; I != NumAccElts; ++I) {
7988 SDValue Elt = Ops[0].getOperand(I);
7989 if (Elt.getOpcode() == ISD::POISON) {
7990 PoisonElts.set(I);
7991 continue;
7992 }
7993 auto *C = dyn_cast<ConstantSDNode>(Elt);
7994 if (!C || C->isOpaque())
7995 return SDValue();
7996 Results[I] = C->getAPIntValue().trunc(AccEltBits);
7997 }
7998
7999 bool IsLHSSigned = Opcode != ISD::PARTIAL_REDUCE_UMLA;
8000 bool IsRHSSigned = Opcode == ISD::PARTIAL_REDUCE_SMLA;
8001 for (unsigned I = 0; I != NumInputElts; ++I) {
8002 const unsigned AccIdx = I % NumAccElts;
8003 SDValue LHSElt = Ops[1].getOperand(I);
8004 SDValue RHSElt = Ops[2].getOperand(I);
8005 if (LHSElt.getOpcode() == ISD::POISON ||
8006 RHSElt.getOpcode() == ISD::POISON) {
8007 PoisonElts.set(AccIdx);
8008 continue;
8009 }
8010
8011 auto *LHS = dyn_cast<ConstantSDNode>(LHSElt);
8012 auto *RHS = dyn_cast<ConstantSDNode>(RHSElt);
8013 if (!LHS || !RHS || LHS->isOpaque() || RHS->isOpaque())
8014 return SDValue();
8015
8016 APInt LHSVal = LHS->getAPIntValue().trunc(InputEltBits);
8017 APInt RHSVal = RHS->getAPIntValue().trunc(InputEltBits);
8018 LHSVal = IsLHSSigned ? LHSVal.sext(AccEltBits) : LHSVal.zext(AccEltBits);
8019 RHSVal = IsRHSSigned ? RHSVal.sext(AccEltBits) : RHSVal.zext(AccEltBits);
8020 Results[AccIdx] += LHSVal * RHSVal;
8021 }
8022
8023 // After type legalization the vector element type may not be a legal
8024 // scalar type (e.g. i16 on AArch64). Create the folded constants in the
8025 // promoted legal scalar type instead, matching the generic per-lane path
8026 // below. Bail out if legalization would narrow the type, since the lane
8027 // value would not fit.
8028 EVT AccEltVT = VT.getVectorElementType();
8029 EVT LegalSVT = AccEltVT;
8030 if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
8031 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
8032 if (LegalSVT.bitsLT(AccEltVT))
8033 return SDValue();
8034 }
8035
8036 SmallVector<SDValue, 8> ResultOps;
8037 for (unsigned I = 0; I != NumAccElts; ++I)
8038 ResultOps.push_back(
8039 PoisonElts[I] ? getPOISON(LegalSVT)
8040 : getConstant(Results[I].sext(LegalSVT.getSizeInBits()),
8041 DL, LegalSVT));
8042 return getBuildVector(VT, DL, ResultOps);
8043 }
8044
8045 ElementCount NumElts = VT.getVectorElementCount();
8046
8047 // See if we can fold through any bitcasted integer ops.
8048 if (NumOps == 2 && VT.isFixedLengthVector() && VT.isInteger() &&
8049 Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
8050 (Ops[0].getOpcode() == ISD::BITCAST ||
8051 Ops[1].getOpcode() == ISD::BITCAST)) {
8054 auto *BV1 = dyn_cast<BuildVectorSDNode>(N1);
8055 auto *BV2 = dyn_cast<BuildVectorSDNode>(N2);
8056 if (BV1 && BV2 && N1.getValueType().isInteger() &&
8057 N2.getValueType().isInteger()) {
8058 bool IsLE = getDataLayout().isLittleEndian();
8059 unsigned EltBits = VT.getScalarSizeInBits();
8060 SmallVector<APInt> RawBits1, RawBits2;
8061 BitVector UndefElts1, UndefElts2;
8062 if (BV1->getConstantRawBits(IsLE, EltBits, RawBits1, UndefElts1) &&
8063 BV2->getConstantRawBits(IsLE, EltBits, RawBits2, UndefElts2)) {
8064 SmallVector<APInt> RawBits;
8065 for (unsigned I = 0, E = NumElts.getFixedValue(); I != E; ++I) {
8066 std::optional<APInt> Fold = FoldValueWithUndef(
8067 Opcode, RawBits1[I], UndefElts1[I], RawBits2[I], UndefElts2[I]);
8068 if (!Fold)
8069 break;
8070 RawBits.push_back(*Fold);
8071 }
8072 if (RawBits.size() == NumElts.getFixedValue()) {
8073 // We have constant folded, but we might need to cast this again back
8074 // to the original (possibly legalized) type.
8075 EVT BVVT, BVEltVT;
8076 if (N1.getValueType() == VT) {
8077 BVVT = N1.getValueType();
8078 BVEltVT = BV1->getOperand(0).getValueType();
8079 } else {
8080 BVVT = N2.getValueType();
8081 BVEltVT = BV2->getOperand(0).getValueType();
8082 }
8083 unsigned BVEltBits = BVEltVT.getSizeInBits();
8084 SmallVector<APInt> DstBits;
8085 BitVector DstUndefs;
8087 DstBits, RawBits, DstUndefs,
8088 BitVector(RawBits.size(), false));
8089 SmallVector<SDValue> Ops(DstBits.size(), getUNDEF(BVEltVT));
8090 for (unsigned I = 0, E = DstBits.size(); I != E; ++I) {
8091 if (DstUndefs[I])
8092 continue;
8093 Ops[I] = getConstant(DstBits[I].sext(BVEltBits), DL, BVEltVT);
8094 }
8095 return getBitcast(VT, getBuildVector(BVVT, DL, Ops));
8096 }
8097 }
8098 }
8099 // Logic ops can be folded from raw integer bits - mainly for AVX512 masks.
8100 if (ISD::isBitwiseLogicOp(Opcode) && isa<ConstantSDNode>(N1) &&
8101 isa<ConstantSDNode>(N2)) {
8102 if (SDValue Res = FoldConstantArithmetic(Opcode, DL, N1.getValueType(),
8103 {N1, N2}, Flags))
8104 return getBitcast(VT, Res);
8105 }
8106 }
8107
8108 // Fold (mul step_vector(C0), C1) to (step_vector(C0 * C1)).
8109 // (shl step_vector(C0), C1) -> (step_vector(C0 << C1))
8110 if ((Opcode == ISD::MUL || Opcode == ISD::SHL) &&
8111 Ops[0].getOpcode() == ISD::STEP_VECTOR) {
8112 APInt RHSVal;
8113 if (ISD::isConstantSplatVector(Ops[1].getNode(), RHSVal)) {
8114 APInt NewStep = Opcode == ISD::MUL
8115 ? Ops[0].getConstantOperandAPInt(0) * RHSVal
8116 : Ops[0].getConstantOperandAPInt(0) << RHSVal;
8117 return getStepVector(DL, VT, NewStep);
8118 }
8119 }
8120
8121 auto IsScalarOrSameVectorSize = [NumElts](const SDValue &Op) {
8122 return !Op.getValueType().isVector() ||
8123 Op.getValueType().getVectorElementCount() == NumElts;
8124 };
8125
8126 auto IsBuildVectorSplatVectorOrUndef = [](const SDValue &Op) {
8127 return Op.isUndef() || Op.getOpcode() == ISD::CONDCODE ||
8128 Op.getOpcode() == ISD::BUILD_VECTOR ||
8129 Op.getOpcode() == ISD::SPLAT_VECTOR;
8130 };
8131
8132 // All operands must be vector types with the same number of elements as
8133 // the result type and must be either UNDEF or a build/splat vector
8134 // or UNDEF scalars.
8135 if (!llvm::all_of(Ops, IsBuildVectorSplatVectorOrUndef) ||
8136 !llvm::all_of(Ops, IsScalarOrSameVectorSize))
8137 return SDValue();
8138
8139 // If we are comparing vectors, then the result needs to be a i1 boolean that
8140 // is then extended back to the legal result type depending on how booleans
8141 // are represented.
8142 EVT SVT = (Opcode == ISD::SETCC ? MVT::i1 : VT.getScalarType());
8143 ISD::NodeType ExtendCode =
8144 (Opcode == ISD::SETCC && SVT != VT.getScalarType())
8145 ? TargetLowering::getExtendForContent(TLI->getBooleanContents(VT))
8147
8148 // Find legal integer scalar type for constant promotion and
8149 // ensure that its scalar size is at least as large as source.
8150 EVT LegalSVT = VT.getScalarType();
8151 if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
8152 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
8153 if (LegalSVT.bitsLT(VT.getScalarType()))
8154 return SDValue();
8155 }
8156
8157 // For scalable vector types we know we're dealing with SPLAT_VECTORs. We
8158 // only have one operand to check. For fixed-length vector types we may have
8159 // a combination of BUILD_VECTOR and SPLAT_VECTOR.
8160 unsigned NumVectorElts = NumElts.isScalable() ? 1 : NumElts.getFixedValue();
8161
8162 // Constant fold each scalar lane separately.
8163 SmallVector<SDValue, 4> ScalarResults;
8164 for (unsigned I = 0; I != NumVectorElts; I++) {
8165 SmallVector<SDValue, 4> ScalarOps;
8166 for (SDValue Op : Ops) {
8167 EVT InSVT = Op.getValueType().getScalarType();
8168 if (Op.getOpcode() != ISD::BUILD_VECTOR &&
8169 Op.getOpcode() != ISD::SPLAT_VECTOR) {
8170 if (Op.isUndef())
8171 ScalarOps.push_back(getUNDEF(InSVT));
8172 else
8173 ScalarOps.push_back(Op);
8174 continue;
8175 }
8176
8177 SDValue ScalarOp =
8178 Op.getOperand(Op.getOpcode() == ISD::SPLAT_VECTOR ? 0 : I);
8179 EVT ScalarVT = ScalarOp.getValueType();
8180
8181 // Build vector (integer) scalar operands may need implicit
8182 // truncation - do this before constant folding.
8183 if (ScalarVT.isInteger() && ScalarVT.bitsGT(InSVT)) {
8184 // Don't create illegally-typed nodes unless they're constants or undef
8185 // - if we fail to constant fold we can't guarantee the (dead) nodes
8186 // we're creating will be cleaned up before being visited for
8187 // legalization.
8188 if (NewNodesMustHaveLegalTypes && !ScalarOp.isUndef() &&
8189 !isa<ConstantSDNode>(ScalarOp) &&
8190 TLI->getTypeAction(*getContext(), InSVT) !=
8192 return SDValue();
8193 ScalarOp = getNode(ISD::TRUNCATE, DL, InSVT, ScalarOp);
8194 }
8195
8196 ScalarOps.push_back(ScalarOp);
8197 }
8198
8199 // Constant fold the scalar operands.
8200 SDValue ScalarResult = getNode(Opcode, DL, SVT, ScalarOps, Flags);
8201
8202 // Scalar folding only succeeded if the result is a constant or UNDEF.
8203 if (!ScalarResult.isUndef() && ScalarResult.getOpcode() != ISD::Constant &&
8204 ScalarResult.getOpcode() != ISD::ConstantFP)
8205 return SDValue();
8206
8207 // Legalize the (integer) scalar constant if necessary. We only do
8208 // this once we know the folding succeeded, since otherwise we would
8209 // get a node with illegal type which has a user.
8210 if (LegalSVT != SVT)
8211 ScalarResult = getNode(ExtendCode, DL, LegalSVT, ScalarResult);
8212
8213 ScalarResults.push_back(ScalarResult);
8214 }
8215
8216 SDValue V = NumElts.isScalable() ? getSplatVector(VT, DL, ScalarResults[0])
8217 : getBuildVector(VT, DL, ScalarResults);
8218 NewSDValueDbgMsg(V, "New node fold constant vector: ", this);
8219 return V;
8220}
8221
8224 // TODO: Add support for unary/ternary fp opcodes.
8225 if (Ops.size() != 2)
8226 return SDValue();
8227
8228 // TODO: We don't do any constant folding for strict FP opcodes here, but we
8229 // should. That will require dealing with a potentially non-default
8230 // rounding mode, checking the "opStatus" return value from the APFloat
8231 // math calculations, and possibly other variations.
8232 SDValue N1 = Ops[0];
8233 SDValue N2 = Ops[1];
8234 ConstantFPSDNode *N1CFP = isConstOrConstSplatFP(N1, /*AllowUndefs*/ false);
8235 ConstantFPSDNode *N2CFP = isConstOrConstSplatFP(N2, /*AllowUndefs*/ false);
8236 if (N1CFP && N2CFP) {
8237 APFloat C1 = N1CFP->getValueAPF(); // make copy
8238 const APFloat &C2 = N2CFP->getValueAPF();
8239 switch (Opcode) {
8240 case ISD::FADD:
8242 return getConstantFP(C1, DL, VT);
8243 case ISD::FSUB:
8245 return getConstantFP(C1, DL, VT);
8246 case ISD::FMUL:
8248 return getConstantFP(C1, DL, VT);
8249 case ISD::FDIV:
8251 return getConstantFP(C1, DL, VT);
8252 case ISD::FREM:
8253 C1.mod(C2);
8254 return getConstantFP(C1, DL, VT);
8255 case ISD::FCOPYSIGN:
8256 C1.copySign(C2);
8257 return getConstantFP(C1, DL, VT);
8258 case ISD::FMINNUM:
8259 return getConstantFP(minnum(C1, C2), DL, VT);
8260 case ISD::FMAXNUM:
8261 return getConstantFP(maxnum(C1, C2), DL, VT);
8262 case ISD::FMINIMUM:
8263 return getConstantFP(minimum(C1, C2), DL, VT);
8264 case ISD::FMAXIMUM:
8265 return getConstantFP(maximum(C1, C2), DL, VT);
8266 case ISD::FMINIMUMNUM:
8267 return getConstantFP(minimumnum(C1, C2), DL, VT);
8268 case ISD::FMAXIMUMNUM:
8269 return getConstantFP(maximumnum(C1, C2), DL, VT);
8270 default: break;
8271 }
8272 }
8273 if (N1CFP && Opcode == ISD::FP_ROUND) {
8274 APFloat C1 = N1CFP->getValueAPF(); // make copy
8275 bool Unused;
8276 // This can return overflow, underflow, or inexact; we don't care.
8277 // FIXME need to be more flexible about rounding mode.
8279 &Unused);
8280 return getConstantFP(C1, DL, VT);
8281 }
8282
8283 switch (Opcode) {
8284 case ISD::FSUB:
8285 // -0.0 - undef --> undef (consistent with "fneg undef")
8286 if (ConstantFPSDNode *N1C = isConstOrConstSplatFP(N1, /*AllowUndefs*/ true))
8287 if (N1C && N1C->getValueAPF().isNegZero() && N2.isUndef())
8288 return getUNDEF(VT);
8289 [[fallthrough]];
8290
8291 case ISD::FADD:
8292 case ISD::FMUL:
8293 case ISD::FDIV:
8294 case ISD::FREM:
8295 // If both operands are undef, the result is undef. If 1 operand is undef,
8296 // the result is NaN. This should match the behavior of the IR optimizer.
8297 if (N1.isUndef() && N2.isUndef())
8298 return getUNDEF(VT);
8299 if (N1.isUndef() || N2.isUndef())
8301 }
8302 return SDValue();
8303}
8304
8306 const SDLoc &DL, EVT DstEltVT) {
8307 EVT SrcEltVT = BV->getValueType(0).getVectorElementType();
8308
8309 // If this is already the right type, we're done.
8310 if (SrcEltVT == DstEltVT)
8311 return SDValue(BV, 0);
8312
8313 unsigned SrcBitSize = SrcEltVT.getSizeInBits();
8314 unsigned DstBitSize = DstEltVT.getSizeInBits();
8315
8316 // If this is a conversion of N elements of one type to N elements of another
8317 // type, convert each element. This handles FP<->INT cases.
8318 if (SrcBitSize == DstBitSize) {
8320 for (SDValue Op : BV->op_values()) {
8321 // If the vector element type is not legal, the BUILD_VECTOR operands
8322 // are promoted and implicitly truncated. Make that explicit here.
8323 if (Op.getValueType() != SrcEltVT)
8324 Op = getNode(ISD::TRUNCATE, DL, SrcEltVT, Op);
8325 Ops.push_back(getBitcast(DstEltVT, Op));
8326 }
8327 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT,
8329 return getBuildVector(VT, DL, Ops);
8330 }
8331
8332 // Otherwise, we're growing or shrinking the elements. To avoid having to
8333 // handle annoying details of growing/shrinking FP values, we convert them to
8334 // int first.
8335 if (SrcEltVT.isFloatingPoint()) {
8336 // Convert the input float vector to a int vector where the elements are the
8337 // same sizes.
8338 EVT IntEltVT = EVT::getIntegerVT(*getContext(), SrcEltVT.getSizeInBits());
8339 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8341 DstEltVT);
8342 return SDValue();
8343 }
8344
8345 // Now we know the input is an integer vector. If the output is a FP type,
8346 // convert to integer first, then to FP of the right size.
8347 if (DstEltVT.isFloatingPoint()) {
8348 EVT IntEltVT = EVT::getIntegerVT(*getContext(), DstEltVT.getSizeInBits());
8349 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8351 DstEltVT);
8352 return SDValue();
8353 }
8354
8355 // Okay, we know the src/dst types are both integers of differing types.
8356 assert(SrcEltVT.isInteger() && DstEltVT.isInteger());
8357
8358 // Extract the constant raw bit data.
8359 BitVector UndefElements;
8360 SmallVector<APInt> RawBits;
8361 bool IsLE = getDataLayout().isLittleEndian();
8362 if (!BV->getConstantRawBits(IsLE, DstBitSize, RawBits, UndefElements))
8363 return SDValue();
8364
8366 for (unsigned I = 0, E = RawBits.size(); I != E; ++I) {
8367 if (UndefElements[I])
8368 Ops.push_back(getUNDEF(DstEltVT));
8369 else
8370 Ops.push_back(getConstant(RawBits[I], DL, DstEltVT));
8371 }
8372
8373 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT, Ops.size());
8374 return getBuildVector(VT, DL, Ops);
8375}
8376
8378 assert(Val.getValueType().isInteger() && "Invalid AssertAlign!");
8379
8380 // There's no need to assert on a byte-aligned pointer. All pointers are at
8381 // least byte aligned.
8382 if (A == Align(1))
8383 return Val;
8384
8385 SDVTList VTs = getVTList(Val.getValueType());
8386 SDValue Ops[] = {Val};
8387 SDNodeKey ID(ISD::AssertAlign, VTs, Ops);
8388 ID.AddInteger(A.value());
8389
8390 FoldingSetInsertToken InsertToken;
8391 if (SDNode *E = lookupNode(ID, DL, InsertToken))
8392 return SDValue(E, 0);
8393
8394 auto *N =
8395 newSDNode<AssertAlignSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, A);
8396 createOperands(N, {Val});
8397
8398 CSEMap.insert(N, InsertToken);
8399 InsertNode(N);
8400
8401 SDValue V(N, 0);
8402 NewSDValueDbgMsg(V, "Creating new node: ", this);
8403 return V;
8404}
8405
8406SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8407 SDValue N1, SDValue N2) {
8408 SDNodeFlags Flags;
8409 if (Inserter)
8410 Flags = Inserter->getFlags();
8411 return getNode(Opcode, DL, VT, N1, N2, Flags);
8412}
8413
8415 SDValue &N2) const {
8416 if (!TLI->isCommutativeBinOp(Opcode))
8417 return;
8418
8419 // Canonicalize:
8420 // binop(const, nonconst) -> binop(nonconst, const)
8423 bool N1CFP = isConstantFPBuildVectorOrConstantFP(N1);
8424 bool N2CFP = isConstantFPBuildVectorOrConstantFP(N2);
8425 if ((N1C && !N2C) || (N1CFP && !N2CFP))
8426 std::swap(N1, N2);
8427
8428 // Canonicalize:
8429 // binop(splat(x), step_vector) -> binop(step_vector, splat(x))
8430 else if (N1.getOpcode() == ISD::SPLAT_VECTOR &&
8432 std::swap(N1, N2);
8433}
8434
8435SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8436 SDValue N1, SDValue N2, const SDNodeFlags Flags) {
8438 N2.getOpcode() != ISD::DELETED_NODE &&
8439 "Operand is DELETED_NODE!");
8440
8441 canonicalizeCommutativeBinop(Opcode, N1, N2);
8442
8443 auto *N1C = dyn_cast<ConstantSDNode>(N1);
8444 auto *N2C = dyn_cast<ConstantSDNode>(N2);
8445
8446 // Don't allow undefs in vector splats - we might be returning N2 when folding
8447 // to zero etc.
8448 ConstantSDNode *N2CV =
8449 isConstOrConstSplat(N2, /*AllowUndefs*/ false, /*AllowTruncation*/ true);
8450
8451 switch (Opcode) {
8452 default: break;
8453 case ISD::TokenFactor:
8454 assert(VT == MVT::Other && N1.getValueType() == MVT::Other &&
8455 N2.getValueType() == MVT::Other && "Invalid token factor!");
8456 // Fold trivial token factors.
8457 if (N1.getOpcode() == ISD::EntryToken) return N2;
8458 if (N2.getOpcode() == ISD::EntryToken) return N1;
8459 if (N1 == N2) return N1;
8460 break;
8461 case ISD::BUILD_VECTOR: {
8462 // Attempt to simplify BUILD_VECTOR.
8463 SDValue Ops[] = {N1, N2};
8464 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
8465 return V;
8466 break;
8467 }
8468 case ISD::CONCAT_VECTORS: {
8469 SDValue Ops[] = {N1, N2};
8470 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
8471 return V;
8472 break;
8473 }
8474 case ISD::AND:
8475 assert(VT.isInteger() && "This operator does not apply to FP types!");
8476 assert(N1.getValueType() == N2.getValueType() &&
8477 N1.getValueType() == VT && "Binary operator types must match!");
8478 // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's
8479 // worth handling here.
8480 if (N2CV && N2CV->isZero())
8481 return N2;
8482 if (N2CV && N2CV->isAllOnes()) // X & -1 -> X
8483 return N1;
8484 break;
8485 case ISD::OR:
8486 case ISD::XOR:
8487 case ISD::ADD:
8488 case ISD::PTRADD:
8489 case ISD::SUB:
8490 assert(VT.isInteger() && "This operator does not apply to FP types!");
8491 assert(N1.getValueType() == N2.getValueType() &&
8492 N1.getValueType() == VT && "Binary operator types must match!");
8493 // The equal operand types requirement is unnecessarily strong for PTRADD.
8494 // However, the SelectionDAGBuilder does not generate PTRADDs with different
8495 // operand types, and we'd need to re-implement GEP's non-standard wrapping
8496 // logic everywhere where PTRADDs may be folded or combined to properly
8497 // support them. If/when we introduce pointer types to the SDAG, we will
8498 // need to relax this constraint.
8499
8500 // (X ^|+- 0) -> X. This commonly occurs when legalizing i64 values, so
8501 // it's worth handling here.
8502 if (N2CV && N2CV->isZero())
8503 return N1;
8504 if ((Opcode == ISD::ADD || Opcode == ISD::SUB) &&
8505 VT.getScalarType() == MVT::i1)
8506 return getNode(ISD::XOR, DL, VT, N1, N2);
8507 // Fold (add (vscale * C0), (vscale * C1)) to (vscale * (C0 + C1)).
8508 if (Opcode == ISD::ADD && N1.getOpcode() == ISD::VSCALE &&
8509 N2.getOpcode() == ISD::VSCALE) {
8510 const APInt &C1 = N1->getConstantOperandAPInt(0);
8511 const APInt &C2 = N2->getConstantOperandAPInt(0);
8512 return getVScale(DL, VT, C1 + C2);
8513 }
8514 break;
8515 case ISD::MUL:
8516 assert(VT.isInteger() && "This operator does not apply to FP types!");
8517 assert(N1.getValueType() == N2.getValueType() &&
8518 N1.getValueType() == VT && "Binary operator types must match!");
8519 if (VT.getScalarType() == MVT::i1)
8520 return getNode(ISD::AND, DL, VT, N1, N2);
8521 if (N2CV && N2CV->isZero())
8522 return N2;
8523 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8524 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8525 const APInt &N2CImm = N2C->getAPIntValue();
8526 return getVScale(DL, VT, MulImm * N2CImm);
8527 }
8528 break;
8529 case ISD::UDIV:
8530 case ISD::UREM:
8531 case ISD::MULHU:
8532 case ISD::MULHS:
8533 case ISD::SDIV:
8534 case ISD::SREM:
8535 case ISD::SADDSAT:
8536 case ISD::SSUBSAT:
8537 case ISD::UADDSAT:
8538 case ISD::USUBSAT:
8539 assert(VT.isInteger() && "This operator does not apply to FP types!");
8540 assert(N1.getValueType() == N2.getValueType() &&
8541 N1.getValueType() == VT && "Binary operator types must match!");
8542 if (VT.getScalarType() == MVT::i1) {
8543 // fold (add_sat x, y) -> (or x, y) for bool types.
8544 if (Opcode == ISD::SADDSAT || Opcode == ISD::UADDSAT)
8545 return getNode(ISD::OR, DL, VT, N1, N2);
8546 // fold (sub_sat x, y) -> (and x, ~y) for bool types.
8547 if (Opcode == ISD::SSUBSAT || Opcode == ISD::USUBSAT)
8548 return getNode(ISD::AND, DL, VT, N1, getNOT(DL, N2, VT));
8549 }
8550 break;
8551 case ISD::SCMP:
8552 case ISD::UCMP:
8553 assert(N1.getValueType() == N2.getValueType() &&
8554 "Types of operands of UCMP/SCMP must match");
8555 assert(N1.getValueType().isVector() == VT.isVector() &&
8556 "Operands and return type of must both be scalars or vectors");
8557 if (VT.isVector())
8560 "Result and operands must have the same number of elements");
8561 break;
8562 case ISD::AVGFLOORS:
8563 case ISD::AVGFLOORU:
8564 case ISD::AVGCEILS:
8565 case ISD::AVGCEILU:
8566 assert(VT.isInteger() && "This operator does not apply to FP types!");
8567 assert(N1.getValueType() == N2.getValueType() &&
8568 N1.getValueType() == VT && "Binary operator types must match!");
8569 break;
8570 case ISD::ABDS:
8571 case ISD::ABDU:
8572 assert(VT.isInteger() && "This operator does not apply to FP types!");
8573 assert(N1.getValueType() == N2.getValueType() &&
8574 N1.getValueType() == VT && "Binary operator types must match!");
8575 if (VT.getScalarType() == MVT::i1)
8576 return getNode(ISD::XOR, DL, VT, N1, N2);
8577 break;
8578 case ISD::SMIN:
8579 case ISD::UMAX:
8580 assert(VT.isInteger() && "This operator does not apply to FP types!");
8581 assert(N1.getValueType() == N2.getValueType() &&
8582 N1.getValueType() == VT && "Binary operator types must match!");
8583 if (VT.getScalarType() == MVT::i1)
8584 return getNode(ISD::OR, DL, VT, N1, N2);
8585 break;
8586 case ISD::SMAX:
8587 case ISD::UMIN:
8588 assert(VT.isInteger() && "This operator does not apply to FP types!");
8589 assert(N1.getValueType() == N2.getValueType() &&
8590 N1.getValueType() == VT && "Binary operator types must match!");
8591 if (VT.getScalarType() == MVT::i1)
8592 return getNode(ISD::AND, DL, VT, N1, N2);
8593 break;
8594 case ISD::FADD:
8595 case ISD::FSUB:
8596 case ISD::FMUL:
8597 case ISD::FDIV:
8598 case ISD::FREM:
8599 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
8600 assert(N1.getValueType() == N2.getValueType() &&
8601 N1.getValueType() == VT && "Binary operator types must match!");
8602 if (SDValue V = simplifyFPBinop(Opcode, N1, N2, Flags))
8603 return V;
8604 break;
8605 case ISD::FCOPYSIGN: // N1 and result must match. N1/N2 need not match.
8606 assert(N1.getValueType() == VT &&
8609 "Invalid FCOPYSIGN!");
8610 break;
8611 case ISD::SHL:
8612 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8613 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8614 const APInt &ShiftImm = N2C->getAPIntValue();
8615 return getVScale(DL, VT, MulImm << ShiftImm);
8616 }
8617 [[fallthrough]];
8618 case ISD::SRA:
8619 case ISD::SRL:
8620 if (SDValue V = simplifyShift(N1, N2))
8621 return V;
8622 [[fallthrough]];
8623 case ISD::ROTL:
8624 case ISD::ROTR:
8625 case ISD::SSHLSAT:
8626 case ISD::USHLSAT:
8627 assert(VT == N1.getValueType() &&
8628 "Shift operators return type must be the same as their first arg");
8629 assert(VT.isInteger() && N2.getValueType().isInteger() &&
8630 "Shifts only work on integers");
8631 assert((!VT.isVector() || VT == N2.getValueType()) &&
8632 "Vector shift amounts must be in the same as their first arg");
8633 // Verify that the shift amount VT is big enough to hold valid shift
8634 // amounts. This catches things like trying to shift an i1024 value by an
8635 // i8, which is easy to fall into in generic code that uses
8636 // TLI.getShiftAmount().
8639 "Invalid use of small shift amount with oversized value!");
8640
8641 // Always fold shifts of i1 values so the code generator doesn't need to
8642 // handle them. Since we know the size of the shift has to be less than the
8643 // size of the value, the shift/rotate count is guaranteed to be zero.
8644 if (VT == MVT::i1)
8645 return N1;
8646 if (N2CV && N2CV->isZero())
8647 return N1;
8648 break;
8649 case ISD::FP_ROUND:
8651 VT.bitsLE(N1.getValueType()) && N2C &&
8652 (N2C->getZExtValue() == 0 || N2C->getZExtValue() == 1) &&
8653 N2.getOpcode() == ISD::TargetConstant && "Invalid FP_ROUND!");
8654 if (N1.getValueType() == VT) return N1; // noop conversion.
8655 break;
8656 case ISD::IS_FPCLASS: {
8658 "IS_FPCLASS is used for a non-floating type");
8659 assert(isa<ConstantSDNode>(N2) && "FPClassTest is not Constant");
8660 // is.fpclass(poison, mask) -> poison
8661 if (N1.getOpcode() == ISD::POISON)
8662 return getPOISON(VT);
8663 FPClassTest Mask = static_cast<FPClassTest>(N2->getAsZExtVal());
8664 // If all tests are made, it doesn't matter what the value is.
8665 if ((Mask & fcAllFlags) == fcAllFlags)
8666 return getBoolConstant(true, DL, VT, N1.getValueType());
8667 if ((Mask & fcAllFlags) == 0)
8668 return getBoolConstant(false, DL, VT, N1.getValueType());
8669 break;
8670 }
8671 case ISD::AssertNoFPClass: {
8673 "AssertNoFPClass is used for a non-floating type");
8674 assert(isa<ConstantSDNode>(N2) && "NoFPClass is not Constant");
8675 FPClassTest NoFPClass = static_cast<FPClassTest>(N2->getAsZExtVal());
8676 assert(llvm::to_underlying(NoFPClass) <=
8678 "FPClassTest value too large");
8679 (void)NoFPClass;
8680 break;
8681 }
8682 case ISD::AssertSext:
8683 case ISD::AssertZext: {
8684 EVT EVT = cast<VTSDNode>(N2)->getVT();
8685 assert(VT == N1.getValueType() && "Not an inreg extend!");
8686 assert(VT.isInteger() && EVT.isInteger() &&
8687 "Cannot *_EXTEND_INREG FP types");
8688 assert(!EVT.isVector() &&
8689 "AssertSExt/AssertZExt type should be the vector element type "
8690 "rather than the vector type!");
8691 assert(EVT.bitsLE(VT.getScalarType()) && "Not extending!");
8692 if (VT.getScalarType() == EVT) return N1; // noop assertion.
8693 break;
8694 }
8696 EVT EVT = cast<VTSDNode>(N2)->getVT();
8697 assert(VT == N1.getValueType() && "Not an inreg extend!");
8698 assert(VT.isInteger() && EVT.isInteger() &&
8699 "Cannot *_EXTEND_INREG FP types");
8700 assert(EVT.isVector() == VT.isVector() &&
8701 "SIGN_EXTEND_INREG type should be vector iff the operand "
8702 "type is vector!");
8703 assert((!EVT.isVector() ||
8705 "Vector element counts must match in SIGN_EXTEND_INREG");
8706 assert(EVT.getScalarType().bitsLE(VT.getScalarType()) && "Not extending!");
8707 if (EVT == VT) return N1; // Not actually extending
8708 break;
8709 }
8711 case ISD::FP_TO_UINT_SAT: {
8712 assert(VT.isInteger() && cast<VTSDNode>(N2)->getVT().isInteger() &&
8713 N1.getValueType().isFloatingPoint() && "Invalid FP_TO_*INT_SAT");
8714 assert(N1.getValueType().isVector() == VT.isVector() &&
8715 "FP_TO_*INT_SAT type should be vector iff the operand type is "
8716 "vector!");
8717 assert((!VT.isVector() || VT.getVectorElementCount() ==
8719 "Vector element counts must match in FP_TO_*INT_SAT");
8720 assert(!cast<VTSDNode>(N2)->getVT().isVector() &&
8721 "Type to saturate to must be a scalar.");
8722 assert(cast<VTSDNode>(N2)->getVT().bitsLE(VT.getScalarType()) &&
8723 "Not extending!");
8724 break;
8725 }
8728 "The result of EXTRACT_VECTOR_ELT must be at least as wide as the \
8729 element type of the vector.");
8730
8731 // Extract from an undefined value or using an undefined index is undefined.
8732 if (N1.isUndef() || N2.isUndef())
8733 return getUNDEF(VT);
8734
8735 // EXTRACT_VECTOR_ELT of out-of-bounds element is POISON for fixed length
8736 // vectors. For scalable vectors we will provide appropriate support for
8737 // dealing with arbitrary indices.
8738 if (N2C && N1.getValueType().isFixedLengthVector() &&
8739 N2C->getAPIntValue().uge(N1.getValueType().getVectorNumElements()))
8740 return getPOISON(VT);
8741
8742 // EXTRACT_VECTOR_ELT of CONCAT_VECTORS is often formed while lowering is
8743 // expanding copies of large vectors from registers. This only works for
8744 // fixed length vectors, since we need to know the exact number of
8745 // elements.
8746 if (N2C && N1.getOpcode() == ISD::CONCAT_VECTORS &&
8748 unsigned Factor = N1.getOperand(0).getValueType().getVectorNumElements();
8749 return getExtractVectorElt(DL, VT,
8750 N1.getOperand(N2C->getZExtValue() / Factor),
8751 N2C->getZExtValue() % Factor);
8752 }
8753
8754 // EXTRACT_VECTOR_ELT of BUILD_VECTOR or SPLAT_VECTOR is often formed while
8755 // lowering is expanding large vector constants.
8756 if (N2C && (N1.getOpcode() == ISD::BUILD_VECTOR ||
8757 N1.getOpcode() == ISD::SPLAT_VECTOR)) {
8760 "BUILD_VECTOR used for scalable vectors");
8761 unsigned Index =
8762 N1.getOpcode() == ISD::BUILD_VECTOR ? N2C->getZExtValue() : 0;
8763 SDValue Elt = N1.getOperand(Index);
8764
8765 if (VT != Elt.getValueType())
8766 // If the vector element type is not legal, the BUILD_VECTOR operands
8767 // are promoted and implicitly truncated, and the result implicitly
8768 // extended. Make that explicit here.
8769 Elt = getAnyExtOrTrunc(Elt, DL, VT);
8770
8771 return Elt;
8772 }
8773
8774 // EXTRACT_VECTOR_ELT of INSERT_VECTOR_ELT is often formed when vector
8775 // operations are lowered to scalars.
8776 if (N1.getOpcode() == ISD::INSERT_VECTOR_ELT) {
8777 // If the indices are the same, return the inserted element else
8778 // if the indices are known different, extract the element from
8779 // the original vector.
8780 SDValue N1Op2 = N1.getOperand(2);
8782
8783 if (N1Op2C && N2C) {
8784 if (N1Op2C->getZExtValue() == N2C->getZExtValue()) {
8785 if (VT == N1.getOperand(1).getValueType())
8786 return N1.getOperand(1);
8787 if (VT.isFloatingPoint()) {
8789 return getFPExtendOrRound(N1.getOperand(1), DL, VT);
8790 }
8791 return getSExtOrTrunc(N1.getOperand(1), DL, VT);
8792 }
8793 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0), N2);
8794 }
8795 }
8796
8797 // EXTRACT_VECTOR_ELT of v1iX EXTRACT_SUBVECTOR could be formed
8798 // when vector types are scalarized and v1iX is legal.
8799 // vextract (v1iX extract_subvector(vNiX, Idx)) -> vextract(vNiX,Idx).
8800 // Here we are completely ignoring the extract element index (N2),
8801 // which is fine for fixed width vectors, since any index other than 0
8802 // is undefined anyway. However, this cannot be ignored for scalable
8803 // vectors - in theory we could support this, but we don't want to do this
8804 // without a profitability check.
8805 if (N1.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
8807 N1.getValueType().getVectorNumElements() == 1) {
8808 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0),
8809 N1.getOperand(1));
8810 }
8811 break;
8813 assert(N2C && (unsigned)N2C->getZExtValue() < 2 && "Bad EXTRACT_ELEMENT!");
8814 assert(!N1.getValueType().isVector() && !VT.isVector() &&
8815 (N1.getValueType().isInteger() == VT.isInteger()) &&
8816 N1.getValueType() != VT &&
8817 "Wrong types for EXTRACT_ELEMENT!");
8818
8819 // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding
8820 // 64-bit integers into 32-bit parts. Instead of building the extract of
8821 // the BUILD_PAIR, only to have legalize rip it apart, just do it now.
8822 if (N1.getOpcode() == ISD::BUILD_PAIR)
8823 return N1.getOperand(N2C->getZExtValue());
8824
8825 // EXTRACT_ELEMENT of a constant int is also very common.
8826 if (N1C) {
8827 unsigned ElementSize = VT.getSizeInBits();
8828 unsigned Shift = ElementSize * N2C->getZExtValue();
8829 const APInt &Val = N1C->getAPIntValue();
8830 return getConstant(Val.extractBits(ElementSize, Shift), DL, VT);
8831 }
8832 break;
8834 EVT N1VT = N1.getValueType();
8835 assert(VT.isVector() && N1VT.isVector() &&
8836 "Extract subvector VTs must be vectors!");
8838 "Extract subvector VTs must have the same element type!");
8839 assert((VT.isFixedLengthVector() || N1VT.isScalableVector()) &&
8840 "Cannot extract a scalable vector from a fixed length vector!");
8841 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8843 "Extract subvector must be from larger vector to smaller vector!");
8844 assert(N2C && "Extract subvector index must be a constant");
8845 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8846 (VT.getVectorMinNumElements() + N2C->getZExtValue()) <=
8847 N1VT.getVectorMinNumElements()) &&
8848 "Extract subvector overflow!");
8849 assert(N2C->getAPIntValue().getBitWidth() ==
8850 TLI->getVectorIdxWidth(getDataLayout()) &&
8851 "Constant index for EXTRACT_SUBVECTOR has an invalid size");
8852 assert(N2C->getZExtValue() % VT.getVectorMinNumElements() == 0 &&
8853 "Extract index is not a multiple of the output vector length");
8854
8855 // Trivial extraction.
8856 if (VT == N1VT)
8857 return N1;
8858
8859 // EXTRACT_SUBVECTOR of an UNDEF is an UNDEF.
8860 if (N1.isUndef())
8861 return getUNDEF(VT);
8862
8863 // EXTRACT_SUBVECTOR of CONCAT_VECTOR can be simplified if the pieces of
8864 // the concat have the same type as the extract.
8865 if (N1.getOpcode() == ISD::CONCAT_VECTORS &&
8866 VT == N1.getOperand(0).getValueType()) {
8867 unsigned Factor = VT.getVectorMinNumElements();
8868 return N1.getOperand(N2C->getZExtValue() / Factor);
8869 }
8870
8871 // EXTRACT_SUBVECTOR of INSERT_SUBVECTOR is often created
8872 // during shuffle legalization.
8873 if (N1.getOpcode() == ISD::INSERT_SUBVECTOR && N2 == N1.getOperand(2) &&
8874 VT == N1.getOperand(1).getValueType())
8875 return N1.getOperand(1);
8876 break;
8877 }
8878 }
8879
8880 if (N1.getOpcode() == ISD::POISON || N2.getOpcode() == ISD::POISON) {
8881 switch (Opcode) {
8882 case ISD::XOR:
8883 case ISD::ADD:
8884 case ISD::PTRADD:
8885 case ISD::SUB:
8887 case ISD::UDIV:
8888 case ISD::SDIV:
8889 case ISD::UREM:
8890 case ISD::SREM:
8891 case ISD::MUL:
8892 case ISD::AND:
8893 case ISD::SSUBSAT:
8894 case ISD::USUBSAT:
8895 case ISD::UMIN:
8896 case ISD::OR:
8897 case ISD::SADDSAT:
8898 case ISD::UADDSAT:
8899 case ISD::UMAX:
8900 case ISD::SMAX:
8901 case ISD::SMIN:
8902 // fold op(arg1, poison) -> poison, fold op(poison, arg2) -> poison.
8903 return N2.getOpcode() == ISD::POISON ? N2 : N1;
8904 }
8905 }
8906
8907 // Canonicalize an UNDEF to the RHS, even over a constant.
8908 if (N1.getOpcode() == ISD::UNDEF && N2.getOpcode() != ISD::UNDEF) {
8909 if (TLI->isCommutativeBinOp(Opcode)) {
8910 std::swap(N1, N2);
8911 } else {
8912 switch (Opcode) {
8913 case ISD::PTRADD:
8914 case ISD::SUB:
8915 // fold op(undef, non_undef_arg2) -> undef.
8916 return N1;
8918 case ISD::UDIV:
8919 case ISD::SDIV:
8920 case ISD::UREM:
8921 case ISD::SREM:
8922 case ISD::SSUBSAT:
8923 case ISD::USUBSAT:
8924 // fold op(undef, non_undef_arg2) -> 0.
8925 return getConstant(0, DL, VT);
8926 }
8927 }
8928 }
8929
8930 // Fold a bunch of operators when the RHS is undef.
8931 if (N2.getOpcode() == ISD::UNDEF) {
8932 switch (Opcode) {
8933 case ISD::XOR:
8934 if (N1.getOpcode() == ISD::UNDEF)
8935 // Handle undef ^ undef -> 0 special case. This is a common
8936 // idiom (misuse).
8937 return getConstant(0, DL, VT);
8938 [[fallthrough]];
8939 case ISD::ADD:
8940 case ISD::PTRADD:
8941 case ISD::SUB:
8942 // fold op(arg1, undef) -> undef.
8943 return N2;
8944 case ISD::UDIV:
8945 case ISD::SDIV:
8946 case ISD::UREM:
8947 case ISD::SREM:
8948 // fold op(arg1, undef) -> poison.
8949 return getPOISON(VT);
8950 case ISD::MUL:
8951 case ISD::AND:
8952 case ISD::SSUBSAT:
8953 case ISD::USUBSAT:
8954 case ISD::UMIN:
8955 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> 0.
8956 return N1.getOpcode() == ISD::UNDEF ? N2 : getConstant(0, DL, VT);
8957 case ISD::OR:
8958 case ISD::SADDSAT:
8959 case ISD::UADDSAT:
8960 case ISD::UMAX:
8961 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> -1.
8962 return N1.getOpcode() == ISD::UNDEF ? N2 : getAllOnesConstant(DL, VT);
8963 case ISD::SMAX:
8964 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MAX_INT.
8965 return N1.getOpcode() == ISD::UNDEF
8966 ? N2
8967 : getConstant(
8969 VT);
8970 case ISD::SMIN:
8971 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MIN_INT.
8972 return N1.getOpcode() == ISD::UNDEF
8973 ? N2
8974 : getConstant(
8976 VT);
8977 }
8978 }
8979
8980 // Perform trivial constant folding.
8981 if (SDValue SV = FoldConstantArithmetic(Opcode, DL, VT, {N1, N2}, Flags))
8982 return SV;
8983
8984 // Memoize this node if possible.
8985 SDNode *N;
8986 SDVTList VTs = getVTList(VT);
8987 SDValue Ops[] = {N1, N2};
8988 if (VT != MVT::Glue) {
8989 SDNodeKey ID(Opcode, VTs, Ops);
8990 FoldingSetInsertToken InsertToken;
8991 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
8992 E->intersectFlagsWith(Flags);
8993 return SDValue(E, 0);
8994 }
8995
8996 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8997 N->setFlags(Flags);
8998 createOperands(N, Ops);
8999 CSEMap.insert(N, InsertToken);
9000 } else {
9001 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9002 createOperands(N, Ops);
9003 }
9004
9005 InsertNode(N);
9006 SDValue V = SDValue(N, 0);
9007 NewSDValueDbgMsg(V, "Creating new node: ", this);
9008 return V;
9009}
9010
9011SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9012 SDValue N1, SDValue N2, SDValue N3) {
9013 SDNodeFlags Flags;
9014 if (Inserter)
9015 Flags = Inserter->getFlags();
9016 return getNode(Opcode, DL, VT, N1, N2, N3, Flags);
9017}
9018
9019SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9020 SDValue N1, SDValue N2, SDValue N3,
9021 const SDNodeFlags Flags) {
9023 N2.getOpcode() != ISD::DELETED_NODE &&
9024 N3.getOpcode() != ISD::DELETED_NODE &&
9025 "Operand is DELETED_NODE!");
9026 // Perform various simplifications.
9027 switch (Opcode) {
9028 case ISD::BUILD_VECTOR: {
9029 // Attempt to simplify BUILD_VECTOR.
9030 SDValue Ops[] = {N1, N2, N3};
9031 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
9032 return V;
9033 break;
9034 }
9035 case ISD::CONCAT_VECTORS: {
9036 SDValue Ops[] = {N1, N2, N3};
9037 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
9038 return V;
9039 break;
9040 }
9041 case ISD::SETCC: {
9042 assert(VT.isInteger() && "SETCC result type must be an integer!");
9043 assert(N1.getValueType() == N2.getValueType() &&
9044 "SETCC operands must have the same type!");
9045 assert(VT.isVector() == N1.getValueType().isVector() &&
9046 "SETCC type should be vector iff the operand type is vector!");
9047 assert((!VT.isVector() || VT.getVectorElementCount() ==
9049 "SETCC vector element counts must match!");
9050 // Use FoldSetCC to simplify SETCC's.
9051 if (SDValue V =
9052 FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get(), DL, Flags))
9053 return V;
9054 break;
9055 }
9056 case ISD::SELECT:
9057 case ISD::VSELECT:
9058 if (SDValue V = simplifySelect(N1, N2, N3))
9059 return V;
9060 break;
9062 llvm_unreachable("should use getVectorShuffle constructor!");
9064 if (isNullConstant(N3))
9065 return N1;
9066 break;
9068 if (isNullConstant(N3))
9069 return N2;
9070 break;
9072 assert(VT.isVector() && VT == N1.getValueType() &&
9073 "INSERT_VECTOR_ELT vector type mismatch");
9075 "INSERT_VECTOR_ELT scalar fp/int mismatch");
9076 assert((!VT.isFloatingPoint() ||
9077 VT.getVectorElementType() == N2.getValueType()) &&
9078 "INSERT_VECTOR_ELT fp scalar type mismatch");
9079 assert((!VT.isInteger() ||
9081 "INSERT_VECTOR_ELT int scalar size mismatch");
9082
9083 auto *N3C = dyn_cast<ConstantSDNode>(N3);
9084 // INSERT_VECTOR_ELT into out-of-bounds element is an UNDEF, except
9085 // for scalable vectors where we will generate appropriate code to
9086 // deal with out-of-bounds cases correctly.
9087 if (N3C && VT.isFixedLengthVector() &&
9088 N3C->getZExtValue() >= VT.getVectorNumElements())
9089 return getUNDEF(VT);
9090
9091 // Undefined index can be assumed out-of-bounds, so that's UNDEF too.
9092 if (N3.isUndef())
9093 return getUNDEF(VT);
9094
9095 // If inserting poison, just use the input vector.
9096 if (N2.getOpcode() == ISD::POISON)
9097 return N1;
9098
9099 // Inserting undef into undef/poison is still undef.
9100 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
9101 return getUNDEF(VT);
9102
9103 // If the inserted element is an UNDEF, just use the input vector.
9104 // But not if skipping the insert could make the result more poisonous.
9105 if (N2.isUndef()) {
9106 if (N3C && VT.isFixedLengthVector()) {
9107 APInt EltMask =
9108 APInt::getOneBitSet(VT.getVectorNumElements(), N3C->getZExtValue());
9109 if (isGuaranteedNotToBePoison(N1, EltMask))
9110 return N1;
9111 } else if (isGuaranteedNotToBePoison(N1))
9112 return N1;
9113 }
9114 break;
9115 }
9116 case ISD::INSERT_SUBVECTOR: {
9117 // If inserting poison, just use the input vector,
9118 if (N2.getOpcode() == ISD::POISON)
9119 return N1;
9120
9121 // Inserting undef into undef/poison is still undef.
9122 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
9123 return getUNDEF(VT);
9124
9125 EVT N2VT = N2.getValueType();
9126 assert(VT == N1.getValueType() &&
9127 "Dest and insert subvector source types must match!");
9128 assert(VT.isVector() && N2VT.isVector() &&
9129 "Insert subvector VTs must be vectors!");
9131 "Insert subvector VTs must have the same element type!");
9132 assert((VT.isScalableVector() || N2VT.isFixedLengthVector()) &&
9133 "Cannot insert a scalable vector into a fixed length vector!");
9134 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
9136 "Insert subvector must be from smaller vector to larger vector!");
9138 "Insert subvector index must be constant");
9139 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
9140 (N2VT.getVectorMinNumElements() + N3->getAsZExtVal()) <=
9142 "Insert subvector overflow!");
9144 TLI->getVectorIdxWidth(getDataLayout()) &&
9145 "Constant index for INSERT_SUBVECTOR has an invalid size");
9146
9147 // Trivial insertion.
9148 if (VT == N2VT)
9149 return N2;
9150
9151 // If this is an insert of an extracted vector into an undef/poison vector,
9152 // we can just use the input to the extract. But not if skipping the
9153 // extract+insert could make the result more poisonous.
9154 if (N1.isUndef() && N2.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
9155 N2.getOperand(1) == N3 && N2.getOperand(0).getValueType() == VT) {
9156 if (N1.getOpcode() == ISD::POISON)
9157 return N2.getOperand(0);
9158 if (VT.isFixedLengthVector() && N2VT.isFixedLengthVector()) {
9159 unsigned LoBit = N3->getAsZExtVal();
9160 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
9161 APInt EltMask =
9162 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
9163 if (isGuaranteedNotToBePoison(N2.getOperand(0), ~EltMask))
9164 return N2.getOperand(0);
9165 } else if (isGuaranteedNotToBePoison(N2.getOperand(0)))
9166 return N2.getOperand(0);
9167 }
9168
9169 // If the inserted subvector is UNDEF, just use the input vector.
9170 // But not if skipping the insert could make the result more poisonous.
9171 if (N2.isUndef()) {
9172 if (VT.isFixedLengthVector()) {
9173 unsigned LoBit = N3->getAsZExtVal();
9174 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
9175 APInt EltMask =
9176 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
9177 if (isGuaranteedNotToBePoison(N1, EltMask))
9178 return N1;
9179 } else if (isGuaranteedNotToBePoison(N1))
9180 return N1;
9181 }
9182 break;
9183 }
9184 case ISD::BITCAST:
9185 // Fold bit_convert nodes from a type to themselves.
9186 if (N1.getValueType() == VT)
9187 return N1;
9188 break;
9189 case ISD::VECTOR_COMPRESS: {
9190 [[maybe_unused]] EVT VecVT = N1.getValueType();
9191 [[maybe_unused]] EVT MaskVT = N2.getValueType();
9192 [[maybe_unused]] EVT PassthruVT = N3.getValueType();
9193 assert(VT == VecVT && "Vector and result type don't match.");
9194 assert(VecVT.isVector() && MaskVT.isVector() && PassthruVT.isVector() &&
9195 "All inputs must be vectors.");
9196 assert(VecVT == PassthruVT && "Vector and passthru types don't match.");
9198 "Vector and mask must have same number of elements.");
9199
9200 if (N1.isUndef() || N2.isUndef())
9201 return N3;
9202
9203 break;
9204 }
9209 [[maybe_unused]] EVT AccVT = N1.getValueType();
9210 [[maybe_unused]] EVT Input1VT = N2.getValueType();
9211 [[maybe_unused]] EVT Input2VT = N3.getValueType();
9212 assert(Input1VT.isVector() && Input1VT == Input2VT &&
9213 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
9214 "node to have the same type!");
9215 assert(VT.isVector() && VT == AccVT &&
9216 "Expected the first operand of the PARTIAL_REDUCE_MLA node to have "
9217 "the same type as its result!");
9219 AccVT.getVectorElementCount()) &&
9220 "Expected the element count of the second and third operands of the "
9221 "PARTIAL_REDUCE_MLA node to be a positive integer multiple of the "
9222 "element count of the first operand and the result!");
9224 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
9225 "node to have an element type which is the same as or smaller than "
9226 "the element type of the first operand and result!");
9227 break;
9228 }
9229 }
9230
9231 // Perform trivial constant folding for arithmetic operators.
9232 switch (Opcode) {
9236 case ISD::FMA:
9237 case ISD::FMAD:
9238 case ISD::SETCC:
9239 case ISD::FSHL:
9240 case ISD::FSHR:
9241 if (SDValue SV =
9242 FoldConstantArithmetic(Opcode, DL, VT, {N1, N2, N3}, Flags))
9243 return SV;
9244 break;
9245 }
9246
9247 // Memoize node if it doesn't produce a glue result.
9248 SDNode *N;
9249 SDVTList VTs = getVTList(VT);
9250 SDValue Ops[] = {N1, N2, N3};
9251 if (VT != MVT::Glue) {
9252 SDNodeKey ID(Opcode, VTs, Ops);
9253 FoldingSetInsertToken InsertToken;
9254 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
9255 E->intersectFlagsWith(Flags);
9256 return SDValue(E, 0);
9257 }
9258
9259 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9260 N->setFlags(Flags);
9261 createOperands(N, Ops);
9262 CSEMap.insert(N, InsertToken);
9263 } else {
9264 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9265 createOperands(N, Ops);
9266 }
9267
9268 InsertNode(N);
9269 SDValue V = SDValue(N, 0);
9270 NewSDValueDbgMsg(V, "Creating new node: ", this);
9271 return V;
9272}
9273
9274SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9275 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9276 const SDNodeFlags Flags) {
9277 SDValue Ops[] = { N1, N2, N3, N4 };
9278 return getNode(Opcode, DL, VT, Ops, Flags);
9279}
9280
9281SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9282 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
9283 SDNodeFlags Flags;
9284 if (Inserter)
9285 Flags = Inserter->getFlags();
9286 return getNode(Opcode, DL, VT, N1, N2, N3, N4, Flags);
9287}
9288
9289SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9290 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9291 SDValue N5, const SDNodeFlags Flags) {
9292 SDValue Ops[] = { N1, N2, N3, N4, N5 };
9293 return getNode(Opcode, DL, VT, Ops, Flags);
9294}
9295
9296SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9297 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9298 SDValue N5) {
9299 SDNodeFlags Flags;
9300 if (Inserter)
9301 Flags = Inserter->getFlags();
9302 return getNode(Opcode, DL, VT, N1, N2, N3, N4, N5, Flags);
9303}
9304
9305/// getStackArgumentTokenFactor - Compute a TokenFactor to force all
9306/// the incoming stack arguments to be loaded from the stack.
9308 SmallVector<SDValue, 8> ArgChains;
9309
9310 // Include the original chain at the beginning of the list. When this is
9311 // used by target LowerCall hooks, this helps legalize find the
9312 // CALLSEQ_BEGIN node.
9313 ArgChains.push_back(Chain);
9314
9315 // Add a chain value for each stack argument.
9316 for (SDNode *U : getEntryNode().getNode()->users())
9317 if (LoadSDNode *L = dyn_cast<LoadSDNode>(U))
9318 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(L->getBasePtr()))
9319 if (FI->getIndex() < 0)
9320 ArgChains.push_back(SDValue(L, 1));
9321
9322 // Build a tokenfactor for all the chains.
9323 return getNode(ISD::TokenFactor, SDLoc(Chain), MVT::Other, ArgChains);
9324}
9325
9326/// getMemsetValue - Vectorized representation of the memset value
9327/// operand.
9329 const SDLoc &dl) {
9330 assert(!Value.isUndef());
9331
9332 unsigned NumBits = VT.getScalarSizeInBits();
9334 assert(C->getAPIntValue().getBitWidth() == 8);
9335 APInt Val = APInt::getSplat(NumBits, C->getAPIntValue());
9336 if (VT.isInteger()) {
9337 bool IsOpaque = VT.getSizeInBits() > 64 ||
9338 !DAG.getTargetLoweringInfo().isLegalStoreImmediate(C->getSExtValue());
9339 return DAG.getConstant(Val, dl, VT, false, IsOpaque);
9340 }
9341 return DAG.getConstantFP(APFloat(VT.getFltSemantics(), Val), dl, VT);
9342 }
9343
9344 assert(Value.getValueType() == MVT::i8 && "memset with non-byte fill value?");
9345 EVT IntVT = VT.getScalarType();
9346 if (!IntVT.isInteger())
9347 IntVT = EVT::getIntegerVT(*DAG.getContext(), IntVT.getSizeInBits());
9348
9349 Value = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, Value);
9350 if (NumBits > 8) {
9351 // Use a multiplication with 0x010101... to extend the input to the
9352 // required length.
9353 APInt Magic = APInt::getSplat(NumBits, APInt(8, 0x01));
9354 Value = DAG.getNode(ISD::MUL, dl, IntVT, Value,
9355 DAG.getConstant(Magic, dl, IntVT));
9356 }
9357
9358 if (VT != Value.getValueType() && !VT.isInteger())
9359 Value = DAG.getBitcast(VT.getScalarType(), Value);
9360 if (VT != Value.getValueType())
9361 Value = DAG.getSplatBuildVector(VT, dl, Value);
9362
9363 return Value;
9364}
9365
9366/// getMemsetStringVal - Similar to getMemsetValue. Except this is only
9367/// used when a memcpy is turned into a memset when the source is a constant
9368/// string ptr.
9370 const TargetLowering &TLI,
9371 const ConstantDataArraySlice &Slice) {
9372 // Handle vector with all elements zero.
9373 if (Slice.Array == nullptr) {
9374 if (VT.isInteger())
9375 return DAG.getConstant(0, dl, VT);
9376 return DAG.getNode(ISD::BITCAST, dl, VT,
9377 DAG.getConstant(0, dl, VT.changeTypeToInteger()));
9378 }
9379
9380 assert(!VT.isVector() && "Can't handle vector type here!");
9381 unsigned NumVTBits = VT.getSizeInBits();
9382 unsigned NumVTBytes = NumVTBits / 8;
9383 unsigned NumBytes = std::min(NumVTBytes, unsigned(Slice.Length));
9384
9385 APInt Val(NumVTBits, 0);
9386 if (DAG.getDataLayout().isLittleEndian()) {
9387 for (unsigned i = 0; i != NumBytes; ++i)
9388 Val |= (uint64_t)(unsigned char)Slice[i] << i*8;
9389 } else {
9390 for (unsigned i = 0; i != NumBytes; ++i)
9391 Val |= (uint64_t)(unsigned char)Slice[i] << (NumVTBytes-i-1)*8;
9392 }
9393
9394 // If the "cost" of materializing the integer immediate is less than the cost
9395 // of a load, then it is cost effective to turn the load into the immediate.
9396 Type *Ty = VT.getTypeForEVT(*DAG.getContext());
9397 if (TLI.shouldConvertConstantLoadToIntImm(Val, Ty))
9398 return DAG.getConstant(Val, dl, VT);
9399 return SDValue();
9400}
9401
9403 const SDLoc &DL,
9404 const SDNodeFlags Flags) {
9405 SDValue Index = getTypeSize(DL, Base.getValueType(), Offset);
9406 return getMemBasePlusOffset(Base, Index, DL, Flags);
9407}
9408
9410 const SDLoc &DL,
9411 const SDNodeFlags Flags) {
9412 assert(Offset.getValueType().isInteger());
9413 EVT BasePtrVT = Ptr.getValueType();
9414 if (TLI->shouldPreservePtrArith(this->getMachineFunction().getFunction(),
9415 BasePtrVT))
9416 return getNode(ISD::PTRADD, DL, BasePtrVT, Ptr, Offset, Flags);
9417 // InBounds only applies to PTRADD, don't set it if we generate ADD.
9418 SDNodeFlags AddFlags = Flags;
9419 AddFlags.setInBounds(false);
9420 return getNode(ISD::ADD, DL, BasePtrVT, Ptr, Offset, AddFlags);
9421}
9422
9423/// Returns true if memcpy source is constant data.
9425 uint64_t SrcDelta = 0;
9426 GlobalAddressSDNode *G = nullptr;
9427 if (Src.getOpcode() == ISD::GlobalAddress)
9429 else if (Src->isAnyAdd() &&
9430 Src.getOperand(0).getOpcode() == ISD::GlobalAddress &&
9431 Src.getOperand(1).getOpcode() == ISD::Constant) {
9432 G = cast<GlobalAddressSDNode>(Src.getOperand(0));
9433 SrcDelta = Src.getConstantOperandVal(1);
9434 }
9435 if (!G)
9436 return false;
9437
9438 return getConstantDataArrayInfo(G->getGlobal(), Slice, 8,
9439 SrcDelta + G->getOffset());
9440}
9441
9443 SelectionDAG &DAG) {
9444 // On Darwin, -Os means optimize for size without hurting performance, so
9445 // only really optimize for size when -Oz (MinSize) is used.
9447 return MF.getFunction().hasMinSize();
9448 return DAG.shouldOptForSize();
9449}
9450
9452 SmallVector<SDValue, 32> &OutChains, unsigned From,
9453 unsigned To, SmallVector<SDValue, 16> &OutLoadChains,
9454 SmallVector<SDValue, 16> &OutStoreChains) {
9455 assert(OutLoadChains.size() && "Missing loads in memcpy inlining");
9456 assert(OutStoreChains.size() && "Missing stores in memcpy inlining");
9457 SmallVector<SDValue, 16> GluedLoadChains;
9458 for (unsigned i = From; i < To; ++i) {
9459 OutChains.push_back(OutLoadChains[i]);
9460 GluedLoadChains.push_back(OutLoadChains[i]);
9461 }
9462
9463 // Chain for all loads.
9464 SDValue LoadToken = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
9465 GluedLoadChains);
9466
9467 for (unsigned i = From; i < To; ++i) {
9468 StoreSDNode *ST = dyn_cast<StoreSDNode>(OutStoreChains[i]);
9469 SDValue NewStore = DAG.getTruncStore(LoadToken, dl, ST->getValue(),
9470 ST->getBasePtr(), ST->getMemoryVT(),
9471 ST->getMemOperand());
9472 OutChains.push_back(NewStore);
9473 }
9474}
9475
9476static SDValue
9478 SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign,
9479 Align SrcAlign, bool isVol, bool AlwaysInline,
9480 MachinePointerInfo DstPtrInfo,
9481 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo,
9482 BatchAAResults *BatchAA, const MDNode *DstMemCacheHint,
9483 const MDNode *SrcMemCacheHint) {
9484 // Turn a memcpy of undef to nop.
9485 // FIXME: We need to honor volatile even is Src is undef.
9486 if (Src.isUndef())
9487 return Chain;
9488
9489 // Expand memcpy to a series of load and store ops if the size operand falls
9490 // below a certain threshold.
9491 // TODO: In the AlwaysInline case, if the size is big then generate a loop
9492 // rather than maybe a humongous number of loads and stores.
9493 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9494 const DataLayout &DL = DAG.getDataLayout();
9495 LLVMContext &C = *DAG.getContext();
9496 std::vector<EVT> MemOps;
9497 bool DstAlignCanChange = false;
9499 MachineFrameInfo &MFI = MF.getFrameInfo();
9500 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9502 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9503 DstAlignCanChange = true;
9504 SrcAlign = std::max(SrcAlign, DAG.InferPtrAlign(Src).valueOrOne());
9506 // If marked as volatile, perform a copy even when marked as constant.
9507 bool CopyFromConstant = !isVol && isMemSrcFromConstant(Src, Slice);
9508 bool isZeroConstant = CopyFromConstant && Slice.Array == nullptr;
9509 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemcpy(OptSize);
9510 const MemOp Op = isZeroConstant
9511 ? MemOp::Set(Size, DstAlignCanChange, DstAlign,
9512 /*IsZeroMemset*/ true, isVol)
9513 : MemOp::Copy(Size, DstAlignCanChange, DstAlign,
9514 SrcAlign, isVol, CopyFromConstant);
9515 if (!TLI.findOptimalMemOpLowering(
9516 C, MemOps, Limit, Op, DstPtrInfo.getAddrSpace(),
9517 SrcPtrInfo.getAddrSpace(), MF.getFunction().getAttributes(), nullptr))
9518 return SDValue();
9519
9520 if (DstAlignCanChange) {
9521 Type *Ty = MemOps[0].getTypeForEVT(C);
9522 Align NewDstAlign = DL.getABITypeAlign(Ty);
9523
9524 // Don't promote to an alignment that would require dynamic stack
9525 // realignment which may conflict with optimizations such as tail call
9526 // optimization.
9528 if (!TRI->hasStackRealignment(MF))
9529 if (MaybeAlign StackAlign = DL.getStackAlignment())
9530 NewDstAlign = std::min(NewDstAlign, *StackAlign);
9531
9532 if (NewDstAlign > DstAlign) {
9533 // Give the stack frame object a larger alignment if needed.
9534 if (MFI.getObjectAlign(FI->getIndex()) < NewDstAlign)
9535 MFI.setObjectAlignment(FI->getIndex(), NewDstAlign);
9536 DstAlign = NewDstAlign;
9537 }
9538 }
9539
9540 // Prepare AAInfo for loads/stores after lowering this memcpy.
9541 AAMDNodes NewAAInfo = AAInfo;
9542 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9543
9544 const Value *SrcVal = dyn_cast_if_present<const Value *>(SrcPtrInfo.V);
9545 bool isConstant =
9546 BatchAA && SrcVal &&
9547 BatchAA->pointsToConstantMemory(MemoryLocation(SrcVal, Size, AAInfo));
9548
9549 MachineMemOperand::Flags MMOFlags =
9551 SmallVector<SDValue, 16> OutLoadChains;
9552 SmallVector<SDValue, 16> OutStoreChains;
9553 SmallVector<SDValue, 32> OutChains;
9554 unsigned NumMemOps = MemOps.size();
9555 uint64_t SrcOff = 0, DstOff = 0;
9556 for (unsigned i = 0; i != NumMemOps; ++i) {
9557 EVT VT = MemOps[i];
9558 unsigned VTSize = VT.getSizeInBits() / 8;
9560
9561 if (VTSize > Size) {
9562 // Issuing an unaligned load / store pair that overlaps with the previous
9563 // pair. Adjust the offset accordingly.
9564 assert(i == NumMemOps-1 && i != 0);
9565 SrcOff -= VTSize - Size;
9566 DstOff -= VTSize - Size;
9567 }
9568
9569 if (CopyFromConstant &&
9570 (isZeroConstant || (VT.isInteger() && !VT.isVector()))) {
9571 // It's unlikely a store of a vector immediate can be done in a single
9572 // instruction. It would require a load from a constantpool first.
9573 // We only handle zero vectors here.
9574 // FIXME: Handle other cases where store of vector immediate is done in
9575 // a single instruction.
9576 ConstantDataArraySlice SubSlice;
9577 if (SrcOff < Slice.Length) {
9578 SubSlice = Slice;
9579 SubSlice.move(SrcOff);
9580 } else {
9581 // This is an out-of-bounds access and hence UB. Pretend we read zero.
9582 SubSlice.Array = nullptr;
9583 SubSlice.Offset = 0;
9584 SubSlice.Length = VTSize;
9585 }
9586 Value = getMemsetStringVal(VT, dl, DAG, TLI, SubSlice);
9587 if (Value.getNode()) {
9588 Store = DAG.getStore(
9589 Chain, dl, Value,
9590 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9591 DstPtrInfo.getWithOffset(DstOff), DstAlign, MMOFlags,
9592 MMOMetadata(NewAAInfo, /*Ranges=*/nullptr, DstMemCacheHint));
9593 OutChains.push_back(Store);
9594 }
9595 }
9596
9597 if (!Store.getNode()) {
9598 // The type might not be legal for the target. This should only happen
9599 // if the type is smaller than a legal type, as on PPC, so the right
9600 // thing to do is generate a LoadExt/StoreTrunc pair. These simplify
9601 // to Load/Store if NVT==VT.
9602 // FIXME does the case above also need this?
9603 EVT NVT = TLI.getTypeToTransformTo(C, VT);
9604 assert(NVT.bitsGE(VT));
9605
9606 bool isDereferenceable =
9607 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9608 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9609 if (isDereferenceable)
9611 if (isConstant)
9612 SrcMMOFlags |= MachineMemOperand::MOInvariant;
9613
9614 Value = DAG.getExtLoad(
9615 ISD::EXTLOAD, dl, NVT, Chain,
9616 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9617 SrcPtrInfo.getWithOffset(SrcOff), VT,
9618 commonAlignment(SrcAlign, SrcOff), SrcMMOFlags,
9619 MMOMetadata(NewAAInfo, /*Ranges=*/nullptr, SrcMemCacheHint));
9620 OutLoadChains.push_back(Value.getValue(1));
9621
9622 Store = DAG.getTruncStore(
9623 Chain, dl, Value,
9624 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9625 DstPtrInfo.getWithOffset(DstOff), VT, DstAlign, MMOFlags,
9626 MMOMetadata(NewAAInfo, /*Ranges=*/nullptr, DstMemCacheHint));
9627 OutStoreChains.push_back(Store);
9628 }
9629 SrcOff += VTSize;
9630 DstOff += VTSize;
9631 Size -= VTSize;
9632 }
9633
9634 unsigned GluedLdStLimit = MaxLdStGlue == 0 ?
9636 unsigned NumLdStInMemcpy = OutStoreChains.size();
9637
9638 if (NumLdStInMemcpy) {
9639 // It may be that memcpy might be converted to memset if it's memcpy
9640 // of constants. In such a case, we won't have loads and stores, but
9641 // just stores. In the absence of loads, there is nothing to gang up.
9642 if ((GluedLdStLimit <= 1) || !EnableMemCpyDAGOpt) {
9643 // If target does not care, just leave as it.
9644 for (unsigned i = 0; i < NumLdStInMemcpy; ++i) {
9645 OutChains.push_back(OutLoadChains[i]);
9646 OutChains.push_back(OutStoreChains[i]);
9647 }
9648 } else {
9649 // Ld/St less than/equal limit set by target.
9650 if (NumLdStInMemcpy <= GluedLdStLimit) {
9651 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, 0,
9652 NumLdStInMemcpy, OutLoadChains,
9653 OutStoreChains);
9654 } else {
9655 unsigned NumberLdChain = NumLdStInMemcpy / GluedLdStLimit;
9656 unsigned RemainingLdStInMemcpy = NumLdStInMemcpy % GluedLdStLimit;
9657 unsigned GlueIter = 0;
9658
9659 // Residual ld/st.
9660 if (RemainingLdStInMemcpy) {
9662 DAG, dl, OutChains, NumLdStInMemcpy - RemainingLdStInMemcpy,
9663 NumLdStInMemcpy, OutLoadChains, OutStoreChains);
9664 }
9665
9666 for (unsigned cnt = 0; cnt < NumberLdChain; ++cnt) {
9667 unsigned IndexFrom = NumLdStInMemcpy - RemainingLdStInMemcpy -
9668 GlueIter - GluedLdStLimit;
9669 unsigned IndexTo = NumLdStInMemcpy - RemainingLdStInMemcpy - GlueIter;
9670 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, IndexFrom, IndexTo,
9671 OutLoadChains, OutStoreChains);
9672 GlueIter += GluedLdStLimit;
9673 }
9674 }
9675 }
9676 }
9677 return DAG.getTokenFactor(dl, OutChains);
9678}
9679
9681 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
9682 uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol,
9683 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9684 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo) {
9685 // Turn a memmove of undef to nop.
9686 // FIXME: We need to honor volatile even is Src is undef.
9687 if (Src.isUndef())
9688 return Chain;
9689
9690 // Expand memmove to a series of load and store ops if the size operand falls
9691 // below a certain threshold.
9692 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9693 const DataLayout &DL = DAG.getDataLayout();
9694 LLVMContext &C = *DAG.getContext();
9695 std::vector<EVT> MemOps;
9696 bool DstAlignCanChange = false;
9698 MachineFrameInfo &MFI = MF.getFrameInfo();
9699 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9701 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9702 DstAlignCanChange = true;
9703 SrcAlign = std::max(SrcAlign, DAG.InferPtrAlign(Src).valueOrOne());
9704 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemmove(OptSize);
9705 if (!TLI.findOptimalMemOpLowering(
9706 C, MemOps, Limit,
9707 MemOp::Move(Size, DstAlignCanChange, DstAlign, SrcAlign, isVol),
9708 DstPtrInfo.getAddrSpace(), SrcPtrInfo.getAddrSpace(),
9709 MF.getFunction().getAttributes(), nullptr))
9710 return SDValue();
9711
9712 if (DstAlignCanChange) {
9713 Type *Ty = MemOps[0].getTypeForEVT(C);
9714 Align NewDstAlign = DL.getABITypeAlign(Ty);
9715
9716 // Don't promote to an alignment that would require dynamic stack
9717 // realignment which may conflict with optimizations such as tail call
9718 // optimization.
9720 if (!TRI->hasStackRealignment(MF))
9721 if (MaybeAlign StackAlign = DL.getStackAlignment())
9722 NewDstAlign = std::min(NewDstAlign, *StackAlign);
9723
9724 if (NewDstAlign > DstAlign) {
9725 // Give the stack frame object a larger alignment if needed.
9726 if (MFI.getObjectAlign(FI->getIndex()) < NewDstAlign)
9727 MFI.setObjectAlignment(FI->getIndex(), NewDstAlign);
9728 DstAlign = NewDstAlign;
9729 }
9730 }
9731
9732 // Prepare AAInfo for loads/stores after lowering this memmove.
9733 AAMDNodes NewAAInfo = AAInfo;
9734 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9735
9736 MachineMemOperand::Flags MMOFlags =
9738 uint64_t SrcOff = 0;
9739 SmallVector<SDValue, 8> LoadValues;
9740 SmallVector<SDValue, 8> LoadChains;
9741 SmallVector<SDValue, 8> OutChains;
9742 unsigned NumMemOps = MemOps.size();
9743 for (unsigned i = 0; i < NumMemOps; i++) {
9744 EVT VT = MemOps[i];
9745 unsigned VTSize = VT.getSizeInBits() / 8;
9746 SDValue Value;
9747 bool IsOverlapping = false;
9748
9749 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - SrcOff) {
9750 // Issuing an unaligned load / store pair that overlaps with the previous
9751 // pair. Adjust the offset accordingly.
9752 SrcOff = Size - VTSize;
9753 IsOverlapping = true;
9754 }
9755
9756 // Calculate the actual alignment at the current offset. The alignment at
9757 // SrcOff may be lower than the base alignment, especially when using
9758 // overlapping loads.
9759 Align SrcAlignAtOffset = commonAlignment(SrcAlign, SrcOff);
9760 if (IsOverlapping) {
9761 // Verify that the target allows misaligned memory accesses at the
9762 // adjusted offset when using overlapping loads.
9763 unsigned Fast;
9764 if (!TLI.allowsMisalignedMemoryAccesses(VT, SrcPtrInfo.getAddrSpace(),
9765 SrcAlignAtOffset, MMOFlags,
9766 &Fast) ||
9767 !Fast) {
9768 // This should have been caught by findOptimalMemOpLowering, but verify
9769 // here for safety.
9770 return SDValue();
9771 }
9772 }
9773
9774 bool isDereferenceable =
9775 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9776 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9777 if (isDereferenceable)
9779 Value =
9780 DAG.getLoad(VT, dl, Chain,
9781 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9782 SrcPtrInfo.getWithOffset(SrcOff), SrcAlignAtOffset,
9783 SrcMMOFlags, NewAAInfo);
9784 LoadValues.push_back(Value);
9785 LoadChains.push_back(Value.getValue(1));
9786 SrcOff += VTSize;
9787 }
9788 Chain = DAG.getTokenFactor(dl, LoadChains);
9789 OutChains.clear();
9790 uint64_t DstOff = 0;
9791 for (unsigned i = 0; i < NumMemOps; i++) {
9792 EVT VT = MemOps[i];
9793 unsigned VTSize = VT.getSizeInBits() / 8;
9794 SDValue Store;
9795 bool IsOverlapping = false;
9796
9797 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - DstOff) {
9798 // Issuing an unaligned load / store pair that overlaps with the previous
9799 // pair. Adjust the offset accordingly.
9800 DstOff = Size - VTSize;
9801 IsOverlapping = true;
9802 }
9803
9804 // Calculate the actual alignment at the current offset. The alignment at
9805 // DstOff may be lower than the base alignment, especially when using
9806 // overlapping stores.
9807 Align DstAlignAtOffset = commonAlignment(DstAlign, DstOff);
9808 if (IsOverlapping) {
9809 // Verify that the target allows misaligned memory accesses at the
9810 // adjusted offset when using overlapping stores.
9811 unsigned Fast;
9812 if (!TLI.allowsMisalignedMemoryAccesses(VT, DstPtrInfo.getAddrSpace(),
9813 DstAlignAtOffset, MMOFlags,
9814 &Fast) ||
9815 !Fast) {
9816 // This should have been caught by findOptimalMemOpLowering, but verify
9817 // here for safety.
9818 return SDValue();
9819 }
9820 }
9821 Store = DAG.getStore(
9822 Chain, dl, LoadValues[i],
9823 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9824 DstPtrInfo.getWithOffset(DstOff), DstAlignAtOffset, MMOFlags,
9825 NewAAInfo);
9826 OutChains.push_back(Store);
9827 DstOff += VTSize;
9828 }
9829
9830 return DAG.getTokenFactor(dl, OutChains);
9831}
9832
9833/// Lower the call to 'memset' intrinsic function into a series of store
9834/// operations.
9835///
9836/// \param DAG Selection DAG where lowered code is placed.
9837/// \param dl Link to corresponding IR location.
9838/// \param Chain Control flow dependency.
9839/// \param Dst Pointer to destination memory location.
9840/// \param Src Value of byte to write into the memory.
9841/// \param Size Number of bytes to write.
9842/// \param Alignment Alignment of the destination in bytes.
9843/// \param isVol True if destination is volatile.
9844/// \param AlwaysInline Makes sure no function call is generated.
9845/// \param DstPtrInfo IR information on the memory pointer.
9846/// \returns New head in the control flow, if lowering was successful, empty
9847/// SDValue otherwise.
9848///
9849/// The function tries to replace 'llvm.memset' intrinsic with several store
9850/// operations and value calculation code. This is usually profitable for small
9851/// memory size or when the semantic requires inlining.
9853 SDValue Chain, SDValue Dst, SDValue Src,
9854 uint64_t Size, Align Alignment, bool isVol,
9855 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9856 const AAMDNodes &AAInfo) {
9857 // Turn a memset of undef to nop.
9858 // FIXME: We need to honor volatile even is Src is undef.
9859 if (Src.isUndef())
9860 return Chain;
9861
9862 // Expand memset to a series of load/store ops if the size operand
9863 // falls below a certain threshold.
9864 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9865 std::vector<EVT> MemOps;
9866 bool DstAlignCanChange = false;
9867 LLVMContext &C = *DAG.getContext();
9869 MachineFrameInfo &MFI = MF.getFrameInfo();
9870 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9872 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9873 DstAlignCanChange = true;
9874 bool IsZeroVal = isNullConstant(Src);
9875 unsigned Limit = AlwaysInline ? ~0 : TLI.getMaxStoresPerMemset(OptSize);
9876
9877 EVT LargestVT;
9878 if (!TLI.findOptimalMemOpLowering(
9879 C, MemOps, Limit,
9880 MemOp::Set(Size, DstAlignCanChange, Alignment, IsZeroVal, isVol),
9881 DstPtrInfo.getAddrSpace(), ~0u, MF.getFunction().getAttributes(),
9882 &LargestVT))
9883 return SDValue();
9884
9885 if (DstAlignCanChange) {
9886 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext());
9887 const DataLayout &DL = DAG.getDataLayout();
9888 Align NewAlign = DL.getABITypeAlign(Ty);
9889
9890 // Don't promote to an alignment that would require dynamic stack
9891 // realignment which may conflict with optimizations such as tail call
9892 // optimization.
9894 if (!TRI->hasStackRealignment(MF))
9895 if (MaybeAlign StackAlign = DL.getStackAlignment())
9896 NewAlign = std::min(NewAlign, *StackAlign);
9897
9898 if (NewAlign > Alignment) {
9899 // Give the stack frame object a larger alignment if needed.
9900 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
9901 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
9902 Alignment = NewAlign;
9903 }
9904 }
9905
9906 SmallVector<SDValue, 8> OutChains;
9907 uint64_t DstOff = 0;
9908 unsigned NumMemOps = MemOps.size();
9909
9910 // Find the largest store and generate the bit pattern for it.
9911 // If target didn't set LargestVT, compute it from MemOps.
9912 if (!LargestVT.isSimple()) {
9913 LargestVT = MemOps[0];
9914 for (unsigned i = 1; i < NumMemOps; i++)
9915 if (MemOps[i].bitsGT(LargestVT))
9916 LargestVT = MemOps[i];
9917 }
9918 SDValue MemSetValue = getMemsetValue(Src, LargestVT, DAG, dl);
9919
9920 // Prepare AAInfo for loads/stores after lowering this memset.
9921 AAMDNodes NewAAInfo = AAInfo;
9922 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9923
9924 for (unsigned i = 0; i < NumMemOps; i++) {
9925 EVT VT = MemOps[i];
9926 unsigned VTSize = VT.getSizeInBits() / 8;
9927 // The target should specify store types that exactly cover the memset size
9928 // (with the last store potentially being oversized for overlapping stores).
9929 assert(Size > 0 && "Target specified more stores than needed in "
9930 "findOptimalMemOpLowering");
9931 if (VTSize > Size) {
9932 // Issuing an unaligned load / store pair that overlaps with the previous
9933 // pair. Adjust the offset accordingly.
9934 assert(i == NumMemOps-1 && i != 0);
9935 DstOff -= VTSize - Size;
9936 }
9937
9938 // If this store is smaller than the largest store see whether we can get
9939 // the smaller value for free with a truncate or extract vector element and
9940 // then store.
9941 SDValue Value = MemSetValue;
9942 if (VT.bitsLT(LargestVT)) {
9943 unsigned Index;
9944 unsigned NElts = LargestVT.getSizeInBits() / VT.getSizeInBits();
9945 EVT SVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(), NElts);
9946 if (!LargestVT.isVector() && !VT.isVector() &&
9947 TLI.isTruncateFree(LargestVT, VT))
9948 Value = DAG.getNode(ISD::TRUNCATE, dl, VT, MemSetValue);
9949 else if (LargestVT.isVector() && !VT.isVector() &&
9951 LargestVT.getTypeForEVT(*DAG.getContext()),
9952 VT.getSizeInBits(), Index) &&
9953 TLI.isTypeLegal(SVT) &&
9954 LargestVT.getSizeInBits() == SVT.getSizeInBits()) {
9955 // Target which can combine store(extractelement VectorTy, Idx) can get
9956 // the smaller value for free.
9957 SDValue TailValue = DAG.getNode(ISD::BITCAST, dl, SVT, MemSetValue);
9958 Value = DAG.getExtractVectorElt(dl, VT, TailValue, Index);
9959 } else
9960 Value = getMemsetValue(Src, VT, DAG, dl);
9961 }
9962 assert(Value.getValueType() == VT && "Value with wrong type.");
9963 SDValue Store = DAG.getStore(
9964 Chain, dl, Value,
9965 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9966 DstPtrInfo.getWithOffset(DstOff), Alignment,
9968 NewAAInfo);
9969 OutChains.push_back(Store);
9970 DstOff += VT.getSizeInBits() / 8;
9971 // For oversized overlapping stores, only subtract the remaining bytes.
9972 // For normal stores, subtract the full store size.
9973 if (VTSize > Size) {
9974 Size = 0;
9975 } else {
9976 Size -= VTSize;
9977 }
9978 }
9979
9980 // After processing all stores, Size should be exactly 0. Any remaining bytes
9981 // indicate a bug in the target's findOptimalMemOpLowering implementation.
9982 assert(Size == 0 && "Target's findOptimalMemOpLowering did not specify "
9983 "stores that exactly cover the memset size");
9984
9985 return DAG.getTokenFactor(dl, OutChains);
9986}
9987
9989 unsigned AS) {
9990 // Lowering memcpy / memset / memmove intrinsics to calls is only valid if all
9991 // pointer operands can be losslessly bitcasted to pointers of address space 0
9992 if (AS != 0 && !TLI->getTargetMachine().isNoopAddrSpaceCast(AS, 0)) {
9993 report_fatal_error("cannot lower memory intrinsic in address space " +
9994 Twine(AS));
9995 }
9996}
9997
9999 const SelectionDAG *SelDAG,
10000 bool AllowReturnsFirstArg) {
10001 if (!CI || !CI->isTailCall())
10002 return false;
10003 // TODO: Fix "returns-first-arg" determination so it doesn't depend on which
10004 // helper symbol we lower to.
10005 return isInTailCallPosition(*CI, SelDAG->getTarget(),
10006 AllowReturnsFirstArg &&
10008}
10009
10010static std::pair<SDValue, SDValue>
10013 const CallInst *CI, RTLIB::Libcall Call,
10014 SelectionDAG *DAG, const TargetLowering *TLI) {
10015 RTLIB::LibcallImpl LCImpl = DAG->getLibcalls().getLibcallImpl(Call);
10016
10017 if (LCImpl == RTLIB::Unsupported)
10018 return {};
10019
10021 bool IsTailCall =
10022 isInTailCallPositionWrapper(CI, DAG, /*AllowReturnsFirstArg=*/true) &&
10023 // Lowering doesn't support tail calling inside a function with
10024 // a swifterror argument yet.
10025 !DAG->hasSwiftErrorArg();
10026 SDValue Callee =
10027 DAG->getExternalSymbol(LCImpl, TLI->getPointerTy(DAG->getDataLayout()));
10028
10029 CLI.setDebugLoc(dl)
10030 .setChain(Chain)
10032 CI->getType(), Callee, std::move(Args))
10033 .setTailCall(IsTailCall);
10034
10035 return TLI->LowerCallTo(CLI);
10036}
10037
10038std::pair<SDValue, SDValue> SelectionDAG::getStrcmp(SDValue Chain,
10039 const SDLoc &dl, SDValue S1,
10040 SDValue S2,
10041 const CallInst *CI) {
10043 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
10044 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10045 RTLIB::STRCMP, this, TLI);
10046}
10047
10048std::pair<SDValue, SDValue> SelectionDAG::getStrstr(SDValue Chain,
10049 const SDLoc &dl, SDValue S1,
10050 SDValue S2,
10051 const CallInst *CI) {
10053 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
10054 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10055 RTLIB::STRSTR, this, TLI);
10056}
10057
10058std::pair<SDValue, SDValue> SelectionDAG::getMemccpy(SDValue Chain,
10059 const SDLoc &dl,
10060 SDValue Dst, SDValue Src,
10062 const CallInst *CI) {
10064
10066 {Dst, PT},
10067 {Src, PT},
10070 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10071 RTLIB::MEMCCPY, this, TLI);
10072}
10073
10074std::pair<SDValue, SDValue>
10076 SDValue Mem1, SDValue Size, const CallInst *CI) {
10079 {Mem0, PT},
10080 {Mem1, PT},
10082 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10083 RTLIB::MEMCMP, this, TLI);
10084}
10085
10086std::pair<SDValue, SDValue> SelectionDAG::getStrcpy(SDValue Chain,
10087 const SDLoc &dl,
10088 SDValue Dst, SDValue Src,
10089 const CallInst *CI) {
10091 TargetLowering::ArgListTy Args = {{Dst, PT}, {Src, PT}};
10092 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10093 RTLIB::STRCPY, this, TLI);
10094}
10095
10096std::pair<SDValue, SDValue> SelectionDAG::getStrlen(SDValue Chain,
10097 const SDLoc &dl,
10098 SDValue Src,
10099 const CallInst *CI) {
10100 // Emit a library call.
10103 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10104 RTLIB::STRLEN, this, TLI);
10105}
10106
10108 return TLI->supportSwiftError() &&
10109 MF->getFunction().getAttributes().hasAttrSomewhere(
10110 Attribute::SwiftError);
10111}
10112
10114 SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size,
10115 Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline,
10116 const CallInst *CI, std::optional<bool> OverrideTailCall,
10117 MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo,
10118 const AAMDNodes &AAInfo, BatchAAResults *BatchAA) {
10119 // Check to see if we should lower the memcpy to loads and stores first.
10120 // For cases within the target-specified limits, this is the best choice.
10121 const MDNode *DstMemCacheHint =
10122 CI ? getMemCacheHintMetadata(*CI, /*OperandNo=*/0) : nullptr;
10123 const MDNode *SrcMemCacheHint =
10124 CI ? getMemCacheHintMetadata(*CI, /*OperandNo=*/1) : nullptr;
10125
10127 if (ConstantSize) {
10128 // Memcpy with size zero? Just return the original chain.
10129 if (ConstantSize->isZero())
10130 return Chain;
10131
10133 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10134 SrcAlign, isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA,
10135 DstMemCacheHint, SrcMemCacheHint);
10136 if (Result.getNode())
10137 return Result;
10138 }
10139
10140 // Then check to see if we should lower the memcpy with target-specific
10141 // code. If the target chooses to do this, this is the next best.
10142 if (TSI) {
10143 SDValue Result = TSI->EmitTargetCodeForMemcpy(
10144 *this, dl, Chain, Dst, Src, Size, DstAlign, SrcAlign, isVol,
10145 AlwaysInline, DstPtrInfo, SrcPtrInfo);
10146 if (Result.getNode())
10147 return Result;
10148 }
10149
10150 // If we really need inline code and the target declined to provide it,
10151 // use a (potentially long) sequence of loads and stores.
10152 if (AlwaysInline) {
10153 assert(ConstantSize && "AlwaysInline requires a constant size!");
10155 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10156 SrcAlign, isVol, true, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA,
10157 DstMemCacheHint, SrcMemCacheHint);
10158 }
10159
10162
10163 // FIXME: If the memcpy is volatile (isVol), lowering it to a plain libc
10164 // memcpy is not guaranteed to be safe. libc memcpys aren't required to
10165 // respect volatile, so they may do things like read or write memory
10166 // beyond the given memory regions. But fixing this isn't easy, and most
10167 // people don't care.
10168
10169 // Emit a library call.
10172 Args.emplace_back(Dst, PtrTy);
10173 Args.emplace_back(Src, PtrTy);
10174 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
10175 // FIXME: pass in SDLoc
10177 bool IsTailCall = false;
10178 RTLIB::LibcallImpl MemCpyImpl = TLI->getMemcpyImpl();
10179
10180 if (OverrideTailCall.has_value()) {
10181 IsTailCall = *OverrideTailCall;
10182 } else {
10183 bool LowersToMemcpy = MemCpyImpl == RTLIB::impl_memcpy;
10184 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemcpy);
10185 }
10186 // Lowering doesn't support tail calling inside a function with a
10187 // swifterror argument yet.
10188 IsTailCall &= !hasSwiftErrorArg();
10189
10190 CLI.setDebugLoc(dl)
10191 .setChain(Chain)
10192 .setLibCallee(
10193 Libcalls->getLibcallImplCallingConv(MemCpyImpl),
10194 Dst.getValueType().getTypeForEVT(*getContext()),
10195 getExternalSymbol(MemCpyImpl, TLI->getPointerTy(getDataLayout())),
10196 std::move(Args))
10198 .setTailCall(IsTailCall);
10199
10200 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
10201 return CallResult.second;
10202}
10203
10205 SDValue Dst, SDValue Src, SDValue Size,
10206 Type *SizeTy, unsigned ElemSz,
10207 bool isTailCall,
10208 MachinePointerInfo DstPtrInfo,
10209 MachinePointerInfo SrcPtrInfo) {
10210 // Lowering doesn't support tail calling inside a function with a
10211 // swifterror argument yet.
10212 isTailCall &= !hasSwiftErrorArg();
10213
10214 // Emit a library call.
10217 Args.emplace_back(Dst, ArgTy);
10218 Args.emplace_back(Src, ArgTy);
10219 Args.emplace_back(Size, SizeTy);
10220
10221 RTLIB::Libcall LibraryCall =
10223 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10224 if (LibcallImpl == RTLIB::Unsupported)
10225 report_fatal_error("Unsupported element size");
10226
10228 CLI.setDebugLoc(dl)
10229 .setChain(Chain)
10230 .setLibCallee(
10231 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10233 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10234 std::move(Args))
10236 .setTailCall(isTailCall);
10237
10238 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10239 return CallResult.second;
10240}
10241
10243 SDValue Src, SDValue Size, Align DstAlign,
10244 Align SrcAlign, bool isVol, const CallInst *CI,
10245 std::optional<bool> OverrideTailCall,
10246 MachinePointerInfo DstPtrInfo,
10247 MachinePointerInfo SrcPtrInfo,
10248 const AAMDNodes &AAInfo,
10249 BatchAAResults *BatchAA) {
10250 // Check to see if we should lower the memmove to loads and stores first.
10251 // For cases within the target-specified limits, this is the best choice.
10253 if (ConstantSize) {
10254 // Memmove with size zero? Just return the original chain.
10255 if (ConstantSize->isZero())
10256 return Chain;
10257
10259 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10260 SrcAlign, isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo);
10261 if (Result.getNode())
10262 return Result;
10263 }
10264
10265 // Then check to see if we should lower the memmove with target-specific
10266 // code. If the target chooses to do this, this is the next best.
10267 if (TSI) {
10268 SDValue Result = TSI->EmitTargetCodeForMemmove(
10269 *this, dl, Chain, Dst, Src, Size, DstAlign, SrcAlign, isVol, DstPtrInfo,
10270 SrcPtrInfo);
10271 if (Result.getNode())
10272 return Result;
10273 }
10274
10277
10278 // FIXME: If the memmove is volatile, lowering it to plain libc memmove may
10279 // not be safe. See memcpy above for more details.
10280
10281 // Emit a library call.
10284 Args.emplace_back(Dst, PtrTy);
10285 Args.emplace_back(Src, PtrTy);
10286 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
10287 // FIXME: pass in SDLoc
10289
10290 RTLIB::LibcallImpl MemmoveImpl = Libcalls->getLibcallImpl(RTLIB::MEMMOVE);
10291
10292 bool IsTailCall = false;
10293 if (OverrideTailCall.has_value()) {
10294 IsTailCall = *OverrideTailCall;
10295 } else {
10296 bool LowersToMemmove = MemmoveImpl == RTLIB::impl_memmove;
10297 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemmove);
10298 }
10299 // Lowering doesn't support tail calling inside a function with a
10300 // swifterror argument yet.
10301 IsTailCall &= !hasSwiftErrorArg();
10302
10303 CLI.setDebugLoc(dl)
10304 .setChain(Chain)
10305 .setLibCallee(
10306 Libcalls->getLibcallImplCallingConv(MemmoveImpl),
10307 Dst.getValueType().getTypeForEVT(*getContext()),
10308 getExternalSymbol(MemmoveImpl, TLI->getPointerTy(getDataLayout())),
10309 std::move(Args))
10311 .setTailCall(IsTailCall);
10312
10313 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
10314 return CallResult.second;
10315}
10316
10318 SDValue Dst, SDValue Src, SDValue Size,
10319 Type *SizeTy, unsigned ElemSz,
10320 bool isTailCall,
10321 MachinePointerInfo DstPtrInfo,
10322 MachinePointerInfo SrcPtrInfo) {
10323 // Lowering doesn't support tail calling inside a function with a
10324 // swifterror argument yet.
10325 isTailCall &= !hasSwiftErrorArg();
10326
10327 // Emit a library call.
10330 Args.emplace_back(Dst, IntPtrTy);
10331 Args.emplace_back(Src, IntPtrTy);
10332 Args.emplace_back(Size, SizeTy);
10333
10334 RTLIB::Libcall LibraryCall =
10336 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10337 if (LibcallImpl == RTLIB::Unsupported)
10338 report_fatal_error("Unsupported element size");
10339
10341 CLI.setDebugLoc(dl)
10342 .setChain(Chain)
10343 .setLibCallee(
10344 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10346 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10347 std::move(Args))
10349 .setTailCall(isTailCall);
10350
10351 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10352 return CallResult.second;
10353}
10354
10356 SDValue Src, SDValue Size, Align Alignment,
10357 bool isVol, bool AlwaysInline,
10358 const CallInst *CI,
10359 MachinePointerInfo DstPtrInfo,
10360 const AAMDNodes &AAInfo) {
10361 // Check to see if we should lower the memset to stores first.
10362 // For cases within the target-specified limits, this is the best choice.
10364 if (ConstantSize) {
10365 // Memset with size zero? Just return the original chain.
10366 if (ConstantSize->isZero())
10367 return Chain;
10368
10369 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10370 ConstantSize->getZExtValue(), Alignment,
10371 isVol, false, DstPtrInfo, AAInfo);
10372
10373 if (Result.getNode())
10374 return Result;
10375 }
10376
10377 // Then check to see if we should lower the memset with target-specific
10378 // code. If the target chooses to do this, this is the next best.
10379 if (TSI) {
10380 SDValue Result = TSI->EmitTargetCodeForMemset(
10381 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline, DstPtrInfo);
10382 if (Result.getNode())
10383 return Result;
10384 }
10385
10386 // If we really need inline code and the target declined to provide it,
10387 // use a (potentially long) sequence of loads and stores.
10388 if (AlwaysInline) {
10389 assert(ConstantSize && "AlwaysInline requires a constant size!");
10390 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10391 ConstantSize->getZExtValue(), Alignment,
10392 isVol, true, DstPtrInfo, AAInfo);
10393 assert(Result &&
10394 "getMemsetStores must return a valid sequence when AlwaysInline");
10395 return Result;
10396 }
10397
10399
10400 // Emit a library call.
10401 auto &Ctx = *getContext();
10402 const auto& DL = getDataLayout();
10403
10405 // FIXME: pass in SDLoc
10406 CLI.setDebugLoc(dl).setChain(Chain);
10407
10408 RTLIB::LibcallImpl BzeroImpl = Libcalls->getLibcallImpl(RTLIB::BZERO);
10409 bool UseBZero = BzeroImpl != RTLIB::Unsupported && isNullConstant(Src);
10410
10411 // If zeroing out and bzero is present, use it.
10412 if (UseBZero) {
10414 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10415 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10416 CLI.setLibCallee(
10417 Libcalls->getLibcallImplCallingConv(BzeroImpl), Type::getVoidTy(Ctx),
10418 getExternalSymbol(BzeroImpl, TLI->getPointerTy(DL)), std::move(Args));
10419 } else {
10420 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10421
10423 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10424 Args.emplace_back(Src, Src.getValueType().getTypeForEVT(Ctx));
10425 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10426 CLI.setLibCallee(Libcalls->getLibcallImplCallingConv(MemsetImpl),
10427 Dst.getValueType().getTypeForEVT(Ctx),
10428 getExternalSymbol(MemsetImpl, TLI->getPointerTy(DL)),
10429 std::move(Args));
10430 }
10431
10432 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10433 bool LowersToMemset = MemsetImpl == RTLIB::impl_memset;
10434
10435 // If we're going to use bzero, make sure not to tail call unless the
10436 // subsequent return doesn't need a value, as bzero doesn't return the first
10437 // arg unlike memset.
10438 bool ReturnsFirstArg = CI && funcReturnsFirstArgOfCall(*CI) && !UseBZero;
10439 bool IsTailCall = CI && CI->isTailCall() &&
10441 ReturnsFirstArg && LowersToMemset) &&
10442 // Lowering doesn't support tail calling inside a function
10443 // with a swifterror argument yet.
10445 CLI.setDiscardResult().setTailCall(IsTailCall);
10446
10447 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10448 return CallResult.second;
10449}
10450
10453 Type *SizeTy, unsigned ElemSz,
10454 bool isTailCall,
10455 MachinePointerInfo DstPtrInfo) {
10456 // Lowering doesn't support tail calling inside a function with a
10457 // swifterror argument yet.
10458 isTailCall &= !hasSwiftErrorArg();
10459
10460 // Emit a library call.
10462 Args.emplace_back(Dst, getDataLayout().getIntPtrType(*getContext()));
10463 Args.emplace_back(Value, Type::getInt8Ty(*getContext()));
10464 Args.emplace_back(Size, SizeTy);
10465
10466 RTLIB::Libcall LibraryCall =
10468 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10469 if (LibcallImpl == RTLIB::Unsupported)
10470 report_fatal_error("Unsupported element size");
10471
10473 CLI.setDebugLoc(dl)
10474 .setChain(Chain)
10475 .setLibCallee(
10476 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10478 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10479 std::move(Args))
10481 .setTailCall(isTailCall);
10482
10483 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10484 return CallResult.second;
10485}
10486
10487SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10489 MachineMemOperand *MMO,
10490 ISD::LoadExtType ExtType) {
10491 SDNodeKey ID(Opcode, VTList, Ops);
10492 ID.AddInteger(MemVT.getRawBits());
10493 ID.AddInteger(getSyntheticNodeSubclassData<AtomicSDNode>(
10494 dl.getIROrder(), Opcode, VTList, MemVT, MMO, ExtType));
10495 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10496 ID.AddInteger(MMO->getFlags());
10497 FoldingSetInsertToken InsertToken;
10498 if (auto *E = cast_or_null<AtomicSDNode>(lookupNode(ID, dl, InsertToken))) {
10499 E->refineAlignment(MMO);
10500 E->refineMMOMetadata(MMO);
10501 return SDValue(E, 0);
10502 }
10503
10504 auto *N = newSDNode<AtomicSDNode>(dl.getIROrder(), dl.getDebugLoc(), Opcode,
10505 VTList, MemVT, MMO, ExtType);
10506 createOperands(N, Ops);
10507
10508 CSEMap.insert(N, InsertToken);
10509 InsertNode(N);
10510 SDValue V(N, 0);
10511 NewSDValueDbgMsg(V, "Creating new node: ", this);
10512 return V;
10513}
10514
10516 EVT MemVT, SDVTList VTs, SDValue Chain,
10517 SDValue Ptr, SDValue Cmp, SDValue Swp,
10518 MachineMemOperand *MMO) {
10519 assert(Opcode == ISD::ATOMIC_CMP_SWAP ||
10521 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types");
10522
10523 SDValue Ops[] = {Chain, Ptr, Cmp, Swp};
10524 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10525}
10526
10527SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10528 SDValue Chain, SDValue Ptr, SDValue Val,
10529 MachineMemOperand *MMO) {
10530 assert((Opcode == ISD::ATOMIC_LOAD_ADD || Opcode == ISD::ATOMIC_LOAD_SUB ||
10531 Opcode == ISD::ATOMIC_LOAD_AND || Opcode == ISD::ATOMIC_LOAD_CLR ||
10532 Opcode == ISD::ATOMIC_LOAD_OR || Opcode == ISD::ATOMIC_LOAD_XOR ||
10533 Opcode == ISD::ATOMIC_LOAD_NAND || Opcode == ISD::ATOMIC_LOAD_MIN ||
10534 Opcode == ISD::ATOMIC_LOAD_MAX || Opcode == ISD::ATOMIC_LOAD_UMIN ||
10535 Opcode == ISD::ATOMIC_LOAD_UMAX || Opcode == ISD::ATOMIC_LOAD_FADD ||
10536 Opcode == ISD::ATOMIC_LOAD_FSUB || Opcode == ISD::ATOMIC_LOAD_FMAX ||
10537 Opcode == ISD::ATOMIC_LOAD_FMIN ||
10538 Opcode == ISD::ATOMIC_LOAD_FMINIMUM ||
10539 Opcode == ISD::ATOMIC_LOAD_FMAXIMUM ||
10540 Opcode == ISD::ATOMIC_LOAD_UINC_WRAP ||
10541 Opcode == ISD::ATOMIC_LOAD_UDEC_WRAP ||
10542 Opcode == ISD::ATOMIC_LOAD_USUB_COND ||
10543 Opcode == ISD::ATOMIC_LOAD_USUB_SAT || Opcode == ISD::ATOMIC_SWAP ||
10544 Opcode == ISD::ATOMIC_STORE) &&
10545 "Invalid Atomic Op");
10546
10547 EVT VT = Val.getValueType();
10548
10549 SDVTList VTs = Opcode == ISD::ATOMIC_STORE ? getVTList(MVT::Other) :
10550 getVTList(VT, MVT::Other);
10551 SDValue Ops[] = {Chain, Ptr, Val};
10552 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10553}
10554
10556 EVT MemVT, EVT VT, SDValue Chain,
10557 SDValue Ptr, MachineMemOperand *MMO) {
10558 SDVTList VTs = getVTList(VT, MVT::Other);
10559 SDValue Ops[] = {Chain, Ptr};
10560 return getAtomic(ISD::ATOMIC_LOAD, dl, MemVT, VTs, Ops, MMO, ExtType);
10561}
10562
10563/// getMergeValues - Create a MERGE_VALUES node from the given operands.
10565 if (Ops.size() == 1)
10566 return Ops[0];
10567
10569 VTs.reserve(Ops.size());
10570 for (const SDValue &Op : Ops)
10571 VTs.push_back(Op.getValueType());
10572 return getNode(ISD::MERGE_VALUES, dl, getVTList(VTs), Ops);
10573}
10574
10576 SDValue Chain, const SDLoc &dl) {
10577 SmallVector<SDValue, 4> RetValues;
10578 RetValues.reserve(ResultTypes.size());
10579 for (EVT VT : ResultTypes)
10580 RetValues.push_back(VT == MVT::Other ? Chain : getPOISON(VT));
10581 return getMergeValues(RetValues, dl);
10582}
10583
10585 unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef<SDValue> Ops,
10586 EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment,
10588 const AAMDNodes &AAInfo) {
10589 if (Size.hasValue() && !Size.getValue())
10591
10593 MachineMemOperand *MMO =
10594 MF.getMachineMemOperand(PtrInfo, Flags, Size, Alignment, AAInfo);
10595
10596 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, MMO);
10597}
10598
10600 SDVTList VTList,
10601 ArrayRef<SDValue> Ops, EVT MemVT,
10602 MachineMemOperand *MMO) {
10603 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, ArrayRef(MMO));
10604}
10605
10607 SDVTList VTList,
10608 ArrayRef<SDValue> Ops, EVT MemVT,
10610 assert(!MMOs.empty() && "Must have at least one MMO");
10611 assert(
10612 (Opcode == ISD::INTRINSIC_VOID || Opcode == ISD::INTRINSIC_W_CHAIN ||
10613 Opcode == ISD::PREFETCH ||
10614 (Opcode <= (unsigned)std::numeric_limits<int>::max() &&
10615 Opcode >= ISD::BUILTIN_OP_END && TSI->isTargetMemoryOpcode(Opcode))) &&
10616 "Opcode is not a memory-accessing opcode!");
10617
10619 if (MMOs.size() == 1) {
10620 MemRefs = MMOs[0];
10621 } else {
10622 // Allocate: [size_t count][MMO*][MMO*]...
10623 size_t AllocSize =
10624 sizeof(size_t) + MMOs.size() * sizeof(MachineMemOperand *);
10625 void *Buffer = Allocator.Allocate(AllocSize, alignof(size_t));
10626 size_t *CountPtr = static_cast<size_t *>(Buffer);
10627 *CountPtr = MMOs.size();
10628 MachineMemOperand **Array =
10629 reinterpret_cast<MachineMemOperand **>(CountPtr + 1);
10630 llvm::copy(MMOs, Array);
10631 MemRefs = Array;
10632 }
10633
10634 // Memoize the node unless it returns a glue result.
10636 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
10637 SDNodeKey ID(Opcode, VTList, Ops);
10638 ID.AddInteger(getSyntheticNodeSubclassData<MemIntrinsicSDNode>(
10639 Opcode, dl.getIROrder(), VTList, MemVT, MemRefs));
10640 ID.AddInteger(MemVT.getRawBits());
10641 for (const MachineMemOperand *MMO : MMOs) {
10642 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10643 ID.AddInteger(MMO->getFlags());
10644 }
10645 FoldingSetInsertToken InsertToken;
10646 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
10647 cast<MemIntrinsicSDNode>(E)->refineAlignment(MMOs);
10648 return SDValue(E, 0);
10649 }
10650
10651 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10652 VTList, MemVT, MemRefs);
10653 createOperands(N, Ops);
10654 CSEMap.insert(N, InsertToken);
10655 } else {
10656 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10657 VTList, MemVT, MemRefs);
10658 createOperands(N, Ops);
10659 }
10660 InsertNode(N);
10661 SDValue V(N, 0);
10662 NewSDValueDbgMsg(V, "Creating new node: ", this);
10663 return V;
10664}
10665
10667 SDValue Chain, int FrameIndex) {
10668 const unsigned Opcode = IsStart ? ISD::LIFETIME_START : ISD::LIFETIME_END;
10669 const auto VTs = getVTList(MVT::Other);
10670 SDValue Ops[2] = {
10671 Chain,
10672 getFrameIndex(FrameIndex,
10673 getTargetLoweringInfo().getFrameIndexTy(getDataLayout()),
10674 true)};
10675
10676 SDNodeKey ID(Opcode, VTs, Ops);
10677 FoldingSetInsertToken InsertToken;
10678 if (SDNode *E = lookupNode(ID, dl, InsertToken))
10679 return SDValue(E, 0);
10680
10681 LifetimeSDNode *N =
10682 newSDNode<LifetimeSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), VTs);
10683 createOperands(N, Ops);
10684 CSEMap.insert(N, InsertToken);
10685 InsertNode(N);
10686 SDValue V(N, 0);
10687 NewSDValueDbgMsg(V, "Creating new node: ", this);
10688 return V;
10689}
10690
10692 uint64_t Guid, uint64_t Index,
10693 uint32_t Attr) {
10694 const unsigned Opcode = ISD::PSEUDO_PROBE;
10695 const auto VTs = getVTList(MVT::Other);
10696 SDValue Ops[] = {Chain};
10697 SDNodeKey ID(Opcode, VTs, Ops);
10698 ID.AddInteger(Guid);
10699 ID.AddInteger(Index);
10700 ID.AddInteger(Attr);
10701 FoldingSetInsertToken InsertToken;
10702 if (SDNode *E = lookupNode(ID, Dl, InsertToken))
10703 return SDValue(E, 0);
10704
10705 auto *N = newSDNode<PseudoProbeSDNode>(
10706 Opcode, Dl.getIROrder(), Dl.getDebugLoc(), VTs, Guid, Index, Attr);
10707 createOperands(N, Ops);
10708 CSEMap.insert(N, InsertToken);
10709 InsertNode(N);
10710 SDValue V(N, 0);
10711 NewSDValueDbgMsg(V, "Creating new node: ", this);
10712 return V;
10713}
10714
10715/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10716/// MachinePointerInfo record from it. This is particularly useful because the
10717/// code generator has many cases where it doesn't bother passing in a
10718/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10720 SelectionDAG &DAG, SDValue Ptr,
10721 int64_t Offset = 0) {
10722 // If this is FI+Offset, we can model it.
10723 if (const FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr))
10725 FI->getIndex(), Offset);
10726
10727 // If this is (FI+Offset1)+Offset2, we can model it.
10728 if (Ptr.getOpcode() != ISD::ADD ||
10731 return Info;
10732
10733 int FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
10735 DAG.getMachineFunction(), FI,
10736 Offset + cast<ConstantSDNode>(Ptr.getOperand(1))->getSExtValue());
10737}
10738
10739/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10740/// MachinePointerInfo record from it. This is particularly useful because the
10741/// code generator has many cases where it doesn't bother passing in a
10742/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10744 SelectionDAG &DAG, SDValue Ptr,
10745 SDValue OffsetOp) {
10746 // If the 'Offset' value isn't a constant, we can't handle this.
10748 return InferPointerInfo(Info, DAG, Ptr, OffsetNode->getSExtValue());
10749 if (OffsetOp.isUndef())
10750 return InferPointerInfo(Info, DAG, Ptr);
10751 return Info;
10752}
10753
10755 EVT VT, const SDLoc &dl, SDValue Chain,
10756 SDValue Ptr, SDValue Offset,
10757 MachinePointerInfo PtrInfo, EVT MemVT,
10758 Align Alignment,
10759 MachineMemOperand::Flags MMOFlags,
10760 const MMOMetadata &Metadata) {
10761 assert(Chain.getValueType() == MVT::Other &&
10762 "Invalid chain type");
10763
10764 MMOFlags |= MachineMemOperand::MOLoad;
10765 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10766 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10767 // clients.
10768 if (PtrInfo.V.isNull())
10769 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10770
10771 TypeSize Size = MemVT.getStoreSize();
10773 MachineMemOperand *MMO =
10774 MF.getMachineMemOperand(PtrInfo, MMOFlags, Size, Alignment, Metadata);
10775 return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO);
10776}
10777
10779 EVT VT, const SDLoc &dl, SDValue Chain,
10780 SDValue Ptr, SDValue Offset, EVT MemVT,
10781 MachineMemOperand *MMO) {
10782 if (VT == MemVT) {
10783 ExtType = ISD::NON_EXTLOAD;
10784 } else if (ExtType == ISD::NON_EXTLOAD) {
10785 assert(VT == MemVT && "Non-extending load from different memory type!");
10786 } else {
10787 // Extending load.
10788 assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) &&
10789 "Should only be an extending load, not truncating!");
10790 assert(VT.isInteger() == MemVT.isInteger() &&
10791 "Cannot convert from FP to Int or Int -> FP!");
10792 assert(VT.isVector() == MemVT.isVector() &&
10793 "Cannot use an ext load to convert to or from a vector!");
10794 assert((!VT.isVector() ||
10796 "Cannot use an ext load to change the number of vector elements!");
10797 }
10798
10799 assert((!MMO->getRanges() ||
10801 ->getBitWidth() == MemVT.getScalarSizeInBits() &&
10802 MemVT.isInteger())) &&
10803 "Range metadata and load type must match!");
10804
10805 bool Indexed = AM != ISD::UNINDEXED;
10806 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
10807 "Unindexed load with an offset!");
10808
10809 SDVTList VTs = Indexed ?
10810 getVTList(VT, Ptr.getValueType(), MVT::Other) : getVTList(VT, MVT::Other);
10811 SDValue Ops[] = { Chain, Ptr, Offset };
10812 SDNodeKey ID(ISD::LOAD, VTs, Ops);
10813 ID.AddInteger(MemVT.getRawBits());
10814 ID.AddInteger(getSyntheticNodeSubclassData<LoadSDNode>(
10815 dl.getIROrder(), VTs, AM, ExtType, MemVT, MMO));
10816 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10817 ID.AddInteger(MMO->getFlags());
10818 FoldingSetInsertToken InsertToken;
10819 if (auto *E = cast_or_null<LoadSDNode>(lookupNode(ID, dl, InsertToken))) {
10820 E->refineAlignment(MMO);
10821 E->refineMMOMetadata(MMO);
10822 return SDValue(E, 0);
10823 }
10824 auto *N = newSDNode<LoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10825 ExtType, MemVT, MMO);
10826 createOperands(N, Ops);
10827
10828 CSEMap.insert(N, InsertToken);
10829 InsertNode(N);
10830 SDValue V(N, 0);
10831 NewSDValueDbgMsg(V, "Creating new node: ", this);
10832 return V;
10833}
10834
10836 SDValue Ptr, MachinePointerInfo PtrInfo,
10837 MaybeAlign Alignment,
10838 MachineMemOperand::Flags MMOFlags,
10839 const MMOMetadata &Metadata) {
10841 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10842 PtrInfo, VT, Alignment, MMOFlags, Metadata);
10843}
10844
10846 SDValue Ptr, MachineMemOperand *MMO) {
10848 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10849 VT, MMO);
10850}
10851
10853 EVT VT, SDValue Chain, SDValue Ptr,
10854 MachinePointerInfo PtrInfo, EVT MemVT,
10855 MaybeAlign Alignment,
10856 MachineMemOperand::Flags MMOFlags,
10857 const MMOMetadata &Metadata) {
10859 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, PtrInfo,
10860 MemVT, Alignment, MMOFlags, Metadata);
10861}
10862
10864 EVT VT, SDValue Chain, SDValue Ptr, EVT MemVT,
10865 MachineMemOperand *MMO) {
10867 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef,
10868 MemVT, MMO);
10869}
10870
10874 LoadSDNode *LD = cast<LoadSDNode>(OrigLoad);
10875 assert(LD->getOffset().getOpcode() == ISD::POISON &&
10876 "Load is already a indexed load!");
10877 // Don't propagate the invariant or dereferenceable flags.
10878 auto MMOFlags =
10879 LD->getMemOperand()->getFlags() &
10881 return getLoad(
10882 AM, LD->getExtensionType(), OrigLoad.getValueType(), dl, LD->getChain(),
10883 Base, Offset, LD->getPointerInfo(), LD->getMemoryVT(), LD->getAlign(),
10884 MMOFlags,
10885 MMOMetadata(LD->getAAInfo(), LD->getRanges(), LD->getMemCacheHint()));
10886}
10887
10889 SDValue Ptr, MachinePointerInfo PtrInfo,
10890 Align Alignment,
10891 MachineMemOperand::Flags MMOFlags,
10892 const MMOMetadata &Metadata) {
10893 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10894
10895 MMOFlags |= MachineMemOperand::MOStore;
10896 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10897 assert(!Metadata.Ranges && "range metadata is invalid for stores");
10898
10899 if (PtrInfo.V.isNull())
10900 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10901
10904 MachineMemOperand *MMO =
10905 MF.getMachineMemOperand(PtrInfo, MMOFlags, Size, Alignment, Metadata);
10906 return getStore(Chain, dl, Val, Ptr, MMO);
10907}
10908
10910 SDValue Ptr, MachineMemOperand *MMO) {
10912 return getStore(Chain, dl, Val, Ptr, Undef, Val.getValueType(), MMO,
10914}
10915
10917 SDValue Ptr, SDValue Offset, EVT SVT,
10919 bool IsTruncating) {
10920 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10921 EVT VT = Val.getValueType();
10922 if (VT == SVT) {
10923 IsTruncating = false;
10924 } else if (!IsTruncating) {
10925 assert(VT == SVT && "No-truncating store from different memory type!");
10926 } else {
10928 "Should only be a truncating store, not extending!");
10929 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
10930 assert(VT.isVector() == SVT.isVector() &&
10931 "Cannot use trunc store to convert to or from a vector!");
10932 assert((!VT.isVector() ||
10934 "Cannot use trunc store to change the number of vector elements!");
10935 }
10936
10937 bool Indexed = AM != ISD::UNINDEXED;
10938 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
10939 "Unindexed store with an offset!");
10940 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10941 : getVTList(MVT::Other);
10942 SDValue Ops[] = {Chain, Val, Ptr, Offset};
10943 SDNodeKey ID(ISD::STORE, VTs, Ops);
10944 ID.AddInteger(SVT.getRawBits());
10945 ID.AddInteger(getSyntheticNodeSubclassData<StoreSDNode>(
10946 dl.getIROrder(), VTs, AM, IsTruncating, SVT, MMO));
10947 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10948 ID.AddInteger(MMO->getFlags());
10949 FoldingSetInsertToken InsertToken;
10950 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
10951 cast<StoreSDNode>(E)->refineAlignment(MMO);
10952 cast<StoreSDNode>(E)->refineMMOMetadata(MMO);
10953 return SDValue(E, 0);
10954 }
10955 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10956 IsTruncating, SVT, MMO);
10957 createOperands(N, Ops);
10958
10959 CSEMap.insert(N, InsertToken);
10960 InsertNode(N);
10961 SDValue V(N, 0);
10962 NewSDValueDbgMsg(V, "Creating new node: ", this);
10963 return V;
10964}
10965
10967 SDValue Ptr, SDValue Offset,
10968 MachinePointerInfo PtrInfo, EVT SVT,
10969 Align Alignment,
10970 MachineMemOperand::Flags MMOFlags,
10971 const MMOMetadata &Metadata) {
10972 assert(Chain.getValueType() == MVT::Other &&
10973 "Invalid chain type");
10974
10975 MMOFlags |= MachineMemOperand::MOStore;
10976 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10977 assert(!Metadata.Ranges && "range metadata is invalid for stores");
10978
10979 if (PtrInfo.V.isNull())
10980 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10981
10983 MachineMemOperand *MMO = MF.getMachineMemOperand(
10984 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, Metadata);
10985 return getTruncStore(Chain, dl, Val, Ptr, Offset, SVT, MMO);
10986}
10987
10989 SDValue Ptr, MachinePointerInfo PtrInfo,
10990 EVT SVT, Align Alignment,
10991 MachineMemOperand::Flags MMOFlags,
10992 const MMOMetadata &Metadata) {
10993 return getTruncStore(Chain, dl, Val, Ptr, getPOISON(Ptr.getValueType()),
10994 PtrInfo, SVT, Alignment, MMOFlags, Metadata);
10995}
10996
10998 SDValue Ptr, SDValue Offset, EVT SVT,
10999 MachineMemOperand *MMO) {
11000 return getStore(Chain, dl, Val, Ptr, Offset, SVT, MMO, ISD::UNINDEXED, true);
11001}
11002
11004 SDValue Ptr, EVT SVT,
11005 MachineMemOperand *MMO) {
11006 return getStore(Chain, dl, Val, Ptr, getPOISON(Ptr.getValueType()), SVT, MMO,
11007 ISD::UNINDEXED, true);
11008}
11009
11013 StoreSDNode *ST = cast<StoreSDNode>(OrigStore);
11014 assert(ST->getOffset().getOpcode() == ISD::POISON &&
11015 "Store is already a indexed store!");
11016 return getStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
11017 ST->getMemoryVT(), ST->getMemOperand(), AM,
11018 ST->isTruncatingStore());
11019}
11020
11022 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl,
11023 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL,
11024 MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment,
11025 MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo,
11026 const MDNode *Ranges, bool IsExpanding) {
11027 MMOFlags |= MachineMemOperand::MOLoad;
11028 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
11029 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
11030 // clients.
11031 if (PtrInfo.V.isNull())
11032 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
11033
11034 TypeSize Size = MemVT.getStoreSize();
11036 MachineMemOperand *MMO = MF.getMachineMemOperand(
11037 PtrInfo, MMOFlags, Size, Alignment, MMOMetadata(AAInfo, Ranges));
11038 return getLoadVP(AM, ExtType, VT, dl, Chain, Ptr, Offset, Mask, EVL, MemVT,
11039 MMO, IsExpanding);
11040}
11041
11043 ISD::LoadExtType ExtType, EVT VT,
11044 const SDLoc &dl, SDValue Chain, SDValue Ptr,
11045 SDValue Offset, SDValue Mask, SDValue EVL,
11046 EVT MemVT, MachineMemOperand *MMO,
11047 bool IsExpanding) {
11048 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11049 assert(Mask.getValueType().getVectorElementCount() ==
11050 VT.getVectorElementCount() &&
11051 "Vector width mismatch between mask and data");
11052
11053 bool Indexed = AM != ISD::UNINDEXED;
11054 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11055 "Unindexed load with an offset!");
11056
11057 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
11058 : getVTList(VT, MVT::Other);
11059 SDValue Ops[] = {Chain, Ptr, Offset, Mask, EVL};
11060 SDNodeKey ID(ISD::VP_LOAD, VTs, Ops);
11061 ID.AddInteger(MemVT.getRawBits());
11062 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadSDNode>(
11063 dl.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
11064 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11065 ID.AddInteger(MMO->getFlags());
11066 FoldingSetInsertToken InsertToken;
11067 if (auto *E = cast_or_null<VPLoadSDNode>(lookupNode(ID, dl, InsertToken))) {
11068 E->refineAlignment(MMO);
11069 E->refineMMOMetadata(MMO);
11070 return SDValue(E, 0);
11071 }
11072 auto *N = newSDNode<VPLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11073 ExtType, IsExpanding, MemVT, MMO);
11074 createOperands(N, Ops);
11075
11076 CSEMap.insert(N, InsertToken);
11077 InsertNode(N);
11078 SDValue V(N, 0);
11079 NewSDValueDbgMsg(V, "Creating new node: ", this);
11080 return V;
11081}
11082
11084 SDValue Ptr, SDValue Mask, SDValue EVL,
11085 MachinePointerInfo PtrInfo,
11086 MaybeAlign Alignment,
11087 MachineMemOperand::Flags MMOFlags,
11088 const AAMDNodes &AAInfo, const MDNode *Ranges,
11089 bool IsExpanding) {
11091 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
11092 Mask, EVL, PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges,
11093 IsExpanding);
11094}
11095
11097 SDValue Ptr, SDValue Mask, SDValue EVL,
11098 MachineMemOperand *MMO, bool IsExpanding) {
11100 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
11101 Mask, EVL, VT, MMO, IsExpanding);
11102}
11103
11105 EVT VT, SDValue Chain, SDValue Ptr,
11106 SDValue Mask, SDValue EVL,
11107 MachinePointerInfo PtrInfo, EVT MemVT,
11108 MaybeAlign Alignment,
11109 MachineMemOperand::Flags MMOFlags,
11110 const AAMDNodes &AAInfo, bool IsExpanding) {
11112 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
11113 EVL, PtrInfo, MemVT, Alignment, MMOFlags, AAInfo, nullptr,
11114 IsExpanding);
11115}
11116
11118 EVT VT, SDValue Chain, SDValue Ptr,
11119 SDValue Mask, SDValue EVL, EVT MemVT,
11120 MachineMemOperand *MMO, bool IsExpanding) {
11122 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
11123 EVL, MemVT, MMO, IsExpanding);
11124}
11125
11127 SDValue Ptr, SDValue Offset, SDValue Mask,
11128 SDValue EVL, EVT MemVT, MachineMemOperand *MMO,
11129 ISD::MemIndexedMode AM, bool IsTruncating,
11130 bool IsCompressing) {
11131 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11132 assert(Mask.getValueType().getVectorElementCount() ==
11134 "Vector width mismatch between mask and data");
11135
11136 bool Indexed = AM != ISD::UNINDEXED;
11137 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11138 "Unindexed vp_store with an offset!");
11139 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
11140 : getVTList(MVT::Other);
11141 SDValue Ops[] = {Chain, Val, Ptr, Offset, Mask, EVL};
11142 SDNodeKey ID(ISD::VP_STORE, VTs, Ops);
11143 ID.AddInteger(MemVT.getRawBits());
11144 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
11145 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11146 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11147 ID.AddInteger(MMO->getFlags());
11148 FoldingSetInsertToken InsertToken;
11149 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11150 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
11151 return SDValue(E, 0);
11152 }
11153 auto *N = newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11154 IsTruncating, IsCompressing, MemVT, MMO);
11155 createOperands(N, Ops);
11156
11157 CSEMap.insert(N, InsertToken);
11158 InsertNode(N);
11159 SDValue V(N, 0);
11160 NewSDValueDbgMsg(V, "Creating new node: ", this);
11161 return V;
11162}
11163
11165 SDValue Val, SDValue Ptr, SDValue Mask,
11166 SDValue EVL, MachinePointerInfo PtrInfo,
11167 EVT SVT, Align Alignment,
11168 MachineMemOperand::Flags MMOFlags,
11169 const AAMDNodes &AAInfo,
11170 bool IsCompressing) {
11171 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11172
11173 MMOFlags |= MachineMemOperand::MOStore;
11174 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
11175
11176 if (PtrInfo.V.isNull())
11177 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
11178
11180 MachineMemOperand *MMO = MF.getMachineMemOperand(
11181 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
11182 return getTruncStoreVP(Chain, dl, Val, Ptr, Mask, EVL, SVT, MMO,
11183 IsCompressing);
11184}
11185
11187 SDValue Val, SDValue Ptr, SDValue Mask,
11188 SDValue EVL, EVT SVT,
11189 MachineMemOperand *MMO,
11190 bool IsCompressing) {
11191 EVT VT = Val.getValueType();
11192
11193 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11194 if (VT == SVT)
11195 return getStoreVP(Chain, dl, Val, Ptr, getPOISON(Ptr.getValueType()), Mask,
11196 EVL, VT, MMO, ISD::UNINDEXED,
11197 /*IsTruncating*/ false, IsCompressing);
11198
11200 "Should only be a truncating store, not extending!");
11201 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
11202 assert(VT.isVector() == SVT.isVector() &&
11203 "Cannot use trunc store to convert to or from a vector!");
11204 assert((!VT.isVector() ||
11206 "Cannot use trunc store to change the number of vector elements!");
11207
11208 SDVTList VTs = getVTList(MVT::Other);
11210 SDValue Ops[] = {Chain, Val, Ptr, Undef, Mask, EVL};
11211 SDNodeKey ID(ISD::VP_STORE, VTs, Ops);
11212 ID.AddInteger(SVT.getRawBits());
11213 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
11214 dl.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
11215 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11216 ID.AddInteger(MMO->getFlags());
11217 FoldingSetInsertToken InsertToken;
11218 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11219 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
11220 return SDValue(E, 0);
11221 }
11222 auto *N =
11223 newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11224 ISD::UNINDEXED, true, IsCompressing, SVT, MMO);
11225 createOperands(N, Ops);
11226
11227 CSEMap.insert(N, InsertToken);
11228 InsertNode(N);
11229 SDValue V(N, 0);
11230 NewSDValueDbgMsg(V, "Creating new node: ", this);
11231 return V;
11232}
11233
11235 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL,
11236 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask,
11237 SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding) {
11238 bool Indexed = AM != ISD::UNINDEXED;
11239 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11240 "Unindexed load with an offset!");
11241
11242 SDValue Ops[] = {Chain, Ptr, Offset, Stride, Mask, EVL};
11243 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
11244 : getVTList(VT, MVT::Other);
11245 SDNodeKey ID(ISD::EXPERIMENTAL_VP_STRIDED_LOAD, VTs, Ops);
11246 ID.AddInteger(MemVT.getRawBits());
11247 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedLoadSDNode>(
11248 DL.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
11249 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11250
11251 FoldingSetInsertToken InsertToken;
11252 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
11253 cast<VPStridedLoadSDNode>(E)->refineAlignment(MMO);
11254 return SDValue(E, 0);
11255 }
11256
11257 auto *N =
11258 newSDNode<VPStridedLoadSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, AM,
11259 ExtType, IsExpanding, MemVT, MMO);
11260 createOperands(N, Ops);
11261 CSEMap.insert(N, InsertToken);
11262 InsertNode(N);
11263 SDValue V(N, 0);
11264 NewSDValueDbgMsg(V, "Creating new node: ", this);
11265 return V;
11266}
11267
11269 SDValue Ptr, SDValue Stride,
11270 SDValue Mask, SDValue EVL,
11271 MachineMemOperand *MMO,
11272 bool IsExpanding) {
11274 return getStridedLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, DL, Chain, Ptr,
11275 Undef, Stride, Mask, EVL, VT, MMO, IsExpanding);
11276}
11277
11279 ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain,
11280 SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT,
11281 MachineMemOperand *MMO, bool IsExpanding) {
11283 return getStridedLoadVP(ISD::UNINDEXED, ExtType, VT, DL, Chain, Ptr, Undef,
11284 Stride, Mask, EVL, MemVT, MMO, IsExpanding);
11285}
11286
11288 SDValue Val, SDValue Ptr,
11289 SDValue Offset, SDValue Stride,
11290 SDValue Mask, SDValue EVL, EVT MemVT,
11291 MachineMemOperand *MMO,
11293 bool IsTruncating, bool IsCompressing) {
11294 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11295 bool Indexed = AM != ISD::UNINDEXED;
11296 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11297 "Unindexed vp_store with an offset!");
11298 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
11299 : getVTList(MVT::Other);
11300 SDValue Ops[] = {Chain, Val, Ptr, Offset, Stride, Mask, EVL};
11301 SDNodeKey ID(ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
11302 ID.AddInteger(MemVT.getRawBits());
11303 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
11304 DL.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11305 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11306 FoldingSetInsertToken InsertToken;
11307 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
11308 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
11309 return SDValue(E, 0);
11310 }
11311 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
11312 VTs, AM, IsTruncating,
11313 IsCompressing, MemVT, MMO);
11314 createOperands(N, Ops);
11315
11316 CSEMap.insert(N, InsertToken);
11317 InsertNode(N);
11318 SDValue V(N, 0);
11319 NewSDValueDbgMsg(V, "Creating new node: ", this);
11320 return V;
11321}
11322
11325 ISD::MemIndexType IndexType) {
11326 assert(Ops.size() == 6 && "Incompatible number of operands");
11327
11328 SDNodeKey ID(ISD::VP_GATHER, VTs, Ops);
11329 ID.AddInteger(VT.getRawBits());
11330 ID.AddInteger(getSyntheticNodeSubclassData<VPGatherSDNode>(
11331 dl.getIROrder(), VTs, VT, MMO, IndexType));
11332 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11333 ID.AddInteger(MMO->getFlags());
11334 FoldingSetInsertToken InsertToken;
11335 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11336 cast<VPGatherSDNode>(E)->refineAlignment(MMO);
11337 return SDValue(E, 0);
11338 }
11339
11340 auto *N = newSDNode<VPGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11341 VT, MMO, IndexType);
11342 createOperands(N, Ops);
11343
11344 assert(N->getMask().getValueType().getVectorElementCount() ==
11345 N->getValueType(0).getVectorElementCount() &&
11346 "Vector width mismatch between mask and data");
11347 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11348 N->getValueType(0).getVectorElementCount().isScalable() &&
11349 "Scalable flags of index and data do not match");
11351 N->getIndex().getValueType().getVectorElementCount(),
11352 N->getValueType(0).getVectorElementCount()) &&
11353 "Vector width mismatch between index and data");
11354 assert(isa<ConstantSDNode>(N->getScale()) &&
11355 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11356 "Scale should be a constant power of 2");
11357
11358 CSEMap.insert(N, InsertToken);
11359 InsertNode(N);
11360 SDValue V(N, 0);
11361 NewSDValueDbgMsg(V, "Creating new node: ", this);
11362 return V;
11363}
11364
11367 MachineMemOperand *MMO,
11368 ISD::MemIndexType IndexType) {
11369 assert(Ops.size() == 7 && "Incompatible number of operands");
11370
11371 SDNodeKey ID(ISD::VP_SCATTER, VTs, Ops);
11372 ID.AddInteger(VT.getRawBits());
11373 ID.AddInteger(getSyntheticNodeSubclassData<VPScatterSDNode>(
11374 dl.getIROrder(), VTs, VT, MMO, IndexType));
11375 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11376 ID.AddInteger(MMO->getFlags());
11377 FoldingSetInsertToken InsertToken;
11378 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11379 cast<VPScatterSDNode>(E)->refineAlignment(MMO);
11380 return SDValue(E, 0);
11381 }
11382 auto *N = newSDNode<VPScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11383 VT, MMO, IndexType);
11384 createOperands(N, Ops);
11385
11386 assert(N->getMask().getValueType().getVectorElementCount() ==
11387 N->getValue().getValueType().getVectorElementCount() &&
11388 "Vector width mismatch between mask and data");
11389 assert(
11390 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11391 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11392 "Scalable flags of index and data do not match");
11394 N->getIndex().getValueType().getVectorElementCount(),
11395 N->getValue().getValueType().getVectorElementCount()) &&
11396 "Vector width mismatch between index and data");
11397 assert(isa<ConstantSDNode>(N->getScale()) &&
11398 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11399 "Scale should be a constant power of 2");
11400
11401 CSEMap.insert(N, InsertToken);
11402 InsertNode(N);
11403 SDValue V(N, 0);
11404 NewSDValueDbgMsg(V, "Creating new node: ", this);
11405 return V;
11406}
11407
11410 SDValue PassThru, EVT MemVT,
11411 MachineMemOperand *MMO,
11413 ISD::LoadExtType ExtTy, bool isExpanding) {
11414 bool Indexed = AM != ISD::UNINDEXED;
11415 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11416 "Unindexed masked load with an offset!");
11417 SDVTList VTs = Indexed ? getVTList(VT, Base.getValueType(), MVT::Other)
11418 : getVTList(VT, MVT::Other);
11419 SDValue Ops[] = {Chain, Base, Offset, Mask, PassThru};
11420 SDNodeKey ID(ISD::MLOAD, VTs, Ops);
11421 ID.AddInteger(MemVT.getRawBits());
11422 ID.AddInteger(getSyntheticNodeSubclassData<MaskedLoadSDNode>(
11423 dl.getIROrder(), VTs, AM, ExtTy, isExpanding, MemVT, MMO));
11424 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11425 ID.AddInteger(MMO->getFlags());
11426 FoldingSetInsertToken InsertToken;
11427 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11428 cast<MaskedLoadSDNode>(E)->refineAlignment(MMO);
11429 return SDValue(E, 0);
11430 }
11431 auto *N = newSDNode<MaskedLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11432 AM, ExtTy, isExpanding, MemVT, MMO);
11433 createOperands(N, Ops);
11434
11435 CSEMap.insert(N, InsertToken);
11436 InsertNode(N);
11437 SDValue V(N, 0);
11438 NewSDValueDbgMsg(V, "Creating new node: ", this);
11439 return V;
11440}
11441
11446 assert(LD->getOffset().getOpcode() == ISD::POISON &&
11447 "Masked load is already a indexed load!");
11448 return getMaskedLoad(OrigLoad.getValueType(), dl, LD->getChain(), Base,
11449 Offset, LD->getMask(), LD->getPassThru(),
11450 LD->getMemoryVT(), LD->getMemOperand(), AM,
11451 LD->getExtensionType(), LD->isExpandingLoad());
11452}
11453
11456 SDValue Mask, EVT MemVT,
11457 MachineMemOperand *MMO,
11458 ISD::MemIndexedMode AM, bool IsTruncating,
11459 bool IsCompressing) {
11460 assert(Chain.getValueType() == MVT::Other &&
11461 "Invalid chain type");
11462 bool Indexed = AM != ISD::UNINDEXED;
11463 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11464 "Unindexed masked store with an offset!");
11465 SDVTList VTs = Indexed ? getVTList(Base.getValueType(), MVT::Other)
11466 : getVTList(MVT::Other);
11467 SDValue Ops[] = {Chain, Val, Base, Offset, Mask};
11468 SDNodeKey ID(ISD::MSTORE, VTs, Ops);
11469 ID.AddInteger(MemVT.getRawBits());
11470 ID.AddInteger(getSyntheticNodeSubclassData<MaskedStoreSDNode>(
11471 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11472 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11473 ID.AddInteger(MMO->getFlags());
11474 FoldingSetInsertToken InsertToken;
11475 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11476 cast<MaskedStoreSDNode>(E)->refineAlignment(MMO);
11477 return SDValue(E, 0);
11478 }
11479 auto *N =
11480 newSDNode<MaskedStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11481 IsTruncating, IsCompressing, MemVT, MMO);
11482 createOperands(N, Ops);
11483
11484 CSEMap.insert(N, InsertToken);
11485 InsertNode(N);
11486 SDValue V(N, 0);
11487 NewSDValueDbgMsg(V, "Creating new node: ", this);
11488 return V;
11489}
11490
11495 assert(ST->getOffset().getOpcode() == ISD::POISON &&
11496 "Masked store is already a indexed store!");
11497 return getMaskedStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
11498 ST->getMask(), ST->getMemoryVT(), ST->getMemOperand(),
11499 AM, ST->isTruncatingStore(), ST->isCompressingStore());
11500}
11501
11504 MachineMemOperand *MMO,
11505 ISD::MemIndexType IndexType,
11506 ISD::LoadExtType ExtTy) {
11507 assert(Ops.size() == 6 && "Incompatible number of operands");
11508
11509 SDNodeKey ID(ISD::MGATHER, VTs, Ops);
11510 ID.AddInteger(MemVT.getRawBits());
11511 ID.AddInteger(getSyntheticNodeSubclassData<MaskedGatherSDNode>(
11512 dl.getIROrder(), VTs, MemVT, MMO, IndexType, ExtTy));
11513 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11514 ID.AddInteger(MMO->getFlags());
11515 FoldingSetInsertToken InsertToken;
11516 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11517 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11518 return SDValue(E, 0);
11519 }
11520
11521 auto *N = newSDNode<MaskedGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11522 VTs, MemVT, MMO, IndexType, ExtTy);
11523 createOperands(N, Ops);
11524
11525 assert(N->getPassThru().getValueType() == N->getValueType(0) &&
11526 "Incompatible type of the PassThru value in MaskedGatherSDNode");
11527 assert(N->getMask().getValueType().getVectorElementCount() ==
11528 N->getValueType(0).getVectorElementCount() &&
11529 "Vector width mismatch between mask and data");
11530 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11531 N->getValueType(0).getVectorElementCount().isScalable() &&
11532 "Scalable flags of index and data do not match");
11534 N->getIndex().getValueType().getVectorElementCount(),
11535 N->getValueType(0).getVectorElementCount()) &&
11536 "Vector width mismatch between index and data");
11537 assert(isa<ConstantSDNode>(N->getScale()) &&
11538 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11539 "Scale should be a constant power of 2");
11540
11541 CSEMap.insert(N, InsertToken);
11542 InsertNode(N);
11543 SDValue V(N, 0);
11544 NewSDValueDbgMsg(V, "Creating new node: ", this);
11545 return V;
11546}
11547
11550 MachineMemOperand *MMO,
11551 ISD::MemIndexType IndexType,
11552 bool IsTrunc) {
11553 assert(Ops.size() == 6 && "Incompatible number of operands");
11554
11555 SDNodeKey ID(ISD::MSCATTER, VTs, Ops);
11556 ID.AddInteger(MemVT.getRawBits());
11557 ID.AddInteger(getSyntheticNodeSubclassData<MaskedScatterSDNode>(
11558 dl.getIROrder(), VTs, MemVT, MMO, IndexType, IsTrunc));
11559 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11560 ID.AddInteger(MMO->getFlags());
11561 FoldingSetInsertToken InsertToken;
11562 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11563 cast<MaskedScatterSDNode>(E)->refineAlignment(MMO);
11564 return SDValue(E, 0);
11565 }
11566
11567 auto *N = newSDNode<MaskedScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11568 VTs, MemVT, MMO, IndexType, IsTrunc);
11569 createOperands(N, Ops);
11570
11571 assert(N->getMask().getValueType().getVectorElementCount() ==
11572 N->getValue().getValueType().getVectorElementCount() &&
11573 "Vector width mismatch between mask and data");
11574 assert(
11575 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11576 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11577 "Scalable flags of index and data do not match");
11579 N->getIndex().getValueType().getVectorElementCount(),
11580 N->getValue().getValueType().getVectorElementCount()) &&
11581 "Vector width mismatch between index and data");
11582 assert(isa<ConstantSDNode>(N->getScale()) &&
11583 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11584 "Scale should be a constant power of 2");
11585
11586 CSEMap.insert(N, InsertToken);
11587 InsertNode(N);
11588 SDValue V(N, 0);
11589 NewSDValueDbgMsg(V, "Creating new node: ", this);
11590 return V;
11591}
11592
11594 const SDLoc &dl, ArrayRef<SDValue> Ops,
11595 MachineMemOperand *MMO,
11596 ISD::MemIndexType IndexType) {
11597 assert(Ops.size() == 7 && "Incompatible number of operands");
11598
11600 ID.AddInteger(MemVT.getRawBits());
11601 ID.AddInteger(getSyntheticNodeSubclassData<MaskedHistogramSDNode>(
11602 dl.getIROrder(), VTs, MemVT, MMO, IndexType));
11603 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11604 ID.AddInteger(MMO->getFlags());
11605 FoldingSetInsertToken InsertToken;
11606 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11607 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11608 return SDValue(E, 0);
11609 }
11610
11611 auto *N = newSDNode<MaskedHistogramSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11612 VTs, MemVT, MMO, IndexType);
11613 createOperands(N, Ops);
11614
11615 assert(N->getMask().getValueType().getVectorElementCount() ==
11616 N->getIndex().getValueType().getVectorElementCount() &&
11617 "Vector width mismatch between mask and data");
11618 assert(isa<ConstantSDNode>(N->getScale()) &&
11619 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11620 "Scale should be a constant power of 2");
11621 assert(N->getInc().getValueType().isInteger() && "Non integer update value");
11622
11623 CSEMap.insert(N, InsertToken);
11624 InsertNode(N);
11625 SDValue V(N, 0);
11626 NewSDValueDbgMsg(V, "Creating new node: ", this);
11627 return V;
11628}
11629
11631 SDValue Ptr, SDValue Mask, SDValue EVL,
11632 MachineMemOperand *MMO) {
11633 SDVTList VTs = getVTList(VT, EVL.getValueType(), MVT::Other);
11634 SDValue Ops[] = {Chain, Ptr, Mask, EVL};
11635 SDNodeKey ID(ISD::VP_LOAD_FF, VTs, Ops);
11636 ID.AddInteger(VT.getRawBits());
11637 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadFFSDNode>(DL.getIROrder(),
11638 VTs, VT, MMO));
11639 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11640 ID.AddInteger(MMO->getFlags());
11641 FoldingSetInsertToken InsertToken;
11642 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
11643 cast<VPLoadFFSDNode>(E)->refineAlignment(MMO);
11644 return SDValue(E, 0);
11645 }
11646 auto *N = newSDNode<VPLoadFFSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs,
11647 VT, MMO);
11648 createOperands(N, Ops);
11649
11650 CSEMap.insert(N, InsertToken);
11651 InsertNode(N);
11652 SDValue V(N, 0);
11653 NewSDValueDbgMsg(V, "Creating new node: ", this);
11654 return V;
11655}
11656
11658 EVT MemVT, MachineMemOperand *MMO) {
11659 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11660 SDVTList VTs = getVTList(MVT::Other);
11661 SDValue Ops[] = {Chain, Ptr};
11663 ID.AddInteger(MemVT.getRawBits());
11664 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11665 ISD::GET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11666 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11667 ID.AddInteger(MMO->getFlags());
11668 FoldingSetInsertToken InsertToken;
11669 if (SDNode *E = lookupNode(ID, dl, InsertToken))
11670 return SDValue(E, 0);
11671
11672 auto *N = newSDNode<FPStateAccessSDNode>(ISD::GET_FPENV_MEM, dl.getIROrder(),
11673 dl.getDebugLoc(), VTs, MemVT, MMO);
11674 createOperands(N, Ops);
11675
11676 CSEMap.insert(N, InsertToken);
11677 InsertNode(N);
11678 SDValue V(N, 0);
11679 NewSDValueDbgMsg(V, "Creating new node: ", this);
11680 return V;
11681}
11682
11684 EVT MemVT, MachineMemOperand *MMO) {
11685 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11686 SDVTList VTs = getVTList(MVT::Other);
11687 SDValue Ops[] = {Chain, Ptr};
11689 ID.AddInteger(MemVT.getRawBits());
11690 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11691 ISD::SET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11692 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11693 ID.AddInteger(MMO->getFlags());
11694 FoldingSetInsertToken InsertToken;
11695 if (SDNode *E = lookupNode(ID, dl, InsertToken))
11696 return SDValue(E, 0);
11697
11698 auto *N = newSDNode<FPStateAccessSDNode>(ISD::SET_FPENV_MEM, dl.getIROrder(),
11699 dl.getDebugLoc(), VTs, MemVT, MMO);
11700 createOperands(N, Ops);
11701
11702 CSEMap.insert(N, InsertToken);
11703 InsertNode(N);
11704 SDValue V(N, 0);
11705 NewSDValueDbgMsg(V, "Creating new node: ", this);
11706 return V;
11707}
11708
11710 // select undef, T, F --> T (if T is a constant), otherwise F
11711 // select, ?, undef, F --> F
11712 // select, ?, T, undef --> T
11713 if (Cond.isUndef())
11714 return isConstantValueOfAnyType(T) ? T : F;
11715 if (T.isUndef())
11717 if (F.isUndef())
11719
11720 // select true, T, F --> T
11721 // select false, T, F --> F
11722 if (auto C = isBoolConstant(Cond))
11723 return *C ? T : F;
11724
11725 // select ?, T, T --> T
11726 if (T == F)
11727 return T;
11728
11729 return SDValue();
11730}
11731
11733 // shift undef, Y --> 0 (can always assume that the undef value is 0)
11734 if (X.isUndef())
11735 return getConstant(0, SDLoc(X.getNode()), X.getValueType());
11736 // shift X, undef --> undef (because it may shift by the bitwidth)
11737 if (Y.isUndef())
11738 return getUNDEF(X.getValueType());
11739
11740 // shift 0, Y --> 0
11741 // shift X, 0 --> X
11743 return X;
11744
11745 // shift X, C >= bitwidth(X) --> undef
11746 // All vector elements must be too big (or undef) to avoid partial undefs.
11747 auto isShiftTooBig = [X](ConstantSDNode *Val) {
11748 return !Val || Val->getAPIntValue().uge(X.getScalarValueSizeInBits());
11749 };
11750 if (ISD::matchUnaryPredicate(Y, isShiftTooBig, true))
11751 return getUNDEF(X.getValueType());
11752
11753 // shift i1/vXi1 X, Y --> X (any non-zero shift amount is undefined).
11754 if (X.getValueType().getScalarType() == MVT::i1)
11755 return X;
11756
11757 return SDValue();
11758}
11759
11761 SDNodeFlags Flags) {
11762 // If this operation has 'nnan' or 'ninf' and at least 1 disallowed operand
11763 // (an undef operand can be chosen to be Nan/Inf), then the result of this
11764 // operation is poison. That result can be relaxed to undef.
11765 ConstantFPSDNode *XC = isConstOrConstSplatFP(X, /* AllowUndefs */ true);
11766 ConstantFPSDNode *YC = isConstOrConstSplatFP(Y, /* AllowUndefs */ true);
11767 bool HasNan = (XC && XC->getValueAPF().isNaN()) ||
11768 (YC && YC->getValueAPF().isNaN());
11769 bool HasInf = (XC && XC->getValueAPF().isInfinity()) ||
11770 (YC && YC->getValueAPF().isInfinity());
11771
11772 if (Flags.hasNoNaNs() && (HasNan || X.isUndef() || Y.isUndef()))
11773 return getUNDEF(X.getValueType());
11774
11775 if (Flags.hasNoInfs() && (HasInf || X.isUndef() || Y.isUndef()))
11776 return getUNDEF(X.getValueType());
11777
11778 if (!YC)
11779 return SDValue();
11780
11781 // X + -0.0 --> X
11782 if (Opcode == ISD::FADD)
11783 if (YC->getValueAPF().isNegZero())
11784 return X;
11785
11786 // X - +0.0 --> X
11787 if (Opcode == ISD::FSUB)
11788 if (YC->getValueAPF().isPosZero())
11789 return X;
11790
11791 // X * 1.0 --> X
11792 // X / 1.0 --> X
11793 if (Opcode == ISD::FMUL || Opcode == ISD::FDIV)
11794 if (YC->getValueAPF().isOne())
11795 return X;
11796
11797 // X * 0.0 --> 0.0
11798 if (Opcode == ISD::FMUL && Flags.hasNoNaNs() && Flags.hasNoSignedZeros())
11799 if (YC->getValueAPF().isZero())
11800 return getConstantFP(0.0, SDLoc(Y), Y.getValueType());
11801
11802 return SDValue();
11803}
11804
11806 SDValue Ptr, SDValue SV, unsigned Align) {
11807 SDValue Ops[] = { Chain, Ptr, SV, getTargetConstant(Align, dl, MVT::i32) };
11808 return getNode(ISD::VAARG, dl, getVTList(VT, MVT::Other), Ops);
11809}
11810
11811SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11813 switch (Ops.size()) {
11814 case 0: return getNode(Opcode, DL, VT);
11815 case 1: return getNode(Opcode, DL, VT, Ops[0].get());
11816 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]);
11817 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]);
11818 default: break;
11819 }
11820
11821 // Copy from an SDUse array into an SDValue array for use with
11822 // the regular getNode logic.
11824 return getNode(Opcode, DL, VT, NewOps);
11825}
11826
11827SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11829 SDNodeFlags Flags;
11830 if (Inserter)
11831 Flags = Inserter->getFlags();
11832 return getNode(Opcode, DL, VT, Ops, Flags);
11833}
11834
11835SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11836 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11837 unsigned NumOps = Ops.size();
11838 switch (NumOps) {
11839 case 0: return getNode(Opcode, DL, VT);
11840 case 1: return getNode(Opcode, DL, VT, Ops[0], Flags);
11841 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Flags);
11842 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2], Flags);
11843 default: break;
11844 }
11845
11846#ifndef NDEBUG
11847 for (const auto &Op : Ops)
11848 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11849 "Operand is DELETED_NODE!");
11850#endif
11851
11852 switch (Opcode) {
11853 default: break;
11854 case ISD::BUILD_VECTOR:
11855 // Attempt to simplify BUILD_VECTOR.
11856 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
11857 return V;
11858 break;
11860 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
11861 return V;
11862 break;
11863 case ISD::SELECT_CC:
11864 assert(NumOps == 5 && "SELECT_CC takes 5 operands!");
11865 assert(Ops[0].getValueType() == Ops[1].getValueType() &&
11866 "LHS and RHS of condition must have same type!");
11867 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11868 "True and False arms of SelectCC must have same type!");
11869 assert(Ops[2].getValueType() == VT &&
11870 "select_cc node must be of same type as true and false value!");
11871 assert((!Ops[0].getValueType().isVector() ||
11872 Ops[0].getValueType().getVectorElementCount() ==
11873 VT.getVectorElementCount()) &&
11874 "Expected select_cc with vector result to have the same sized "
11875 "comparison type!");
11876 break;
11877 case ISD::BR_CC:
11878 assert(NumOps == 5 && "BR_CC takes 5 operands!");
11879 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11880 "LHS/RHS of comparison should match types!");
11881 break;
11882 case ISD::VP_REDUCE_MUL:
11883 // If it is VP_REDUCE_MUL mask operation then turn it to VP_REDUCE_AND
11884 if (VT == MVT::i1)
11885 Opcode = ISD::VP_REDUCE_AND;
11886 break;
11887 case ISD::VP_REDUCE_ADD:
11888 // If it is VP_REDUCE_ADD mask operation then turn it to VP_REDUCE_XOR
11889 if (VT == MVT::i1)
11890 Opcode = ISD::VP_REDUCE_XOR;
11891 break;
11892 case ISD::VP_REDUCE_SMAX:
11893 case ISD::VP_REDUCE_UMIN:
11894 // If it is VP_REDUCE_SMAX/VP_REDUCE_UMIN mask operation then turn it to
11895 // VP_REDUCE_AND.
11896 if (VT == MVT::i1)
11897 Opcode = ISD::VP_REDUCE_AND;
11898 break;
11899 case ISD::VP_REDUCE_SMIN:
11900 case ISD::VP_REDUCE_UMAX:
11901 // If it is VP_REDUCE_SMIN/VP_REDUCE_UMAX mask operation then turn it to
11902 // VP_REDUCE_OR.
11903 if (VT == MVT::i1)
11904 Opcode = ISD::VP_REDUCE_OR;
11905 break;
11906 }
11907
11908 // Memoize nodes.
11909 SDNode *N;
11910 SDVTList VTs = getVTList(VT);
11911
11912 if (VT != MVT::Glue) {
11913 SDNodeKey ID(Opcode, VTs, Ops);
11914 FoldingSetInsertToken InsertToken;
11915
11916 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
11917 E->intersectFlagsWith(Flags);
11918 return SDValue(E, 0);
11919 }
11920
11921 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11922 createOperands(N, Ops);
11923
11924 CSEMap.insert(N, InsertToken);
11925 } else {
11926 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11927 createOperands(N, Ops);
11928 }
11929
11930 N->setFlags(Flags);
11931 InsertNode(N);
11932 SDValue V(N, 0);
11933 NewSDValueDbgMsg(V, "Creating new node: ", this);
11934 return V;
11935}
11936
11937SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11938 ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops) {
11939 SDNodeFlags Flags;
11940 if (Inserter)
11941 Flags = Inserter->getFlags();
11942 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11943}
11944
11945SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11947 const SDNodeFlags Flags) {
11948 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11949}
11950
11951SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11953 SDNodeFlags Flags;
11954 if (Inserter)
11955 Flags = Inserter->getFlags();
11956 return getNode(Opcode, DL, VTList, Ops, Flags);
11957}
11958
11959SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11960 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11961 if (VTList.NumVTs == 1)
11962 return getNode(Opcode, DL, VTList.VTs[0], Ops, Flags);
11963
11964#ifndef NDEBUG
11965 for (const auto &Op : Ops)
11966 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11967 "Operand is DELETED_NODE!");
11968#endif
11969
11970 switch (Opcode) {
11971 case ISD::SADDO:
11972 case ISD::UADDO:
11973 case ISD::SSUBO:
11974 case ISD::USUBO: {
11975 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
11976 "Invalid add/sub overflow op!");
11977 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
11978 Ops[0].getValueType() == Ops[1].getValueType() &&
11979 Ops[0].getValueType() == VTList.VTs[0] &&
11980 "Binary operator types must match!");
11981 SDValue N1 = Ops[0], N2 = Ops[1];
11982 canonicalizeCommutativeBinop(Opcode, N1, N2);
11983
11984 // (X +- 0) -> X with zero-overflow.
11985 ConstantSDNode *N2CV = isConstOrConstSplat(N2, /*AllowUndefs*/ false,
11986 /*AllowTruncation*/ true);
11987 if (N2CV && N2CV->isZero()) {
11988 SDValue ZeroOverFlow = getConstant(0, DL, VTList.VTs[1]);
11989 return getNode(ISD::MERGE_VALUES, DL, VTList, {N1, ZeroOverFlow}, Flags);
11990 }
11991
11992 if (VTList.VTs[0].getScalarType() == MVT::i1 &&
11993 VTList.VTs[1].getScalarType() == MVT::i1) {
11994 SDValue F1 = getFreeze(N1);
11995 SDValue F2 = getFreeze(N2);
11996 // {vXi1,vXi1} (u/s)addo(vXi1 x, vXi1y) -> {xor(x,y),and(x,y)}
11997 if (Opcode == ISD::UADDO || Opcode == ISD::SADDO)
11998 return getNode(ISD::MERGE_VALUES, DL, VTList,
11999 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
12000 getNode(ISD::AND, DL, VTList.VTs[1], F1, F2)},
12001 Flags);
12002 // {vXi1,vXi1} (u/s)subo(vXi1 x, vXi1y) -> {xor(x,y),and(~x,y)}
12003 if (Opcode == ISD::USUBO || Opcode == ISD::SSUBO) {
12004 SDValue NotF1 = getNOT(DL, F1, VTList.VTs[0]);
12005 return getNode(ISD::MERGE_VALUES, DL, VTList,
12006 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
12007 getNode(ISD::AND, DL, VTList.VTs[1], NotF1, F2)},
12008 Flags);
12009 }
12010 }
12011 break;
12012 }
12013 case ISD::SADDO_CARRY:
12014 case ISD::UADDO_CARRY:
12015 case ISD::SSUBO_CARRY:
12016 case ISD::USUBO_CARRY:
12017 assert(VTList.NumVTs == 2 && Ops.size() == 3 &&
12018 "Invalid add/sub overflow op!");
12019 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
12020 Ops[0].getValueType() == Ops[1].getValueType() &&
12021 Ops[0].getValueType() == VTList.VTs[0] &&
12022 Ops[2].getValueType() == VTList.VTs[1] &&
12023 "Binary operator types must match!");
12024 break;
12025 case ISD::SMUL_LOHI:
12026 case ISD::UMUL_LOHI: {
12027 assert(VTList.NumVTs == 2 && Ops.size() == 2 && "Invalid mul lo/hi op!");
12028 assert(VTList.VTs[0].isInteger() && VTList.VTs[0] == VTList.VTs[1] &&
12029 VTList.VTs[0] == Ops[0].getValueType() &&
12030 VTList.VTs[0] == Ops[1].getValueType() &&
12031 "Binary operator types must match!");
12032 // Constant fold.
12035 if (LHS && RHS) {
12036 unsigned Width = VTList.VTs[0].getScalarSizeInBits();
12037 unsigned OutWidth = Width * 2;
12038 APInt Val = LHS->getAPIntValue();
12039 APInt Mul = RHS->getAPIntValue();
12040 if (Opcode == ISD::SMUL_LOHI) {
12041 Val = Val.sext(OutWidth);
12042 Mul = Mul.sext(OutWidth);
12043 } else {
12044 Val = Val.zext(OutWidth);
12045 Mul = Mul.zext(OutWidth);
12046 }
12047 Val *= Mul;
12048
12049 SDValue Hi =
12050 getConstant(Val.extractBits(Width, Width), DL, VTList.VTs[0]);
12051 SDValue Lo = getConstant(Val.trunc(Width), DL, VTList.VTs[0]);
12052 return getNode(ISD::MERGE_VALUES, DL, VTList, {Lo, Hi}, Flags);
12053 }
12054 break;
12055 }
12056 case ISD::FFREXP: {
12057 assert(VTList.NumVTs == 2 && Ops.size() == 1 && "Invalid ffrexp op!");
12058 assert(VTList.VTs[0].isFloatingPoint() && VTList.VTs[1].isInteger() &&
12059 VTList.VTs[0] == Ops[0].getValueType() && "frexp type mismatch");
12060
12062 int FrexpExp;
12063 APFloat FrexpMant =
12064 frexp(C->getValueAPF(), FrexpExp, APFloat::rmNearestTiesToEven);
12065 SDValue Result0 = getConstantFP(FrexpMant, DL, VTList.VTs[0]);
12066 SDValue Result1 = getSignedConstant(FrexpMant.isFinite() ? FrexpExp : 0,
12067 DL, VTList.VTs[1]);
12068 return getNode(ISD::MERGE_VALUES, DL, VTList, {Result0, Result1}, Flags);
12069 }
12070
12071 break;
12072 }
12074 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
12075 "Invalid STRICT_FP_EXTEND!");
12076 assert(VTList.VTs[0].isFloatingPoint() &&
12077 Ops[1].getValueType().isFloatingPoint() && "Invalid FP cast!");
12078 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
12079 "STRICT_FP_EXTEND result type should be vector iff the operand "
12080 "type is vector!");
12081 assert((!VTList.VTs[0].isVector() ||
12082 VTList.VTs[0].getVectorElementCount() ==
12083 Ops[1].getValueType().getVectorElementCount()) &&
12084 "Vector element count mismatch!");
12085 assert(Ops[1].getValueType().bitsLT(VTList.VTs[0]) &&
12086 "Invalid fpext node, dst <= src!");
12087 break;
12089 assert(VTList.NumVTs == 2 && Ops.size() == 3 && "Invalid STRICT_FP_ROUND!");
12090 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
12091 "STRICT_FP_ROUND result type should be vector iff the operand "
12092 "type is vector!");
12093 assert((!VTList.VTs[0].isVector() ||
12094 VTList.VTs[0].getVectorElementCount() ==
12095 Ops[1].getValueType().getVectorElementCount()) &&
12096 "Vector element count mismatch!");
12097 assert(VTList.VTs[0].isFloatingPoint() &&
12098 Ops[1].getValueType().isFloatingPoint() &&
12099 VTList.VTs[0].bitsLT(Ops[1].getValueType()) &&
12100 Ops[2].getOpcode() == ISD::TargetConstant &&
12101 (Ops[2]->getAsZExtVal() == 0 || Ops[2]->getAsZExtVal() == 1) &&
12102 "Invalid STRICT_FP_ROUND!");
12103 break;
12104 }
12105
12106 // Memoize the node unless it returns a glue result.
12107 SDNode *N;
12108 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
12109 SDNodeKey ID(Opcode, VTList, Ops);
12110 FoldingSetInsertToken InsertToken;
12111 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
12112 E->intersectFlagsWith(Flags);
12113 return SDValue(E, 0);
12114 }
12115
12116 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
12117 createOperands(N, Ops);
12118 CSEMap.insert(N, InsertToken);
12119 } else {
12120 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
12121 createOperands(N, Ops);
12122 }
12123
12124 N->setFlags(Flags);
12125 InsertNode(N);
12126 SDValue V(N, 0);
12127 NewSDValueDbgMsg(V, "Creating new node: ", this);
12128 return V;
12129}
12130
12131SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
12132 SDVTList VTList) {
12133 return getNode(Opcode, DL, VTList, ArrayRef<SDValue>());
12134}
12135
12136SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12137 SDValue N1) {
12138 SDValue Ops[] = { N1 };
12139 return getNode(Opcode, DL, VTList, Ops);
12140}
12141
12142SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12143 SDValue N1, SDValue N2) {
12144 SDValue Ops[] = { N1, N2 };
12145 return getNode(Opcode, DL, VTList, Ops);
12146}
12147
12148SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12149 SDValue N1, SDValue N2, SDValue N3) {
12150 SDValue Ops[] = { N1, N2, N3 };
12151 return getNode(Opcode, DL, VTList, Ops);
12152}
12153
12154SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12155 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
12156 SDValue Ops[] = { N1, N2, N3, N4 };
12157 return getNode(Opcode, DL, VTList, Ops);
12158}
12159
12160SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12161 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
12162 SDValue N5) {
12163 SDValue Ops[] = { N1, N2, N3, N4, N5 };
12164 return getNode(Opcode, DL, VTList, Ops);
12165}
12166
12168 if (!VT.isExtended())
12169 return makeVTList(SDNode::getValueTypeList(VT.getSimpleVT()), 1);
12170
12171 EVT VTs[] = {VT};
12172 return getVTList(VTs);
12173}
12174
12176 EVT VTs[] = {VT1, VT2};
12177 return getVTList(VTs);
12178}
12179
12181 EVT VTs[] = {VT1, VT2, VT3};
12182 return getVTList(VTs);
12183}
12184
12186 EVT VTs[] = {VT1, VT2, VT3, VT4};
12187 return getVTList(VTs);
12188}
12189
12191 auto It = VTLists.find(VTs);
12192 if (It == VTLists.end()) {
12193 EVT *Array = Allocator.Allocate<EVT>(VTs.size());
12194 llvm::copy(VTs, Array);
12195 It = VTLists.insert(ArrayRef(Array, VTs.size())).first;
12196 }
12197 return makeVTList(It->data(), It->size());
12198}
12199
12200/// UpdateNodeOperands - *Mutate* the specified node in-place to have the
12201/// specified operands. If the resultant node already exists in the DAG,
12202/// this does not modify the specified node, instead it returns the node that
12203/// already exists. If the resultant node does not exist in the DAG, the
12204/// input node is returned. As a degenerate case, if you specify the same
12205/// input operands as the node already has, the input node is returned.
12207 assert(N->getNumOperands() == 1 && "Update with wrong number of operands");
12208
12209 // Check to see if there is no change.
12210 if (Op == N->getOperand(0)) return N;
12211
12212 // See if the modified node already exists.
12213 FoldingSetInsertToken InsertToken;
12214 if (SDNode *Existing = FindModifiedNodeSlot(N, Op, InsertToken))
12215 return Existing;
12216
12217 // Nope it doesn't. Remove the node from its current place in the maps.
12218 if (InsertToken)
12219 if (!RemoveNodeFromCSEMaps(N))
12220 InsertToken = {};
12221
12222 // Now we update the operands.
12223 N->OperandList[0].set(Op);
12224
12226 // If this gets put into a CSE map, add it.
12227 if (InsertToken)
12228 CSEMap.insert(N, InsertToken);
12229 return N;
12230}
12231
12233 assert(N->getNumOperands() == 2 && "Update with wrong number of operands");
12234
12235 // Check to see if there is no change.
12236 if (Op1 == N->getOperand(0) && Op2 == N->getOperand(1))
12237 return N; // No operands changed, just return the input node.
12238
12239 // See if the modified node already exists.
12240 FoldingSetInsertToken InsertToken;
12241 if (SDNode *Existing = FindModifiedNodeSlot(N, Op1, Op2, InsertToken))
12242 return Existing;
12243
12244 // Nope it doesn't. Remove the node from its current place in the maps.
12245 if (InsertToken)
12246 if (!RemoveNodeFromCSEMaps(N))
12247 InsertToken = {};
12248
12249 // Now we update the operands.
12250 if (N->OperandList[0] != Op1)
12251 N->OperandList[0].set(Op1);
12252 if (N->OperandList[1] != Op2)
12253 N->OperandList[1].set(Op2);
12254
12256 // If this gets put into a CSE map, add it.
12257 if (InsertToken)
12258 CSEMap.insert(N, InsertToken);
12259 return N;
12260}
12261
12264 SDValue Ops[] = { Op1, Op2, Op3 };
12265 return UpdateNodeOperands(N, Ops);
12266}
12267
12270 SDValue Op3, SDValue Op4) {
12271 SDValue Ops[] = { Op1, Op2, Op3, Op4 };
12272 return UpdateNodeOperands(N, Ops);
12273}
12274
12277 SDValue Op3, SDValue Op4, SDValue Op5) {
12278 SDValue Ops[] = { Op1, Op2, Op3, Op4, Op5 };
12279 return UpdateNodeOperands(N, Ops);
12280}
12281
12284 unsigned NumOps = Ops.size();
12285 assert(N->getNumOperands() == NumOps &&
12286 "Update with wrong number of operands");
12287
12288 // If no operands changed just return the input node.
12289 if (std::equal(Ops.begin(), Ops.end(), N->op_begin()))
12290 return N;
12291
12292 // See if the modified node already exists.
12293 FoldingSetInsertToken InsertToken;
12294 if (SDNode *Existing = FindModifiedNodeSlot(N, Ops, InsertToken))
12295 return Existing;
12296
12297 // Nope it doesn't. Remove the node from its current place in the maps.
12298 if (InsertToken)
12299 if (!RemoveNodeFromCSEMaps(N))
12300 InsertToken = {};
12301
12302 // Now we update the operands.
12303 for (unsigned i = 0; i != NumOps; ++i)
12304 if (N->OperandList[i] != Ops[i])
12305 N->OperandList[i].set(Ops[i]);
12306
12308 // If this gets put into a CSE map, add it.
12309 if (InsertToken)
12310 CSEMap.insert(N, InsertToken);
12311 return N;
12312}
12313
12314/// DropOperands - Release the operands and set this node to have
12315/// zero operands.
12317 // Unlike the code in MorphNodeTo that does this, we don't need to
12318 // watch for dead nodes here.
12319 for (op_iterator I = op_begin(), E = op_end(); I != E; ) {
12320 SDUse &Use = *I++;
12321 Use.set(SDValue());
12322 }
12323}
12324
12326 ArrayRef<MachineMemOperand *> NewMemRefs) {
12327 if (NewMemRefs.empty()) {
12328 N->clearMemRefs();
12329 return;
12330 }
12331
12332 // Check if we can avoid allocating by storing a single reference directly.
12333 if (NewMemRefs.size() == 1) {
12334 N->MemRefs = NewMemRefs[0];
12335 N->NumMemRefs = 1;
12336 return;
12337 }
12338
12339 MachineMemOperand **MemRefsBuffer =
12340 Allocator.template Allocate<MachineMemOperand *>(NewMemRefs.size());
12341 llvm::copy(NewMemRefs, MemRefsBuffer);
12342 N->MemRefs = MemRefsBuffer;
12343 N->NumMemRefs = static_cast<int>(NewMemRefs.size());
12344}
12345
12346/// SelectNodeTo - These are wrappers around MorphNodeTo that accept a
12347/// machine opcode.
12348///
12350 EVT VT) {
12351 SDVTList VTs = getVTList(VT);
12352 return SelectNodeTo(N, MachineOpc, VTs, {});
12353}
12354
12356 EVT VT, SDValue Op1) {
12357 SDVTList VTs = getVTList(VT);
12358 SDValue Ops[] = { Op1 };
12359 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12360}
12361
12363 EVT VT, SDValue Op1,
12364 SDValue Op2) {
12365 SDVTList VTs = getVTList(VT);
12366 SDValue Ops[] = { Op1, Op2 };
12367 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12368}
12369
12371 EVT VT, SDValue Op1,
12372 SDValue Op2, SDValue Op3) {
12373 SDVTList VTs = getVTList(VT);
12374 SDValue Ops[] = { Op1, Op2, Op3 };
12375 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12376}
12377
12380 SDVTList VTs = getVTList(VT);
12381 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12382}
12383
12385 EVT VT1, EVT VT2, ArrayRef<SDValue> Ops) {
12386 SDVTList VTs = getVTList(VT1, VT2);
12387 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12388}
12389
12391 EVT VT1, EVT VT2) {
12392 SDVTList VTs = getVTList(VT1, VT2);
12393 return SelectNodeTo(N, MachineOpc, VTs, {});
12394}
12395
12397 EVT VT1, EVT VT2, EVT VT3,
12399 SDVTList VTs = getVTList(VT1, VT2, VT3);
12400 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12401}
12402
12404 EVT VT1, EVT VT2,
12405 SDValue Op1, SDValue Op2) {
12406 SDVTList VTs = getVTList(VT1, VT2);
12407 SDValue Ops[] = { Op1, Op2 };
12408 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12409}
12410
12413 SDNode *New = MorphNodeTo(N, ~MachineOpc, VTs, Ops);
12414 // Reset the NodeID to -1.
12415 New->setNodeId(-1);
12416 if (New != N) {
12417 ReplaceAllUsesWith(N, New);
12419 }
12420 return New;
12421}
12422
12423/// UpdateSDLocOnMergeSDNode - If the opt level is -O0 then it throws away
12424/// the line number information on the merged node since it is not possible to
12425/// preserve the information that operation is associated with multiple lines.
12426/// This will make the debugger working better at -O0, were there is a higher
12427/// probability having other instructions associated with that line.
12428///
12429/// For IROrder, we keep the smaller of the two
12430SDNode *SelectionDAG::UpdateSDLocOnMergeSDNode(SDNode *N, const SDLoc &OLoc) {
12431 DebugLoc NLoc = N->getDebugLoc();
12432 if (NLoc && OptLevel == CodeGenOptLevel::None && OLoc.getDebugLoc() != NLoc) {
12433 N->setDebugLoc(DebugLoc());
12434 }
12435 unsigned Order = std::min(N->getIROrder(), OLoc.getIROrder());
12436 N->setIROrder(Order);
12437 return N;
12438}
12439
12440/// MorphNodeTo - This *mutates* the specified node to have the specified
12441/// return type, opcode, and operands.
12442///
12443/// Note that MorphNodeTo returns the resultant node. If there is already a
12444/// node of the specified opcode and operands, it returns that node instead of
12445/// the current one. Note that the SDLoc need not be the same.
12446///
12447/// Using MorphNodeTo is faster than creating a new node and swapping it in
12448/// with ReplaceAllUsesWith both because it often avoids allocating a new
12449/// node, and because it doesn't require CSE recalculation for any of
12450/// the node's users.
12451///
12452/// However, note that MorphNodeTo recursively deletes dead nodes from the DAG.
12453/// As a consequence it isn't appropriate to use from within the DAG combiner or
12454/// the legalizer which maintain worklists that would need to be updated when
12455/// deleting things.
12458 // If an identical node already exists, use it.
12459 FoldingSetInsertToken InsertToken;
12460 if (VTs.VTs[VTs.NumVTs-1] != MVT::Glue) {
12461 SDNodeKey ID(Opc, VTs, Ops);
12462 AddNodeIDCustom(ID.Tail, N, Opc);
12463 if (SDNode *ON = lookupNode(ID, SDLoc(N), InsertToken))
12464 return UpdateSDLocOnMergeSDNode(ON, SDLoc(N));
12465 }
12466
12467 if (!RemoveNodeFromCSEMaps(N))
12468 InsertToken = {};
12469
12470 // Start the morphing.
12471 N->NodeType = Opc;
12472 N->ValueList = VTs.VTs;
12473 N->NumValues = VTs.NumVTs;
12474
12475 // Clear the operands list, updating used nodes to remove this from their
12476 // use list. Keep track of any operands that become dead as a result.
12477 SmallPtrSet<SDNode*, 16> DeadNodeSet;
12478 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
12479 SDUse &Use = *I++;
12480 SDNode *Used = Use.getNode();
12481 Use.set(SDValue());
12482 if (Used->use_empty())
12483 DeadNodeSet.insert(Used);
12484 }
12485
12486 // For MachineNode, initialize the memory references information.
12488 MN->clearMemRefs();
12489
12490 // Swap for an appropriately sized array from the recycler.
12491 removeOperands(N);
12492 createOperands(N, Ops);
12493
12494 // Delete any nodes that are still dead after adding the uses for the
12495 // new operands.
12496 if (!DeadNodeSet.empty()) {
12497 SmallVector<SDNode *, 16> DeadNodes;
12498 for (SDNode *N : DeadNodeSet)
12499 if (N->use_empty())
12500 DeadNodes.push_back(N);
12501 RemoveDeadNodes(DeadNodes);
12502 }
12503
12504 if (InsertToken)
12505 CSEMap.insert(N, InsertToken); // Memoize the new node.
12506 return N;
12507}
12508
12510 unsigned OrigOpc = Node->getOpcode();
12511 unsigned NewOpc;
12512 switch (OrigOpc) {
12513 default:
12514 llvm_unreachable("mutateStrictFPToFP called with unexpected opcode!");
12515#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12516 case ISD::STRICT_##DAGN: NewOpc = ISD::DAGN; break;
12517#define CMP_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12518 case ISD::STRICT_##DAGN: NewOpc = ISD::SETCC; break;
12519#include "llvm/IR/ConstrainedOps.def"
12520 }
12521
12522 assert(Node->getNumValues() == 2 && "Unexpected number of results!");
12523
12524 // We're taking this node out of the chain, so we need to re-link things.
12525 SDValue InputChain = Node->getOperand(0);
12526 SDValue OutputChain = SDValue(Node, 1);
12527 ReplaceAllUsesOfValueWith(OutputChain, InputChain);
12528
12530 for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
12531 Ops.push_back(Node->getOperand(i));
12532
12533 SDVTList VTs = getVTList(Node->getValueType(0));
12534 SDNode *Res = MorphNodeTo(Node, NewOpc, VTs, Ops);
12535
12536 // MorphNodeTo can operate in two ways: if an existing node with the
12537 // specified operands exists, it can just return it. Otherwise, it
12538 // updates the node in place to have the requested operands.
12539 if (Res == Node) {
12540 // If we updated the node in place, reset the node ID. To the isel,
12541 // this should be just like a newly allocated machine node.
12542 Res->setNodeId(-1);
12543 } else {
12546 }
12547
12548 return Res;
12549}
12550
12551/// getMachineNode - These are used for target selectors to create a new node
12552/// with specified return type(s), MachineInstr opcode, and operands.
12553///
12554/// Note that getMachineNode returns the resultant node. If there is already a
12555/// node of the specified opcode and operands, it returns that node instead of
12556/// the current one.
12558 EVT VT) {
12559 SDVTList VTs = getVTList(VT);
12560 return getMachineNode(Opcode, dl, VTs, {});
12561}
12562
12564 EVT VT, SDValue Op1) {
12565 SDVTList VTs = getVTList(VT);
12566 SDValue Ops[] = { Op1 };
12567 return getMachineNode(Opcode, dl, VTs, Ops);
12568}
12569
12571 EVT VT, SDValue Op1, SDValue Op2) {
12572 SDVTList VTs = getVTList(VT);
12573 SDValue Ops[] = { Op1, Op2 };
12574 return getMachineNode(Opcode, dl, VTs, Ops);
12575}
12576
12578 EVT VT, SDValue Op1, SDValue Op2,
12579 SDValue Op3) {
12580 SDVTList VTs = getVTList(VT);
12581 SDValue Ops[] = { Op1, Op2, Op3 };
12582 return getMachineNode(Opcode, dl, VTs, Ops);
12583}
12584
12587 SDVTList VTs = getVTList(VT);
12588 return getMachineNode(Opcode, dl, VTs, Ops);
12589}
12590
12592 EVT VT1, EVT VT2, SDValue Op1,
12593 SDValue Op2) {
12594 SDVTList VTs = getVTList(VT1, VT2);
12595 SDValue Ops[] = { Op1, Op2 };
12596 return getMachineNode(Opcode, dl, VTs, Ops);
12597}
12598
12600 EVT VT1, EVT VT2, SDValue Op1,
12601 SDValue Op2, SDValue Op3) {
12602 SDVTList VTs = getVTList(VT1, VT2);
12603 SDValue Ops[] = { Op1, Op2, Op3 };
12604 return getMachineNode(Opcode, dl, VTs, Ops);
12605}
12606
12608 EVT VT1, EVT VT2,
12610 SDVTList VTs = getVTList(VT1, VT2);
12611 return getMachineNode(Opcode, dl, VTs, Ops);
12612}
12613
12615 EVT VT1, EVT VT2, EVT VT3,
12616 SDValue Op1, SDValue Op2) {
12617 SDVTList VTs = getVTList(VT1, VT2, VT3);
12618 SDValue Ops[] = { Op1, Op2 };
12619 return getMachineNode(Opcode, dl, VTs, Ops);
12620}
12621
12623 EVT VT1, EVT VT2, EVT VT3,
12624 SDValue Op1, SDValue Op2,
12625 SDValue Op3) {
12626 SDVTList VTs = getVTList(VT1, VT2, VT3);
12627 SDValue Ops[] = { Op1, Op2, Op3 };
12628 return getMachineNode(Opcode, dl, VTs, Ops);
12629}
12630
12632 EVT VT1, EVT VT2, EVT VT3,
12634 SDVTList VTs = getVTList(VT1, VT2, VT3);
12635 return getMachineNode(Opcode, dl, VTs, Ops);
12636}
12637
12639 ArrayRef<EVT> ResultTys,
12641 SDVTList VTs = getVTList(ResultTys);
12642 return getMachineNode(Opcode, dl, VTs, Ops);
12643}
12644
12646 SDVTList VTs,
12648 bool DoCSE = VTs.VTs[VTs.NumVTs-1] != MVT::Glue;
12650 FoldingSetInsertToken InsertToken;
12651
12652 if (DoCSE) {
12653 SDNodeKey ID(~Opcode, VTs, Ops);
12654 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
12655 return cast<MachineSDNode>(UpdateSDLocOnMergeSDNode(E, DL));
12656 }
12657 }
12658
12659 // Allocate a new MachineSDNode.
12660 N = newSDNode<MachineSDNode>(~Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
12661 createOperands(N, Ops);
12662
12663 if (DoCSE)
12664 CSEMap.insert(N, InsertToken);
12665
12666 InsertNode(N);
12667 NewSDValueDbgMsg(SDValue(N, 0), "Creating new machine node: ", this);
12668 return N;
12669}
12670
12671/// getTargetExtractSubreg - A convenience function for creating
12672/// TargetOpcode::EXTRACT_SUBREG nodes.
12674 SDValue Operand) {
12675 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12676 SDNode *Subreg = getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL,
12677 VT, Operand, SRIdxVal);
12678 return SDValue(Subreg, 0);
12679}
12680
12681/// getTargetInsertSubreg - A convenience function for creating
12682/// TargetOpcode::INSERT_SUBREG nodes.
12684 SDValue Operand, SDValue Subreg) {
12685 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12686 SDNode *Result = getMachineNode(TargetOpcode::INSERT_SUBREG, DL,
12687 VT, Operand, Subreg, SRIdxVal);
12688 return SDValue(Result, 0);
12689}
12690
12691/// getNodeIfExists - Get the specified node if it's already available, or
12692/// else return NULL.
12695 bool AllowCommute) {
12696 SDNodeFlags Flags;
12697 if (Inserter)
12698 Flags = Inserter->getFlags();
12699 return getNodeIfExists(Opcode, VTList, Ops, Flags, AllowCommute);
12700}
12701
12704 const SDNodeFlags Flags,
12705 bool AllowCommute) {
12706 if (VTList.VTs[VTList.NumVTs - 1] == MVT::Glue)
12707 return nullptr;
12708
12709 auto Lookup = [&](ArrayRef<SDValue> LookupOps) -> SDNode * {
12710 SDNodeKey ID(Opcode, VTList, LookupOps);
12711 FoldingSetInsertToken InsertToken;
12712 if (SDNode *E = lookupNode(ID, InsertToken)) {
12713 E->intersectFlagsWith(Flags);
12714 return E;
12715 }
12716 return nullptr;
12717 };
12718
12719 if (SDNode *Existing = Lookup(Ops))
12720 return Existing;
12721
12722 if (AllowCommute && TLI->isCommutativeBinOp(Opcode))
12723 return Lookup({Ops[1], Ops[0]});
12724
12725 return nullptr;
12726}
12727
12728/// doesNodeExist - Check if a node exists without modifying its flags.
12729bool SelectionDAG::doesNodeExist(unsigned Opcode, SDVTList VTList,
12731 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {
12732 SDNodeKey ID(Opcode, VTList, Ops);
12733 FoldingSetInsertToken InsertToken;
12734 if (lookupNode(ID, SDLoc(), InsertToken))
12735 return true;
12736 }
12737 return false;
12738}
12739
12740/// getDbgValue - Creates a SDDbgValue node.
12741///
12742/// SDNode
12744 SDNode *N, unsigned R, bool IsIndirect,
12745 const DebugLoc &DL, unsigned O) {
12746 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12747 "Expected inlined-at fields to agree");
12748 return new (DbgInfo->getAlloc())
12749 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromNode(N, R),
12750 {}, IsIndirect, DL, O,
12751 /*IsVariadic=*/false);
12752}
12753
12754/// Constant
12756 DIExpression *Expr,
12757 const Value *C,
12758 const DebugLoc &DL, unsigned O) {
12759 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12760 "Expected inlined-at fields to agree");
12761 return new (DbgInfo->getAlloc())
12762 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromConst(C), {},
12763 /*IsIndirect=*/false, DL, O,
12764 /*IsVariadic=*/false);
12765}
12766
12767/// FrameIndex
12769 DIExpression *Expr, unsigned FI,
12770 bool IsIndirect,
12771 const DebugLoc &DL,
12772 unsigned O) {
12773 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12774 "Expected inlined-at fields to agree");
12775 return getFrameIndexDbgValue(Var, Expr, FI, {}, IsIndirect, DL, O);
12776}
12777
12778/// FrameIndex with dependencies
12780 DIExpression *Expr, unsigned FI,
12781 ArrayRef<SDNode *> Dependencies,
12782 bool IsIndirect,
12783 const DebugLoc &DL,
12784 unsigned O) {
12785 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12786 "Expected inlined-at fields to agree");
12787 return new (DbgInfo->getAlloc())
12788 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromFrameIdx(FI),
12789 Dependencies, IsIndirect, DL, O,
12790 /*IsVariadic=*/false);
12791}
12792
12793/// VReg
12795 Register VReg, bool IsIndirect,
12796 const DebugLoc &DL, unsigned O) {
12797 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12798 "Expected inlined-at fields to agree");
12799 return new (DbgInfo->getAlloc())
12800 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromVReg(VReg),
12801 {}, IsIndirect, DL, O,
12802 /*IsVariadic=*/false);
12803}
12804
12807 ArrayRef<SDNode *> Dependencies,
12808 bool IsIndirect, const DebugLoc &DL,
12809 unsigned O, bool IsVariadic) {
12810 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12811 "Expected inlined-at fields to agree");
12812 return new (DbgInfo->getAlloc())
12813 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, Locs, Dependencies, IsIndirect,
12814 DL, O, IsVariadic);
12815}
12816
12818 unsigned OffsetInBits, unsigned SizeInBits,
12819 bool InvalidateDbg) {
12820 SDNode *FromNode = From.getNode();
12821 SDNode *ToNode = To.getNode();
12822 assert(FromNode && ToNode && "Can't modify dbg values");
12823
12824 // PR35338
12825 // TODO: assert(From != To && "Redundant dbg value transfer");
12826 // TODO: assert(FromNode != ToNode && "Intranode dbg value transfer");
12827 if (From == To || FromNode == ToNode)
12828 return;
12829
12830 if (!FromNode->getHasDebugValue())
12831 return;
12832
12833 SDDbgOperand FromLocOp =
12834 SDDbgOperand::fromNode(From.getNode(), From.getResNo());
12836
12838 for (SDDbgValue *Dbg : GetDbgValues(FromNode)) {
12839 if (Dbg->isInvalidated())
12840 continue;
12841
12842 // TODO: assert(!Dbg->isInvalidated() && "Transfer of invalid dbg value");
12843
12844 // Create a new location ops vector that is equal to the old vector, but
12845 // with each instance of FromLocOp replaced with ToLocOp.
12846 bool Changed = false;
12847 auto NewLocOps = Dbg->copyLocationOps();
12848 std::replace_if(
12849 NewLocOps.begin(), NewLocOps.end(),
12850 [&Changed, FromLocOp](const SDDbgOperand &Op) {
12851 bool Match = Op == FromLocOp;
12852 Changed |= Match;
12853 return Match;
12854 },
12855 ToLocOp);
12856 // Ignore this SDDbgValue if we didn't find a matching location.
12857 if (!Changed)
12858 continue;
12859
12860 DIVariable *Var = Dbg->getVariable();
12861 auto *Expr = Dbg->getExpression();
12862 // If a fragment is requested, update the expression.
12863 if (SizeInBits) {
12864 // When splitting a larger (e.g., sign-extended) value whose
12865 // lower bits are described with an SDDbgValue, do not attempt
12866 // to transfer the SDDbgValue to the upper bits.
12867 if (auto FI = Expr->getFragmentInfo())
12868 if (OffsetInBits + SizeInBits > FI->SizeInBits)
12869 continue;
12870 auto Fragment = DIExpression::createFragmentExpression(Expr, OffsetInBits,
12871 SizeInBits);
12872 if (!Fragment)
12873 continue;
12874 Expr = *Fragment;
12875 }
12876
12877 auto AdditionalDependencies = Dbg->getAdditionalDependencies();
12878 // Clone the SDDbgValue and move it to To.
12879 SDDbgValue *Clone = getDbgValueList(
12880 Var, Expr, NewLocOps, AdditionalDependencies, Dbg->isIndirect(),
12881 Dbg->getDebugLoc(), std::max(ToNode->getIROrder(), Dbg->getOrder()),
12882 Dbg->isVariadic());
12883 ClonedDVs.push_back(Clone);
12884
12885 if (InvalidateDbg) {
12886 // Invalidate value and indicate the SDDbgValue should not be emitted.
12887 Dbg->setIsInvalidated();
12888 Dbg->setIsEmitted();
12889 }
12890 }
12891
12892 for (SDDbgValue *Dbg : ClonedDVs) {
12893 assert(is_contained(Dbg->getSDNodes(), ToNode) &&
12894 "Transferred DbgValues should depend on the new SDNode");
12895 AddDbgValue(Dbg, false);
12896 }
12897}
12898
12900 if (!N.getHasDebugValue())
12901 return;
12902
12903 auto GetLocationOperand = [](SDNode *Node, unsigned ResNo) {
12904 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(Node))
12905 return SDDbgOperand::fromFrameIdx(FISDN->getIndex());
12906 return SDDbgOperand::fromNode(Node, ResNo);
12907 };
12908
12910 for (auto *DV : GetDbgValues(&N)) {
12911 if (DV->isInvalidated())
12912 continue;
12913 switch (N.getOpcode()) {
12914 default:
12915 break;
12916 case ISD::ADD: {
12917 SDValue N0 = N.getOperand(0);
12918 SDValue N1 = N.getOperand(1);
12919 if (!isa<ConstantSDNode>(N0)) {
12920 bool RHSConstant = isa<ConstantSDNode>(N1);
12921 uint64_t Offset;
12922 if (RHSConstant)
12923 Offset = N.getConstantOperandVal(1);
12924 // We are not allowed to turn indirect debug values variadic, so
12925 // don't salvage those.
12926 if (!RHSConstant && DV->isIndirect())
12927 continue;
12928
12929 // Rewrite an ADD constant node into a DIExpression. Since we are
12930 // performing arithmetic to compute the variable's *value* in the
12931 // DIExpression, we need to mark the expression with a
12932 // DW_OP_stack_value.
12933 auto *DIExpr = DV->getExpression();
12934 auto NewLocOps = DV->copyLocationOps();
12935 bool Changed = false;
12936 size_t OrigLocOpsSize = NewLocOps.size();
12937 for (size_t i = 0; i < OrigLocOpsSize; ++i) {
12938 // We're not given a ResNo to compare against because the whole
12939 // node is going away. We know that any ISD::ADD only has one
12940 // result, so we can assume any node match is using the result.
12941 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
12942 NewLocOps[i].getSDNode() != &N)
12943 continue;
12944 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
12945 if (RHSConstant) {
12948 DIExpr = DIExpression::appendOpsToArg(DIExpr, ExprOps, i, true);
12949 } else {
12950 // Convert to a variadic expression (if not already).
12951 // convertToVariadicExpression() returns a const pointer, so we use
12952 // a temporary const variable here.
12953 const auto *TmpDIExpr =
12957 ExprOps.push_back(NewLocOps.size());
12958 ExprOps.push_back(dwarf::DW_OP_plus);
12959 SDDbgOperand RHS =
12961 NewLocOps.push_back(RHS);
12962 DIExpr = DIExpression::appendOpsToArg(TmpDIExpr, ExprOps, i, true);
12963 }
12964 Changed = true;
12965 }
12966 (void)Changed;
12967 assert(Changed && "Salvage target doesn't use N");
12968
12969 bool IsVariadic =
12970 DV->isVariadic() || OrigLocOpsSize != NewLocOps.size();
12971
12972 auto AdditionalDependencies = DV->getAdditionalDependencies();
12973 SDDbgValue *Clone = getDbgValueList(
12974 DV->getVariable(), DIExpr, NewLocOps, AdditionalDependencies,
12975 DV->isIndirect(), DV->getDebugLoc(), DV->getOrder(), IsVariadic);
12976 ClonedDVs.push_back(Clone);
12977 DV->setIsInvalidated();
12978 DV->setIsEmitted();
12979 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting";
12980 N0.getNode()->dumprFull(this);
12981 dbgs() << " into " << *DIExpr << '\n');
12982 }
12983 break;
12984 }
12985 case ISD::TRUNCATE: {
12986 SDValue N0 = N.getOperand(0);
12987 TypeSize FromSize = N0.getValueSizeInBits();
12988 TypeSize ToSize = N.getValueSizeInBits(0);
12989
12990 DIExpression *DbgExpression = DV->getExpression();
12991 auto ExtOps = DIExpression::getExtOps(FromSize, ToSize, false);
12992 auto NewLocOps = DV->copyLocationOps();
12993 bool Changed = false;
12994 for (size_t i = 0; i < NewLocOps.size(); ++i) {
12995 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
12996 NewLocOps[i].getSDNode() != &N)
12997 continue;
12998
12999 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
13000 DbgExpression = DIExpression::appendOpsToArg(DbgExpression, ExtOps, i);
13001 Changed = true;
13002 }
13003 assert(Changed && "Salvage target doesn't use N");
13004 (void)Changed;
13005
13006 SDDbgValue *Clone =
13007 getDbgValueList(DV->getVariable(), DbgExpression, NewLocOps,
13008 DV->getAdditionalDependencies(), DV->isIndirect(),
13009 DV->getDebugLoc(), DV->getOrder(), DV->isVariadic());
13010
13011 ClonedDVs.push_back(Clone);
13012 DV->setIsInvalidated();
13013 DV->setIsEmitted();
13014 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting"; N0.getNode()->dumprFull(this);
13015 dbgs() << " into " << *DbgExpression << '\n');
13016 break;
13017 }
13018 }
13019 }
13020
13021 for (SDDbgValue *Dbg : ClonedDVs) {
13022 assert((!Dbg->getSDNodes().empty() ||
13023 llvm::any_of(Dbg->getLocationOps(),
13024 [&](const SDDbgOperand &Op) {
13025 return Op.getKind() == SDDbgOperand::FRAMEIX;
13026 })) &&
13027 "Salvaged DbgValue should depend on a new SDNode");
13028 AddDbgValue(Dbg, false);
13029 }
13030}
13031
13032/// Creates a SDDbgLabel node.
13034 const DebugLoc &DL, unsigned O) {
13035 assert(cast<DILabel>(Label)->isValidLocationForIntrinsic(DL) &&
13036 "Expected inlined-at fields to agree");
13037 return new (DbgInfo->getAlloc()) SDDbgLabel(Label, DL, O);
13038}
13039
13040namespace {
13041
13042/// RAUWUpdateListener - Helper for ReplaceAllUsesWith - When the node
13043/// pointed to by a use iterator is deleted, increment the use iterator
13044/// so that it doesn't dangle.
13045///
13046class RAUWUpdateListener : public SelectionDAG::DAGUpdateListener {
13049
13050 void NodeDeleted(SDNode *N, SDNode *E) override {
13051 // Increment the iterator as needed.
13052 while (UI != UE && N == UI->getUser())
13053 ++UI;
13054 }
13055
13056public:
13057 RAUWUpdateListener(SelectionDAG &d,
13060 : SelectionDAG::DAGUpdateListener(d), UI(ui), UE(ue) {}
13061};
13062
13063} // end anonymous namespace
13064
13065/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13066/// This can cause recursive merging of nodes in the DAG.
13067///
13068/// This version assumes From has a single result value.
13069///
13071 SDNode *From = FromN.getNode();
13072 assert(From->getNumValues() == 1 && FromN.getResNo() == 0 &&
13073 "Cannot replace with this method!");
13074 assert(From != To.getNode() && "Cannot replace uses of with self");
13075
13076 // Preserve Debug Values
13077 transferDbgValues(FromN, To);
13078 // Preserve extra info.
13079 copyExtraInfo(From, To.getNode());
13080
13081 // Iterate over all the existing uses of From. New uses will be added
13082 // to the beginning of the use list, which we avoid visiting.
13083 // This specifically avoids visiting uses of From that arise while the
13084 // replacement is happening, because any such uses would be the result
13085 // of CSE: If an existing node looks like From after one of its operands
13086 // is replaced by To, we don't want to replace of all its users with To
13087 // too. See PR3018 for more info.
13088 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13089 RAUWUpdateListener Listener(*this, UI, UE);
13090 while (UI != UE) {
13091 SDNode *User = UI->getUser();
13092
13093 // This node is about to morph, remove its old self from the CSE maps.
13094 RemoveNodeFromCSEMaps(User);
13095
13096 // A user can appear in a use list multiple times, and when this
13097 // happens the uses are usually next to each other in the list.
13098 // To help reduce the number of CSE recomputations, process all
13099 // the uses of this user that we can find this way.
13100 do {
13101 SDUse &Use = *UI;
13102 ++UI;
13103 Use.set(To);
13104 if (To->isDivergent() != From->isDivergent())
13106 } while (UI != UE && UI->getUser() == User);
13107 // Now that we have modified User, add it back to the CSE maps. If it
13108 // already exists there, recursively merge the results together.
13109 AddModifiedNodeToCSEMaps(User);
13110 }
13111
13112 // If we just RAUW'd the root, take note.
13113 if (FromN == getRoot())
13114 setRoot(To);
13115}
13116
13117/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13118/// This can cause recursive merging of nodes in the DAG.
13119///
13120/// This version assumes that for each value of From, there is a
13121/// corresponding value in To in the same position with the same type.
13122///
13124#ifndef NDEBUG
13125 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
13126 assert((!From->hasAnyUseOfValue(i) ||
13127 From->getValueType(i) == To->getValueType(i)) &&
13128 "Cannot use this version of ReplaceAllUsesWith!");
13129#endif
13130
13131 // Handle the trivial case.
13132 if (From == To)
13133 return;
13134
13135 // Preserve Debug Info. Only do this if there's a use.
13136 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
13137 if (From->hasAnyUseOfValue(i)) {
13138 assert((i < To->getNumValues()) && "Invalid To location");
13139 transferDbgValues(SDValue(From, i), SDValue(To, i));
13140 }
13141 // Preserve extra info.
13142 copyExtraInfo(From, To);
13143
13144 // Iterate over just the existing users of From. See the comments in
13145 // the ReplaceAllUsesWith above.
13146 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13147 RAUWUpdateListener Listener(*this, UI, UE);
13148 while (UI != UE) {
13149 SDNode *User = UI->getUser();
13150
13151 // This node is about to morph, remove its old self from the CSE maps.
13152 RemoveNodeFromCSEMaps(User);
13153
13154 // A user can appear in a use list multiple times, and when this
13155 // happens the uses are usually next to each other in the list.
13156 // To help reduce the number of CSE recomputations, process all
13157 // the uses of this user that we can find this way.
13158 do {
13159 SDUse &Use = *UI;
13160 ++UI;
13161 Use.setNode(To);
13162 if (To->isDivergent() != From->isDivergent())
13164 } while (UI != UE && UI->getUser() == User);
13165
13166 // Now that we have modified User, add it back to the CSE maps. If it
13167 // already exists there, recursively merge the results together.
13168 AddModifiedNodeToCSEMaps(User);
13169 }
13170
13171 // If we just RAUW'd the root, take note.
13172 if (From == getRoot().getNode())
13173 setRoot(SDValue(To, getRoot().getResNo()));
13174}
13175
13176/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13177/// This can cause recursive merging of nodes in the DAG.
13178///
13179/// This version can replace From with any result values. To must match the
13180/// number and types of values returned by From.
13182 if (From->getNumValues() == 1) // Handle the simple case efficiently.
13183 return ReplaceAllUsesWith(SDValue(From, 0), To[0]);
13184
13185 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) {
13186 // Preserve Debug Info.
13187 transferDbgValues(SDValue(From, i), To[i]);
13188 // Preserve extra info.
13189 copyExtraInfo(From, To[i].getNode());
13190 }
13191
13192 // Iterate over just the existing users of From. See the comments in
13193 // the ReplaceAllUsesWith above.
13194 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13195 RAUWUpdateListener Listener(*this, UI, UE);
13196 while (UI != UE) {
13197 SDNode *User = UI->getUser();
13198
13199 // This node is about to morph, remove its old self from the CSE maps.
13200 RemoveNodeFromCSEMaps(User);
13201
13202 // A user can appear in a use list multiple times, and when this happens the
13203 // uses are usually next to each other in the list. To help reduce the
13204 // number of CSE and divergence recomputations, process all the uses of this
13205 // user that we can find this way.
13206 bool To_IsDivergent = false;
13207 do {
13208 SDUse &Use = *UI;
13209 const SDValue &ToOp = To[Use.getResNo()];
13210 ++UI;
13211 Use.set(ToOp);
13212 if (ToOp.getValueType() != MVT::Other)
13213 To_IsDivergent |= ToOp->isDivergent();
13214 } while (UI != UE && UI->getUser() == User);
13215
13216 if (To_IsDivergent != From->isDivergent())
13218
13219 // Now that we have modified User, add it back to the CSE maps. If it
13220 // already exists there, recursively merge the results together.
13221 AddModifiedNodeToCSEMaps(User);
13222 }
13223
13224 // If we just RAUW'd the root, take note.
13225 if (From == getRoot().getNode())
13226 setRoot(SDValue(To[getRoot().getResNo()]));
13227}
13228
13229/// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
13230/// uses of other values produced by From.getNode() alone. The Deleted
13231/// vector is handled the same way as for ReplaceAllUsesWith.
13233 // Handle the really simple, really trivial case efficiently.
13234 if (From == To) return;
13235
13236 // Handle the simple, trivial, case efficiently.
13237 if (From.getNode()->getNumValues() == 1) {
13238 ReplaceAllUsesWith(From, To);
13239 return;
13240 }
13241
13242 // Preserve Debug Info.
13243 transferDbgValues(From, To);
13244 copyExtraInfo(From.getNode(), To.getNode());
13245
13246 // Iterate over just the existing users of From. See the comments in
13247 // the ReplaceAllUsesWith above.
13248 SDNode::use_iterator UI = From.getNode()->use_begin(),
13249 UE = From.getNode()->use_end();
13250 RAUWUpdateListener Listener(*this, UI, UE);
13251 while (UI != UE) {
13252 SDNode *User = UI->getUser();
13253 bool UserRemovedFromCSEMaps = false;
13254
13255 // A user can appear in a use list multiple times, and when this
13256 // happens the uses are usually next to each other in the list.
13257 // To help reduce the number of CSE recomputations, process all
13258 // the uses of this user that we can find this way.
13259 do {
13260 SDUse &Use = *UI;
13261
13262 // Skip uses of different values from the same node.
13263 if (Use.getResNo() != From.getResNo()) {
13264 ++UI;
13265 continue;
13266 }
13267
13268 // If this node hasn't been modified yet, it's still in the CSE maps,
13269 // so remove its old self from the CSE maps.
13270 if (!UserRemovedFromCSEMaps) {
13271 RemoveNodeFromCSEMaps(User);
13272 UserRemovedFromCSEMaps = true;
13273 }
13274
13275 ++UI;
13276 Use.set(To);
13277 if (To->isDivergent() != From->isDivergent())
13279 } while (UI != UE && UI->getUser() == User);
13280 // We are iterating over all uses of the From node, so if a use
13281 // doesn't use the specific value, no changes are made.
13282 if (!UserRemovedFromCSEMaps)
13283 continue;
13284
13285 // Now that we have modified User, add it back to the CSE maps. If it
13286 // already exists there, recursively merge the results together.
13287 AddModifiedNodeToCSEMaps(User);
13288 }
13289
13290 // If we just RAUW'd the root, take note.
13291 if (From == getRoot())
13292 setRoot(To);
13293}
13294
13295namespace {
13296
13297/// UseMemo - This class is used by SelectionDAG::ReplaceAllUsesOfValuesWith
13298/// to record information about a use.
13299struct UseMemo {
13300 SDNode *User;
13301 unsigned Index;
13302 SDUse *Use;
13303};
13304
13305/// operator< - Sort Memos by User.
13306bool operator<(const UseMemo &L, const UseMemo &R) {
13307 return (intptr_t)L.User < (intptr_t)R.User;
13308}
13309
13310/// RAUOVWUpdateListener - Helper for ReplaceAllUsesOfValuesWith - When the node
13311/// pointed to by a UseMemo is deleted, set the User to nullptr to indicate that
13312/// the node already has been taken care of recursively.
13313class RAUOVWUpdateListener : public SelectionDAG::DAGUpdateListener {
13314 SmallVectorImpl<UseMemo> &Uses;
13315
13316 void NodeDeleted(SDNode *N, SDNode *E) override {
13317 for (UseMemo &Memo : Uses)
13318 if (Memo.User == N)
13319 Memo.User = nullptr;
13320 }
13321
13322public:
13323 RAUOVWUpdateListener(SelectionDAG &d, SmallVectorImpl<UseMemo> &uses)
13324 : SelectionDAG::DAGUpdateListener(d), Uses(uses) {}
13325};
13326
13327} // end anonymous namespace
13328
13329/// Return true if a glue output should propagate divergence information.
13331 switch (Node->getOpcode()) {
13332 case ISD::CopyFromReg:
13333 case ISD::CopyToReg:
13334 return false;
13335 default:
13336 return true;
13337 }
13338
13339 llvm_unreachable("covered opcode switch");
13340}
13341
13343 if (TLI->isSDNodeAlwaysUniform(N)) {
13344 assert(!TLI->isSDNodeSourceOfDivergence(N, FLI, UA) &&
13345 "Conflicting divergence information!");
13346 return false;
13347 }
13348 if (TLI->isSDNodeSourceOfDivergence(N, FLI, UA))
13349 return true;
13350 for (const auto &Op : N->ops()) {
13351 EVT VT = Op.getValueType();
13352
13353 // Skip Chain. It does not carry divergence.
13354 if (VT != MVT::Other && Op.getNode()->isDivergent() &&
13355 (VT != MVT::Glue || gluePropagatesDivergence(Op.getNode())))
13356 return true;
13357 }
13358 return false;
13359}
13360
13362 SmallVector<SDNode *, 16> Worklist(1, N);
13363 do {
13364 N = Worklist.pop_back_val();
13365 bool IsDivergent = calculateDivergence(N);
13366 if (N->SDNodeBits.IsDivergent != IsDivergent) {
13367 N->SDNodeBits.IsDivergent = IsDivergent;
13368 llvm::append_range(Worklist, N->users());
13369 }
13370 } while (!Worklist.empty());
13371}
13372
13373void SelectionDAG::CreateTopologicalOrder(std::vector<SDNode *> &Order) {
13375 Order.reserve(AllNodes.size());
13376 for (auto &N : allnodes()) {
13377 unsigned NOps = N.getNumOperands();
13378 Degree[&N] = NOps;
13379 if (0 == NOps)
13380 Order.push_back(&N);
13381 }
13382 for (size_t I = 0; I != Order.size(); ++I) {
13383 SDNode *N = Order[I];
13384 for (auto *U : N->users()) {
13385 unsigned &UnsortedOps = Degree[U];
13386 if (0 == --UnsortedOps)
13387 Order.push_back(U);
13388 }
13389 }
13390}
13391
13392#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
13393void SelectionDAG::VerifyDAGDivergence() {
13394 std::vector<SDNode *> TopoOrder;
13395 CreateTopologicalOrder(TopoOrder);
13396 for (auto *N : TopoOrder) {
13397 assert(calculateDivergence(N) == N->isDivergent() &&
13398 "Divergence bit inconsistency detected");
13399 }
13400}
13401#endif
13402
13403/// ReplaceAllUsesOfValuesWith - Replace any uses of From with To, leaving
13404/// uses of other values produced by From.getNode() alone. The same value
13405/// may appear in both the From and To list. The Deleted vector is
13406/// handled the same way as for ReplaceAllUsesWith.
13408 const SDValue *To,
13409 unsigned Num){
13410 // Handle the simple, trivial case efficiently.
13411 if (Num == 1)
13412 return ReplaceAllUsesOfValueWith(*From, *To);
13413
13414 transferDbgValues(*From, *To);
13415 copyExtraInfo(From->getNode(), To->getNode());
13416
13417 // Read up all the uses and make records of them. This helps
13418 // processing new uses that are introduced during the
13419 // replacement process.
13421 for (unsigned i = 0; i != Num; ++i) {
13422 unsigned FromResNo = From[i].getResNo();
13423 SDNode *FromNode = From[i].getNode();
13424 for (SDUse &Use : FromNode->uses()) {
13425 if (Use.getResNo() == FromResNo) {
13426 UseMemo Memo = {Use.getUser(), i, &Use};
13427 Uses.push_back(Memo);
13428 }
13429 }
13430 }
13431
13432 // Sort the uses, so that all the uses from a given User are together.
13434 RAUOVWUpdateListener Listener(*this, Uses);
13435
13436 for (unsigned UseIndex = 0, UseIndexEnd = Uses.size();
13437 UseIndex != UseIndexEnd; ) {
13438 // We know that this user uses some value of From. If it is the right
13439 // value, update it.
13440 SDNode *User = Uses[UseIndex].User;
13441 // If the node has been deleted by recursive CSE updates when updating
13442 // another node, then just skip this entry.
13443 if (User == nullptr) {
13444 ++UseIndex;
13445 continue;
13446 }
13447
13448 // This node is about to morph, remove its old self from the CSE maps.
13449 RemoveNodeFromCSEMaps(User);
13450
13451 // The Uses array is sorted, so all the uses for a given User
13452 // are next to each other in the list.
13453 // To help reduce the number of CSE recomputations, process all
13454 // the uses of this user that we can find this way.
13455 do {
13456 unsigned i = Uses[UseIndex].Index;
13457 SDUse &Use = *Uses[UseIndex].Use;
13458 ++UseIndex;
13459
13460 Use.set(To[i]);
13461 } while (UseIndex != UseIndexEnd && Uses[UseIndex].User == User);
13462
13463 // Now that we have modified User, add it back to the CSE maps. If it
13464 // already exists there, recursively merge the results together.
13465 AddModifiedNodeToCSEMaps(User);
13466 }
13467}
13468
13469/// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
13470/// based on their topological order. It returns the maximum id and a vector
13471/// of the SDNodes* in assigned order by reference.
13473 unsigned DAGSize = 0;
13474
13475 // SortedPos tracks the progress of the algorithm. Nodes before it are
13476 // sorted, nodes after it are unsorted. When the algorithm completes
13477 // it is at the end of the list.
13478 allnodes_iterator SortedPos = allnodes_begin();
13479
13480 // Visit all the nodes. Move nodes with no operands to the front of
13481 // the list immediately. Annotate nodes that do have operands with their
13482 // operand count. Before we do this, the Node Id fields of the nodes
13483 // may contain arbitrary values. After, the Node Id fields for nodes
13484 // before SortedPos will contain the topological sort index, and the
13485 // Node Id fields for nodes At SortedPos and after will contain the
13486 // count of outstanding operands.
13488 checkForCycles(&N, this);
13489 unsigned Degree = N.getNumOperands();
13490 if (Degree == 0) {
13491 // A node with no uses, add it to the result array immediately.
13492 N.setNodeId(DAGSize++);
13493 allnodes_iterator Q(&N);
13494 if (Q != SortedPos)
13495 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(Q));
13496 assert(SortedPos != AllNodes.end() && "Overran node list");
13497 ++SortedPos;
13498 } else {
13499 // Temporarily use the Node Id as scratch space for the degree count.
13500 N.setNodeId(Degree);
13501 }
13502 }
13503
13504 // Visit all the nodes. As we iterate, move nodes into sorted order,
13505 // such that by the time the end is reached all nodes will be sorted.
13506 for (SDNode &Node : allnodes()) {
13507 SDNode *N = &Node;
13508 checkForCycles(N, this);
13509 // N is in sorted position, so all its uses have one less operand
13510 // that needs to be sorted.
13511 for (SDNode *P : N->users()) {
13512 unsigned Degree = P->getNodeId();
13513 assert(Degree != 0 && "Invalid node degree");
13514 --Degree;
13515 if (Degree == 0) {
13516 // All of P's operands are sorted, so P may sorted now.
13517 P->setNodeId(DAGSize++);
13518 if (P->getIterator() != SortedPos)
13519 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(P));
13520 assert(SortedPos != AllNodes.end() && "Overran node list");
13521 ++SortedPos;
13522 } else {
13523 // Update P's outstanding operand count.
13524 P->setNodeId(Degree);
13525 }
13526 }
13527 if (Node.getIterator() == SortedPos) {
13528#ifndef NDEBUG
13530 SDNode *S = &*++I;
13531 dbgs() << "Overran sorted position:\n";
13532 S->dumprFull(this); dbgs() << "\n";
13533 dbgs() << "Checking if this is due to cycles\n";
13534 checkForCycles(this, true);
13535#endif
13536 llvm_unreachable(nullptr);
13537 }
13538 }
13539
13540 assert(SortedPos == AllNodes.end() &&
13541 "Topological sort incomplete!");
13542 assert(AllNodes.front().getOpcode() == ISD::EntryToken &&
13543 "First node in topological sort is not the entry token!");
13544 assert(AllNodes.front().getNodeId() == 0 &&
13545 "First node in topological sort has non-zero id!");
13546 assert(AllNodes.front().getNumOperands() == 0 &&
13547 "First node in topological sort has operands!");
13548 assert(AllNodes.back().getNodeId() == (int)DAGSize-1 &&
13549 "Last node in topologic sort has unexpected id!");
13550 assert(AllNodes.back().use_empty() &&
13551 "Last node in topologic sort has users!");
13552 assert(DAGSize == allnodes_size() && "Node count mismatch!");
13553 return DAGSize;
13554}
13555
13557 SmallVectorImpl<const SDNode *> &SortedNodes) const {
13558 SortedNodes.clear();
13559 // Node -> remaining number of outstanding operands.
13560 DenseMap<const SDNode *, unsigned> RemainingOperands;
13561
13562 // Put nodes without any operands into SortedNodes first.
13563 for (const SDNode &N : allnodes()) {
13564 checkForCycles(&N, this);
13565 unsigned NumOperands = N.getNumOperands();
13566 if (NumOperands == 0)
13567 SortedNodes.push_back(&N);
13568 else
13569 // Record their total number of outstanding operands.
13570 RemainingOperands[&N] = NumOperands;
13571 }
13572
13573 // A node is pushed into SortedNodes when all of its operands (predecessors in
13574 // the graph) are also in SortedNodes.
13575 for (unsigned i = 0U; i < SortedNodes.size(); ++i) {
13576 const SDNode *N = SortedNodes[i];
13577 for (const SDNode *U : N->users()) {
13578 // HandleSDNode is never part of a DAG and therefore has no entry in
13579 // RemainingOperands.
13580 if (U->getOpcode() == ISD::HANDLENODE)
13581 continue;
13582 unsigned &NumRemOperands = RemainingOperands[U];
13583 assert(NumRemOperands && "Invalid number of remaining operands");
13584 --NumRemOperands;
13585 if (!NumRemOperands)
13586 SortedNodes.push_back(U);
13587 }
13588 }
13589
13590 assert(SortedNodes.size() == AllNodes.size() && "Node count mismatch");
13591 assert(SortedNodes.front()->getOpcode() == ISD::EntryToken &&
13592 "First node in topological sort is not the entry token");
13593 assert(SortedNodes.front()->getNumOperands() == 0 &&
13594 "First node in topological sort has operands");
13595}
13596
13597/// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the
13598/// value is produced by SD.
13599void SelectionDAG::AddDbgValue(SDDbgValue *DB, bool isParameter) {
13600 for (SDNode *SD : DB->getSDNodes()) {
13601 if (!SD)
13602 continue;
13603 assert(DbgInfo->getSDDbgValues(SD).empty() || SD->getHasDebugValue());
13604 SD->setHasDebugValue(true);
13605 }
13606 DbgInfo->add(DB, isParameter);
13607}
13608
13609void SelectionDAG::AddDbgLabel(SDDbgLabel *DB) { DbgInfo->add(DB); }
13610
13612 SDValue NewMemOpChain) {
13613 assert(isa<MemSDNode>(NewMemOpChain) && "Expected a memop node");
13614 assert(NewMemOpChain.getValueType() == MVT::Other && "Expected a token VT");
13615 // The new memory operation must have the same position as the old load in
13616 // terms of memory dependency. Create a TokenFactor for the old load and new
13617 // memory operation and update uses of the old load's output chain to use that
13618 // TokenFactor.
13619 if (OldChain == NewMemOpChain || OldChain.use_empty())
13620 return NewMemOpChain;
13621
13622 SDValue TokenFactor = getNode(ISD::TokenFactor, SDLoc(OldChain), MVT::Other,
13623 OldChain, NewMemOpChain);
13624 ReplaceAllUsesOfValueWith(OldChain, TokenFactor);
13625 UpdateNodeOperands(TokenFactor.getNode(), OldChain, NewMemOpChain);
13626 return TokenFactor;
13627}
13628
13630 SDValue NewMemOp) {
13631 assert(isa<MemSDNode>(NewMemOp.getNode()) && "Expected a memop node");
13632 SDValue OldChain = SDValue(OldLoad, 1);
13633 SDValue NewMemOpChain = NewMemOp.getValue(1);
13634 return makeEquivalentMemoryOrdering(OldChain, NewMemOpChain);
13635}
13636
13638 Function **OutFunction) {
13639 assert(isa<ExternalSymbolSDNode>(Op) && "Node should be an ExternalSymbol");
13640
13641 auto *Symbol = cast<ExternalSymbolSDNode>(Op)->getSymbol();
13642 auto *Module = MF->getFunction().getParent();
13643 auto *Function = Module->getFunction(Symbol);
13644
13645 if (OutFunction != nullptr)
13646 *OutFunction = Function;
13647
13648 if (Function != nullptr) {
13649 auto PtrTy = TLI->getPointerTy(getDataLayout(), Function->getAddressSpace());
13650 return getGlobalAddress(Function, SDLoc(Op), PtrTy);
13651 }
13652
13653 std::string ErrorStr;
13654 raw_string_ostream ErrorFormatter(ErrorStr);
13655 ErrorFormatter << "Undefined external symbol ";
13656 ErrorFormatter << '"' << Symbol << '"';
13657 report_fatal_error(Twine(ErrorStr));
13658}
13659
13660//===----------------------------------------------------------------------===//
13661// SDNode Class
13662//===----------------------------------------------------------------------===//
13663
13666 return Const != nullptr && Const->isZero();
13667}
13668
13670 return V.isUndef() || isNullConstant(V);
13671}
13672
13675 return Const != nullptr && Const->isZero() && !Const->isNegative();
13676}
13677
13680 return Const != nullptr && Const->isAllOnes();
13681}
13682
13685 return Const != nullptr && Const->isOne();
13686}
13687
13690 return Const != nullptr && Const->isMinSignedValue();
13691}
13692
13694 SDValue V, unsigned OperandNo,
13695 unsigned Depth) const {
13696 APInt DemandedElts = getDemandAllEltsMask(V);
13697 return isIdentityElement(Opcode, Flags, V, DemandedElts, OperandNo, Depth);
13698}
13699
13701 SDValue V, const APInt &DemandedElts,
13702 unsigned OperandNo, unsigned Depth) const {
13703 // NOTE: The cases should match with IR's ConstantExpr::getBinOpIdentity().
13704 // TODO: Target-specific opcodes could be added.
13705 if (V.getValueType().isInteger()) {
13706 KnownBits Known = computeKnownBits(V, DemandedElts, Depth);
13707 if (Known.isConstant()) {
13708 const APInt &Const = Known.getConstant();
13709 switch (Opcode) {
13710 case ISD::ADD:
13711 case ISD::OR:
13712 case ISD::XOR:
13713 case ISD::UMAX:
13714 return Const.isZero();
13715 case ISD::MUL:
13716 return Const.isOne();
13717 case ISD::AND:
13718 case ISD::UMIN:
13719 return Const.isAllOnes();
13720 case ISD::SMAX:
13721 return Const.isMinSignedValue();
13722 case ISD::SMIN:
13723 return Const.isMaxSignedValue();
13724 case ISD::SUB:
13725 case ISD::SHL:
13726 case ISD::SRA:
13727 case ISD::SRL:
13728 return OperandNo == 1 && Const.isZero();
13729 case ISD::UDIV:
13730 case ISD::SDIV:
13731 return OperandNo == 1 && Const.isOne();
13732 }
13733 }
13734 } else if (auto *ConstFP = isConstOrConstSplatFP(V, DemandedElts)) {
13735 switch (Opcode) {
13736 case ISD::FADD:
13737 return ConstFP->isZero() &&
13738 (Flags.hasNoSignedZeros() || ConstFP->isNegative());
13739 case ISD::FSUB:
13740 return OperandNo == 1 && ConstFP->isZero() &&
13741 (Flags.hasNoSignedZeros() || !ConstFP->isNegative());
13742 case ISD::FMUL:
13743 return ConstFP->isOne();
13744 case ISD::FDIV:
13745 return OperandNo == 1 && ConstFP->isOne();
13746 case ISD::FMINNUM:
13747 case ISD::FMAXNUM:
13748 case ISD::FMINIMUMNUM:
13749 case ISD::FMAXIMUMNUM: {
13750 // Neutral element for fminnum/fminimumnum is NaN, Inf or FLT_MAX,
13751 // depending on fast-math flags (FMF).
13752 EVT VT = V.getValueType();
13753 const fltSemantics &Semantics = VT.getFltSemantics();
13754 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics)
13755 : !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
13756 : APFloat::getLargest(Semantics);
13757 if (Opcode == ISD::FMAXNUM || Opcode == ISD::FMAXIMUMNUM)
13758 NeutralAF.changeSign();
13759
13760 return ConstFP->isExactlyValue(NeutralAF);
13761 }
13762 case ISD::FMINIMUM:
13763 case ISD::FMAXIMUM: {
13764 // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
13765 const APFloat &VAPF = ConstFP->getValueAPF();
13766 bool NeutralNegative = (Opcode == ISD::FMAXIMUM);
13767 if (Flags.hasNoInfs())
13768 return VAPF.isLargest() && VAPF.isNegative() == NeutralNegative;
13769 return VAPF.isInfinity() && VAPF.isNegative() == NeutralNegative;
13770 }
13771 }
13772 }
13773 return false;
13774}
13775
13777 while (V.getOpcode() == ISD::BITCAST)
13778 V = V.getOperand(0);
13779 return V;
13780}
13781
13783 while (V.getOpcode() == ISD::BITCAST && V.getOperand(0).hasOneUse())
13784 V = V.getOperand(0);
13785 return V;
13786}
13787
13789 while (V.getOpcode() == ISD::EXTRACT_SUBVECTOR)
13790 V = V.getOperand(0);
13791 return V;
13792}
13793
13795 while (V.getOpcode() == ISD::INSERT_VECTOR_ELT) {
13796 SDValue InVec = V.getOperand(0);
13797 SDValue EltNo = V.getOperand(2);
13798 EVT VT = InVec.getValueType();
13799 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
13800 if (IndexC && VT.isFixedLengthVector() &&
13801 IndexC->getAPIntValue().ult(VT.getVectorNumElements()) &&
13802 !DemandedElts[IndexC->getZExtValue()]) {
13803 V = InVec;
13804 continue;
13805 }
13806 break;
13807 }
13808 return V;
13809}
13810
13812 while (V.getOpcode() == ISD::TRUNCATE)
13813 V = V.getOperand(0);
13814 return V;
13815}
13816
13817bool llvm::isBitwiseNot(SDValue V, bool AllowUndefs) {
13818 if (V.getOpcode() != ISD::XOR)
13819 return false;
13820 V = peekThroughBitcasts(V.getOperand(1));
13821 unsigned NumBits = V.getScalarValueSizeInBits();
13822 ConstantSDNode *C =
13823 isConstOrConstSplat(V, AllowUndefs, /*AllowTruncation*/ true);
13824 return C && (C->getAPIntValue().countr_one() >= NumBits);
13825}
13826
13828 bool AllowTruncation) {
13829 APInt DemandedElts = getDemandAllEltsMask(N);
13830 return isConstOrConstSplat(N, DemandedElts, AllowUndefs, AllowTruncation);
13831}
13832
13834 bool AllowUndefs,
13835 bool AllowTruncation) {
13837 return CN;
13838
13839 // SplatVectors can truncate their operands. Ignore that case here unless
13840 // AllowTruncation is set.
13841 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
13842 EVT VecEltVT = N->getValueType(0).getVectorElementType();
13843 if (auto *CN = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
13844 EVT CVT = CN->getValueType(0);
13845 assert(CVT.bitsGE(VecEltVT) && "Illegal splat_vector element extension");
13846 if (AllowTruncation || CVT == VecEltVT)
13847 return CN;
13848 }
13849 }
13850
13852 BitVector UndefElements;
13853 ConstantSDNode *CN = BV->getConstantSplatNode(DemandedElts, &UndefElements);
13854
13855 // BuildVectors can truncate their operands. Ignore that case here unless
13856 // AllowTruncation is set.
13857 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13858 if (CN && (UndefElements.none() || AllowUndefs)) {
13859 EVT CVT = CN->getValueType(0);
13860 EVT NSVT = N.getValueType().getScalarType();
13861 assert(CVT.bitsGE(NSVT) && "Illegal build vector element extension");
13862 if (AllowTruncation || (CVT == NSVT))
13863 return CN;
13864 }
13865 }
13866
13867 return nullptr;
13868}
13869
13871 APInt DemandedElts = getDemandAllEltsMask(N);
13872 return isConstOrConstSplatFP(N, DemandedElts, AllowUndefs);
13873}
13874
13876 const APInt &DemandedElts,
13877 bool AllowUndefs) {
13879 return CN;
13880
13882 BitVector UndefElements;
13883 ConstantFPSDNode *CN =
13884 BV->getConstantFPSplatNode(DemandedElts, &UndefElements);
13885 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13886 if (CN && (UndefElements.none() || AllowUndefs))
13887 return CN;
13888 }
13889
13890 if (N.getOpcode() == ISD::SPLAT_VECTOR)
13891 if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N.getOperand(0)))
13892 return CN;
13893
13894 return nullptr;
13895}
13896
13897bool llvm::isNullOrNullSplat(SDValue N, bool AllowUndefs) {
13898 // TODO: may want to use peekThroughBitcast() here.
13899 ConstantSDNode *C =
13900 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
13901 return C && C->isZero();
13902}
13903
13904bool llvm::isOneOrOneSplat(SDValue N, bool AllowUndefs) {
13905 ConstantSDNode *C =
13906 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation*/ true);
13907 return C && C->isOne();
13908}
13909
13910bool llvm::isOneOrOneSplatFP(SDValue N, bool AllowUndefs) {
13911 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13912 return C && C->isOne();
13913}
13914
13915bool llvm::isAllOnesOrAllOnesSplat(SDValue N, bool AllowUndefs) {
13917 unsigned BitWidth = N.getScalarValueSizeInBits();
13918 ConstantSDNode *C =
13919 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
13920 return C && C->getAPIntValue().countTrailingOnes() >= BitWidth;
13921}
13922
13923bool llvm::isOnesOrOnesSplat(SDValue N, bool AllowUndefs) {
13924 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs);
13925 return C && APInt::isSameValue(C->getAPIntValue(),
13926 APInt(C->getAPIntValue().getBitWidth(), 1));
13927}
13928
13929bool llvm::isZeroOrZeroSplat(SDValue N, bool AllowUndefs) {
13931 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs, true);
13932 return C && C->isZero();
13933}
13934
13935bool llvm::isZeroOrZeroSplatFP(SDValue N, bool AllowUndefs) {
13936 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13937 return C && C->isZero();
13938}
13939
13943
13945 unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt,
13947 : SDNode(Opc, Order, dl, VTs), MemoryVT(memvt), MemRefs(memrefs) {
13948 bool IsVolatile = false;
13949 bool IsNonTemporal = false;
13950 bool IsDereferenceable = true;
13951 bool IsInvariant = true;
13952 for (const MachineMemOperand *MMO : memoperands()) {
13953 IsVolatile |= MMO->isVolatile();
13954 IsNonTemporal |= MMO->isNonTemporal();
13955 IsDereferenceable &= MMO->isDereferenceable();
13956 IsInvariant &= MMO->isInvariant();
13957 }
13958 MemSDNodeBits.IsVolatile = IsVolatile;
13959 MemSDNodeBits.IsNonTemporal = IsNonTemporal;
13960 MemSDNodeBits.IsDereferenceable = IsDereferenceable;
13961 MemSDNodeBits.IsInvariant = IsInvariant;
13962
13963 // For the single-MMO case, we check here that the size of the memory operand
13964 // fits within the size of the MMO. This is because the MMO might indicate
13965 // only a possible address range instead of specifying the affected memory
13966 // addresses precisely.
13969 getMemOperand()->getSize().getValue())) &&
13970 "Size mismatch!");
13971}
13972
13973namespace {
13974
13975 struct EVTArray {
13976 std::vector<EVT> VTs;
13977
13978 EVTArray() {
13979 VTs.reserve(MVT::VALUETYPE_SIZE);
13980 for (unsigned i = 0; i < MVT::VALUETYPE_SIZE; ++i)
13981 VTs.push_back(MVT((MVT::SimpleValueType)i));
13982 }
13983 };
13984
13985} // end anonymous namespace
13986
13987/// getValueTypeList - Return a pointer to the specified value type.
13988///
13989const EVT *SDNode::getValueTypeList(MVT VT) {
13990 static EVTArray SimpleVTArray;
13991
13992 assert(VT < MVT::VALUETYPE_SIZE && "Value type out of range!");
13993 return &SimpleVTArray.VTs[VT.SimpleTy];
13994}
13995
13996/// hasAnyUseOfValue - Return true if there are any use of the indicated
13997/// value. This method ignores uses of other values defined by this operation.
13998bool SDNode::hasAnyUseOfValue(unsigned Value) const {
13999 assert(Value < getNumValues() && "Bad value!");
14000
14001 for (SDUse &U : uses())
14002 if (U.getResNo() == Value)
14003 return true;
14004
14005 return false;
14006}
14007
14008/// isOnlyUserOf - Return true if this node is the only use of N.
14009bool SDNode::isOnlyUserOf(const SDNode *N) const {
14010 bool Seen = false;
14011 for (const SDNode *User : N->users()) {
14012 if (User == this)
14013 Seen = true;
14014 else
14015 return false;
14016 }
14017
14018 return Seen;
14019}
14020
14021/// Return true if the only users of N are contained in Nodes.
14023 bool Seen = false;
14024 for (const SDNode *User : N->users()) {
14025 if (llvm::is_contained(Nodes, User))
14026 Seen = true;
14027 else
14028 return false;
14029 }
14030
14031 return Seen;
14032}
14033
14034/// Return true if the referenced return value is an operand of N.
14035bool SDValue::isOperandOf(const SDNode *N) const {
14036 return is_contained(N->op_values(), *this);
14037}
14038
14039bool SDNode::isOperandOf(const SDNode *N) const {
14040 return any_of(N->op_values(),
14041 [this](SDValue Op) { return this == Op.getNode(); });
14042}
14043
14044/// reachesChainWithoutSideEffects - Return true if this operand (which must
14045/// be a chain) reaches the specified operand without crossing any
14046/// side-effecting instructions on any chain path. In practice, this looks
14047/// through token factors and non-volatile loads. In order to remain efficient,
14048/// this only looks a couple of nodes in, it does not do an exhaustive search.
14049///
14050/// Note that we only need to examine chains when we're searching for
14051/// side-effects; SelectionDAG requires that all side-effects are represented
14052/// by chains, even if another operand would force a specific ordering. This
14053/// constraint is necessary to allow transformations like splitting loads.
14055 unsigned Depth) const {
14056 if (*this == Dest) return true;
14057
14058 // Don't search too deeply, we just want to be able to see through
14059 // TokenFactor's etc.
14060 if (Depth == 0) return false;
14061
14062 // If this is a token factor, all inputs to the TF happen in parallel.
14063 if (getOpcode() == ISD::TokenFactor) {
14064 // First, try a shallow search.
14065 if (is_contained((*this)->ops(), Dest)) {
14066 // We found the chain we want as an operand of this TokenFactor.
14067 // Essentially, we reach the chain without side-effects if we could
14068 // serialize the TokenFactor into a simple chain of operations with
14069 // Dest as the last operation. This is automatically true if the
14070 // chain has one use: there are no other ordering constraints.
14071 // If the chain has more than one use, we give up: some other
14072 // use of Dest might force a side-effect between Dest and the current
14073 // node.
14074 if (Dest.hasOneUse())
14075 return true;
14076 }
14077 // Next, try a deep search: check whether every operand of the TokenFactor
14078 // reaches Dest.
14079 return llvm::all_of((*this)->ops(), [=](SDValue Op) {
14080 return Op.reachesChainWithoutSideEffects(Dest, Depth - 1);
14081 });
14082 }
14083
14084 // Loads don't have side effects, look through them.
14085 if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(*this)) {
14086 if (Ld->isUnordered())
14087 return Ld->getChain().reachesChainWithoutSideEffects(Dest, Depth-1);
14088 }
14089 return false;
14090}
14091
14092bool SDNode::hasPredecessor(const SDNode *N) const {
14095 Worklist.push_back(this);
14096 return hasPredecessorHelper(N, Visited, Worklist);
14097}
14098
14100 this->Flags &= Flags;
14101}
14102
14103SDValue
14105 ArrayRef<ISD::NodeType> CandidateBinOps,
14106 bool AllowPartials) {
14107 // The pattern must end in an extract from index 0.
14108 if (Extract->getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
14109 !isNullConstant(Extract->getOperand(1)))
14110 return SDValue();
14111
14112 // Match against one of the candidate binary ops.
14113 SDValue Op = Extract->getOperand(0);
14114 if (llvm::none_of(CandidateBinOps, [Op](ISD::NodeType BinOp) {
14115 return Op.getOpcode() == unsigned(BinOp);
14116 }))
14117 return SDValue();
14118
14119 // Floating-point reductions may require relaxed constraints on the final step
14120 // of the reduction because they may reorder intermediate operations.
14121 unsigned CandidateBinOp = Op.getOpcode();
14122 if (Op.getValueType().isFloatingPoint()) {
14123 SDNodeFlags Flags = Op->getFlags();
14124 switch (CandidateBinOp) {
14125 case ISD::FADD:
14126 if (!Flags.hasNoSignedZeros() || !Flags.hasAllowReassociation())
14127 return SDValue();
14128 break;
14129 default:
14130 llvm_unreachable("Unhandled FP opcode for binop reduction");
14131 }
14132 }
14133
14134 // Matching failed - attempt to see if we did enough stages that a partial
14135 // reduction from a subvector is possible.
14136 auto PartialReduction = [&](SDValue Op, unsigned NumSubElts) {
14137 if (!AllowPartials || !Op)
14138 return SDValue();
14139 EVT OpVT = Op.getValueType();
14140 EVT OpSVT = OpVT.getScalarType();
14141 EVT SubVT = EVT::getVectorVT(*getContext(), OpSVT, NumSubElts);
14142 if (TLI->getExtractSubvectorCost(SubVT, OpVT, 0) >
14144 return SDValue();
14145 BinOp = (ISD::NodeType)CandidateBinOp;
14146 return getExtractSubvector(SDLoc(Op), SubVT, Op, 0);
14147 };
14148
14149 // At each stage, we're looking for something that looks like:
14150 // %s = shufflevector <8 x i32> %op, <8 x i32> undef,
14151 // <8 x i32> <i32 2, i32 3, i32 undef, i32 undef,
14152 // i32 undef, i32 undef, i32 undef, i32 undef>
14153 // %a = binop <8 x i32> %op, %s
14154 // Where the mask changes according to the stage. E.g. for a 3-stage pyramid,
14155 // we expect something like:
14156 // <4,5,6,7,u,u,u,u>
14157 // <2,3,u,u,u,u,u,u>
14158 // <1,u,u,u,u,u,u,u>
14159 // While a partial reduction match would be:
14160 // <2,3,u,u,u,u,u,u>
14161 // <1,u,u,u,u,u,u,u>
14162 unsigned Stages = Log2_32(Op.getValueType().getVectorNumElements());
14163 SDValue PrevOp;
14164 for (unsigned i = 0; i < Stages; ++i) {
14165 unsigned MaskEnd = (1 << i);
14166
14167 if (Op.getOpcode() != CandidateBinOp)
14168 return PartialReduction(PrevOp, MaskEnd);
14169
14170 SDValue Op0 = Op.getOperand(0);
14171 SDValue Op1 = Op.getOperand(1);
14172
14174 if (Shuffle) {
14175 Op = Op1;
14176 } else {
14177 Shuffle = dyn_cast<ShuffleVectorSDNode>(Op1);
14178 Op = Op0;
14179 }
14180
14181 // The first operand of the shuffle should be the same as the other operand
14182 // of the binop.
14183 if (!Shuffle || Shuffle->getOperand(0) != Op)
14184 return PartialReduction(PrevOp, MaskEnd);
14185
14186 // Verify the shuffle has the expected (at this stage of the pyramid) mask.
14187 for (int Index = 0; Index < (int)MaskEnd; ++Index)
14188 if (Shuffle->getMaskElt(Index) != (int)(MaskEnd + Index))
14189 return PartialReduction(PrevOp, MaskEnd);
14190
14191 PrevOp = Op;
14192 }
14193
14194 // Handle subvector reductions, which tend to appear after the shuffle
14195 // reduction stages.
14196 while (Op.getOpcode() == CandidateBinOp) {
14197 unsigned NumElts = Op.getValueType().getVectorNumElements();
14198 SDValue Op0 = Op.getOperand(0);
14199 SDValue Op1 = Op.getOperand(1);
14200 if (Op0.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
14202 Op0.getOperand(0) != Op1.getOperand(0))
14203 break;
14204 SDValue Src = Op0.getOperand(0);
14205 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
14206 if (NumSrcElts != (2 * NumElts))
14207 break;
14208 if (!(Op0.getConstantOperandAPInt(1) == 0 &&
14209 Op1.getConstantOperandAPInt(1) == NumElts) &&
14210 !(Op1.getConstantOperandAPInt(1) == 0 &&
14211 Op0.getConstantOperandAPInt(1) == NumElts))
14212 break;
14213 Op = Src;
14214 }
14215
14216 BinOp = (ISD::NodeType)CandidateBinOp;
14217 return Op;
14218}
14219
14221 EVT VT = N->getValueType(0);
14222 EVT EltVT = VT.getVectorElementType();
14223 unsigned NE = getMaxRuntimeNumElements(VT);
14224
14225 if (VT.isScalableVector() && (NE == 0 || ResNE != 0))
14226 reportFatalUsageError("Cannot unroll scalable vector!");
14227
14228 assert(NE && "Nothing to unroll!");
14229 SDLoc dl(N);
14230
14231 // If ResNE is 0, fully unroll the vector op.
14232 if (ResNE == 0)
14233 ResNE = NE;
14234 else if (NE > ResNE)
14235 NE = ResNE;
14236
14237 if (N->getNumValues() == 2) {
14238 SmallVector<SDValue, 8> Scalars0, Scalars1;
14239 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14240 EVT VT1 = N->getValueType(1);
14241 EVT EltVT1 = VT1.getVectorElementType();
14242
14243 unsigned i;
14244 for (i = 0; i != NE; ++i) {
14245 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14246 SDValue Operand = N->getOperand(j);
14247 EVT OperandVT = Operand.getValueType();
14248
14249 // A vector operand; extract a single element.
14250 EVT OperandEltVT = OperandVT.getVectorElementType();
14251 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14252 }
14253
14254 SDValue EltOp = getNode(N->getOpcode(), dl, {EltVT, EltVT1}, Operands);
14255 Scalars0.push_back(EltOp);
14256 Scalars1.push_back(EltOp.getValue(1));
14257 }
14258
14259 for (; i < ResNE; ++i) {
14260 Scalars0.push_back(getUNDEF(EltVT));
14261 Scalars1.push_back(getUNDEF(EltVT1));
14262 }
14263
14265 : ElementCount::getFixed(ResNE);
14266 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResEC);
14267 EVT VecVT1 = EVT::getVectorVT(*getContext(), EltVT1, ResEC);
14268 SDValue Vec0 = buildVectorFromUnrolledParts(VecVT, dl, Scalars0);
14269 SDValue Vec1 = buildVectorFromUnrolledParts(VecVT1, dl, Scalars1);
14270 return getMergeValues({Vec0, Vec1}, dl);
14271 }
14272
14273 assert(N->getNumValues() == 1 &&
14274 "Can't unroll a vector with multiple results!");
14275
14277 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14278
14279 unsigned i;
14280 for (i= 0; i != NE; ++i) {
14281 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14282 SDValue Operand = N->getOperand(j);
14283 EVT OperandVT = Operand.getValueType();
14284 if (OperandVT.isVector()) {
14285 // A vector operand; extract a single element.
14286 EVT OperandEltVT = OperandVT.getVectorElementType();
14287 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14288 } else {
14289 // A scalar operand; just use it as is.
14290 Operands[j] = Operand;
14291 }
14292 }
14293
14294 switch (N->getOpcode()) {
14295 default: {
14296 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands,
14297 N->getFlags()));
14298 break;
14299 }
14300 case ISD::VSELECT:
14301 Scalars.push_back(
14302 getNode(ISD::SELECT, dl, EltVT, Operands, N->getFlags()));
14303 break;
14304 case ISD::SHL:
14305 case ISD::SRA:
14306 case ISD::SRL:
14307 case ISD::ROTL:
14308 case ISD::ROTR:
14309 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands[0],
14311 Operands[1])));
14312 break;
14314 EVT ExtVT = cast<VTSDNode>(Operands[1])->getVT().getVectorElementType();
14315 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT,
14316 Operands[0],
14317 getValueType(ExtVT)));
14318 break;
14319 }
14320 case ISD::ADDRSPACECAST: {
14321 const auto *ASC = cast<AddrSpaceCastSDNode>(N);
14322 Scalars.push_back(
14323 getAddrSpaceCast(dl, EltVT, Operands[0], ASC->getSrcAddressSpace(),
14324 ASC->getDestAddressSpace(), ASC->getFlags()));
14325 break;
14326 }
14327 }
14328 }
14329
14330 for (; i < ResNE; ++i)
14331 Scalars.push_back(getUNDEF(EltVT));
14332
14333 EVT VecVT = VT.isScalableVector()
14334 ? VT
14335 : EVT::getVectorVT(*getContext(), EltVT, ResNE);
14336 return buildVectorFromUnrolledParts(VecVT, dl, Scalars);
14337}
14338
14339std::pair<SDValue, SDValue> SelectionDAG::UnrollVectorOverflowOp(
14340 SDNode *N, unsigned ResNE) {
14341 unsigned Opcode = N->getOpcode();
14342 assert((Opcode == ISD::UADDO || Opcode == ISD::SADDO ||
14343 Opcode == ISD::USUBO || Opcode == ISD::SSUBO ||
14344 Opcode == ISD::UMULO || Opcode == ISD::SMULO) &&
14345 "Expected an overflow opcode");
14346
14347 EVT ResVT = N->getValueType(0);
14348 EVT OvVT = N->getValueType(1);
14349 EVT ResEltVT = ResVT.getVectorElementType();
14350 EVT OvEltVT = OvVT.getVectorElementType();
14351 SDLoc dl(N);
14352
14353 // If ResNE is 0, fully unroll the vector op.
14354 unsigned NE = ResVT.getVectorNumElements();
14355 if (ResNE == 0)
14356 ResNE = NE;
14357 else if (NE > ResNE)
14358 NE = ResNE;
14359
14360 SmallVector<SDValue, 8> LHSScalars;
14361 SmallVector<SDValue, 8> RHSScalars;
14362 ExtractVectorElements(N->getOperand(0), LHSScalars, 0, NE);
14363 ExtractVectorElements(N->getOperand(1), RHSScalars, 0, NE);
14364
14365 EVT SVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), ResEltVT);
14366 SDVTList VTs = getVTList(ResEltVT, SVT);
14367 SmallVector<SDValue, 8> ResScalars;
14368 SmallVector<SDValue, 8> OvScalars;
14369 for (unsigned i = 0; i < NE; ++i) {
14370 SDValue Res = getNode(Opcode, dl, VTs, LHSScalars[i], RHSScalars[i]);
14371 SDValue Ov =
14372 getSelect(dl, OvEltVT, Res.getValue(1),
14373 getBoolConstant(true, dl, OvEltVT, ResVT),
14374 getConstant(0, dl, OvEltVT));
14375
14376 ResScalars.push_back(Res);
14377 OvScalars.push_back(Ov);
14378 }
14379
14380 ResScalars.append(ResNE - NE, getUNDEF(ResEltVT));
14381 OvScalars.append(ResNE - NE, getUNDEF(OvEltVT));
14382
14383 EVT NewResVT = EVT::getVectorVT(*getContext(), ResEltVT, ResNE);
14384 EVT NewOvVT = EVT::getVectorVT(*getContext(), OvEltVT, ResNE);
14385 return std::make_pair(getBuildVector(NewResVT, dl, ResScalars),
14386 getBuildVector(NewOvVT, dl, OvScalars));
14387}
14388
14391 unsigned Bytes, int Dist,
14392 const SelectionDAG &DAG) {
14393 if (LS->isVolatile() || Base->isVolatile())
14394 return false;
14395 // TODO: probably too restrictive for atomics, revisit
14396 if (!LS->isSimple())
14397 return false;
14398 if (LS->isIndexed() || Base->isIndexed())
14399 return false;
14400 if (LS->getChain() != Base->getChain())
14401 return false;
14402 EVT VT = LS->getMemoryVT();
14403 if (VT.getSizeInBits() / 8 != Bytes)
14404 return false;
14405
14406 auto BaseLocDecomp = BaseIndexOffset::match(Base, DAG);
14407 auto LocDecomp = BaseIndexOffset::match(LS, DAG);
14408
14409 int64_t Offset = 0;
14410 if (BaseLocDecomp.equalBaseIndex(LocDecomp, DAG, Offset))
14411 return (Dist * (int64_t)Bytes == Offset);
14412 return false;
14413}
14414
14417 unsigned Bytes,
14418 int Dist) const {
14419 return areNonVolatileConsecutiveLoadsOrStores(LD, Base, Bytes, Dist, *this);
14420}
14421
14424 unsigned Bytes,
14425 int Dist) const {
14426 return areNonVolatileConsecutiveLoadsOrStores(ST, Base, Bytes, Dist, *this);
14427}
14428
14429/// InferPtrAlignment - Infer alignment of a load / store address. Return
14430/// std::nullopt if it cannot be inferred.
14432 // If this is a GlobalAddress + cst, return the alignment.
14433 const GlobalValue *GV = nullptr;
14434 int64_t GVOffset = 0;
14435 if (TLI->isGAPlusOffset(Ptr.getNode(), GV, GVOffset)) {
14436 unsigned PtrWidth = getDataLayout().getPointerTypeSizeInBits(GV->getType());
14437 KnownBits Known(PtrWidth);
14439 unsigned AlignBits = Known.countMinTrailingZeros();
14440 if (AlignBits)
14441 return commonAlignment(Align(1ull << std::min(31U, AlignBits)), GVOffset);
14442 }
14443
14444 // If this is a direct reference to a stack slot, use information about the
14445 // stack slot's alignment.
14446 int FrameIdx = INT_MIN;
14447 int64_t FrameOffset = 0;
14449 FrameIdx = FI->getIndex();
14450 } else if (isBaseWithConstantOffset(Ptr) &&
14452 // Handle FI+Cst
14453 FrameIdx = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
14454 FrameOffset = Ptr.getConstantOperandVal(1);
14455 }
14456
14457 if (FrameIdx != INT_MIN) {
14459 return commonAlignment(MFI.getObjectAlign(FrameIdx), FrameOffset);
14460 }
14461
14462 return std::nullopt;
14463}
14464
14465/// Split the scalar node with EXTRACT_ELEMENT using the provided
14466/// VTs and return the low/high part.
14467std::pair<SDValue, SDValue> SelectionDAG::SplitScalar(const SDValue &N,
14468 const SDLoc &DL,
14469 const EVT &LoVT,
14470 const EVT &HiVT) {
14471 assert(!LoVT.isVector() && !HiVT.isVector() && !N.getValueType().isVector() &&
14472 "Split node must be a scalar type");
14473 SDValue Lo =
14475 SDValue Hi =
14477 return std::make_pair(Lo, Hi);
14478}
14479
14480/// GetSplitDestVTs - Compute the VTs needed for the low/hi parts of a type
14481/// which is split (or expanded) into two not necessarily identical pieces.
14482std::pair<EVT, EVT> SelectionDAG::GetSplitDestVTs(const EVT &VT) const {
14483 // Currently all types are split in half.
14484 EVT LoVT, HiVT;
14485 if (!VT.isVector())
14486 LoVT = HiVT = TLI->getTypeToTransformTo(*getContext(), VT);
14487 else
14488 LoVT = HiVT = VT.getHalfNumVectorElementsVT(*getContext());
14489
14490 return std::make_pair(LoVT, HiVT);
14491}
14492
14493/// GetDependentSplitDestVTs - Compute the VTs needed for the low/hi parts of a
14494/// type, dependent on an enveloping VT that has been split into two identical
14495/// pieces. Sets the HiIsEmpty flag when hi type has zero storage size.
14496std::pair<EVT, EVT>
14498 bool *HiIsEmpty) const {
14499 EVT EltTp = VT.getVectorElementType();
14500 // Examples:
14501 // custom VL=8 with enveloping VL=8/8 yields 8/0 (hi empty)
14502 // custom VL=9 with enveloping VL=8/8 yields 8/1
14503 // custom VL=10 with enveloping VL=8/8 yields 8/2
14504 // etc.
14505 ElementCount VTNumElts = VT.getVectorElementCount();
14506 ElementCount EnvNumElts = EnvVT.getVectorElementCount();
14507 assert(VTNumElts.isScalable() == EnvNumElts.isScalable() &&
14508 "Mixing fixed width and scalable vectors when enveloping a type");
14509 EVT LoVT, HiVT;
14510 if (VTNumElts.getKnownMinValue() > EnvNumElts.getKnownMinValue()) {
14511 LoVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14512 HiVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts - EnvNumElts);
14513 *HiIsEmpty = false;
14514 } else {
14515 // Flag that hi type has zero storage size, but return split envelop type
14516 // (this would be easier if vector types with zero elements were allowed).
14517 LoVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts);
14518 HiVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14519 *HiIsEmpty = true;
14520 }
14521 return std::make_pair(LoVT, HiVT);
14522}
14523
14524/// SplitVector - Split the vector with EXTRACT_SUBVECTOR and return the
14525/// low/high part.
14526std::pair<SDValue, SDValue>
14527SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT,
14528 const EVT &HiVT) {
14529 assert(LoVT.isScalableVector() == HiVT.isScalableVector() &&
14530 LoVT.isScalableVector() == N.getValueType().isScalableVector() &&
14531 "Splitting vector with an invalid mixture of fixed and scalable "
14532 "vector types");
14534 N.getValueType().getVectorMinNumElements() &&
14535 "More vector elements requested than available!");
14536 SDValue Lo, Hi;
14537 Lo = getExtractSubvector(DL, LoVT, N, 0);
14538 // For scalable vectors it is safe to use LoVT.getVectorMinNumElements()
14539 // (rather than having to use ElementCount), because EXTRACT_SUBVECTOR scales
14540 // IDX with the runtime scaling factor of the result vector type. For
14541 // fixed-width result vectors, that runtime scaling factor is 1.
14543 return std::make_pair(Lo, Hi);
14544}
14545
14546std::pair<SDValue, SDValue> SelectionDAG::SplitEVL(SDValue N, EVT VecVT,
14547 const SDLoc &DL) {
14548 // Split the vector length parameter.
14549 // %evl -> umin(%evl, %halfnumelts) and usubsat(%evl - %halfnumelts).
14550 EVT VT = N.getValueType();
14552 "Expecting the mask to be an evenly-sized vector");
14553 SDValue HalfNumElts = getElementCount(
14555 SDValue Lo = getNode(ISD::UMIN, DL, VT, N, HalfNumElts);
14556 SDValue Hi = getNode(ISD::USUBSAT, DL, VT, N, HalfNumElts);
14557 return std::make_pair(Lo, Hi);
14558}
14559
14560/// Widen the vector up to the next power of two using INSERT_SUBVECTOR.
14562 EVT VT = N.getValueType();
14565 return getInsertSubvector(DL, getPOISON(WideVT), N, 0);
14566}
14567
14570 unsigned Start, unsigned Count,
14571 EVT EltVT) {
14572 EVT VT = Op.getValueType();
14573 if (Count == 0)
14575 if (EltVT == EVT())
14576 EltVT = VT.getVectorElementType();
14577 SDLoc SL(Op);
14578 for (unsigned i = Start, e = Start + Count; i != e; ++i) {
14579 Args.push_back(getExtractVectorElt(SL, EltVT, Op, i));
14580 }
14581}
14582
14583// getAddressSpace - Return the address space this GlobalAddress belongs to.
14585 return getGlobal()->getType()->getAddressSpace();
14586}
14587
14590 return Val.MachineCPVal->getType();
14591 return Val.ConstVal->getType();
14592}
14593
14594bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue, APInt &SplatUndef,
14595 unsigned &SplatBitSize,
14596 bool &HasAnyUndefs,
14597 unsigned MinSplatBits,
14598 bool IsBigEndian) const {
14599 EVT VT = getValueType(0);
14600 assert(VT.isVector() && "Expected a vector type");
14601 unsigned VecWidth = VT.getSizeInBits();
14602 if (MinSplatBits > VecWidth)
14603 return false;
14604
14605 // FIXME: The widths are based on this node's type, but build vectors can
14606 // truncate their operands.
14607 SplatValue = APInt(VecWidth, 0);
14608 SplatUndef = APInt(VecWidth, 0);
14609
14610 // Get the bits. Bits with undefined values (when the corresponding element
14611 // of the vector is an ISD::UNDEF value) are set in SplatUndef and cleared
14612 // in SplatValue. If any of the values are not constant, give up and return
14613 // false.
14614 unsigned int NumOps = getNumOperands();
14615 assert(NumOps > 0 && "isConstantSplat has 0-size build vector");
14616 unsigned EltWidth = VT.getScalarSizeInBits();
14617
14618 for (unsigned j = 0; j < NumOps; ++j) {
14619 unsigned i = IsBigEndian ? NumOps - 1 - j : j;
14620 SDValue OpVal = getOperand(i);
14621 unsigned BitPos = j * EltWidth;
14622
14623 if (OpVal.isUndef())
14624 SplatUndef.setBits(BitPos, BitPos + EltWidth);
14625 else if (auto *CN = dyn_cast<ConstantSDNode>(OpVal))
14626 SplatValue.insertBits(CN->getAPIntValue().zextOrTrunc(EltWidth), BitPos);
14627 else if (auto *CN = dyn_cast<ConstantFPSDNode>(OpVal))
14628 SplatValue.insertBits(CN->getValueAPF().bitcastToAPInt(), BitPos);
14629 else
14630 return false;
14631 }
14632
14633 // The build_vector is all constants or undefs. Find the smallest element
14634 // size that splats the vector.
14635 HasAnyUndefs = (SplatUndef != 0);
14636
14637 // FIXME: This does not work for vectors with elements less than 8 bits.
14638 while (VecWidth > 8) {
14639 // If we can't split in half, stop here.
14640 if (VecWidth & 1)
14641 break;
14642
14643 unsigned HalfSize = VecWidth / 2;
14644 APInt HighValue = SplatValue.extractBits(HalfSize, HalfSize);
14645 APInt LowValue = SplatValue.extractBits(HalfSize, 0);
14646 APInt HighUndef = SplatUndef.extractBits(HalfSize, HalfSize);
14647 APInt LowUndef = SplatUndef.extractBits(HalfSize, 0);
14648
14649 // If the two halves do not match (ignoring undef bits), stop here.
14650 if ((HighValue & ~LowUndef) != (LowValue & ~HighUndef) ||
14651 MinSplatBits > HalfSize)
14652 break;
14653
14654 SplatValue = HighValue | LowValue;
14655 SplatUndef = HighUndef & LowUndef;
14656
14657 VecWidth = HalfSize;
14658 }
14659
14660 // FIXME: The loop above only tries to split in halves. But if the input
14661 // vector for example is <3 x i16> it wouldn't be able to detect a
14662 // SplatBitSize of 16. No idea if that is a design flaw currently limiting
14663 // optimizations. I guess that back in the days when this helper was created
14664 // vectors normally was power-of-2 sized.
14665
14666 SplatBitSize = VecWidth;
14667 return true;
14668}
14669
14671 BitVector *UndefElements) const {
14672 unsigned NumOps = getNumOperands();
14673 if (UndefElements) {
14674 UndefElements->clear();
14675 UndefElements->resize(NumOps);
14676 }
14677 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14678 if (!DemandedElts)
14679 return SDValue();
14680 SDValue Splatted;
14681 for (unsigned i = 0; i != NumOps; ++i) {
14682 if (!DemandedElts[i])
14683 continue;
14684 SDValue Op = getOperand(i);
14685 if (Op.isUndef()) {
14686 if (UndefElements)
14687 (*UndefElements)[i] = true;
14688 } else if (!Splatted) {
14689 Splatted = Op;
14690 } else if (Splatted != Op) {
14691 return SDValue();
14692 }
14693 }
14694
14695 if (!Splatted) {
14696 unsigned FirstDemandedIdx = DemandedElts.countr_zero();
14697 assert(getOperand(FirstDemandedIdx).isUndef() &&
14698 "Can only have a splat without a constant for all undefs.");
14699 return getOperand(FirstDemandedIdx);
14700 }
14701
14702 return Splatted;
14703}
14704
14706 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14707 return getSplatValue(DemandedElts, UndefElements);
14708}
14709
14711 SmallVectorImpl<SDValue> &Sequence,
14712 BitVector *UndefElements) const {
14713 unsigned NumOps = getNumOperands();
14714 Sequence.clear();
14715 if (UndefElements) {
14716 UndefElements->clear();
14717 UndefElements->resize(NumOps);
14718 }
14719 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14720 if (!DemandedElts || NumOps < 2 || !isPowerOf2_32(NumOps))
14721 return false;
14722
14723 // Set the undefs even if we don't find a sequence (like getSplatValue).
14724 if (UndefElements)
14725 for (unsigned I = 0; I != NumOps; ++I)
14726 if (DemandedElts[I] && getOperand(I).isUndef())
14727 (*UndefElements)[I] = true;
14728
14729 // Iteratively widen the sequence length looking for repetitions.
14730 for (unsigned SeqLen = 1; SeqLen < NumOps; SeqLen *= 2) {
14731 Sequence.append(SeqLen, SDValue());
14732 for (unsigned I = 0; I != NumOps; ++I) {
14733 if (!DemandedElts[I])
14734 continue;
14735 SDValue &SeqOp = Sequence[I % SeqLen];
14737 if (Op.isUndef()) {
14738 if (!SeqOp)
14739 SeqOp = Op;
14740 continue;
14741 }
14742 if (SeqOp && !SeqOp.isUndef() && SeqOp != Op) {
14743 Sequence.clear();
14744 break;
14745 }
14746 SeqOp = Op;
14747 }
14748 if (!Sequence.empty())
14749 return true;
14750 }
14751
14752 assert(Sequence.empty() && "Failed to empty non-repeating sequence pattern");
14753 return false;
14754}
14755
14757 BitVector *UndefElements) const {
14758 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14759 return getRepeatedSequence(DemandedElts, Sequence, UndefElements);
14760}
14761
14764 BitVector *UndefElements) const {
14766 getSplatValue(DemandedElts, UndefElements));
14767}
14768
14771 return dyn_cast_or_null<ConstantSDNode>(getSplatValue(UndefElements));
14772}
14773
14776 BitVector *UndefElements) const {
14778 getSplatValue(DemandedElts, UndefElements));
14779}
14780
14785
14786int32_t
14788 uint32_t BitWidth) const {
14789 if (ConstantFPSDNode *CN =
14791 bool IsExact;
14792 APSInt IntVal(BitWidth);
14793 const APFloat &APF = CN->getValueAPF();
14794 if (APF.convertToInteger(IntVal, APFloat::rmTowardZero, &IsExact) !=
14795 APFloat::opOK ||
14796 !IsExact)
14797 return -1;
14798
14799 return IntVal.exactLogBase2();
14800 }
14801 return -1;
14802}
14803
14805 bool IsLittleEndian, unsigned DstEltSizeInBits,
14806 SmallVectorImpl<APInt> &RawBitElements, BitVector &UndefElements) const {
14807 // Early-out if this contains anything but Undef/Constant/ConstantFP.
14808 if (!isConstant())
14809 return false;
14810
14811 unsigned NumSrcOps = getNumOperands();
14812 unsigned SrcEltSizeInBits = getValueType(0).getScalarSizeInBits();
14813 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14814 "Invalid bitcast scale");
14815
14816 // Extract raw src bits.
14817 SmallVector<APInt> SrcBitElements(NumSrcOps,
14818 APInt::getZero(SrcEltSizeInBits));
14819 BitVector SrcUndeElements(NumSrcOps, false);
14820
14821 for (unsigned I = 0; I != NumSrcOps; ++I) {
14823 if (Op.isUndef()) {
14824 SrcUndeElements.set(I);
14825 continue;
14826 }
14827 auto *CInt = dyn_cast<ConstantSDNode>(Op);
14828 auto *CFP = dyn_cast<ConstantFPSDNode>(Op);
14829 assert((CInt || CFP) && "Unknown constant");
14830 SrcBitElements[I] = CInt ? CInt->getAPIntValue().trunc(SrcEltSizeInBits)
14831 : CFP->getValueAPF().bitcastToAPInt();
14832 }
14833
14834 // Recast to dst width.
14835 recastRawBits(IsLittleEndian, DstEltSizeInBits, RawBitElements,
14836 SrcBitElements, UndefElements, SrcUndeElements);
14837 return true;
14838}
14839
14840void BuildVectorSDNode::recastRawBits(bool IsLittleEndian,
14841 unsigned DstEltSizeInBits,
14842 SmallVectorImpl<APInt> &DstBitElements,
14843 ArrayRef<APInt> SrcBitElements,
14844 BitVector &DstUndefElements,
14845 const BitVector &SrcUndefElements) {
14846 unsigned NumSrcOps = SrcBitElements.size();
14847 unsigned SrcEltSizeInBits = SrcBitElements[0].getBitWidth();
14848 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14849 "Invalid bitcast scale");
14850 assert(NumSrcOps == SrcUndefElements.size() &&
14851 "Vector size mismatch");
14852
14853 unsigned NumDstOps = (NumSrcOps * SrcEltSizeInBits) / DstEltSizeInBits;
14854 DstUndefElements.clear();
14855 DstUndefElements.resize(NumDstOps, false);
14856 DstBitElements.assign(NumDstOps, APInt::getZero(DstEltSizeInBits));
14857
14858 // Concatenate src elements constant bits together into dst element.
14859 if (SrcEltSizeInBits <= DstEltSizeInBits) {
14860 unsigned Scale = DstEltSizeInBits / SrcEltSizeInBits;
14861 for (unsigned I = 0; I != NumDstOps; ++I) {
14862 DstUndefElements.set(I);
14863 APInt &DstBits = DstBitElements[I];
14864 for (unsigned J = 0; J != Scale; ++J) {
14865 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14866 if (SrcUndefElements[Idx])
14867 continue;
14868 DstUndefElements.reset(I);
14869 const APInt &SrcBits = SrcBitElements[Idx];
14870 assert(SrcBits.getBitWidth() == SrcEltSizeInBits &&
14871 "Illegal constant bitwidths");
14872 DstBits.insertBits(SrcBits, J * SrcEltSizeInBits);
14873 }
14874 }
14875 return;
14876 }
14877
14878 // Split src element constant bits into dst elements.
14879 unsigned Scale = SrcEltSizeInBits / DstEltSizeInBits;
14880 for (unsigned I = 0; I != NumSrcOps; ++I) {
14881 if (SrcUndefElements[I]) {
14882 DstUndefElements.set(I * Scale, (I + 1) * Scale);
14883 continue;
14884 }
14885 const APInt &SrcBits = SrcBitElements[I];
14886 for (unsigned J = 0; J != Scale; ++J) {
14887 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14888 APInt &DstBits = DstBitElements[Idx];
14889 DstBits = SrcBits.extractBits(DstEltSizeInBits, J * DstEltSizeInBits);
14890 }
14891 }
14892}
14893
14895 for (const SDValue &Op : op_values()) {
14896 unsigned Opc = Op.getOpcode();
14897 if (!Op.isUndef() && Opc != ISD::Constant && Opc != ISD::ConstantFP)
14898 return false;
14899 }
14900 return true;
14901}
14902
14903std::optional<std::pair<APInt, APInt>>
14905 unsigned NumOps = getNumOperands();
14906 if (NumOps < 2)
14907 return std::nullopt;
14908
14909 unsigned EltSize = getValueType(0).getScalarSizeInBits();
14910 APInt Start, Stride;
14911 int FirstIdx = -1, SecondIdx = -1;
14912
14913 // Find the first two non-undef constant elements to determine Start and
14914 // Stride, then verify all remaining elements match the sequence.
14915 for (unsigned I = 0; I < NumOps; ++I) {
14917 if (Op->isUndef())
14918 continue;
14919 if (!isa<ConstantSDNode>(Op))
14920 return std::nullopt;
14921
14922 APInt Val = getConstantOperandAPInt(I).trunc(EltSize);
14923 if (FirstIdx < 0) {
14924 FirstIdx = I;
14925 Start = Val;
14926 } else if (SecondIdx < 0) {
14927 SecondIdx = I;
14928 // Compute stride using modular arithmetic. Simple division would handle
14929 // common strides (1, 2, -1, etc.), but modular inverse maximizes matches.
14930 // Example: <0, poison, poison, 0xFF> has stride 0x55 since 3*0x55 = 0xFF
14931 // Note that modular arithmetic is agnostic to signed/unsigned.
14932 unsigned IdxDiff = I - FirstIdx;
14933 APInt ValDiff = Val - Start;
14934
14935 // Step 1: Factor out common powers of 2 from IdxDiff and ValDiff.
14936 unsigned CommonPow2Bits = llvm::countr_zero(IdxDiff);
14937 if (ValDiff.countr_zero() < CommonPow2Bits)
14938 return std::nullopt; // ValDiff not divisible by 2^CommonPow2Bits
14939 IdxDiff >>= CommonPow2Bits;
14940 ValDiff.lshrInPlace(CommonPow2Bits);
14941
14942 // Step 2: IdxDiff is now odd, so its inverse mod 2^EltSize exists.
14943 // TODO: There are 2^CommonPow2Bits valid strides; currently we only try
14944 // one, but we could try all candidates to handle more cases.
14945 Stride = ValDiff * APInt(EltSize, IdxDiff).multiplicativeInverse();
14946 if (Stride.isZero())
14947 return std::nullopt;
14948
14949 // Step 3: Adjust Start based on the first defined element's index.
14950 Start -= Stride * FirstIdx;
14951 } else {
14952 // Verify this element matches the sequence.
14953 if (Val != Start + Stride * I)
14954 return std::nullopt;
14955 }
14956 }
14957
14958 // Need at least two defined elements.
14959 if (SecondIdx < 0)
14960 return std::nullopt;
14961
14962 return std::make_pair(Start, Stride);
14963}
14964
14966 // Find the first non-undef value in the shuffle mask.
14967 unsigned i, e;
14968 for (i = 0, e = Mask.size(); i != e && Mask[i] < 0; ++i)
14969 /* search */;
14970
14971 // If all elements are undefined, this shuffle can be considered a splat
14972 // (although it should eventually get simplified away completely).
14973 if (i == e)
14974 return true;
14975
14976 // Make sure all remaining elements are either undef or the same as the first
14977 // non-undef value.
14978 for (int Idx = Mask[i]; i != e; ++i)
14979 if (Mask[i] >= 0 && Mask[i] != Idx)
14980 return false;
14981 return true;
14982}
14983
14984// Returns true if it is a constant integer BuildVector or constant integer,
14985// possibly hidden by a bitcast.
14987 SDValue N, bool AllowOpaques) const {
14989
14990 if (auto *C = dyn_cast<ConstantSDNode>(N))
14991 return AllowOpaques || !C->isOpaque();
14992
14994 return true;
14995
14996 // Treat a GlobalAddress supporting constant offset folding as a
14997 // constant integer.
14998 if (auto *GA = dyn_cast<GlobalAddressSDNode>(N))
14999 if (GA->getOpcode() == ISD::GlobalAddress &&
15000 TLI->isOffsetFoldingLegal(GA))
15001 return true;
15002
15003 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
15004 isa<ConstantSDNode>(N.getOperand(0)))
15005 return true;
15006 return false;
15007}
15008
15009// Returns true if it is a constant float BuildVector or constant float.
15012 return true;
15013
15015 return true;
15016
15017 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
15018 isa<ConstantFPSDNode>(N.getOperand(0)))
15019 return true;
15020
15021 return false;
15022}
15023
15024std::optional<bool> SelectionDAG::isBoolConstant(SDValue N) const {
15025 ConstantSDNode *Const =
15026 isConstOrConstSplat(N, false, /*AllowTruncation=*/true);
15027 if (!Const)
15028 return std::nullopt;
15029
15030 EVT VT = N->getValueType(0);
15031 const APInt CVal = Const->getAPIntValue().trunc(VT.getScalarSizeInBits());
15032 switch (TLI->getBooleanContents(N.getValueType())) {
15034 if (CVal.isOne())
15035 return true;
15036 if (CVal.isZero())
15037 return false;
15038 return std::nullopt;
15040 if (CVal.isAllOnes())
15041 return true;
15042 if (CVal.isZero())
15043 return false;
15044 return std::nullopt;
15046 return CVal[0];
15047 }
15048 llvm_unreachable("Unknown BooleanContent enum");
15049}
15050
15051void SelectionDAG::createOperands(SDNode *Node, ArrayRef<SDValue> Vals) {
15052 assert(!Node->OperandList && "Node already has operands");
15054 "too many operands to fit into SDNode");
15055 SDUse *Ops = OperandRecycler.allocate(
15056 ArrayRecycler<SDUse>::Capacity::get(Vals.size()), OperandAllocator);
15057
15058 bool IsDivergent = false;
15059 for (unsigned I = 0; I != Vals.size(); ++I) {
15060 Ops[I].setUser(Node);
15061 Ops[I].setInitial(Vals[I]);
15062 EVT VT = Ops[I].getValueType();
15063
15064 // Skip Chain. It does not carry divergence.
15065 if (VT != MVT::Other &&
15066 (VT != MVT::Glue || gluePropagatesDivergence(Ops[I].getNode())) &&
15067 Ops[I].getNode()->isDivergent()) {
15068 IsDivergent = true;
15069 }
15070 }
15071 Node->NumOperands = Vals.size();
15072 Node->OperandList = Ops;
15073 if (!TLI->isSDNodeAlwaysUniform(Node)) {
15074 IsDivergent |= TLI->isSDNodeSourceOfDivergence(Node, FLI, UA);
15075 Node->SDNodeBits.IsDivergent = IsDivergent;
15076 }
15077 checkForCycles(Node);
15078}
15079
15082 size_t Limit = SDNode::getMaxNumOperands();
15083 while (Vals.size() > Limit) {
15084 unsigned SliceIdx = Vals.size() - Limit;
15085 auto ExtractedTFs = ArrayRef<SDValue>(Vals).slice(SliceIdx, Limit);
15086 SDValue NewTF = getNode(ISD::TokenFactor, DL, MVT::Other, ExtractedTFs);
15087 Vals.erase(Vals.begin() + SliceIdx, Vals.end());
15088 Vals.emplace_back(NewTF);
15089 }
15090 return getNode(ISD::TokenFactor, DL, MVT::Other, Vals);
15091}
15092
15094 EVT VT, SDNodeFlags Flags) {
15095 switch (Opcode) {
15096 default:
15097 return SDValue();
15098 case ISD::ADD:
15099 case ISD::OR:
15100 case ISD::XOR:
15101 case ISD::UMAX:
15102 case ISD::MUL:
15103 case ISD::AND:
15104 case ISD::UMIN:
15105 case ISD::SMAX:
15106 case ISD::SMIN:
15108 VT);
15109 case ISD::FADD:
15110 // If flags allow, prefer positive zero since it's generally cheaper
15111 // to materialize on most targets.
15112 return getConstantFP(Flags.hasNoSignedZeros() ? 0.0 : -0.0, DL, VT);
15113 case ISD::FMUL:
15114 return getConstantFP(1.0, DL, VT);
15115 case ISD::FMINNUM:
15116 case ISD::FMAXNUM:
15117 case ISD::FMINIMUMNUM:
15118 case ISD::FMAXIMUMNUM: {
15119 // Neutral element for fminnum/fminimumnum is NaN, Inf or FLT_MAX,
15120 // depending on fast-math flags (FMF).
15121 const fltSemantics &Semantics = VT.getFltSemantics();
15122 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics) :
15123 !Flags.hasNoInfs() ? APFloat::getInf(Semantics) :
15124 APFloat::getLargest(Semantics);
15125 if (Opcode == ISD::FMAXNUM || Opcode == ISD::FMAXIMUMNUM)
15126 NeutralAF.changeSign();
15127
15128 return getConstantFP(NeutralAF, DL, VT);
15129 }
15130 case ISD::FMINIMUM:
15131 case ISD::FMAXIMUM: {
15132 // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
15133 const fltSemantics &Semantics = VT.getFltSemantics();
15134 APFloat NeutralAF = !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
15135 : APFloat::getLargest(Semantics);
15136 if (Opcode == ISD::FMAXIMUM)
15137 NeutralAF.changeSign();
15138
15139 return getConstantFP(NeutralAF, DL, VT);
15140 }
15141
15142 }
15143}
15144
15146 SDValue Acc, SDValue LHS,
15147 SDValue RHS) {
15148 EVT AccVT = Acc.getValueType();
15149 if (AccVT.isFloatingPoint()) {
15150 assert(Opc == ISD::PARTIAL_REDUCE_FMLA && "Unexpected opcode");
15151 SDValue NegRHS = getNode(ISD::FNEG, DL, RHS.getValueType(), RHS);
15152 return getNode(Opc, DL, AccVT, Acc, LHS, NegRHS);
15153 }
15155 "Unexpected opcode");
15156 SDValue NegAcc = getNegative(Acc, DL, AccVT);
15157 SDValue MLA = getNode(Opc, DL, AccVT, NegAcc, LHS, RHS);
15158 return getNegative(MLA, DL, AccVT);
15159}
15160
15161/// Helper used to make a call to a library function that has one argument of
15162/// pointer type.
15163///
15164/// Such functions include 'fegetmode', 'fesetenv' and some others, which are
15165/// used to get or set floating-point state. They have one argument of pointer
15166/// type, which points to the memory region containing bits of the
15167/// floating-point state. The value returned by such function is ignored in the
15168/// created call.
15169///
15170/// \param LibFunc Reference to library function (value of RTLIB::Libcall).
15171/// \param Ptr Pointer used to save/load state.
15172/// \param InChain Ingoing token chain.
15173/// \returns Outgoing chain token.
15175 SDValue InChain,
15176 const SDLoc &DLoc) {
15177 assert(InChain.getValueType() == MVT::Other && "Expected token chain");
15179 Args.emplace_back(Ptr, Ptr.getValueType().getTypeForEVT(*getContext()));
15180 RTLIB::LibcallImpl LibcallImpl =
15181 Libcalls->getLibcallImpl(static_cast<RTLIB::Libcall>(LibFunc));
15182 if (LibcallImpl == RTLIB::Unsupported)
15183 reportFatalUsageError("emitting call to unsupported libcall");
15184
15185 SDValue Callee =
15186 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout()));
15188 CLI.setDebugLoc(DLoc).setChain(InChain).setLibCallee(
15189 Libcalls->getLibcallImplCallingConv(LibcallImpl),
15190 Type::getVoidTy(*getContext()), Callee, std::move(Args));
15191 return TLI->LowerCallTo(CLI).second;
15192}
15193
15195 assert(From && To && "Invalid SDNode; empty source SDValue?");
15196 auto I = SDEI.find(From);
15197 if (I == SDEI.end())
15198 return;
15199
15200 // Use of operator[] on the DenseMap may cause an insertion, which invalidates
15201 // the iterator, hence the need to make a copy to prevent a use-after-free.
15202 NodeExtraInfo NEI = I->second;
15203 if (LLVM_LIKELY(!NEI.PCSections)) {
15204 // No deep copy required for the types of extra info set.
15205 //
15206 // FIXME: Investigate if other types of extra info also need deep copy. This
15207 // depends on the types of nodes they can be attached to: if some extra info
15208 // is only ever attached to nodes where a replacement To node is always the
15209 // node where later use and propagation of the extra info has the intended
15210 // semantics, no deep copy is required.
15211 SDEI[To] = std::move(NEI);
15212 return;
15213 }
15214
15215 const SDNode *EntrySDN = getEntryNode().getNode();
15216
15217 // We need to copy NodeExtraInfo to all _new_ nodes that are being introduced
15218 // through the replacement of From with To. Otherwise, replacements of a node
15219 // (From) with more complex nodes (To and its operands) may result in lost
15220 // extra info where the root node (To) is insignificant in further propagating
15221 // and using extra info when further lowering to MIR.
15222 //
15223 // In the first step pre-populate the visited set with the nodes reachable
15224 // from the old From node. This avoids copying NodeExtraInfo to parts of the
15225 // DAG that is not new and should be left untouched.
15226 SmallVector<const SDNode *> Leafs{From}; // Leafs reachable with VisitFrom.
15227 DenseSet<const SDNode *> FromReach; // The set of nodes reachable from From.
15228 auto VisitFrom = [&](auto &&Self, const SDNode *N, int MaxDepth) {
15229 if (MaxDepth == 0) {
15230 // Remember this node in case we need to increase MaxDepth and continue
15231 // populating FromReach from this node.
15232 Leafs.emplace_back(N);
15233 return;
15234 }
15235 if (!FromReach.insert(N).second)
15236 return;
15237 for (const SDValue &Op : N->op_values())
15238 Self(Self, Op.getNode(), MaxDepth - 1);
15239 };
15240
15241 // Copy extra info to To and all its transitive operands (that are new).
15243 auto DeepCopyTo = [&](auto &&Self, const SDNode *N) {
15244 if (FromReach.contains(N))
15245 return true;
15246 if (!Visited.insert(N).second)
15247 return true;
15248 if (EntrySDN == N)
15249 return false;
15250 for (const SDValue &Op : N->op_values()) {
15251 if (N == To && Op.getNode() == EntrySDN) {
15252 // Special case: New node's operand is the entry node; just need to
15253 // copy extra info to new node.
15254 break;
15255 }
15256 if (!Self(Self, Op.getNode()))
15257 return false;
15258 }
15259 // Copy only if entry node was not reached.
15260 SDEI[N] = std::move(NEI);
15261 return true;
15262 };
15263
15264 // We first try with a lower MaxDepth, assuming that the path to common
15265 // operands between From and To is relatively short. This significantly
15266 // improves performance in the common case. The initial MaxDepth is big
15267 // enough to avoid retry in the common case; the last MaxDepth is large
15268 // enough to avoid having to use the fallback below (and protects from
15269 // potential stack exhaustion from recursion).
15270 for (int PrevDepth = 0, MaxDepth = 16; MaxDepth <= 1024;
15271 PrevDepth = MaxDepth, MaxDepth *= 2, Visited.clear()) {
15272 // StartFrom is the previous (or initial) set of leafs reachable at the
15273 // previous maximum depth.
15275 std::swap(StartFrom, Leafs);
15276 for (const SDNode *N : StartFrom)
15277 VisitFrom(VisitFrom, N, MaxDepth - PrevDepth);
15278 if (LLVM_LIKELY(DeepCopyTo(DeepCopyTo, To)))
15279 return;
15280 // This should happen very rarely (reached the entry node).
15281 LLVM_DEBUG(dbgs() << __func__ << ": MaxDepth=" << MaxDepth << " too low\n");
15282 assert(!Leafs.empty());
15283 }
15284
15285 // This should not happen - but if it did, that means the subgraph reachable
15286 // from From has depth greater or equal to maximum MaxDepth, and VisitFrom()
15287 // could not visit all reachable common operands. Consequently, we were able
15288 // to reach the entry node.
15289 errs() << "warning: incomplete propagation of SelectionDAG::NodeExtraInfo\n";
15290 assert(false && "From subgraph too complex - increase max. MaxDepth?");
15291 // Best-effort fallback if assertions disabled.
15292 SDEI[To] = std::move(NEI);
15293}
15294
15296 assert(VT.isVector() && "Can only unroll vector types!");
15297 if (VT.isFixedLengthVector())
15298 return VT.getVectorNumElements();
15299
15300 const MachineFunction &MF = getMachineFunction();
15301 const Function &F = MF.getFunction();
15302
15303 APInt MaxVScale = getVScaleRange(&F, sizeof(unsigned) * 8).getUnsignedMax();
15304 if (MaxVScale.ugt(VScaleUnrollLimit))
15305 return 0;
15306
15307 bool Overflow;
15308 APInt MinNElts(sizeof(unsigned) * 8, VT.getVectorMinNumElements());
15309 APInt MaxNElts = MinNElts.umul_ov(MaxVScale, Overflow);
15310 if (Overflow)
15311 return 0;
15312
15313 return MaxNElts.getZExtValue();
15314}
15315
15317 ArrayRef<SDValue> Scalars) {
15318 assert(Scalars.size() == getMaxRuntimeNumElements(VT) &&
15319 "Element count mismatch!");
15320 if (VT.isFixedLengthVector())
15321 return getBuildVector(VT, DL, Scalars);
15322
15323 SDValue Vec = getPOISON(VT);
15324 // Iterate in reverse so result remains poison until we encounter a lane that
15325 // exists, after which all lower-numbered lanes must also exist.
15326 for (unsigned IdxVal : reverse(seq(Scalars.size())))
15327 Vec = getInsertVectorElt(DL, Vec, Scalars[IdxVal], IdxVal);
15328
15329 return Vec;
15330}
15331
15332#ifndef NDEBUG
15333static void checkForCyclesHelper(const SDNode *N,
15336 const llvm::SelectionDAG *DAG) {
15337 // If this node has already been checked, don't check it again.
15338 if (Checked.count(N))
15339 return;
15340
15341 // If a node has already been visited on this depth-first walk, reject it as
15342 // a cycle.
15343 if (!Visited.insert(N).second) {
15344 errs() << "Detected cycle in SelectionDAG\n";
15345 dbgs() << "Offending node:\n";
15346 N->dumprFull(DAG); dbgs() << "\n";
15347 abort();
15348 }
15349
15350 for (const SDValue &Op : N->op_values())
15351 checkForCyclesHelper(Op.getNode(), Visited, Checked, DAG);
15352
15353 Checked.insert(N);
15354 Visited.erase(N);
15355}
15356#endif
15357
15359 const llvm::SelectionDAG *DAG,
15360 bool force) {
15361#ifndef NDEBUG
15362 bool check = force;
15363#ifdef EXPENSIVE_CHECKS
15364 check = true;
15365#endif // EXPENSIVE_CHECKS
15366 if (check) {
15367 assert(N && "Checking nonexistent SDNode");
15370 checkForCyclesHelper(N, visited, checked, DAG);
15371 }
15372#endif // !NDEBUG
15373}
15374
15375void llvm::checkForCycles(const llvm::SelectionDAG *DAG, bool force) {
15376 checkForCycles(DAG->getRoot().getNode(), DAG, force);
15377}
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:6010
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:231
void clearBit(unsigned BitPosition)
Set a given bit to 0.
Definition APInt.h:1427
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:226
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:420
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1561
unsigned popcount() const
Count the number of bits set.
Definition APInt.h:1691
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:1533
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:1351
APInt abs() const
Get the absolute value.
Definition APInt.h:1816
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:368
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1187
static APInt getBitsSet(unsigned numBits, unsigned loBit, unsigned hiBit)
Get a value with a block of bits set.
Definition APInt.h:255
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:377
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:1509
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1116
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:206
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:326
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:837
bool sle(const APInt &RHS) const
Signed less or equal comparison.
Definition APInt.h:1171
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1660
unsigned getNumSignBits() const
Computes the number of leading bits of this APInt that are equal to its sign bit.
Definition APInt.h:1649
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1619
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:216
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:551
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:1782
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:830
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:331
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1155
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:1388
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:876
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:1262
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:437
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:303
void clearBits(unsigned LoBit, unsigned HiBit)
Clear the bits from LoBit (inclusive) to HiBit (exclusive) to 0.
Definition APInt.h:1438
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:197
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:1242
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:386
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:283
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:236
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
Definition APInt.h:861
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:854
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1226
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:1079
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1436
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
bool hasSwiftErrorArg() const
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
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:2295
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:2300
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:677
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:1759
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:1739
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:2554
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:2208
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:633
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:1746
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:407
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:1636
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:1753
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:1885
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:1947
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:2146
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:772
MDNode * TBAAStruct
The tag for type-based alias analysis (tbaa struct).
Definition Metadata.h:792
MDNode * TBAA
The tag for type-based alias analysis.
Definition Metadata.h:789
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)