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 Known = Known.extractBits(EltBitWidth, Index * EltBitWidth);
4290 break;
4291 }
4293 SDValue InVec = Op.getOperand(0);
4294 SDValue EltNo = Op.getOperand(1);
4295 EVT VecVT = InVec.getValueType();
4296 // computeKnownBits not yet implemented for scalable vectors.
4297 if (VecVT.isScalableVector())
4298 break;
4299 const unsigned EltBitWidth = VecVT.getScalarSizeInBits();
4300 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4301
4302 // If BitWidth > EltBitWidth the value is anyext:ed. So we do not know
4303 // anything about the extended bits.
4304 if (BitWidth > EltBitWidth)
4305 Known = Known.trunc(EltBitWidth);
4306
4307 // If we know the element index, just demand that vector element, else for
4308 // an unknown element index, ignore DemandedElts and demand them all.
4309 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
4310 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4311 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
4312 DemandedSrcElts =
4313 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
4314
4315 Known = computeKnownBits(InVec, DemandedSrcElts, Depth + 1);
4316 if (BitWidth > EltBitWidth)
4317 Known = Known.anyext(BitWidth);
4318 break;
4319 }
4320 case ISD::BUILD_PAIR: {
4321 // Operand 0 is the low half and operand 1 the high half,
4322 // KnownBits::concat places its argument in the low bits.
4323 Known = computeKnownBits(Op.getOperand(0), Depth + 1);
4324 Known2 = computeKnownBits(Op.getOperand(1), Depth + 1);
4325 Known = Known2.concat(Known);
4326 break;
4327 }
4329 if (Op.getValueType().isScalableVector())
4330 break;
4331
4332 // If we know the element index, split the demand between the
4333 // source vector and the inserted element, otherwise assume we need
4334 // the original demanded vector elements and the value.
4335 SDValue InVec = Op.getOperand(0);
4336 SDValue InVal = Op.getOperand(1);
4337 SDValue EltNo = Op.getOperand(2);
4338 bool DemandedVal = true;
4339 APInt DemandedVecElts = DemandedElts;
4340 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
4341 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
4342 unsigned EltIdx = CEltNo->getZExtValue();
4343 DemandedVal = !!DemandedElts[EltIdx];
4344 DemandedVecElts.clearBit(EltIdx);
4345 }
4346 Known.setAllConflict();
4347 if (DemandedVal) {
4348 Known2 = computeKnownBits(InVal, Depth + 1);
4349 Known = Known.intersectWith(Known2.zextOrTrunc(BitWidth));
4350 }
4351 if (!!DemandedVecElts) {
4352 Known2 = computeKnownBits(InVec, DemandedVecElts, Depth + 1);
4353 Known = Known.intersectWith(Known2);
4354 }
4355 break;
4356 }
4357 case ISD::BITREVERSE: {
4358 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4359 Known = Known2.reverseBits();
4360 break;
4361 }
4362 case ISD::BSWAP: {
4363 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4364 Known = Known2.byteSwap();
4365 break;
4366 }
4367 case ISD::ABS:
4368 case ISD::ABS_MIN_POISON: {
4369 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4370 Known = Known2.abs();
4371 Known.Zero.setHighBits(
4372 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1);
4373 break;
4374 }
4375 case ISD::USUBSAT: {
4376 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4377 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4378 Known = KnownBits::usub_sat(Known, Known2);
4379 break;
4380 }
4381 case ISD::UMIN: {
4382 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4383 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4384 Known = KnownBits::umin(Known, Known2);
4385 break;
4386 }
4387 case ISD::UMAX: {
4388 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4389 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4390 Known = KnownBits::umax(Known, Known2);
4391 break;
4392 }
4393 case ISD::SMIN:
4394 case ISD::SMAX: {
4395 // If we have a clamp pattern, we know that the number of sign bits will be
4396 // the minimum of the clamp min/max range.
4397 bool IsMax = (Opcode == ISD::SMAX);
4398 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
4399 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
4400 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
4401 CstHigh =
4402 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
4403 if (CstLow && CstHigh) {
4404 if (!IsMax)
4405 std::swap(CstLow, CstHigh);
4406
4407 const APInt &ValueLow = CstLow->getAPIntValue();
4408 const APInt &ValueHigh = CstHigh->getAPIntValue();
4409 if (ValueLow.sle(ValueHigh)) {
4410 unsigned LowSignBits = ValueLow.getNumSignBits();
4411 unsigned HighSignBits = ValueHigh.getNumSignBits();
4412 unsigned MinSignBits = std::min(LowSignBits, HighSignBits);
4413 if (ValueLow.isNegative() && ValueHigh.isNegative()) {
4414 Known.One.setHighBits(MinSignBits);
4415 break;
4416 }
4417 if (ValueLow.isNonNegative() && ValueHigh.isNonNegative()) {
4418 Known.Zero.setHighBits(MinSignBits);
4419 break;
4420 }
4421 }
4422 }
4423
4424 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4425 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4426 if (IsMax)
4427 Known = KnownBits::smax(Known, Known2);
4428 else
4429 Known = KnownBits::smin(Known, Known2);
4430
4431 // For SMAX, if CstLow is non-negative we know the result will be
4432 // non-negative and thus all sign bits are 0.
4433 // TODO: There's an equivalent of this for smin with negative constant for
4434 // known ones.
4435 if (IsMax && CstLow) {
4436 const APInt &ValueLow = CstLow->getAPIntValue();
4437 if (ValueLow.isNonNegative()) {
4438 unsigned SignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4439 Known.Zero.setHighBits(std::min(SignBits, ValueLow.getNumSignBits()));
4440 }
4441 }
4442
4443 break;
4444 }
4445 case ISD::UINT_TO_FP: {
4446 Known.makeNonNegative();
4447 break;
4448 }
4449 case ISD::SINT_TO_FP: {
4450 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4451 if (Known2.isNonNegative())
4452 Known.makeNonNegative();
4453 else if (Known2.isNegative())
4454 Known.makeNegative();
4455 break;
4456 }
4457 case ISD::FP_TO_UINT_SAT: {
4458 // FP_TO_UINT_SAT produces an unsigned value that fits in the saturating VT.
4459 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4461 break;
4462 }
4463 case ISD::ATOMIC_LOAD: {
4464 // If we are looking at the loaded value.
4465 if (Op.getResNo() == 0) {
4466 auto *AT = cast<AtomicSDNode>(Op);
4467 unsigned ScalarMemorySize = AT->getMemoryVT().getScalarSizeInBits();
4468 KnownBits KnownScalarMemory(ScalarMemorySize);
4469 if (const MDNode *MD = AT->getRanges())
4470 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4471
4472 switch (AT->getExtensionType()) {
4473 case ISD::ZEXTLOAD:
4474 Known = KnownScalarMemory.zext(BitWidth);
4475 break;
4476 case ISD::SEXTLOAD:
4477 Known = KnownScalarMemory.sext(BitWidth);
4478 break;
4479 case ISD::EXTLOAD:
4480 switch (TLI->getExtendForAtomicOps()) {
4481 case ISD::ZERO_EXTEND:
4482 Known = KnownScalarMemory.zext(BitWidth);
4483 break;
4484 case ISD::SIGN_EXTEND:
4485 Known = KnownScalarMemory.sext(BitWidth);
4486 break;
4487 default:
4488 Known = KnownScalarMemory.anyext(BitWidth);
4489 break;
4490 }
4491 break;
4492 case ISD::NON_EXTLOAD:
4493 Known = KnownScalarMemory;
4494 break;
4495 }
4496 assert(Known.getBitWidth() == BitWidth);
4497 }
4498 break;
4499 }
4501 if (Op.getResNo() == 1) {
4502 // The boolean result conforms to getBooleanContents.
4503 // If we know the result of a setcc has the top bits zero, use this info.
4504 // We know that we have an integer-based boolean since these operations
4505 // are only available for integer.
4506 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
4508 BitWidth > 1)
4509 Known.Zero.setBitsFrom(1);
4510 break;
4511 }
4512 [[fallthrough]];
4514 case ISD::ATOMIC_SWAP:
4525 case ISD::ATOMIC_LOAD_UMAX: {
4526 // If we are looking at the loaded value.
4527 if (Op.getResNo() == 0) {
4528 auto *AT = cast<AtomicSDNode>(Op);
4529 unsigned MemBits = AT->getMemoryVT().getScalarSizeInBits();
4530
4531 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
4532 Known.Zero.setBitsFrom(MemBits);
4533 }
4534 break;
4535 }
4536 case ISD::FrameIndex:
4537 case ISD::TargetFrameIndex: {
4538 const MachineFunction &MF = getMachineFunction();
4539 int FrameIdx = cast<FrameIndexSDNode>(Op)->getIndex();
4540 TLI->computeKnownBitsForStackObjectPointer(
4541 Known, MF, MF.getFrameInfo().getObjectAlign(FrameIdx));
4542 break;
4543 }
4544
4545 default:
4546 if (Opcode < ISD::BUILTIN_OP_END)
4547 break;
4548 [[fallthrough]];
4552 // Allow the target to implement this method for its nodes.
4553 TLI->computeKnownBitsForTargetNode(Op, Known, DemandedElts, *this, Depth);
4554 break;
4555 }
4556
4557 return Known;
4558}
4559
4560/// Convert ConstantRange OverflowResult into SelectionDAG::OverflowKind.
4573
4576 // X + 0 never overflow
4577 if (isNullConstant(N1))
4578 return OFK_Never;
4579
4580 // If both operands each have at least two sign bits, the addition
4581 // cannot overflow.
4582 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4583 return OFK_Never;
4584
4585 // TODO: Add ConstantRange::signedAddMayOverflow handling.
4586 return OFK_Sometime;
4587}
4588
4591 // X + 0 never overflow
4592 if (isNullConstant(N1))
4593 return OFK_Never;
4594
4595 // mulhi + 1 never overflow
4596 KnownBits N1Known = computeKnownBits(N1);
4597 if (N0.getOpcode() == ISD::UMUL_LOHI && N0.getResNo() == 1 &&
4598 N1Known.getMaxValue().ult(2))
4599 return OFK_Never;
4600
4601 KnownBits N0Known = computeKnownBits(N0);
4602 if (N1.getOpcode() == ISD::UMUL_LOHI && N1.getResNo() == 1 &&
4603 N0Known.getMaxValue().ult(2))
4604 return OFK_Never;
4605
4606 // Fallback to ConstantRange::unsignedAddMayOverflow handling.
4607 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4608 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4609 return mapOverflowResult(N0Range.unsignedAddMayOverflow(N1Range));
4610}
4611
4614 // X - 0 never overflow
4615 if (isNullConstant(N1))
4616 return OFK_Never;
4617
4618 // If both operands each have at least two sign bits, the subtraction
4619 // cannot overflow.
4620 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4621 return OFK_Never;
4622
4623 KnownBits N0Known = computeKnownBits(N0);
4624 KnownBits N1Known = computeKnownBits(N1);
4625 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, true);
4626 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, true);
4627 return mapOverflowResult(N0Range.signedSubMayOverflow(N1Range));
4628}
4629
4632 // X - 0 never overflow
4633 if (isNullConstant(N1))
4634 return OFK_Never;
4635
4636 ConstantRange N0Range =
4637 computeConstantRangeIncludingKnownBits(N0, /*ForSigned=*/false);
4638 ConstantRange N1Range =
4639 computeConstantRangeIncludingKnownBits(N1, /*ForSigned=*/false);
4640 return mapOverflowResult(N0Range.unsignedSubMayOverflow(N1Range));
4641}
4642
4645 // X * 0 and X * 1 never overflow.
4646 if (isNullConstant(N1) || isOneConstant(N1))
4647 return OFK_Never;
4648
4651 return mapOverflowResult(N0Range.unsignedMulMayOverflow(N1Range));
4652}
4653
4656 // X * 0 and X * 1 never overflow.
4657 if (isNullConstant(N1) || isOneConstant(N1))
4658 return OFK_Never;
4659
4660 // Get the size of the result.
4661 unsigned BitWidth = N0.getScalarValueSizeInBits();
4662
4663 // Sum of the sign bits.
4664 unsigned SignBits = ComputeNumSignBits(N0) + ComputeNumSignBits(N1);
4665
4666 // If we have enough sign bits, then there's no overflow.
4667 if (SignBits > BitWidth + 1)
4668 return OFK_Never;
4669
4670 if (SignBits == BitWidth + 1) {
4671 // The overflow occurs when the true multiplication of the
4672 // the operands is the minimum negative number.
4673 KnownBits N0Known = computeKnownBits(N0);
4674 KnownBits N1Known = computeKnownBits(N1);
4675 // If one of the operands is non-negative, then there's no
4676 // overflow.
4677 if (N0Known.isNonNegative() || N1Known.isNonNegative())
4678 return OFK_Never;
4679 }
4680
4681 return OFK_Sometime;
4682}
4683
4685 unsigned Depth) const {
4686 APInt DemandedElts = getDemandAllEltsMask(Op);
4687 return computeConstantRange(Op, DemandedElts, ForSigned, Depth);
4688}
4689
4691 const APInt &DemandedElts,
4692 bool ForSigned,
4693 unsigned Depth) const {
4694 EVT VT = Op.getValueType();
4695 unsigned BitWidth = VT.getScalarSizeInBits();
4696
4697 if (Depth >= MaxRecursionDepth)
4698 return ConstantRange::getFull(BitWidth);
4699
4700 if (ConstantSDNode *C = isConstOrConstSplat(Op, DemandedElts))
4701 return ConstantRange(C->getAPIntValue());
4702
4703 unsigned Opcode = Op.getOpcode();
4704 switch (Opcode) {
4705 case ISD::VSCALE: {
4707 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
4708 return getVScaleRange(&F, BitWidth).multiply(Multiplier);
4709 }
4710 default:
4711 break;
4712 }
4713
4714 return ConstantRange::getFull(BitWidth);
4715}
4716
4719 unsigned Depth) const {
4720 APInt DemandedElts = getDemandAllEltsMask(Op);
4721 return computeConstantRangeIncludingKnownBits(Op, DemandedElts, ForSigned,
4722 Depth);
4723}
4724
4726 SDValue Op, const APInt &DemandedElts, bool ForSigned,
4727 unsigned Depth) const {
4728 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
4730 ConstantRange CR2 = computeConstantRange(Op, DemandedElts, ForSigned, Depth);
4733 return CR1.intersectWith(CR2, RangeType);
4734}
4735
4737 unsigned Depth) const {
4738 APInt DemandedElts = getDemandAllEltsMask(Val);
4739 return isKnownToBeAPowerOfTwo(Val, DemandedElts, OrZero, Depth);
4740}
4741
4743 const APInt &DemandedElts,
4744 bool OrZero, unsigned Depth) const {
4745 if (Depth >= MaxRecursionDepth)
4746 return false; // Limit search depth.
4747
4748 EVT OpVT = Val.getValueType();
4749 unsigned BitWidth = OpVT.getScalarSizeInBits();
4750 [[maybe_unused]] unsigned NumElts = DemandedElts.getBitWidth();
4751 assert((!OpVT.isScalableVector() || NumElts == 1) &&
4752 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4753 assert(
4754 (!OpVT.isFixedLengthVector() || NumElts == OpVT.getVectorNumElements()) &&
4755 "Unexpected vector size");
4756
4757 auto IsPowerOfTwoOrZero = [BitWidth, OrZero](const ConstantSDNode *C) {
4758 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
4759 return (OrZero && V.isZero()) || V.isPowerOf2();
4760 };
4761
4762 // Is the constant a known power of 2 or zero?
4763 if (ISD::matchUnaryPredicate(Val, DemandedElts, IsPowerOfTwoOrZero,
4764 /*AllowUndefs=*/false, /*AllowTruncation=*/true))
4765 return true;
4766
4767 switch (Val.getOpcode()) {
4769 SDValue InVec = Val.getOperand(0);
4770 SDValue EltNo = Val.getOperand(1);
4771 EVT VecVT = InVec.getValueType();
4772
4773 // Skip scalable vectors or implicit extensions.
4774 if (VecVT.isScalableVector() ||
4775 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
4776 break;
4777
4778 // If we know the element index, just demand that vector element, else for
4779 // an unknown element index, ignore DemandedElts and demand them all.
4780 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4781 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4782 APInt DemandedSrcElts =
4783 ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts)
4784 ? APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue())
4785 : APInt::getAllOnes(NumSrcElts);
4786 return isKnownToBeAPowerOfTwo(InVec, DemandedSrcElts, OrZero, Depth + 1);
4787 }
4788
4789 case ISD::AND: {
4790 // Looking for `x & -x` pattern:
4791 // If x == 0:
4792 // x & -x -> 0
4793 // If x != 0:
4794 // x & -x -> non-zero pow2
4795 // so if we find the pattern return whether we know `x` is non-zero.
4796 SDValue X, Z;
4797 if (sd_match(Val, m_And(m_Value(X), m_Neg(m_Deferred(X)))) ||
4798 (sd_match(Val, m_And(m_Value(X), m_Sub(m_Value(Z), m_Deferred(X)))) &&
4799 MaskedVectorIsZero(Z, DemandedElts, Depth + 1)))
4800 return OrZero || isKnownNeverZero(X, DemandedElts, Depth);
4801 break;
4802 }
4803
4804 case ISD::SHL: {
4805 // A left-shift of a constant one will have exactly one bit set because
4806 // shifting the bit off the end is undefined.
4807 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4808 if (C && C->getAPIntValue() == 1)
4809 return true;
4810 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4811 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4812 Depth + 1);
4813 }
4814
4815 case ISD::SRL: {
4816 // A logical right-shift of a constant sign-bit will have exactly
4817 // one bit set.
4818 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4819 if (C && C->getAPIntValue().isSignMask())
4820 return true;
4821 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4822 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4823 Depth + 1);
4824 }
4825
4826 case ISD::TRUNCATE:
4827 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4828 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4829 Depth + 1);
4830
4831 case ISD::ROTL:
4832 case ISD::ROTR:
4833 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4834 Depth + 1);
4835 case ISD::BSWAP:
4836 case ISD::BITREVERSE:
4837 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4838 Depth + 1);
4839
4840 case ISD::SMIN:
4841 case ISD::SMAX:
4842 case ISD::UMIN:
4843 case ISD::UMAX:
4844 return isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4845 Depth + 1) &&
4846 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4847 Depth + 1);
4848
4849 case ISD::SELECT:
4850 case ISD::VSELECT:
4851 return isKnownToBeAPowerOfTwo(Val.getOperand(2), DemandedElts, OrZero,
4852 Depth + 1) &&
4853 isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4854 Depth + 1);
4855
4856 case ISD::ZERO_EXTEND:
4857 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4858 Depth + 1);
4859
4860 case ISD::VSCALE:
4861 // vscale(power-of-two) is a power-of-two
4862 return isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4863 Depth + 1);
4864
4865 case ISD::VECTOR_SHUFFLE: {
4867 // Demanded elements with undef shuffle mask elements are unknown
4868 // - we cannot guarantee they are a power of two, so return false.
4869 APInt DemandedLHS, DemandedRHS;
4871 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
4872 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
4873 DemandedLHS, DemandedRHS))
4874 return false;
4875
4876 // All demanded elements from LHS must be known power of two.
4877 if (!!DemandedLHS && !isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedLHS,
4878 OrZero, Depth + 1))
4879 return false;
4880
4881 // All demanded elements from RHS must be known power of two.
4882 if (!!DemandedRHS && !isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedRHS,
4883 OrZero, Depth + 1))
4884 return false;
4885
4886 return true;
4887 }
4888 }
4889
4890 // More could be done here, though the above checks are enough
4891 // to handle some common cases.
4892 return false;
4893}
4894
4896 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Val, true))
4897 return C1->getValueAPF().getExactLog2Abs() >= 0;
4898
4899 if (Val.getOpcode() == ISD::UINT_TO_FP || Val.getOpcode() == ISD::SINT_TO_FP)
4900 return isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth + 1);
4901
4902 return false;
4903}
4904
4906 APInt DemandedElts = getDemandAllEltsMask(Op);
4907 return ComputeNumSignBits(Op, DemandedElts, Depth);
4908}
4909
4910unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
4911 unsigned Depth) const {
4912 EVT VT = Op.getValueType();
4913 assert((VT.isInteger() || VT.isFloatingPoint()) && "Invalid VT!");
4914 unsigned VTBits = VT.getScalarSizeInBits();
4915 unsigned NumElts = DemandedElts.getBitWidth();
4916 unsigned Tmp, Tmp2;
4917 unsigned FirstAnswer = 1;
4918
4919 assert((!VT.isScalableVector() || NumElts == 1) &&
4920 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4921
4922 if (auto *C = dyn_cast<ConstantSDNode>(Op)) {
4923 const APInt &Val = C->getAPIntValue();
4924 return Val.getNumSignBits();
4925 }
4926
4927 if (Depth >= MaxRecursionDepth)
4928 return 1; // Limit search depth.
4929
4930 if (!DemandedElts)
4931 return 1; // No demanded elts, better to assume we don't know anything.
4932
4933 unsigned Opcode = Op.getOpcode();
4934 switch (Opcode) {
4935 default: break;
4936 case ISD::AssertSext:
4937 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4938 return VTBits-Tmp+1;
4939 case ISD::AssertZext:
4940 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4941 return VTBits-Tmp;
4942 case ISD::FREEZE:
4943 if (isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
4945 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4946 break;
4947 case ISD::MERGE_VALUES:
4948 return ComputeNumSignBits(Op.getOperand(Op.getResNo()), DemandedElts,
4949 Depth + 1);
4950 case ISD::SPLAT_VECTOR: {
4951 // Check if the sign bits of source go down as far as the truncated value.
4952 unsigned NumSrcBits = Op.getOperand(0).getValueSizeInBits();
4953 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4954 if (NumSrcSignBits > (NumSrcBits - VTBits))
4955 return NumSrcSignBits - (NumSrcBits - VTBits);
4956 break;
4957 }
4958 case ISD::BUILD_VECTOR:
4959 assert(!VT.isScalableVector());
4960 Tmp = VTBits;
4961 for (unsigned i = 0, e = Op.getNumOperands(); (i < e) && (Tmp > 1); ++i) {
4962 if (!DemandedElts[i])
4963 continue;
4964
4965 SDValue SrcOp = Op.getOperand(i);
4966 // BUILD_VECTOR can implicitly truncate sources, we handle this specially
4967 // for constant nodes to ensure we only look at the sign bits.
4969 APInt T = C->getAPIntValue().trunc(VTBits);
4970 Tmp2 = T.getNumSignBits();
4971 } else if (SrcOp.getOpcode() == ISD::EXTRACT_VECTOR_ELT &&
4972 SrcOp.getOperand(0).getScalarValueSizeInBits() >= VTBits) {
4973 // EXTRACT_VECTOR_ELT can extend the value with high bits undefined. If
4974 // this BUILD_VECTOR truncates those undefined bits we can just look
4975 // through the SrcOp and query the vector directly.
4976 SDValue InVec = SrcOp.getOperand(0);
4977 EVT InVecVT = InVec.getValueType();
4978
4979 APInt DemandedSrcElts;
4980 if (InVecVT.isScalableVector())
4981 // Demand all elements.
4982 DemandedSrcElts = APInt(1, 1);
4983 else {
4984 unsigned NumSrcElts = InVecVT.getVectorNumElements();
4985 auto *ConstEltNo = dyn_cast<ConstantSDNode>(SrcOp.getOperand(1));
4986 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
4987 DemandedSrcElts =
4988 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
4989 else
4990 DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
4991 }
4992
4993 Tmp2 = ComputeNumSignBits(InVec, DemandedSrcElts, Depth + 1);
4994 unsigned ExtraBits = InVec.getScalarValueSizeInBits() - VTBits;
4995 if (ExtraBits)
4996 Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1);
4997 } else {
4998 Tmp2 = ComputeNumSignBits(SrcOp, Depth + 1);
4999
5000 if (SrcOp.getValueSizeInBits() != VTBits) {
5001 assert(SrcOp.getValueSizeInBits() > VTBits &&
5002 "Expected BUILD_VECTOR implicit truncation");
5003 unsigned ExtraBits = SrcOp.getValueSizeInBits() - VTBits;
5004 Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1);
5005 }
5006 }
5007 Tmp = std::min(Tmp, Tmp2);
5008 }
5009 return Tmp;
5010
5011 case ISD::VECTOR_COMPRESS: {
5012 SDValue Vec = Op.getOperand(0);
5013 SDValue PassThru = Op.getOperand(2);
5014 Tmp = ComputeNumSignBits(PassThru, DemandedElts, Depth + 1);
5015 if (Tmp == 1)
5016 return 1;
5017 Tmp2 = ComputeNumSignBits(Vec, Depth + 1);
5018 Tmp = std::min(Tmp, Tmp2);
5019 return Tmp;
5020 }
5021
5022 case ISD::VECTOR_SHUFFLE: {
5023 // Collect the minimum number of sign bits that are shared by every vector
5024 // element referenced by the shuffle.
5025 APInt DemandedLHS, DemandedRHS;
5027 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
5028 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
5029 DemandedLHS, DemandedRHS))
5030 return 1;
5031
5032 Tmp = std::numeric_limits<unsigned>::max();
5033 if (!!DemandedLHS)
5034 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedLHS, Depth + 1);
5035 if (!!DemandedRHS) {
5036 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedRHS, Depth + 1);
5037 Tmp = std::min(Tmp, Tmp2);
5038 }
5039 // If we don't know anything, early out and try computeKnownBits fall-back.
5040 if (Tmp == 1)
5041 break;
5042 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5043 return Tmp;
5044 }
5045
5046 case ISD::BITCAST: {
5047 if (VT.isScalableVector())
5048 break;
5049 SDValue N0 = Op.getOperand(0);
5050 EVT SrcVT = N0.getValueType();
5051 unsigned SrcBits = SrcVT.getScalarSizeInBits();
5052
5053 // Ignore bitcasts from unsupported types..
5054 if (!(SrcVT.isInteger() || SrcVT.isFloatingPoint()))
5055 break;
5056
5057 // Fast handling of 'identity' bitcasts.
5058 if (VTBits == SrcBits)
5059 return ComputeNumSignBits(N0, DemandedElts, Depth + 1);
5060
5061 bool IsLE = getDataLayout().isLittleEndian();
5062
5063 // Bitcast 'large element' scalar/vector to 'small element' vector.
5064 if ((SrcBits % VTBits) == 0) {
5065 assert(VT.isVector() && "Expected bitcast to vector");
5066
5067 unsigned Scale = SrcBits / VTBits;
5068 APInt SrcDemandedElts =
5069 APIntOps::ScaleBitMask(DemandedElts, NumElts / Scale);
5070
5071 // Fast case - sign splat can be simply split across the small elements.
5072 Tmp = ComputeNumSignBits(N0, SrcDemandedElts, Depth + 1);
5073 if (Tmp == SrcBits)
5074 return VTBits;
5075
5076 // Slow case - determine how far the sign extends into each sub-element.
5077 Tmp2 = VTBits;
5078 for (unsigned i = 0; i != NumElts; ++i)
5079 if (DemandedElts[i]) {
5080 unsigned SubOffset = i % Scale;
5081 SubOffset = (IsLE ? ((Scale - 1) - SubOffset) : SubOffset);
5082 SubOffset = SubOffset * VTBits;
5083 if (Tmp <= SubOffset)
5084 return 1;
5085 Tmp2 = std::min(Tmp2, Tmp - SubOffset);
5086 }
5087 return Tmp2;
5088 }
5089 break;
5090 }
5091
5093 // FP_TO_SINT_SAT produces a signed value that fits in the saturating VT.
5094 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
5095 return VTBits - Tmp + 1;
5096 case ISD::SIGN_EXTEND:
5097 Tmp = VTBits - Op.getOperand(0).getScalarValueSizeInBits();
5098 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1) + Tmp;
5100 // Max of the input and what this extends.
5101 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
5102 Tmp = VTBits-Tmp+1;
5103 Tmp2 = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5104 return std::max(Tmp, Tmp2);
5106 if (VT.isScalableVector())
5107 break;
5108 SDValue Src = Op.getOperand(0);
5109 EVT SrcVT = Src.getValueType();
5110 APInt DemandedSrcElts = DemandedElts.zext(SrcVT.getVectorNumElements());
5111 Tmp = VTBits - SrcVT.getScalarSizeInBits();
5112 return ComputeNumSignBits(Src, DemandedSrcElts, Depth+1) + Tmp;
5113 }
5114 case ISD::SRA:
5115 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5116 // SRA X, C -> adds C sign bits.
5117 if (std::optional<unsigned> ShAmt =
5118 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
5119 Tmp = std::min(Tmp + *ShAmt, VTBits);
5120 return Tmp;
5121 case ISD::SHL:
5122 if (std::optional<ConstantRange> ShAmtRange =
5123 getValidShiftAmountRange(Op, DemandedElts, Depth + 1)) {
5124 unsigned MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
5125 unsigned MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
5126 // Try to look through ZERO/SIGN/ANY_EXTEND. If all extended bits are
5127 // shifted out, then we can compute the number of sign bits for the
5128 // operand being extended. A future improvement could be to pass along the
5129 // "shifted left by" information in the recursive calls to
5130 // ComputeKnownSignBits. Allowing us to handle this more generically.
5131 if (ISD::isExtOpcode(Op.getOperand(0).getOpcode())) {
5132 SDValue Ext = Op.getOperand(0);
5133 EVT ExtVT = Ext.getValueType();
5134 SDValue Extendee = Ext.getOperand(0);
5135 EVT ExtendeeVT = Extendee.getValueType();
5136 unsigned SizeDifference =
5137 ExtVT.getScalarSizeInBits() - ExtendeeVT.getScalarSizeInBits();
5138 if (SizeDifference <= MinShAmt) {
5139 Tmp = SizeDifference +
5140 ComputeNumSignBits(Extendee, DemandedElts, Depth + 1);
5141 if (MaxShAmt < Tmp)
5142 return Tmp - MaxShAmt;
5143 }
5144 }
5145 // shl destroys sign bits, ensure it doesn't shift out all sign bits.
5146 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5147 if (MaxShAmt < Tmp)
5148 return Tmp - MaxShAmt;
5149 }
5150 break;
5151 case ISD::AND:
5152 case ISD::OR:
5153 case ISD::XOR: // NOT is handled here.
5154 // Logical binary ops preserve the number of sign bits at the worst.
5155 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5156 if (Tmp != 1) {
5157 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5158 FirstAnswer = std::min(Tmp, Tmp2);
5159 // We computed what we know about the sign bits as our first
5160 // answer. Now proceed to the generic code that uses
5161 // computeKnownBits, and pick whichever answer is better.
5162 }
5163 break;
5164
5165 case ISD::SELECT:
5166 case ISD::VSELECT:
5167 Tmp = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5168 if (Tmp == 1) return 1; // Early out.
5169 Tmp2 = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5170 return std::min(Tmp, Tmp2);
5171 case ISD::SELECT_CC:
5172 Tmp = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5173 if (Tmp == 1) return 1; // Early out.
5174 Tmp2 = ComputeNumSignBits(Op.getOperand(3), DemandedElts, Depth+1);
5175 return std::min(Tmp, Tmp2);
5176
5177 case ISD::SMIN:
5178 case ISD::SMAX: {
5179 // If we have a clamp pattern, we know that the number of sign bits will be
5180 // the minimum of the clamp min/max range.
5181 bool IsMax = (Opcode == ISD::SMAX);
5182 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
5183 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
5184 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
5185 CstHigh =
5186 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
5187 if (CstLow && CstHigh) {
5188 if (!IsMax)
5189 std::swap(CstLow, CstHigh);
5190 if (CstLow->getAPIntValue().sle(CstHigh->getAPIntValue())) {
5191 Tmp = CstLow->getAPIntValue().getNumSignBits();
5192 Tmp2 = CstHigh->getAPIntValue().getNumSignBits();
5193 return std::min(Tmp, Tmp2);
5194 }
5195 }
5196
5197 // Fallback - just get the minimum number of sign bits of the operands.
5198 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5199 if (Tmp == 1)
5200 return 1; // Early out.
5201 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5202 return std::min(Tmp, Tmp2);
5203 }
5204 case ISD::UMIN:
5205 case ISD::UMAX:
5206 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5207 if (Tmp == 1)
5208 return 1; // Early out.
5209 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5210 return std::min(Tmp, Tmp2);
5211 case ISD::SSUBO_CARRY:
5212 case ISD::USUBO_CARRY:
5213 // sub_carry(x,x,c) -> 0/-1 (sext carry)
5214 if (Op.getResNo() == 0 && Op.getOperand(0) == Op.getOperand(1))
5215 return VTBits;
5216 [[fallthrough]];
5217 case ISD::SADDO:
5218 case ISD::UADDO:
5219 case ISD::SADDO_CARRY:
5220 case ISD::UADDO_CARRY:
5221 case ISD::SSUBO:
5222 case ISD::USUBO:
5223 case ISD::SMULO:
5224 case ISD::UMULO:
5225 if (Op.getResNo() != 1)
5226 break;
5227 // The boolean result conforms to getBooleanContents. Fall through.
5228 // If setcc returns 0/-1, all bits are sign bits.
5229 // We know that we have an integer-based boolean since these operations
5230 // are only available for integer.
5231 if (TLI->getBooleanContents(VT.isVector(), false) ==
5233 return VTBits;
5234 break;
5235 case ISD::SETCC:
5236 case ISD::SETCCCARRY:
5237 case ISD::STRICT_FSETCC:
5238 case ISD::STRICT_FSETCCS: {
5239 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
5240 // If setcc returns 0/-1, all bits are sign bits.
5241 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
5243 return VTBits;
5244 break;
5245 }
5247 // Semantically similar to icmp ult.
5248 if (TLI->getBooleanContents(VT.isVector(), /*isFloat=*/false) ==
5250 return VTBits;
5251 break;
5252 case ISD::ROTL:
5253 case ISD::ROTR: {
5254 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5255 ConstantSDNode *C = isConstOrConstSplat(Op.getOperand(1), DemandedElts);
5256 FirstAnswer = SignBitsOps::rot(
5257 Tmp, VTBits, C ? std::optional(C->getAPIntValue()) : std::nullopt,
5258 Opcode == ISD::ROTR);
5259 break;
5260 }
5261 case ISD::ADD:
5262 case ISD::ADDC:
5263 // TODO: Move Operand 1 check before Operand 0 check
5264 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5265 if (Tmp == 1) return 1; // Early out.
5266
5267 // Special case decrementing a value (ADD X, -1):
5268 if (ConstantSDNode *CRHS =
5269 isConstOrConstSplat(Op.getOperand(1), DemandedElts))
5270 if (CRHS->isAllOnes()) {
5272 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
5273
5274 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5275 // sign bits set.
5276 if ((Known.Zero | 1).isAllOnes())
5277 return VTBits;
5278
5279 // If we are subtracting one from a positive number, there is no carry
5280 // out of the result.
5281 if (Known.isNonNegative())
5282 return Tmp;
5283 }
5284
5285 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5286 if (Tmp2 == 1) return 1; // Early out.
5287
5288 // Add can have at most one carry bit. Thus we know that the output
5289 // is, at worst, one more bit than the inputs.
5290 return std::min(Tmp, Tmp2) - 1;
5291 case ISD::SUB:
5292 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5293 if (Tmp2 == 1) return 1; // Early out.
5294
5295 // Handle NEG.
5296 if (ConstantSDNode *CLHS =
5297 isConstOrConstSplat(Op.getOperand(0), DemandedElts))
5298 if (CLHS->isZero()) {
5300 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
5301 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5302 // sign bits set.
5303 if ((Known.Zero | 1).isAllOnes())
5304 return VTBits;
5305
5306 // If the input is known to be positive (the sign bit is known clear),
5307 // the output of the NEG has the same number of sign bits as the input.
5308 if (Known.isNonNegative())
5309 return Tmp2;
5310
5311 // Otherwise, we treat this like a SUB.
5312 }
5313
5314 // Sub can have at most one carry bit. Thus we know that the output
5315 // is, at worst, one more bit than the inputs.
5316 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5317 if (Tmp == 1) return 1; // Early out.
5318 return std::min(Tmp, Tmp2) - 1;
5319 case ISD::MUL: {
5320 // The output of the Mul can be at most twice the valid bits in the inputs.
5321 unsigned SignBitsOp0 = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5322 if (SignBitsOp0 == 1)
5323 break;
5324 unsigned SignBitsOp1 = ComputeNumSignBits(Op.getOperand(1), Depth + 1);
5325 if (SignBitsOp1 == 1)
5326 break;
5327 unsigned OutValidBits =
5328 (VTBits - SignBitsOp0 + 1) + (VTBits - SignBitsOp1 + 1);
5329 return OutValidBits > VTBits ? 1 : VTBits - OutValidBits + 1;
5330 }
5331 case ISD::AVGCEILS:
5332 case ISD::AVGFLOORS:
5333 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5334 if (Tmp == 1)
5335 return 1; // Early out.
5336 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5337 return std::min(Tmp, Tmp2);
5338 case ISD::SREM:
5339 // The sign bit is the LHS's sign bit, except when the result of the
5340 // remainder is zero. The magnitude of the result should be less than or
5341 // equal to the magnitude of the LHS. Therefore, the result should have
5342 // at least as many sign bits as the left hand side.
5343 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5344 case ISD::TRUNCATE: {
5345 // Check if the sign bits of source go down as far as the truncated value.
5346 unsigned NumSrcBits = Op.getOperand(0).getScalarValueSizeInBits();
5347 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5348 if (NumSrcSignBits > (NumSrcBits - VTBits))
5349 return NumSrcSignBits - (NumSrcBits - VTBits);
5350 break;
5351 }
5352 case ISD::EXTRACT_ELEMENT: {
5353 if (VT.isScalableVector())
5354 break;
5355 const int KnownSign = ComputeNumSignBits(Op.getOperand(0), Depth+1);
5356 const int BitWidth = Op.getValueSizeInBits();
5357 const int Items = Op.getOperand(0).getValueSizeInBits() / BitWidth;
5358
5359 // Get reverse index (starting from 1), Op1 value indexes elements from
5360 // little end. Sign starts at big end.
5361 const int rIndex = Items - 1 - Op.getConstantOperandVal(1);
5362
5363 // If the sign portion ends in our element the subtraction gives correct
5364 // result. Otherwise it gives either negative or > bitwidth result
5365 return std::clamp(KnownSign - rIndex * BitWidth, 1, BitWidth);
5366 }
5368 if (VT.isScalableVector())
5369 break;
5370 // If we know the element index, split the demand between the
5371 // source vector and the inserted element, otherwise assume we need
5372 // the original demanded vector elements and the value.
5373 SDValue InVec = Op.getOperand(0);
5374 SDValue InVal = Op.getOperand(1);
5375 SDValue EltNo = Op.getOperand(2);
5376 bool DemandedVal = true;
5377 APInt DemandedVecElts = DemandedElts;
5378 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
5379 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
5380 unsigned EltIdx = CEltNo->getZExtValue();
5381 DemandedVal = !!DemandedElts[EltIdx];
5382 DemandedVecElts.clearBit(EltIdx);
5383 }
5384 Tmp = std::numeric_limits<unsigned>::max();
5385 if (DemandedVal) {
5386 // TODO - handle implicit truncation of inserted elements.
5387 if (InVal.getScalarValueSizeInBits() != VTBits)
5388 break;
5389 Tmp2 = ComputeNumSignBits(InVal, Depth + 1);
5390 Tmp = std::min(Tmp, Tmp2);
5391 }
5392 if (!!DemandedVecElts) {
5393 Tmp2 = ComputeNumSignBits(InVec, DemandedVecElts, Depth + 1);
5394 Tmp = std::min(Tmp, Tmp2);
5395 }
5396 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5397 return Tmp;
5398 }
5400 SDValue InVec = Op.getOperand(0);
5401 SDValue EltNo = Op.getOperand(1);
5402 EVT VecVT = InVec.getValueType();
5403 // ComputeNumSignBits not yet implemented for scalable vectors.
5404 if (VecVT.isScalableVector())
5405 break;
5406 const unsigned BitWidth = Op.getValueSizeInBits();
5407 const unsigned EltBitWidth = Op.getOperand(0).getScalarValueSizeInBits();
5408 const unsigned NumSrcElts = VecVT.getVectorNumElements();
5409
5410 // If BitWidth > EltBitWidth the value is anyext:ed, and we do not know
5411 // anything about sign bits. But if the sizes match we can derive knowledge
5412 // about sign bits from the vector operand.
5413 if (BitWidth != EltBitWidth)
5414 break;
5415
5416 // If we know the element index, just demand that vector element, else for
5417 // an unknown element index, ignore DemandedElts and demand them all.
5418 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
5419 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
5420 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
5421 DemandedSrcElts =
5422 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
5423
5424 return ComputeNumSignBits(InVec, DemandedSrcElts, Depth + 1);
5425 }
5427 // Offset the demanded elts by the subvector index.
5428 SDValue Src = Op.getOperand(0);
5429
5430 APInt DemandedSrcElts;
5431 if (Src.getValueType().isScalableVector())
5432 DemandedSrcElts = APInt(1, 1);
5433 else {
5434 uint64_t Idx = Op.getConstantOperandVal(1);
5435 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5436 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5437 }
5438 return ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5439 }
5440 case ISD::CONCAT_VECTORS: {
5441 if (VT.isScalableVector())
5442 break;
5443 // Determine the minimum number of sign bits across all demanded
5444 // elts of the input vectors. Early out if the result is already 1.
5445 Tmp = std::numeric_limits<unsigned>::max();
5446 EVT SubVectorVT = Op.getOperand(0).getValueType();
5447 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
5448 unsigned NumSubVectors = Op.getNumOperands();
5449 for (unsigned i = 0; (i < NumSubVectors) && (Tmp > 1); ++i) {
5450 APInt DemandedSub =
5451 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
5452 if (!DemandedSub)
5453 continue;
5454 Tmp2 = ComputeNumSignBits(Op.getOperand(i), DemandedSub, Depth + 1);
5455 Tmp = std::min(Tmp, Tmp2);
5456 }
5457 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5458 return Tmp;
5459 }
5460 case ISD::INSERT_SUBVECTOR: {
5461 SDValue Src = Op.getOperand(0);
5462 SDValue Sub = Op.getOperand(1);
5463 if (VT.isScalableVector()) {
5464 Tmp = ComputeNumSignBits(Sub, Depth + 1);
5465 Tmp = std::min(Tmp, ComputeNumSignBits(Src, Depth + 1));
5466 return Tmp;
5467 }
5468 // Demand any elements from the subvector and the remainder from the src its
5469 // inserted into.
5470 uint64_t Idx = Op.getConstantOperandVal(2);
5471 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5472 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5473 APInt DemandedSrcElts = DemandedElts;
5474 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5475
5476 Tmp = std::numeric_limits<unsigned>::max();
5477 if (!!DemandedSubElts) {
5478 Tmp = ComputeNumSignBits(Sub, DemandedSubElts, Depth + 1);
5479 if (Tmp == 1)
5480 return 1; // early-out
5481 }
5482 if (!!DemandedSrcElts) {
5483 Tmp2 = ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5484 Tmp = std::min(Tmp, Tmp2);
5485 }
5486 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5487 return Tmp;
5488 }
5489 case ISD::LOAD: {
5490 // If we are looking at the loaded value of the SDNode.
5491 if (Op.getResNo() != 0)
5492 break;
5493
5495 if (const MDNode *Ranges = LD->getRanges()) {
5496 if (DemandedElts != 1)
5497 break;
5498
5500 if (VTBits > CR.getBitWidth()) {
5501 switch (LD->getExtensionType()) {
5502 case ISD::SEXTLOAD:
5503 CR = CR.signExtend(VTBits);
5504 break;
5505 case ISD::ZEXTLOAD:
5506 CR = CR.zeroExtend(VTBits);
5507 break;
5508 default:
5509 break;
5510 }
5511 }
5512
5513 if (VTBits != CR.getBitWidth())
5514 break;
5515 return std::min(CR.getSignedMin().getNumSignBits(),
5517 }
5518
5519 unsigned ExtType = LD->getExtensionType();
5520 switch (ExtType) {
5521 default:
5522 break;
5523 case ISD::SEXTLOAD: // e.g. i16->i32 = '17' bits known.
5524 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5525 return VTBits - Tmp + 1;
5526 case ISD::ZEXTLOAD: // e.g. i16->i32 = '16' bits known.
5527 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5528 return VTBits - Tmp;
5529 case ISD::NON_EXTLOAD:
5530 if (const Constant *Cst = TLI->getTargetConstantFromLoad(LD)) {
5531 // We only need to handle vectors - computeKnownBits should handle
5532 // scalar cases.
5533 Type *CstTy = Cst->getType();
5534 if (CstTy->isVectorTy() && !VT.isScalableVector() &&
5535 (NumElts * VTBits) == CstTy->getPrimitiveSizeInBits() &&
5536 VTBits == CstTy->getScalarSizeInBits()) {
5537 Tmp = VTBits;
5538 for (unsigned i = 0; i != NumElts; ++i) {
5539 if (!DemandedElts[i])
5540 continue;
5541 if (Constant *Elt = Cst->getAggregateElement(i)) {
5542 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
5543 const APInt &Value = CInt->getValue();
5544 Tmp = std::min(Tmp, Value.getNumSignBits());
5545 continue;
5546 }
5547 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
5548 APInt Value = CFP->getValueAPF().bitcastToAPInt();
5549 Tmp = std::min(Tmp, Value.getNumSignBits());
5550 continue;
5551 }
5552 }
5553 // Unknown type. Conservatively assume no bits match sign bit.
5554 return 1;
5555 }
5556 return Tmp;
5557 }
5558 }
5559 break;
5560 }
5561
5562 break;
5563 }
5566 case ISD::ATOMIC_SWAP:
5578 case ISD::ATOMIC_LOAD: {
5579 auto *AT = cast<AtomicSDNode>(Op);
5580 // If we are looking at the loaded value.
5581 if (Op.getResNo() == 0) {
5582 Tmp = AT->getMemoryVT().getScalarSizeInBits();
5583 if (Tmp == VTBits)
5584 return 1; // early-out
5585
5586 // For atomic_load, prefer to use the extension type.
5587 if (Op->getOpcode() == ISD::ATOMIC_LOAD) {
5588 switch (AT->getExtensionType()) {
5589 default:
5590 break;
5591 case ISD::SEXTLOAD:
5592 return VTBits - Tmp + 1;
5593 case ISD::ZEXTLOAD:
5594 return VTBits - Tmp;
5595 }
5596 }
5597
5598 if (TLI->getExtendForAtomicOps() == ISD::SIGN_EXTEND)
5599 return VTBits - Tmp + 1;
5600 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
5601 return VTBits - Tmp;
5602 }
5603 break;
5604 }
5605 }
5606
5607 // Allow the target to implement this method for its nodes.
5608 if (Opcode >= ISD::BUILTIN_OP_END ||
5609 Opcode == ISD::INTRINSIC_WO_CHAIN ||
5610 Opcode == ISD::INTRINSIC_W_CHAIN ||
5611 Opcode == ISD::INTRINSIC_VOID) {
5612 // TODO: This can probably be removed once target code is audited. This
5613 // is here purely to reduce patch size and review complexity.
5614 if (!VT.isScalableVector()) {
5615 unsigned NumBits =
5616 TLI->ComputeNumSignBitsForTargetNode(Op, DemandedElts, *this, Depth);
5617 if (NumBits > 1)
5618 FirstAnswer = std::max(FirstAnswer, NumBits);
5619 }
5620 }
5621
5622 // Finally, if we can prove that the top bits of the result are 0's or 1's,
5623 // use this information.
5624 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
5625 return std::max(FirstAnswer, Known.countMinSignBits());
5626}
5627
5629 unsigned Depth) const {
5630 unsigned SignBits = ComputeNumSignBits(Op, Depth);
5631 return Op.getScalarValueSizeInBits() - SignBits + 1;
5632}
5633
5635 const APInt &DemandedElts,
5636 unsigned Depth) const {
5637 unsigned SignBits = ComputeNumSignBits(Op, DemandedElts, Depth);
5638 return Op.getScalarValueSizeInBits() - SignBits + 1;
5639}
5640
5642 UndefPoisonKind Kind,
5643 unsigned Depth) const {
5644 // Early out for FREEZE.
5645 if (Op.getOpcode() == ISD::FREEZE)
5646 return true;
5647
5648 APInt DemandedElts = getDemandAllEltsMask(Op);
5649 return isGuaranteedNotToBeUndefOrPoison(Op, DemandedElts, Kind, Depth);
5650}
5651
5653 const APInt &DemandedElts,
5654 UndefPoisonKind Kind,
5655 unsigned Depth) const {
5656 unsigned Opcode = Op.getOpcode();
5657
5658 // Early out for FREEZE.
5659 if (Opcode == ISD::FREEZE)
5660 return true;
5661
5662 if (Depth >= MaxRecursionDepth)
5663 return false; // Limit search depth.
5664
5665 if (isIntOrFPConstant(Op))
5666 return true;
5667
5668 switch (Opcode) {
5669 case ISD::CONDCODE:
5670 case ISD::VALUETYPE:
5671 case ISD::FrameIndex:
5673 case ISD::CopyFromReg:
5674 return true;
5675
5676 case ISD::POISON:
5677 return !includesPoison(Kind);
5678
5679 case ISD::UNDEF:
5680 return !includesUndef(Kind);
5681
5682 case ISD::BITCAST: {
5683 SDValue Src = Op.getOperand(0);
5684 EVT SrcVT = Src.getValueType();
5685 EVT DstVT = Op.getValueType();
5686
5687 if (!SrcVT.isVector() || !DstVT.isVector())
5688 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5689
5690 unsigned SrcEltBits = SrcVT.getScalarSizeInBits();
5691 unsigned DstEltBits = DstVT.getScalarSizeInBits();
5692 ElementCount NumSrcElts = SrcVT.getVectorElementCount();
5693 [[maybe_unused]] ElementCount NumDstElts = DstVT.getVectorElementCount();
5694
5695 if (SrcEltBits == DstEltBits)
5696 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedElts, Kind,
5697 Depth + 1);
5698
5699 if (SrcEltBits < DstEltBits) {
5700 if (DstEltBits % SrcEltBits != 0)
5701 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5702
5703 assert(NumSrcElts == NumDstElts * (DstEltBits / SrcEltBits) &&
5704 "Unexpected vector bitcast");
5705 APInt DemandedSrcElts =
5706 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts.getKnownMinValue());
5707 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5708 Depth + 1);
5709 }
5710
5711 if (SrcEltBits % DstEltBits != 0)
5712 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5713
5714 assert(NumDstElts == NumSrcElts * (SrcEltBits / DstEltBits) &&
5715 "Unexpected vector bitcast");
5716 APInt DemandedSrcElts =
5717 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts.getKnownMinValue());
5718 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5719 Depth + 1);
5720 }
5721
5722 case ISD::BUILD_VECTOR:
5723 // NOTE: BUILD_VECTOR has implicit truncation of wider scalar elements -
5724 // this shouldn't affect the result.
5725 for (unsigned i = 0, e = Op.getNumOperands(); i < e; ++i) {
5726 if (!DemandedElts[i])
5727 continue;
5728 if (!isGuaranteedNotToBeUndefOrPoison(Op.getOperand(i), Kind, Depth + 1))
5729 return false;
5730 }
5731 return true;
5732
5733 case ISD::CONCAT_VECTORS: {
5734 EVT VT = Op.getValueType();
5735 if (!VT.isFixedLengthVector())
5736 break;
5737
5738 EVT SubVT = Op.getOperand(0).getValueType();
5739 unsigned NumSubElts = SubVT.getVectorNumElements();
5740 for (unsigned I = 0, E = Op.getNumOperands(); I != E; ++I) {
5741 APInt DemandedSubElts =
5742 DemandedElts.extractBits(NumSubElts, I * NumSubElts);
5743 if (!!DemandedSubElts &&
5744 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(I), DemandedSubElts,
5745 Kind, Depth + 1))
5746 return false;
5747 }
5748 return true;
5749 }
5750
5752 SDValue Src = Op.getOperand(0);
5753 if (Src.getValueType().isScalableVector())
5754 break;
5755 uint64_t Idx = Op.getConstantOperandVal(1);
5756 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5757 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5758 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5759 Depth + 1);
5760 }
5761
5762 case ISD::INSERT_SUBVECTOR: {
5763 if (Op.getValueType().isScalableVector())
5764 break;
5765 SDValue Src = Op.getOperand(0);
5766 SDValue Sub = Op.getOperand(1);
5767 uint64_t Idx = Op.getConstantOperandVal(2);
5768 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5769 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5770 APInt DemandedSrcElts = DemandedElts;
5771 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5772
5773 if (!!DemandedSubElts && !isGuaranteedNotToBeUndefOrPoison(
5774 Sub, DemandedSubElts, Kind, Depth + 1))
5775 return false;
5776 if (!!DemandedSrcElts && !isGuaranteedNotToBeUndefOrPoison(
5777 Src, DemandedSrcElts, Kind, Depth + 1))
5778 return false;
5779 return true;
5780 }
5781
5783 SDValue Src = Op.getOperand(0);
5784 auto *IndexC = dyn_cast<ConstantSDNode>(Op.getOperand(1));
5785 EVT SrcVT = Src.getValueType();
5786 if (SrcVT.isFixedLengthVector() && IndexC &&
5787 IndexC->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
5788 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
5789 IndexC->getZExtValue());
5790 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5791 Depth + 1);
5792 }
5793 break;
5794 }
5795
5797 SDValue InVec = Op.getOperand(0);
5798 SDValue InVal = Op.getOperand(1);
5799 SDValue EltNo = Op.getOperand(2);
5800 EVT VT = InVec.getValueType();
5801 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
5802 if (IndexC && VT.isFixedLengthVector() &&
5803 IndexC->getAPIntValue().ult(VT.getVectorNumElements())) {
5804 if (DemandedElts[IndexC->getZExtValue()] &&
5805 !isGuaranteedNotToBeUndefOrPoison(InVal, Kind, Depth + 1))
5806 return false;
5807 APInt InVecDemandedElts = DemandedElts;
5808 InVecDemandedElts.clearBit(IndexC->getZExtValue());
5809 if (!!InVecDemandedElts &&
5811 peekThroughInsertVectorElt(InVec, InVecDemandedElts),
5812 InVecDemandedElts, Kind, Depth + 1))
5813 return false;
5814 return true;
5815 }
5816 break;
5817 }
5818
5820 // Check upper (known poison) elements.
5821 if (DemandedElts.ugt(1) && includesPoison(Kind))
5822 return false;
5823 // Check element zero.
5824 if (DemandedElts[0] &&
5825 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind, Depth + 1))
5826 return false;
5827 return true;
5828
5829 case ISD::SPLAT_VECTOR:
5830 return isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind, Depth + 1);
5831
5832 case ISD::SELECT: {
5833 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5834 /*ConsiderFlags*/ true, Depth) &&
5835 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind,
5836 Depth + 1) &&
5837 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(1), DemandedElts,
5838 Kind, Depth + 1) &&
5839 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(2), DemandedElts,
5840 Kind, Depth + 1);
5841 }
5842
5843 case ISD::VECTOR_SHUFFLE: {
5844 APInt DemandedLHS, DemandedRHS;
5845 auto *SVN = cast<ShuffleVectorSDNode>(Op);
5846 if (!getShuffleDemandedElts(DemandedElts.getBitWidth(), SVN->getMask(),
5847 DemandedElts, DemandedLHS, DemandedRHS,
5848 /*AllowUndefElts=*/false))
5849 return false;
5850 if (!DemandedLHS.isZero() &&
5851 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedLHS, Kind,
5852 Depth + 1))
5853 return false;
5854 if (!DemandedRHS.isZero() &&
5855 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(1), DemandedRHS, Kind,
5856 Depth + 1))
5857 return false;
5858 return true;
5859 }
5860
5861 case ISD::SHL:
5862 case ISD::SRL:
5863 case ISD::SRA:
5864 // Shift amount operand is checked by canCreateUndefOrPoison. So it is
5865 // enough to check operand 0 if Op can't create undef/poison.
5866 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5867 /*ConsiderFlags*/ true, Depth) &&
5868 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
5869 Kind, Depth + 1);
5870
5871 case ISD::BSWAP:
5872 case ISD::CTPOP:
5873 case ISD::BITREVERSE:
5874 case ISD::AND:
5875 case ISD::OR:
5876 case ISD::XOR:
5877 case ISD::ADD:
5878 case ISD::SUB:
5879 case ISD::MUL:
5880 case ISD::SADDSAT:
5881 case ISD::UADDSAT:
5882 case ISD::SSUBSAT:
5883 case ISD::USUBSAT:
5884 case ISD::SSHLSAT:
5885 case ISD::USHLSAT:
5886 case ISD::SMIN:
5887 case ISD::SMAX:
5888 case ISD::UMIN:
5889 case ISD::UMAX:
5890 case ISD::ZERO_EXTEND:
5891 case ISD::SIGN_EXTEND:
5892 case ISD::ANY_EXTEND:
5893 case ISD::TRUNCATE:
5894 case ISD::VSELECT: {
5895 // If Op can't create undef/poison and none of its operands are undef/poison
5896 // then Op is never undef/poison. A difference from the more common check
5897 // below, outside the switch, is that we handle elementwise operations for
5898 // which the DemandedElts mask is valid for all operands here.
5899 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5900 /*ConsiderFlags*/ true, Depth) &&
5901 all_of(Op->ops(), [&](SDValue V) {
5902 return isGuaranteedNotToBeUndefOrPoison(V, DemandedElts, Kind,
5903 Depth + 1);
5904 });
5905 }
5906
5907 // TODO: Search for noundef attributes from library functions.
5908
5909 // TODO: Pointers dereferenced by ISD::LOAD/STORE ops are noundef.
5910
5911 default:
5912 // Allow the target to implement this method for its nodes.
5913 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
5914 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
5915 return TLI->isGuaranteedNotToBeUndefOrPoisonForTargetNode(
5916 Op, DemandedElts, *this, Kind, Depth);
5917 break;
5918 }
5919
5920 // If Op can't create undef/poison and none of its operands are undef/poison
5921 // then Op is never undef/poison.
5922 // NOTE: TargetNodes can handle this in themselves in
5923 // isGuaranteedNotToBeUndefOrPoisonForTargetNode or let
5924 // TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode handle it.
5925 return !canCreateUndefOrPoison(Op, Kind, /*ConsiderFlags*/ true, Depth) &&
5926 all_of(Op->ops(), [&](SDValue V) {
5927 return isGuaranteedNotToBeUndefOrPoison(V, Kind, Depth + 1);
5928 });
5929}
5930
5932 bool ConsiderFlags,
5933 unsigned Depth) const {
5934 APInt DemandedElts = getDemandAllEltsMask(Op);
5935 return canCreateUndefOrPoison(Op, DemandedElts, Kind, ConsiderFlags, Depth);
5936}
5937
5939 UndefPoisonKind Kind,
5940 bool ConsiderFlags,
5941 unsigned Depth) const {
5942 if (ConsiderFlags && includesPoison(Kind) && Op->hasPoisonGeneratingFlags())
5943 return true;
5944
5945 unsigned Opcode = Op.getOpcode();
5946 switch (Opcode) {
5947 case ISD::AssertSext:
5948 case ISD::AssertZext:
5949 case ISD::AssertAlign:
5951 // Assertion nodes can create poison if the assertion fails.
5952 return includesPoison(Kind);
5953
5954 case ISD::FREEZE:
5958 case ISD::SADDSAT:
5959 case ISD::UADDSAT:
5960 case ISD::SSUBSAT:
5961 case ISD::USUBSAT:
5962 case ISD::MULHU:
5963 case ISD::MULHS:
5964 case ISD::AVGFLOORS:
5965 case ISD::AVGFLOORU:
5966 case ISD::AVGCEILS:
5967 case ISD::AVGCEILU:
5968 case ISD::ABDU:
5969 case ISD::ABDS:
5970 case ISD::SMIN:
5971 case ISD::SMAX:
5972 case ISD::SCMP:
5973 case ISD::UMIN:
5974 case ISD::UMAX:
5975 case ISD::UCMP:
5976 case ISD::AND:
5977 case ISD::XOR:
5978 case ISD::ROTL:
5979 case ISD::ROTR:
5980 case ISD::FSHL:
5981 case ISD::FSHR:
5982 case ISD::BSWAP:
5983 case ISD::CTTZ:
5984 case ISD::CTLZ:
5985 case ISD::CTLS:
5986 case ISD::CTPOP:
5987 case ISD::BITREVERSE:
5988 case ISD::PARITY:
5989 case ISD::SIGN_EXTEND:
5990 case ISD::TRUNCATE:
5994 case ISD::BITCAST:
5995 case ISD::BUILD_VECTOR:
5996 case ISD::BUILD_PAIR:
5997 case ISD::SPLAT_VECTOR:
5998 case ISD::FABS:
5999 case ISD::FCEIL:
6000 case ISD::FFLOOR:
6001 case ISD::FTRUNC:
6002 case ISD::FRINT:
6003 case ISD::FNEARBYINT:
6004 case ISD::FROUND:
6005 case ISD::FROUNDEVEN:
6006 return false;
6007
6008 case ISD::ABS:
6009 // ISD::ABS defines abs(INT_MIN) -> INT_MIN and never generates poison.
6010 // Different to Intrinsic::abs.
6011 return false;
6013 // ABS_MIN_POISON may produce poison if the input is INT_MIN.
6014 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) <= 1;
6015
6016 case ISD::ADDC:
6017 case ISD::SUBC:
6018 case ISD::ADDE:
6019 case ISD::SUBE:
6020 case ISD::SADDO:
6021 case ISD::SSUBO:
6022 case ISD::SMULO:
6023 case ISD::SADDO_CARRY:
6024 case ISD::SSUBO_CARRY:
6025 case ISD::UADDO:
6026 case ISD::USUBO:
6027 case ISD::UMULO:
6028 case ISD::UADDO_CARRY:
6029 case ISD::USUBO_CARRY:
6030 // No poison on result or overflow flags.
6031 return false;
6032
6033 case ISD::SELECT_CC:
6034 case ISD::SETCC: {
6035 // Integer setcc cannot create undef or poison.
6036 if (Op.getOperand(0).getValueType().isInteger())
6037 return false;
6038
6039 // FP compares are more complicated. They can create poison for nan/infinity
6040 // based on options and flags. The options and flags also cause special
6041 // nonan condition codes to be used. Those condition codes may be preserved
6042 // even if the nonan flag is dropped somewhere.
6043 unsigned CCOp = Opcode == ISD::SETCC ? 2 : 4;
6044 ISD::CondCode CCCode = cast<CondCodeSDNode>(Op.getOperand(CCOp))->get();
6045 return (unsigned)CCCode & 0x10U;
6046 }
6047
6048 case ISD::OR:
6049 case ISD::ZERO_EXTEND:
6050 case ISD::SELECT:
6051 case ISD::VSELECT:
6052 case ISD::ADD:
6053 case ISD::SUB:
6054 case ISD::MUL:
6055 case ISD::FNEG:
6056 case ISD::FADD:
6057 case ISD::FSUB:
6058 case ISD::FMUL:
6059 case ISD::FDIV:
6060 case ISD::FREM:
6061 case ISD::FCOPYSIGN:
6062 case ISD::FMA:
6063 case ISD::FMAD:
6064 case ISD::FMULADD:
6065 case ISD::FP_EXTEND:
6066 case ISD::FMINNUM:
6067 case ISD::FMAXNUM:
6068 case ISD::FMINNUM_IEEE:
6069 case ISD::FMAXNUM_IEEE:
6070 case ISD::FMINIMUM:
6071 case ISD::FMAXIMUM:
6072 case ISD::FMINIMUMNUM:
6073 case ISD::FMAXIMUMNUM:
6079 // No poison except from flags (which is handled above)
6080 return false;
6081
6082 case ISD::SHL:
6083 case ISD::SRL:
6084 case ISD::SRA:
6085 // If the max shift amount isn't in range, then the shift can
6086 // create poison.
6087 return includesPoison(Kind) &&
6088 !getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1);
6089
6092 // If the amount is zero then the result will be poison.
6093 // TODO: Add isKnownNeverZero DemandedElts handling.
6094 return includesPoison(Kind) &&
6095 !isKnownNeverZero(Op.getOperand(0), Depth + 1);
6096
6098 // Check if we demand any upper (poison) elements.
6099 return includesPoison(Kind) && DemandedElts.ugt(1);
6100
6103 // Ensure that the element index is in bounds.
6104 if (includesPoison(Kind)) {
6105 EVT VecVT = Op.getOperand(0).getValueType();
6106 SDValue Idx = Op.getOperand(Opcode == ISD::INSERT_VECTOR_ELT ? 2 : 1);
6107 KnownBits KnownIdx = computeKnownBits(Idx, Depth + 1);
6108 return KnownIdx.getMaxValue().uge(VecVT.getVectorMinNumElements());
6109 }
6110 return false;
6111 }
6112
6113 case ISD::VECTOR_SHUFFLE: {
6114 // Check for any demanded shuffle element that is undef.
6115 auto *SVN = cast<ShuffleVectorSDNode>(Op);
6116 for (auto [Idx, Elt] : enumerate(SVN->getMask()))
6117 if (Elt < 0 && DemandedElts[Idx])
6118 return true;
6119 return false;
6120 }
6121
6123 return false;
6124
6125 default:
6126 // Allow the target to implement this method for its nodes.
6127 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6128 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
6129 return TLI->canCreateUndefOrPoisonForTargetNode(
6130 Op, DemandedElts, *this, Kind, ConsiderFlags, Depth);
6131 break;
6132 }
6133
6134 // Be conservative and return true.
6135 return true;
6136}
6137
6138bool SelectionDAG::isADDLike(SDValue Op, bool NoWrap) const {
6139 unsigned Opcode = Op.getOpcode();
6140 if (Opcode == ISD::OR)
6141 return Op->getFlags().hasDisjoint() ||
6142 haveNoCommonBitsSet(Op.getOperand(0), Op.getOperand(1));
6143 if (Opcode == ISD::XOR)
6144 return !NoWrap && isMinSignedConstant(Op.getOperand(1));
6145 return false;
6146}
6147
6149 return Op.getNumOperands() == 2 && isa<ConstantSDNode>(Op.getOperand(1)) &&
6150 (Op.isAnyAdd() || isADDLike(Op));
6151}
6152
6154 FPClassTest InterestedClasses,
6155 unsigned Depth) const {
6156 APInt DemandedElts = getDemandAllEltsMask(Op);
6157 return computeKnownFPClass(Op, DemandedElts, InterestedClasses, Depth);
6158}
6159
6161 const APInt &DemandedElts,
6162 FPClassTest InterestedClasses,
6163 unsigned Depth) const {
6165
6166 if (const auto *CFP = dyn_cast<ConstantFPSDNode>(Op))
6167 return KnownFPClass(CFP->getValueAPF());
6168
6169 if (Depth >= MaxRecursionDepth)
6170 return Known;
6171
6172 if (Op.getOpcode() == ISD::UNDEF)
6173 return Known;
6174
6175 EVT VT = Op.getValueType();
6176 assert(VT.isFloatingPoint() && "Computing KnownFPClass on non-FP op!");
6177 assert((!VT.isFixedLengthVector() ||
6178 DemandedElts.getBitWidth() == VT.getVectorNumElements()) &&
6179 "Unexpected vector size");
6180
6181 if (!DemandedElts)
6182 return Known;
6183
6184 unsigned Opcode = Op.getOpcode();
6185 switch (Opcode) {
6186 case ISD::POISON: {
6187 Known.setKnownFPClasses(fcNone);
6188 Known.setSignBit(false);
6189 break;
6190 }
6191 case ISD::FNEG: {
6192 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6193 InterestedClasses, Depth + 1);
6194 Known.fneg();
6195 break;
6196 }
6197 case ISD::BUILD_VECTOR: {
6198 assert(!VT.isScalableVector());
6199 bool First = true;
6200 for (unsigned I = 0, E = Op.getNumOperands(); I != E; ++I) {
6201 if (!DemandedElts[I])
6202 continue;
6203
6204 if (First) {
6205 Known =
6206 computeKnownFPClass(Op.getOperand(I), InterestedClasses, Depth + 1);
6207 First = false;
6208 } else {
6209 Known |=
6210 computeKnownFPClass(Op.getOperand(I), InterestedClasses, Depth + 1);
6211 }
6212
6213 if (Known.isUnknown())
6214 break;
6215 }
6216 break;
6217 }
6219 SDValue Src = Op.getOperand(0);
6220 auto *CIdx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6221 EVT SrcVT = Src.getValueType();
6222 if (SrcVT.isFixedLengthVector() && CIdx) {
6223 if (CIdx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6224 APInt DemandedSrcElts = APInt::getOneBitSet(
6225 SrcVT.getVectorNumElements(), CIdx->getZExtValue());
6226 Known = computeKnownFPClass(Src, DemandedSrcElts, InterestedClasses,
6227 Depth + 1);
6228 } else {
6229 // Out of bounds index is poison.
6230 Known.setKnownFPClasses(fcNone);
6231 }
6232 } else {
6233 Known = computeKnownFPClass(Src, InterestedClasses, Depth + 1);
6234 }
6235 break;
6236 }
6237 case ISD::SPLAT_VECTOR: {
6238 Known = computeKnownFPClass(Op.getOperand(0), InterestedClasses, Depth + 1);
6239 break;
6240 }
6241 case ISD::BITCAST: {
6242 // FIXME: It should not be necessary to check for an elementwise bitcast.
6243 // If a bitcast is not elementwise between vector / scalar types,
6244 // computeKnownBits already splices the known bits of the source elements
6245 // appropriately so as to line up with the bits of the result's demanded
6246 // elements.
6247 EVT SrcVT = Op.getOperand(0).getValueType();
6248 if (VT.isScalableVector() || SrcVT.isScalableVector())
6249 break;
6250 unsigned VTNumElts = VT.isVector() ? VT.getVectorNumElements() : 1;
6251 unsigned SrcVTNumElts = SrcVT.isVector() ? SrcVT.getVectorNumElements() : 1;
6252 if (VTNumElts != SrcVTNumElts)
6253 break;
6254
6255 KnownBits Bits = computeKnownBits(Op, DemandedElts, Depth + 1);
6257 break;
6258 }
6259 case ISD::FABS: {
6260 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6261 InterestedClasses, Depth + 1);
6262 Known.fabs();
6263 break;
6264 }
6265 case ISD::FCOPYSIGN: {
6266 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6267 InterestedClasses, Depth + 1);
6268 KnownFPClass KnownSign = computeKnownFPClass(Op.getOperand(1), DemandedElts,
6269 InterestedClasses, Depth + 1);
6270 Known.copysign(KnownSign);
6271 break;
6272 }
6273 case ISD::AssertNoFPClass: {
6274 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6275 InterestedClasses, Depth + 1);
6276 FPClassTest AssertedClasses =
6277 static_cast<FPClassTest>(Op->getConstantOperandVal(1));
6278 Known.setKnownFPClasses(Known.getKnownFPClasses() & ~AssertedClasses);
6279 break;
6280 }
6282 SDValue Src = Op.getOperand(0);
6283 EVT SrcVT = Src.getValueType();
6284 if (SrcVT.isFixedLengthVector()) {
6285 unsigned Idx = Op.getConstantOperandVal(1);
6286 unsigned NumSrcElts = SrcVT.getVectorNumElements();
6287
6288 APInt DemandedSrcElts = DemandedElts.zextOrTrunc(NumSrcElts).shl(Idx);
6289 Known = computeKnownFPClass(Src, DemandedSrcElts, InterestedClasses,
6290 Depth + 1);
6291 } else {
6292 Known = computeKnownFPClass(Src, InterestedClasses, Depth + 1);
6293 }
6294 break;
6295 }
6296 case ISD::INSERT_SUBVECTOR: {
6297 SDValue BaseVector = Op.getOperand(0);
6298 SDValue SubVector = Op.getOperand(1);
6299 EVT BaseVT = BaseVector.getValueType();
6300 if (BaseVT.isFixedLengthVector()) {
6301 unsigned Idx = Op.getConstantOperandVal(2);
6302 unsigned NumBaseElts = BaseVT.getVectorNumElements();
6303 unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
6304
6305 APInt DemandedMask =
6306 APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
6307 APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
6308 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
6309
6310 if (!DemandedSrcElts.isZero())
6311 Known = computeKnownFPClass(BaseVector, DemandedSrcElts,
6312 InterestedClasses, Depth + 1);
6313 if (!DemandedSubElts.isZero()) {
6315 SubVector, DemandedSubElts, InterestedClasses, Depth + 1);
6316 Known = DemandedSrcElts.isZero() ? SubKnown : (Known | SubKnown);
6317 }
6318 } else {
6319 Known = computeKnownFPClass(SubVector, InterestedClasses, Depth + 1);
6320 if (!Known.isUnknown())
6321 Known |= computeKnownFPClass(BaseVector, InterestedClasses, Depth + 1);
6322 }
6323 break;
6324 }
6325 case ISD::SELECT:
6326 case ISD::VSELECT: {
6327 // TODO: Add adjustKnownFPClassForSelectArm clamp recognition as in
6328 // IR-level ValueTracking.
6329 KnownFPClass KnownFalseClass = computeKnownFPClass(
6330 Op.getOperand(2), DemandedElts, InterestedClasses, Depth + 1);
6331 if (KnownFalseClass.isUnknown())
6332 break;
6333 KnownFPClass KnownTrueClass = computeKnownFPClass(
6334 Op.getOperand(1), DemandedElts, InterestedClasses, Depth + 1);
6335 Known = KnownTrueClass.intersectWith(KnownFalseClass);
6336 break;
6337 }
6338 default:
6339 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6340 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
6341 TLI->computeKnownFPClassForTargetNode(Op, Known, DemandedElts, *this,
6342 Depth);
6343 }
6344 break;
6345 }
6346
6347 return Known;
6348}
6349
6351 unsigned Depth) const {
6352 APInt DemandedElts = getDemandAllEltsMask(Op);
6353 return isKnownNeverNaN(Op, DemandedElts, SNaN, Depth);
6354}
6355
6357 bool SNaN, unsigned Depth) const {
6358 assert(!DemandedElts.isZero() && "No demanded elements");
6359
6360 // If we're told that NaNs won't happen, assume they won't.
6361 if (Op->getFlags().hasNoNaNs())
6362 return true;
6363
6364 if (Depth >= MaxRecursionDepth)
6365 return false; // Limit search depth.
6366
6367 unsigned Opcode = Op.getOpcode();
6368 switch (Opcode) {
6369 case ISD::FADD:
6370 case ISD::FSUB:
6371 case ISD::FMUL:
6372 case ISD::FDIV:
6373 case ISD::FREM:
6374 case ISD::FSIN:
6375 case ISD::FCOS:
6376 case ISD::FTAN:
6377 case ISD::FASIN:
6378 case ISD::FACOS:
6379 case ISD::FATAN:
6380 case ISD::FATAN2:
6381 case ISD::FSINH:
6382 case ISD::FCOSH:
6383 case ISD::FTANH:
6384 case ISD::FMA:
6385 case ISD::FMULADD:
6386 case ISD::FMAD: {
6387 if (SNaN)
6388 return true;
6389 // TODO: Need isKnownNeverInfinity
6390 return false;
6391 }
6392 case ISD::FCANONICALIZE:
6393 case ISD::FEXP:
6394 case ISD::FEXP2:
6395 case ISD::FEXP10:
6396 case ISD::FTRUNC:
6397 case ISD::FFLOOR:
6398 case ISD::FCEIL:
6399 case ISD::FROUND:
6400 case ISD::FROUNDEVEN:
6401 case ISD::LROUND:
6402 case ISD::LLROUND:
6403 case ISD::FRINT:
6404 case ISD::LRINT:
6405 case ISD::LLRINT:
6406 case ISD::FNEARBYINT:
6407 case ISD::FLDEXP: {
6408 if (SNaN)
6409 return true;
6410 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6411 }
6412 case ISD::FABS:
6413 case ISD::FNEG:
6414 case ISD::FCOPYSIGN: {
6415 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6416 }
6417 case ISD::SELECT:
6418 return isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1) &&
6419 isKnownNeverNaN(Op.getOperand(2), DemandedElts, SNaN, Depth + 1);
6420 case ISD::FP_EXTEND:
6421 case ISD::FP_ROUND: {
6422 if (SNaN)
6423 return true;
6424 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6425 }
6426 case ISD::SINT_TO_FP:
6427 case ISD::UINT_TO_FP:
6428 return true;
6429 case ISD::FSQRT: // Need is known positive
6430 case ISD::FLOG:
6431 case ISD::FLOG2:
6432 case ISD::FLOG10:
6433 case ISD::FPOWI:
6434 case ISD::FPOW: {
6435 if (SNaN)
6436 return true;
6437 // TODO: Refine on operand
6438 return false;
6439 }
6440 case ISD::FMINNUM:
6441 case ISD::FMAXNUM:
6442 case ISD::FMINIMUMNUM:
6443 case ISD::FMAXIMUMNUM: {
6444 // Only one needs to be known not-nan, since it will be returned if the
6445 // other ends up being one.
6446 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) ||
6447 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6448 }
6449 case ISD::FMINNUM_IEEE:
6450 case ISD::FMAXNUM_IEEE: {
6451 if (SNaN)
6452 return true;
6453 // This can return a NaN if either operand is an sNaN, or if both operands
6454 // are NaN.
6455 return (isKnownNeverNaN(Op.getOperand(0), DemandedElts, false, Depth + 1) &&
6456 isKnownNeverSNaN(Op.getOperand(1), DemandedElts, Depth + 1)) ||
6457 (isKnownNeverNaN(Op.getOperand(1), DemandedElts, false, Depth + 1) &&
6458 isKnownNeverSNaN(Op.getOperand(0), DemandedElts, Depth + 1));
6459 }
6460 case ISD::FMINIMUM:
6461 case ISD::FMAXIMUM: {
6462 // TODO: Does this quiet or return the origina NaN as-is?
6463 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) &&
6464 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6465 }
6467 SDValue Src = Op.getOperand(0);
6468 auto *Idx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6469 EVT SrcVT = Src.getValueType();
6470 if (SrcVT.isFixedLengthVector() && Idx &&
6471 Idx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6472 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
6473 Idx->getZExtValue());
6474 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6475 }
6476 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6477 }
6479 SDValue Src = Op.getOperand(0);
6480 if (Src.getValueType().isFixedLengthVector()) {
6481 unsigned Idx = Op.getConstantOperandVal(1);
6482 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
6483 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
6484 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6485 }
6486 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6487 }
6488 case ISD::INSERT_SUBVECTOR: {
6489 SDValue BaseVector = Op.getOperand(0);
6490 SDValue SubVector = Op.getOperand(1);
6491 EVT BaseVectorVT = BaseVector.getValueType();
6492 if (BaseVectorVT.isFixedLengthVector()) {
6493 unsigned Idx = Op.getConstantOperandVal(2);
6494 unsigned NumBaseElts = BaseVectorVT.getVectorNumElements();
6495 unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
6496
6497 // Clear/Extract the bits at the position where the subvector will be
6498 // inserted.
6499 APInt DemandedMask =
6500 APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
6501 APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
6502 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
6503
6504 bool NeverNaN = true;
6505 if (!DemandedSrcElts.isZero())
6506 NeverNaN &=
6507 isKnownNeverNaN(BaseVector, DemandedSrcElts, SNaN, Depth + 1);
6508 if (NeverNaN && !DemandedSubElts.isZero())
6509 NeverNaN &=
6510 isKnownNeverNaN(SubVector, DemandedSubElts, SNaN, Depth + 1);
6511 return NeverNaN;
6512 }
6513 return isKnownNeverNaN(BaseVector, SNaN, Depth + 1) &&
6514 isKnownNeverNaN(SubVector, SNaN, Depth + 1);
6515 }
6516 case ISD::BUILD_VECTOR: {
6517 unsigned NumElts = Op.getNumOperands();
6518 for (unsigned I = 0; I != NumElts; ++I)
6519 if (DemandedElts[I] &&
6520 !isKnownNeverNaN(Op.getOperand(I), SNaN, Depth + 1))
6521 return false;
6522 return true;
6523 }
6524 case ISD::SPLAT_VECTOR:
6525 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
6526 case ISD::AssertNoFPClass: {
6527 FPClassTest NoFPClass =
6528 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
6529 if ((NoFPClass & fcNan) == fcNan)
6530 return true;
6531 if (SNaN && (NoFPClass & fcSNan) == fcSNan)
6532 return true;
6533 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6534 }
6535 default:
6536 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6537 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
6538 return TLI->isKnownNeverNaNForTargetNode(Op, DemandedElts, *this, SNaN,
6539 Depth);
6540 }
6541 break;
6542 }
6543
6544 FPClassTest NanMask = SNaN ? fcSNan : fcNan;
6545 KnownFPClass Known = computeKnownFPClass(Op, DemandedElts, NanMask, Depth);
6546 return Known.isKnownNever(NanMask);
6547}
6548
6550 APInt DemandedElts = getDemandAllEltsMask(Op);
6551 return isKnownNeverLogicalZero(Op, DemandedElts, Depth);
6552}
6553
6555 const APInt &DemandedElts,
6556 unsigned Depth) const {
6557 assert(!DemandedElts.isZero() && "No demanded elements");
6558 EVT VT = Op.getValueType();
6560 computeKnownFPClass(Op, DemandedElts, fcZero | fcSubnormal, Depth);
6561 return Known.isKnownNeverLogicalZero(getDenormalMode(VT));
6562}
6563
6565 APInt DemandedElts = getDemandAllEltsMask(Op);
6566 return isKnownNeverZero(Op, DemandedElts, Depth);
6567}
6568
6570 unsigned Depth) const {
6571 if (Depth >= MaxRecursionDepth)
6572 return false; // Limit search depth.
6573
6574 EVT OpVT = Op.getValueType();
6575 unsigned BitWidth = OpVT.getScalarSizeInBits();
6576
6577 assert(!Op.getValueType().isFloatingPoint() &&
6578 "Floating point types unsupported - use isKnownNeverLogicalZero");
6579
6580 // If the value is a constant, we can obviously see if it is a zero or not.
6581 auto IsNeverZero = [BitWidth](const ConstantSDNode *C) {
6582 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
6583 return !V.isZero();
6584 };
6585
6586 if (ISD::matchUnaryPredicate(Op, DemandedElts, IsNeverZero,
6587 /*AllowUndefs=*/false, /*AllowTruncation=*/true))
6588 return true;
6589
6590 // TODO: Recognize more cases here. Most of the cases are also incomplete to
6591 // some degree.
6592 switch (Op.getOpcode()) {
6593 default:
6594 break;
6595
6597 SDValue InVec = Op.getOperand(0);
6598 SDValue EltNo = Op.getOperand(1);
6599 EVT VecVT = InVec.getValueType();
6600
6601 // Skip scalable vectors or implicit extensions.
6602 if (VecVT.isScalableVector() ||
6603 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
6604 break;
6605
6606 // If we know the element index, just demand that vector element, else for
6607 // an unknown element index, ignore DemandedElts and demand them all.
6608 const unsigned NumSrcElts = VecVT.getVectorNumElements();
6609 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
6610 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
6611 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
6612 DemandedSrcElts =
6613 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
6614
6615 return isKnownNeverZero(InVec, DemandedSrcElts, Depth + 1);
6616 }
6617
6618 case ISD::OR:
6619 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6620 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6621
6622 case ISD::VSELECT:
6623 case ISD::SELECT:
6624 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6625 isKnownNeverZero(Op.getOperand(2), DemandedElts, Depth + 1);
6626
6627 case ISD::SHL: {
6628 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6629 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6630 KnownBits ValKnown =
6631 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6632 // 1 << X is never zero.
6633 if (ValKnown.One[0])
6634 return true;
6635 // If max shift cnt of known ones is non-zero, result is non-zero.
6636 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6637 .getMaxValue();
6638 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6639 !ValKnown.One.shl(MaxCnt).isZero())
6640 return true;
6641 break;
6642 }
6643
6644 case ISD::VECTOR_SHUFFLE: {
6645 if (Op.getValueType().isScalableVector())
6646 return false;
6647
6648 unsigned NumElts = DemandedElts.getBitWidth();
6649
6650 // All demanded elements from LHS and RHS must be known non-zero.
6651 // Demanded elements with undef shuffle mask elements are unknown.
6652
6653 APInt DemandedLHS, DemandedRHS;
6654 auto *SVN = cast<ShuffleVectorSDNode>(Op);
6655 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
6656 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
6657 DemandedLHS, DemandedRHS))
6658 return false;
6659
6660 return (!DemandedLHS ||
6661 isKnownNeverZero(Op.getOperand(0), DemandedLHS, Depth + 1)) &&
6662 (!DemandedRHS ||
6663 isKnownNeverZero(Op.getOperand(1), DemandedRHS, Depth + 1));
6664 }
6665
6666 case ISD::UADDSAT:
6667 case ISD::UMAX:
6668 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6669 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6670
6671 case ISD::UMIN:
6672 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6673 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6674
6675 // For smin/smax: If either operand is known negative/positive
6676 // respectively we don't need the other to be known at all.
6677 case ISD::SMAX: {
6678 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6679 if (Op1.isStrictlyPositive())
6680 return true;
6681
6682 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6683 if (Op0.isStrictlyPositive())
6684 return true;
6685
6686 if (Op1.isNonZero() && Op0.isNonZero())
6687 return true;
6688
6689 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6690 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6691 }
6692 case ISD::SMIN: {
6693 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6694 if (Op1.isNegative())
6695 return true;
6696
6697 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6698 if (Op0.isNegative())
6699 return true;
6700
6701 if (Op1.isNonZero() && Op0.isNonZero())
6702 return true;
6703
6704 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6705 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6706 }
6707
6708 case ISD::ROTL:
6709 case ISD::ROTR:
6710 case ISD::BITREVERSE:
6711 case ISD::BSWAP:
6712 case ISD::CTPOP:
6713 case ISD::ABS:
6715 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6716
6717 case ISD::SRA:
6718 case ISD::SRL: {
6719 if (Op->getFlags().hasExact())
6720 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6721 KnownBits ValKnown =
6722 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6723 if (ValKnown.isNegative())
6724 return true;
6725 // If max shift cnt of known ones is non-zero, result is non-zero.
6726 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6727 .getMaxValue();
6728 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6729 !ValKnown.One.lshr(MaxCnt).isZero())
6730 return true;
6731 break;
6732 }
6733 case ISD::UDIV:
6734 case ISD::SDIV:
6735 // div exact can only produce a zero if the dividend is zero.
6736 // TODO: For udiv this is also true if Op1 u<= Op0
6737 if (Op->getFlags().hasExact())
6738 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6739 break;
6740
6741 case ISD::ADD:
6742 if (Op->getFlags().hasNoUnsignedWrap())
6743 if (isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6744 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1))
6745 return true;
6746 // TODO: There are a lot more cases we can prove for add.
6747 break;
6748
6749 case ISD::SUB: {
6750 if (isNullConstant(Op.getOperand(0)))
6751 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1);
6752
6753 std::optional<bool> ne = KnownBits::ne(
6754 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1),
6755 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1));
6756 return ne && *ne;
6757 }
6758
6759 case ISD::MUL:
6760 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6761 if (isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
6762 isKnownNeverZero(Op.getOperand(0), Depth + 1))
6763 return true;
6764 break;
6765
6766 case ISD::ZERO_EXTEND:
6767 case ISD::SIGN_EXTEND:
6768 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6769 case ISD::VSCALE: {
6771 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
6772 ConstantRange CR =
6773 getVScaleRange(&F, Op.getScalarValueSizeInBits()).multiply(Multiplier);
6774 if (!CR.contains(APInt(CR.getBitWidth(), 0)))
6775 return true;
6776 break;
6777 }
6778 }
6779
6780 return computeKnownBits(Op, DemandedElts, Depth).isNonZero();
6781}
6782
6784 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Op, true))
6785 return !C1->isNegative();
6786
6787 switch (Op.getOpcode()) {
6788 case ISD::FABS:
6789 case ISD::FEXP:
6790 case ISD::FEXP2:
6791 case ISD::FEXP10:
6792 return true;
6793 default:
6794 return false;
6795 }
6796
6797 llvm_unreachable("covered opcode switch");
6798}
6799
6801 assert(Use.getValueType().isFloatingPoint());
6802 const SDNode *User = Use.getUser();
6803 if (User->getFlags().hasNoSignedZeros())
6804 return true;
6805
6806 unsigned OperandNo = Use.getOperandNo();
6807 // Check if this use is insensitive to the sign of zero
6808 switch (User->getOpcode()) {
6809 case ISD::SETCC:
6810 // Comparisons: IEEE-754 specifies +0.0 == -0.0.
6811 case ISD::FABS:
6812 // fabs always produces +0.0.
6813 return true;
6814 case ISD::FCOPYSIGN:
6815 // copysign overwrites the sign bit of the first operand.
6816 return OperandNo == 0;
6817 case ISD::FADD:
6818 case ISD::FSUB: {
6819 // Arithmetic with non-zero constants fixes the uncertainty around the
6820 // sign bit.
6821 SDValue Other = User->getOperand(1 - OperandNo);
6823 }
6824 case ISD::FP_TO_SINT:
6825 case ISD::FP_TO_UINT:
6826 // fp-to-int conversions normalize signed zeros.
6827 return true;
6828 default:
6829 return false;
6830 }
6831}
6832
6834 if (Op->getFlags().hasNoSignedZeros())
6835 return true;
6836 // FIXME: Limit the amount of checked uses to not introduce a compile-time
6837 // regression. Ideally, this should be implemented as a demanded-bits
6838 // optimization that stems from the users.
6839 if (Op->use_size() > 2)
6840 return false;
6841 return all_of(Op->uses(),
6842 [&](const SDUse &Use) { return canIgnoreSignBitOfZero(Use); });
6843}
6844
6846 // Check the obvious case.
6847 if (A == B) return true;
6848
6849 // For negative and positive zero.
6852 if (CA->isZero() && CB->isZero()) return true;
6853
6854 // Otherwise they may not be equal.
6855 return false;
6856}
6857
6858// Only bits set in Mask must be negated, other bits may be arbitrary.
6860 if (isBitwiseNot(V, AllowUndefs))
6861 return V.getOperand(0);
6862
6863 // Handle any_extend (not (truncate X)) pattern, where Mask only sets
6864 // bits in the non-extended part.
6865 ConstantSDNode *MaskC = isConstOrConstSplat(Mask);
6866 if (!MaskC || V.getOpcode() != ISD::ANY_EXTEND)
6867 return SDValue();
6868 SDValue ExtArg = V.getOperand(0);
6869 if (ExtArg.getScalarValueSizeInBits() >=
6870 MaskC->getAPIntValue().getActiveBits() &&
6871 isBitwiseNot(ExtArg, AllowUndefs) &&
6872 ExtArg.getOperand(0).getOpcode() == ISD::TRUNCATE &&
6873 ExtArg.getOperand(0).getOperand(0).getValueType() == V.getValueType())
6874 return ExtArg.getOperand(0).getOperand(0);
6875 return SDValue();
6876}
6877
6879 // Match masked merge pattern (X & ~M) op (Y & M)
6880 // Including degenerate case (X & ~M) op M
6881 auto MatchNoCommonBitsPattern = [&](SDValue Not, SDValue Mask,
6882 SDValue Other) {
6883 if (SDValue NotOperand =
6884 getBitwiseNotOperand(Not, Mask, /* AllowUndefs */ true)) {
6885 if (NotOperand->getOpcode() == ISD::ZERO_EXTEND ||
6886 NotOperand->getOpcode() == ISD::TRUNCATE)
6887 NotOperand = NotOperand->getOperand(0);
6888
6889 if (Other == NotOperand)
6890 return true;
6891 if (Other->getOpcode() == ISD::AND)
6892 return NotOperand == Other->getOperand(0) ||
6893 NotOperand == Other->getOperand(1);
6894 }
6895 return false;
6896 };
6897
6898 if (A->getOpcode() == ISD::ZERO_EXTEND || A->getOpcode() == ISD::TRUNCATE)
6899 A = A->getOperand(0);
6900
6901 if (B->getOpcode() == ISD::ZERO_EXTEND || B->getOpcode() == ISD::TRUNCATE)
6902 B = B->getOperand(0);
6903
6904 if (A->getOpcode() == ISD::AND)
6905 return MatchNoCommonBitsPattern(A->getOperand(0), A->getOperand(1), B) ||
6906 MatchNoCommonBitsPattern(A->getOperand(1), A->getOperand(0), B);
6907 return false;
6908}
6909
6910// FIXME: unify with llvm::haveNoCommonBitsSet.
6912 assert(A.getValueType() == B.getValueType() &&
6913 "Values must have the same type");
6916 return true;
6919}
6920
6921static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step,
6922 SelectionDAG &DAG) {
6923 if (cast<ConstantSDNode>(Step)->isZero())
6924 return DAG.getConstant(0, DL, VT);
6925
6926 return SDValue();
6927}
6928
6931 SelectionDAG &DAG) {
6932 int NumOps = Ops.size();
6933 assert(NumOps != 0 && "Can't build an empty vector!");
6934 assert(!VT.isScalableVector() &&
6935 "BUILD_VECTOR cannot be used with scalable types");
6936 assert(VT.getVectorNumElements() == (unsigned)NumOps &&
6937 "Incorrect element count in BUILD_VECTOR!");
6938
6939 // BUILD_VECTOR of UNDEFs is UNDEF.
6940 bool AllPoison = true;
6941 if (llvm::all_of(Ops, [&AllPoison](SDValue Op) {
6942 AllPoison &= Op.getOpcode() == ISD::POISON;
6943 return Op.isUndef();
6944 }))
6945 return AllPoison ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
6946
6947 // BUILD_VECTOR of seq extract/insert from the same vector + type is Identity.
6948 SDValue IdentitySrc;
6949 bool IsIdentity = true;
6950 for (int i = 0; i != NumOps; ++i) {
6951 if (Ops[i].getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
6952 Ops[i].getOperand(0).getValueType() != VT ||
6953 (IdentitySrc && Ops[i].getOperand(0) != IdentitySrc) ||
6954 !isa<ConstantSDNode>(Ops[i].getOperand(1)) ||
6955 Ops[i].getConstantOperandAPInt(1) != i) {
6956 IsIdentity = false;
6957 break;
6958 }
6959 IdentitySrc = Ops[i].getOperand(0);
6960 }
6961 if (IsIdentity)
6962 return IdentitySrc;
6963
6964 return SDValue();
6965}
6966
6967/// Try to simplify vector concatenation to an input value, undef, or build
6968/// vector.
6971 SelectionDAG &DAG) {
6972 assert(!Ops.empty() && "Can't concatenate an empty list of vectors!");
6974 [Ops](SDValue Op) {
6975 return Ops[0].getValueType() == Op.getValueType();
6976 }) &&
6977 "Concatenation of vectors with inconsistent value types!");
6978 assert((Ops[0].getValueType().getVectorElementCount() * Ops.size()) ==
6979 VT.getVectorElementCount() &&
6980 "Incorrect element count in vector concatenation!");
6981
6982 if (Ops.size() == 1)
6983 return Ops[0];
6984
6985 // Concat of UNDEFs is UNDEF.
6986 bool AllPoison = true;
6987 if (llvm::all_of(Ops, [&AllPoison](SDValue Op) {
6988 AllPoison &= Op.getOpcode() == ISD::POISON;
6989 return Op.isUndef();
6990 }))
6991 return AllPoison ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
6992
6993 // Scan the operands and look for extract operations from a single source
6994 // that correspond to insertion at the same location via this concatenation:
6995 // concat (extract X, 0*subvec_elts), (extract X, 1*subvec_elts), ...
6996 SDValue IdentitySrc;
6997 bool IsIdentity = true;
6998 for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
6999 SDValue Op = Ops[i];
7000 unsigned IdentityIndex = i * Op.getValueType().getVectorMinNumElements();
7001 if (Op.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
7002 Op.getOperand(0).getValueType() != VT ||
7003 (IdentitySrc && Op.getOperand(0) != IdentitySrc) ||
7004 Op.getConstantOperandVal(1) != IdentityIndex) {
7005 IsIdentity = false;
7006 break;
7007 }
7008 assert((!IdentitySrc || IdentitySrc == Op.getOperand(0)) &&
7009 "Unexpected identity source vector for concat of extracts");
7010 IdentitySrc = Op.getOperand(0);
7011 }
7012 if (IsIdentity) {
7013 assert(IdentitySrc && "Failed to set source vector of extracts");
7014 return IdentitySrc;
7015 }
7016
7017 // The code below this point is only designed to work for fixed width
7018 // vectors, so we bail out for now.
7019 if (VT.isScalableVector())
7020 return SDValue();
7021
7022 // A CONCAT_VECTOR of scalar sources, such as UNDEF, BUILD_VECTOR and
7023 // single-element INSERT_VECTOR_ELT operands can be simplified to one big
7024 // BUILD_VECTOR.
7025 // FIXME: Add support for SCALAR_TO_VECTOR as well.
7026 EVT SVT = VT.getScalarType();
7028 for (SDValue Op : Ops) {
7029 EVT OpVT = Op.getValueType();
7030 if (Op.getOpcode() == ISD::POISON)
7031 Elts.append(OpVT.getVectorNumElements(), DAG.getPOISON(SVT));
7032 else if (Op.getOpcode() == ISD::UNDEF)
7033 Elts.append(OpVT.getVectorNumElements(), DAG.getUNDEF(SVT));
7034 else if (Op.getOpcode() == ISD::BUILD_VECTOR)
7035 Elts.append(Op->op_begin(), Op->op_end());
7036 else if (Op.getOpcode() == ISD::INSERT_VECTOR_ELT &&
7037 OpVT.getVectorNumElements() == 1 &&
7038 isNullConstant(Op.getOperand(2)))
7039 Elts.push_back(Op.getOperand(1));
7040 else
7041 return SDValue();
7042 }
7043
7044 // BUILD_VECTOR requires all inputs to be of the same type, find the
7045 // maximum type and extend them all.
7046 for (SDValue Op : Elts)
7047 SVT = (SVT.bitsLT(Op.getValueType()) ? Op.getValueType() : SVT);
7048
7049 if (SVT.bitsGT(VT.getScalarType())) {
7050 for (SDValue &Op : Elts) {
7051 if (Op.getOpcode() == ISD::POISON)
7052 Op = DAG.getPOISON(SVT);
7053 else if (Op.getOpcode() == ISD::UNDEF)
7054 Op = DAG.getUNDEF(SVT);
7055 else
7056 Op = DAG.getTargetLoweringInfo().isZExtFree(Op.getValueType(), SVT)
7057 ? DAG.getZExtOrTrunc(Op, DL, SVT)
7058 : DAG.getSExtOrTrunc(Op, DL, SVT);
7059 }
7060 }
7061
7062 SDValue V = DAG.getBuildVector(VT, DL, Elts);
7063 NewSDValueDbgMsg(V, "New node fold concat vectors: ", &DAG);
7064 return V;
7065}
7066
7067/// Gets or creates the specified node.
7068SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT) {
7069 SDVTList VTs = getVTList(VT);
7070 SDNodeKey ID(Opcode, VTs, {});
7071 FoldingSetInsertToken InsertToken;
7072 if (SDNode *E = lookupNode(ID, DL, InsertToken))
7073 return SDValue(E, 0);
7074
7075 auto *N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7076 CSEMap.insert(N, InsertToken);
7077
7078 InsertNode(N);
7079 SDValue V = SDValue(N, 0);
7080 NewSDValueDbgMsg(V, "Creating new node: ", this);
7081 return V;
7082}
7083
7084SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7085 SDValue N1) {
7086 SDNodeFlags Flags;
7087 if (Inserter)
7088 Flags = Inserter->getFlags();
7089 return getNode(Opcode, DL, VT, N1, Flags);
7090}
7091
7092SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7093 SDValue N1, const SDNodeFlags Flags) {
7094 assert(N1.getOpcode() != ISD::DELETED_NODE && "Operand is DELETED_NODE!");
7095
7096 // Constant fold unary operations with a vector integer or float operand.
7097 switch (Opcode) {
7098 default:
7099 // FIXME: Entirely reasonable to perform folding of other unary
7100 // operations here as the need arises.
7101 break;
7102 case ISD::FNEG:
7103 case ISD::FABS:
7104 case ISD::FCEIL:
7105 case ISD::FTRUNC:
7106 case ISD::FFLOOR:
7107 case ISD::FP_EXTEND:
7108 case ISD::FP_TO_SINT:
7109 case ISD::FP_TO_UINT:
7110 case ISD::FP_TO_FP16:
7111 case ISD::FP_TO_BF16:
7112 case ISD::TRUNCATE:
7113 case ISD::ANY_EXTEND:
7114 case ISD::ZERO_EXTEND:
7115 case ISD::SIGN_EXTEND:
7116 case ISD::UINT_TO_FP:
7117 case ISD::SINT_TO_FP:
7118 case ISD::FP16_TO_FP:
7119 case ISD::BF16_TO_FP:
7120 case ISD::BITCAST:
7121 case ISD::ABS:
7123 case ISD::BITREVERSE:
7124 case ISD::BSWAP:
7125 case ISD::CTLZ:
7127 case ISD::CTTZ:
7129 case ISD::CTPOP:
7130 case ISD::PARITY:
7131 case ISD::CTLS:
7132 case ISD::VECREDUCE_ADD:
7137 case ISD::VECREDUCE_MUL:
7138 case ISD::VECREDUCE_AND:
7139 case ISD::VECREDUCE_OR:
7140 case ISD::VECREDUCE_XOR:
7141 case ISD::STEP_VECTOR: {
7142 SDValue Ops = {N1};
7143 if (SDValue Fold = FoldConstantArithmetic(Opcode, DL, VT, Ops))
7144 return Fold;
7145 }
7146 }
7147
7148 unsigned OpOpcode = N1.getNode()->getOpcode();
7149 switch (Opcode) {
7150 case ISD::STEP_VECTOR:
7151 assert(VT.isScalableVector() &&
7152 "STEP_VECTOR can only be used with scalable types");
7153 assert(OpOpcode == ISD::TargetConstant &&
7154 VT.getVectorElementType() == N1.getValueType() &&
7155 "Unexpected step operand");
7156 break;
7157 case ISD::FREEZE:
7158 assert(VT == N1.getValueType() && "Unexpected VT!");
7160 return N1;
7161 break;
7162 case ISD::TokenFactor:
7163 case ISD::MERGE_VALUES:
7165 return N1; // Factor, merge or concat of one node? No need.
7166 case ISD::BUILD_VECTOR: {
7167 // Attempt to simplify BUILD_VECTOR.
7168 SDValue Ops[] = {N1};
7169 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
7170 return V;
7171 break;
7172 }
7173 case ISD::FP_ROUND: llvm_unreachable("Invalid method to make FP_ROUND node");
7174 case ISD::FP_EXTEND:
7176 "Invalid FP cast!");
7177 if (N1.getValueType() == VT) return N1; // noop conversion.
7178 assert((!VT.isVector() || VT.getVectorElementCount() ==
7180 "Vector element count mismatch!");
7181 assert(N1.getValueType().bitsLT(VT) && "Invalid fpext node, dst < src!");
7182 if (N1.isUndef())
7183 return getUNDEF(VT);
7184 break;
7185 case ISD::FP_TO_SINT:
7186 case ISD::FP_TO_UINT:
7187 if (N1.isUndef())
7188 return getUNDEF(VT);
7189 break;
7190 case ISD::SINT_TO_FP:
7191 case ISD::UINT_TO_FP:
7192 // [us]itofp(undef) = 0, because the result value is bounded.
7193 if (N1.isUndef())
7194 return getConstantFP(0.0, DL, VT);
7195 break;
7196 case ISD::SIGN_EXTEND:
7197 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7198 "Invalid SIGN_EXTEND!");
7199 assert(VT.isVector() == N1.getValueType().isVector() &&
7200 "SIGN_EXTEND result type type should be vector iff the operand "
7201 "type is vector!");
7202 if (N1.getValueType() == VT) return N1; // noop extension
7203 assert((!VT.isVector() || VT.getVectorElementCount() ==
7205 "Vector element count mismatch!");
7206 assert(N1.getValueType().bitsLT(VT) && "Invalid sext node, dst < src!");
7207 if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND) {
7208 SDNodeFlags Flags;
7209 if (OpOpcode == ISD::ZERO_EXTEND)
7210 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7211 SDValue NewVal = getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7212 transferDbgValues(N1, NewVal);
7213 return NewVal;
7214 }
7215
7216 if (OpOpcode == ISD::POISON)
7217 return getPOISON(VT);
7218
7219 if (N1.isUndef())
7220 // sext(undef) = 0, because the top bits will all be the same.
7221 return getConstant(0, DL, VT);
7222
7223 // Skip unnecessary sext_inreg pattern:
7224 // (sext (trunc x)) -> x iff the upper bits are all signbits.
7225 if (OpOpcode == ISD::TRUNCATE) {
7226 SDValue OpOp = N1.getOperand(0);
7227 if (OpOp.getValueType() == VT) {
7228 unsigned NumSignExtBits =
7230 if (ComputeNumSignBits(OpOp) > NumSignExtBits) {
7231 transferDbgValues(N1, OpOp);
7232 return OpOp;
7233 }
7234 }
7235 }
7236 break;
7237 case ISD::ZERO_EXTEND:
7238 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7239 "Invalid ZERO_EXTEND!");
7240 assert(VT.isVector() == N1.getValueType().isVector() &&
7241 "ZERO_EXTEND result type type should be vector iff the operand "
7242 "type is vector!");
7243 if (N1.getValueType() == VT) return N1; // noop extension
7244 assert((!VT.isVector() || VT.getVectorElementCount() ==
7246 "Vector element count mismatch!");
7247 assert(N1.getValueType().bitsLT(VT) && "Invalid zext node, dst < src!");
7248 if (OpOpcode == ISD::ZERO_EXTEND) { // (zext (zext x)) -> (zext x)
7249 SDNodeFlags Flags;
7250 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7251 SDValue NewVal =
7252 getNode(ISD::ZERO_EXTEND, DL, VT, N1.getOperand(0), Flags);
7253 transferDbgValues(N1, NewVal);
7254 return NewVal;
7255 }
7256
7257 if (OpOpcode == ISD::POISON)
7258 return getPOISON(VT);
7259
7260 if (N1.isUndef())
7261 // zext(undef) = 0, because the top bits will be zero.
7262 return getConstant(0, DL, VT);
7263
7264 // Skip unnecessary zext_inreg pattern:
7265 // (zext (trunc x)) -> x iff the upper bits are known zero.
7266 // TODO: Remove (zext (trunc (and x, c))) exception which some targets
7267 // use to recognise zext_inreg patterns.
7268 if (OpOpcode == ISD::TRUNCATE) {
7269 SDValue OpOp = N1.getOperand(0);
7270 if (OpOp.getValueType() == VT) {
7271 if (OpOp.getOpcode() != ISD::AND) {
7274 if (MaskedValueIsZero(OpOp, HiBits)) {
7275 transferDbgValues(N1, OpOp);
7276 return OpOp;
7277 }
7278 }
7279 }
7280 }
7281 break;
7282 case ISD::ANY_EXTEND:
7283 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7284 "Invalid ANY_EXTEND!");
7285 assert(VT.isVector() == N1.getValueType().isVector() &&
7286 "ANY_EXTEND result type type should be vector iff the operand "
7287 "type is vector!");
7288 if (N1.getValueType() == VT) return N1; // noop extension
7289 assert((!VT.isVector() || VT.getVectorElementCount() ==
7291 "Vector element count mismatch!");
7292 assert(N1.getValueType().bitsLT(VT) && "Invalid anyext node, dst < src!");
7293
7294 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7295 OpOpcode == ISD::ANY_EXTEND) {
7296 SDNodeFlags Flags;
7297 if (OpOpcode == ISD::ZERO_EXTEND)
7298 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7299 // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x)
7300 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7301 }
7302 if (N1.isUndef())
7303 return getUNDEF(VT);
7304
7305 // (ext (trunc x)) -> x
7306 if (OpOpcode == ISD::TRUNCATE) {
7307 SDValue OpOp = N1.getOperand(0);
7308 if (OpOp.getValueType() == VT) {
7309 transferDbgValues(N1, OpOp);
7310 return OpOp;
7311 }
7312 }
7313 break;
7314 case ISD::TRUNCATE:
7315 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7316 "Invalid TRUNCATE!");
7317 assert(VT.isVector() == N1.getValueType().isVector() &&
7318 "TRUNCATE result type type should be vector iff the operand "
7319 "type is vector!");
7320 if (N1.getValueType() == VT) return N1; // noop truncate
7321 assert((!VT.isVector() || VT.getVectorElementCount() ==
7323 "Vector element count mismatch!");
7324 assert(N1.getValueType().bitsGT(VT) && "Invalid truncate node, src < dst!");
7325 if (OpOpcode == ISD::TRUNCATE)
7326 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7327 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7328 OpOpcode == ISD::ANY_EXTEND) {
7329 // If the source is smaller than the dest, we still need an extend.
7331 VT.getScalarType())) {
7332 SDNodeFlags Flags;
7333 if (OpOpcode == ISD::ZERO_EXTEND)
7334 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7335 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7336 }
7337 if (N1.getOperand(0).getValueType().bitsGT(VT))
7338 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7339 return N1.getOperand(0);
7340 }
7341 if (N1.isUndef())
7342 return getUNDEF(VT);
7343 if (OpOpcode == ISD::VSCALE && !NewNodesMustHaveLegalTypes)
7344 return getVScale(DL, VT,
7346 break;
7350 assert(VT.isVector() && "This DAG node is restricted to vector types.");
7351 assert(N1.getValueType().bitsLE(VT) &&
7352 "The input must be the same size or smaller than the result.");
7355 "The destination vector type must have fewer lanes than the input.");
7356 break;
7357 case ISD::ABS:
7358 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid ABS!");
7359 if (N1.isUndef())
7360 return getConstant(0, DL, VT);
7361 break;
7363 assert(VT.isInteger() && VT == N1.getValueType() &&
7364 "Invalid ABS_MIN_POISON!");
7365 if (N1.isUndef())
7366 return getConstant(0, DL, VT);
7367 break;
7368 case ISD::BSWAP:
7369 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BSWAP!");
7370 assert((VT.getScalarSizeInBits() % 16 == 0) &&
7371 "BSWAP types must be a multiple of 16 bits!");
7372 if (N1.isUndef())
7373 return getUNDEF(VT);
7374 // bswap(bswap(X)) -> X.
7375 if (OpOpcode == ISD::BSWAP)
7376 return N1.getOperand(0);
7377 break;
7378 case ISD::BITREVERSE:
7379 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BITREVERSE!");
7380 if (N1.isUndef())
7381 return getUNDEF(VT);
7382 break;
7383 case ISD::BITCAST:
7385 "Cannot BITCAST between types of different sizes!");
7386 if (VT == N1.getValueType()) return N1; // noop conversion.
7387 if (OpOpcode == ISD::BITCAST) // bitconv(bitconv(x)) -> bitconv(x)
7388 return getNode(ISD::BITCAST, DL, VT, N1.getOperand(0));
7389 if (N1.isUndef())
7390 return getUNDEF(VT);
7391 break;
7393 assert(VT.isVector() && !N1.getValueType().isVector() &&
7394 (VT.getVectorElementType() == N1.getValueType() ||
7396 N1.getValueType().isInteger() &&
7398 "Illegal SCALAR_TO_VECTOR node!");
7399 if (N1.isUndef())
7400 return getUNDEF(VT);
7401 // scalar_to_vector(extract_vector_elt V, 0) -> V, top bits are undefined.
7402 if (OpOpcode == ISD::EXTRACT_VECTOR_ELT &&
7404 N1.getConstantOperandVal(1) == 0 &&
7405 N1.getOperand(0).getValueType() == VT)
7406 return N1.getOperand(0);
7407 break;
7408 case ISD::FNEG:
7409 // Negation of an unknown bag of bits is still completely undefined.
7410 if (N1.isUndef())
7411 return getUNDEF(VT);
7412
7413 if (OpOpcode == ISD::FNEG) // --X -> X
7414 return N1.getOperand(0);
7415 break;
7416 case ISD::FABS:
7417 if (OpOpcode == ISD::FNEG) // abs(-X) -> abs(X)
7418 return getNode(ISD::FABS, DL, VT, N1.getOperand(0));
7419 break;
7420 case ISD::VSCALE:
7421 assert(VT == N1.getValueType() && "Unexpected VT!");
7422 break;
7423 case ISD::CTPOP:
7424 if (N1.getValueType().getScalarType() == MVT::i1)
7425 return N1;
7426 break;
7427 case ISD::CTLZ:
7428 case ISD::CTTZ:
7429 if (N1.getValueType().getScalarType() == MVT::i1)
7430 return getNOT(DL, N1, N1.getValueType());
7431 break;
7432 case ISD::CTLS:
7433 if (N1.getValueType().getScalarType() == MVT::i1)
7434 return getConstant(0, DL, VT);
7435 break;
7436 case ISD::VECREDUCE_ADD:
7437 if (N1.getValueType().getScalarType() == MVT::i1)
7438 return getNode(ISD::VECREDUCE_XOR, DL, VT, N1);
7439 break;
7442 if (N1.getValueType().getScalarType() == MVT::i1)
7443 return getNode(ISD::VECREDUCE_OR, DL, VT, N1);
7444 break;
7447 if (N1.getValueType().getScalarType() == MVT::i1)
7448 return getNode(ISD::VECREDUCE_AND, DL, VT, N1);
7449 break;
7450 case ISD::VECTOR_REPEAT:
7452 "VECTOR_REPEAT requires a fixed-length vector operand");
7453 assert(VT.isScalableVector() &&
7454 "VECTOR_REPEAT requires a scalable vector result");
7457 "VECTOR_REPEAT operand and result element counts must match");
7458 if (VT.getVectorMinNumElements() == 1)
7459 return getSplatVector(
7460 VT, DL, getExtractVectorElt(DL, VT.getVectorElementType(), N1, 0));
7461 break;
7462 case ISD::SPLAT_VECTOR:
7463 assert(VT.isVector() && "Wrong return type!");
7464 // FIXME: Hexagon uses i32 scalar for a floating point zero vector so allow
7465 // that for now.
7467 (VT.isFloatingPoint() && N1.getValueType() == MVT::i32) ||
7469 N1.getValueType().isInteger() &&
7471 "Wrong operand type!");
7472 break;
7473 }
7474
7475 SDNode *N;
7476 SDVTList VTs = getVTList(VT);
7477 SDValue Ops[] = {N1};
7478 if (VT != MVT::Glue) { // Don't CSE glue producing nodes
7479 SDNodeKey ID(Opcode, VTs, Ops);
7480 FoldingSetInsertToken InsertToken;
7481 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
7482 E->intersectFlagsWith(Flags);
7483 return SDValue(E, 0);
7484 }
7485
7486 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7487 N->setFlags(Flags);
7488 createOperands(N, Ops);
7489 CSEMap.insert(N, InsertToken);
7490 } else {
7491 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7492 createOperands(N, Ops);
7493 }
7494
7495 InsertNode(N);
7496 SDValue V = SDValue(N, 0);
7497 NewSDValueDbgMsg(V, "Creating new node: ", this);
7498 return V;
7499}
7500
7501static APInt getIntegerIdentity(unsigned Opcode, unsigned BitWidth) {
7502 switch (Opcode) {
7503 default:
7504 llvm_unreachable("Unexpected integer identity opcode");
7505 case ISD::ADD:
7506 case ISD::OR:
7507 case ISD::XOR:
7508 case ISD::UMAX:
7509 return APInt::getZero(BitWidth);
7510 case ISD::MUL:
7511 return APInt(BitWidth, 1);
7512 case ISD::AND:
7513 case ISD::UMIN:
7515 case ISD::SMAX:
7517 case ISD::SMIN:
7519 }
7520}
7521
7522static std::optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
7523 const APInt &C2) {
7524 switch (Opcode) {
7525 case ISD::ADD: return C1 + C2;
7526 case ISD::SUB: return C1 - C2;
7527 case ISD::MUL: return C1 * C2;
7528 case ISD::AND: return C1 & C2;
7529 case ISD::OR: return C1 | C2;
7530 case ISD::XOR: return C1 ^ C2;
7531 case ISD::SHL: return C1 << C2;
7532 case ISD::SRL: return C1.lshr(C2);
7533 case ISD::SRA: return C1.ashr(C2);
7534 case ISD::ROTL: return C1.rotl(C2);
7535 case ISD::ROTR: return C1.rotr(C2);
7536 case ISD::SMIN: return C1.sle(C2) ? C1 : C2;
7537 case ISD::SMAX: return C1.sge(C2) ? C1 : C2;
7538 case ISD::UMIN: return C1.ule(C2) ? C1 : C2;
7539 case ISD::UMAX: return C1.uge(C2) ? C1 : C2;
7540 case ISD::SADDSAT: return C1.sadd_sat(C2);
7541 case ISD::UADDSAT: return C1.uadd_sat(C2);
7542 case ISD::SSUBSAT: return C1.ssub_sat(C2);
7543 case ISD::USUBSAT: return C1.usub_sat(C2);
7544 case ISD::SSHLSAT: return C1.sshl_sat(C2);
7545 case ISD::USHLSAT: return C1.ushl_sat(C2);
7546 case ISD::UDIV:
7547 if (!C2.getBoolValue())
7548 break;
7549 return C1.udiv(C2);
7550 case ISD::UREM:
7551 if (!C2.getBoolValue())
7552 break;
7553 return C1.urem(C2);
7554 case ISD::SDIV:
7555 if (!C2.getBoolValue())
7556 break;
7557 return C1.sdiv(C2);
7558 case ISD::SREM:
7559 if (!C2.getBoolValue())
7560 break;
7561 return C1.srem(C2);
7562 case ISD::AVGFLOORS:
7563 return APIntOps::avgFloorS(C1, C2);
7564 case ISD::AVGFLOORU:
7565 return APIntOps::avgFloorU(C1, C2);
7566 case ISD::AVGCEILS:
7567 return APIntOps::avgCeilS(C1, C2);
7568 case ISD::AVGCEILU:
7569 return APIntOps::avgCeilU(C1, C2);
7570 case ISD::ABDS:
7571 return APIntOps::abds(C1, C2);
7572 case ISD::ABDU:
7573 return APIntOps::abdu(C1, C2);
7574 case ISD::MULHS:
7575 return APIntOps::mulhs(C1, C2);
7576 case ISD::MULHU:
7577 return APIntOps::mulhu(C1, C2);
7578 case ISD::CLMUL:
7579 return APIntOps::clmul(C1, C2);
7580 case ISD::CLMULR:
7581 return APIntOps::clmulr(C1, C2);
7582 case ISD::CLMULH:
7583 return APIntOps::clmulh(C1, C2);
7584 case ISD::PEXT:
7585 return APIntOps::pext(C1, C2);
7586 case ISD::PDEP:
7587 return APIntOps::pdep(C1, C2);
7588 }
7589 return std::nullopt;
7590}
7591// Handle constant folding with UNDEF.
7592// TODO: Handle more cases.
7593static std::optional<APInt> FoldValueWithUndef(unsigned Opcode, const APInt &C1,
7594 bool IsUndef1, const APInt &C2,
7595 bool IsUndef2) {
7596 if (!(IsUndef1 || IsUndef2))
7597 return FoldValue(Opcode, C1, C2);
7598
7599 // Fold and(x, undef) -> 0
7600 // Fold mul(x, undef) -> 0
7601 if (Opcode == ISD::AND || Opcode == ISD::MUL)
7602 return APInt::getZero(C1.getBitWidth());
7603
7604 return std::nullopt;
7605}
7606
7608 const GlobalAddressSDNode *GA,
7609 const SDNode *N2) {
7610 if (GA->getOpcode() != ISD::GlobalAddress)
7611 return SDValue();
7612 if (!TLI->isOffsetFoldingLegal(GA))
7613 return SDValue();
7614 auto *C2 = dyn_cast<ConstantSDNode>(N2);
7615 if (!C2)
7616 return SDValue();
7617 int64_t Offset = C2->getSExtValue();
7618 switch (Opcode) {
7619 case ISD::ADD:
7620 case ISD::PTRADD:
7621 break;
7622 case ISD::SUB: Offset = -uint64_t(Offset); break;
7623 default: return SDValue();
7624 }
7625 return getGlobalAddress(GA->getGlobal(), SDLoc(C2), VT,
7626 GA->getOffset() + uint64_t(Offset));
7627}
7628
7630 switch (Opcode) {
7631 case ISD::SDIV:
7632 case ISD::UDIV:
7633 case ISD::SREM:
7634 case ISD::UREM: {
7635 // If a divisor is zero/undef or any element of a divisor vector is
7636 // zero/undef, the whole op is undef.
7637 assert(Ops.size() == 2 && "Div/rem should have 2 operands");
7638 SDValue Divisor = Ops[1];
7639 if (Divisor.isUndef() || isNullConstant(Divisor))
7640 return true;
7641
7642 return ISD::isBuildVectorOfConstantSDNodes(Divisor.getNode()) &&
7643 llvm::any_of(Divisor->op_values(),
7644 [](SDValue V) { return V.isUndef() ||
7645 isNullConstant(V); });
7646 // TODO: Handle signed overflow.
7647 }
7648 // TODO: Handle oversized shifts.
7649 default:
7650 return false;
7651 }
7652}
7653
7656 SDNodeFlags Flags) {
7657 // If the opcode is a target-specific ISD node, there's nothing we can
7658 // do here and the operand rules may not line up with the below, so
7659 // bail early.
7660 // We can't create a scalar CONCAT_VECTORS so skip it. It will break
7661 // for concats involving SPLAT_VECTOR. Concats of BUILD_VECTORS are handled by
7662 // foldCONCAT_VECTORS in getNode before this is called.
7663 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::CONCAT_VECTORS)
7664 return SDValue();
7665
7666 unsigned NumOps = Ops.size();
7667 if (NumOps == 0)
7668 return SDValue();
7669
7670 if (isUndef(Opcode, Ops))
7671 return getUNDEF(VT);
7672
7673 // Handle unary special cases.
7674 if (NumOps == 1) {
7675 SDValue N1 = Ops[0];
7676
7677 // Constant fold unary operations with an integer constant operand. Even
7678 // opaque constant will be folded, because the folding of unary operations
7679 // doesn't create new constants with different values. Nevertheless, the
7680 // opaque flag is preserved during folding to prevent future folding with
7681 // other constants.
7682 if (auto *C = dyn_cast<ConstantSDNode>(N1)) {
7683 const APInt &Val = C->getAPIntValue();
7684 switch (Opcode) {
7685 case ISD::SIGN_EXTEND:
7686 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7687 C->isTargetOpcode(), C->isOpaque());
7688 case ISD::TRUNCATE:
7689 if (C->isOpaque())
7690 break;
7691 [[fallthrough]];
7692 case ISD::ZERO_EXTEND:
7693 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7694 C->isTargetOpcode(), C->isOpaque());
7695 case ISD::ANY_EXTEND:
7696 // Some targets like RISCV prefer to sign extend some types.
7697 if (TLI->isSExtCheaperThanZExt(N1.getValueType(), VT))
7698 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7699 C->isTargetOpcode(), C->isOpaque());
7700 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7701 C->isTargetOpcode(), C->isOpaque());
7702 case ISD::ABS:
7703 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7704 C->isOpaque());
7706 if (Val.isMinSignedValue())
7707 return getPOISON(VT);
7708 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7709 C->isOpaque());
7710 case ISD::BITREVERSE:
7711 return getConstant(Val.reverseBits(), DL, VT, C->isTargetOpcode(),
7712 C->isOpaque());
7713 case ISD::BSWAP:
7714 return getConstant(Val.byteSwap(), DL, VT, C->isTargetOpcode(),
7715 C->isOpaque());
7716 case ISD::CTPOP:
7717 return getConstant(Val.popcount(), DL, VT, C->isTargetOpcode(),
7718 C->isOpaque());
7719 case ISD::PARITY:
7720 return getConstant(Val.popcount() & 1, DL, VT, C->isTargetOpcode(),
7721 C->isOpaque());
7722 case ISD::CTLZ:
7724 return getConstant(Val.countl_zero(), DL, VT, C->isTargetOpcode(),
7725 C->isOpaque());
7726 case ISD::CTTZ:
7728 return getConstant(Val.countr_zero(), DL, VT, C->isTargetOpcode(),
7729 C->isOpaque());
7730 case ISD::CTLS:
7731 // CTLS returns the number of extra sign bits so subtract one.
7732 return getConstant(Val.getNumSignBits() - 1, DL, VT,
7733 C->isTargetOpcode(), C->isOpaque());
7734 case ISD::UINT_TO_FP:
7735 case ISD::SINT_TO_FP: {
7737 (void)FPV.convertFromAPInt(Val, Opcode == ISD::SINT_TO_FP,
7739 return getConstantFP(FPV, DL, VT);
7740 }
7741 case ISD::FP16_TO_FP:
7742 case ISD::BF16_TO_FP: {
7743 bool Ignored;
7744 APFloat FPV(Opcode == ISD::FP16_TO_FP ? APFloat::IEEEhalf()
7745 : APFloat::BFloat(),
7746 (Val.getBitWidth() == 16) ? Val : Val.trunc(16));
7747
7748 // This can return overflow, underflow, or inexact; we don't care.
7749 // FIXME need to be more flexible about rounding mode.
7751 &Ignored);
7752 return getConstantFP(FPV, DL, VT);
7753 }
7754 case ISD::STEP_VECTOR:
7755 if (SDValue V = FoldSTEP_VECTOR(DL, VT, N1, *this))
7756 return V;
7757 break;
7758 case ISD::BITCAST:
7759 if (VT == MVT::f16 && C->getValueType(0) == MVT::i16)
7760 return getConstantFP(APFloat(APFloat::IEEEhalf(), Val), DL, VT);
7761 if (VT == MVT::f32 && C->getValueType(0) == MVT::i32)
7762 return getConstantFP(APFloat(APFloat::IEEEsingle(), Val), DL, VT);
7763 if (VT == MVT::f64 && C->getValueType(0) == MVT::i64)
7764 return getConstantFP(APFloat(APFloat::IEEEdouble(), Val), DL, VT);
7765 if (VT == MVT::f128 && C->getValueType(0) == MVT::i128)
7766 return getConstantFP(APFloat(APFloat::IEEEquad(), Val), DL, VT);
7767 break;
7768 }
7769 }
7770
7771 // Constant fold unary operations with a floating point constant operand.
7772 if (auto *C = dyn_cast<ConstantFPSDNode>(N1)) {
7773 APFloat V = C->getValueAPF(); // make copy
7774 switch (Opcode) {
7775 case ISD::FNEG:
7776 V.changeSign();
7777 return getConstantFP(V, DL, VT);
7778 case ISD::FABS:
7779 V.clearSign();
7780 return getConstantFP(V, DL, VT);
7781 case ISD::FCEIL: {
7782 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardPositive);
7784 return getConstantFP(V, DL, VT);
7785 return SDValue();
7786 }
7787 case ISD::FTRUNC: {
7788 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardZero);
7790 return getConstantFP(V, DL, VT);
7791 return SDValue();
7792 }
7793 case ISD::FFLOOR: {
7794 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardNegative);
7796 return getConstantFP(V, DL, VT);
7797 return SDValue();
7798 }
7799 case ISD::FP_EXTEND: {
7800 bool ignored;
7801 // This can return overflow, underflow, or inexact; we don't care.
7802 // FIXME need to be more flexible about rounding mode.
7803 (void)V.convert(VT.getFltSemantics(), APFloat::rmNearestTiesToEven,
7804 &ignored);
7805 return getConstantFP(V, DL, VT);
7806 }
7807 case ISD::FP_TO_SINT:
7808 case ISD::FP_TO_UINT: {
7809 bool ignored;
7810 APSInt IntVal(VT.getSizeInBits(), Opcode == ISD::FP_TO_UINT);
7811 // FIXME need to be more flexible about rounding mode.
7813 V.convertToInteger(IntVal, APFloat::rmTowardZero, &ignored);
7814 if (s == APFloat::opInvalidOp) // inexact is OK, in fact usual
7815 break;
7816 return getConstant(IntVal, DL, VT);
7817 }
7818 case ISD::FP_TO_FP16:
7819 case ISD::FP_TO_BF16: {
7820 bool Ignored;
7821 // This can return overflow, underflow, or inexact; we don't care.
7822 // FIXME need to be more flexible about rounding mode.
7823 (void)V.convert(Opcode == ISD::FP_TO_FP16 ? APFloat::IEEEhalf()
7824 : APFloat::BFloat(),
7826 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7827 }
7828 case ISD::BITCAST:
7829 if (VT == MVT::i16 && C->getValueType(0) == MVT::f16)
7830 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7831 VT);
7832 if (VT == MVT::i16 && C->getValueType(0) == MVT::bf16)
7833 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7834 VT);
7835 if (VT == MVT::i32 && C->getValueType(0) == MVT::f32)
7836 return getConstant((uint32_t)V.bitcastToAPInt().getZExtValue(), DL,
7837 VT);
7838 if (VT == MVT::i64 && C->getValueType(0) == MVT::f64)
7839 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7840 break;
7841 }
7842 }
7843
7844 // Early-out if we failed to constant fold a bitcast.
7845 if (Opcode == ISD::BITCAST)
7846 return SDValue();
7847
7848 // Constant fold integer vector reductions with constant BUILD_VECTORs.
7849 if ((Opcode == ISD::VECREDUCE_ADD || Opcode == ISD::VECREDUCE_SMAX ||
7850 Opcode == ISD::VECREDUCE_SMIN || Opcode == ISD::VECREDUCE_UMAX ||
7851 Opcode == ISD::VECREDUCE_UMIN || Opcode == ISD::VECREDUCE_MUL ||
7852 Opcode == ISD::VECREDUCE_OR || Opcode == ISD::VECREDUCE_XOR ||
7853 Opcode == ISD::VECREDUCE_AND) &&
7855 unsigned EltBits = N1.getValueType().getScalarSizeInBits();
7856 unsigned BaseOpcode = ISD::getVecReduceBaseOpcode(Opcode);
7857 APInt Acc = getIntegerIdentity(BaseOpcode, EltBits);
7858 for (SDValue Elt : N1->op_values()) {
7859 if (Elt.getOpcode() == ISD::POISON)
7860 return getPOISON(VT);
7861 if (Elt.isUndef() || cast<ConstantSDNode>(Elt)->isOpaque())
7862 return SDValue();
7863 APInt Value = cast<ConstantSDNode>(Elt)->getAPIntValue().trunc(EltBits);
7864 std::optional<APInt> Folded = FoldValue(BaseOpcode, Acc, Value);
7865 assert(Folded &&
7866 "Expected vector reduction base opcode to be foldable");
7867 Acc = *Folded;
7868 }
7869 EVT EltVT = N1.getValueType().getScalarType();
7870 return getAnyExtOrTrunc(getConstant(Acc, DL, EltVT), DL, VT);
7871 }
7872 }
7873
7874 // Handle binops special cases.
7875 if (NumOps == 2) {
7876 if (SDValue CFP = foldConstantFPMath(Opcode, DL, VT, Ops))
7877 return CFP;
7878
7879 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7880 if (auto *C2 = dyn_cast<ConstantSDNode>(Ops[1])) {
7881 if (C1->isOpaque() || C2->isOpaque())
7882 return SDValue();
7883
7884 std::optional<APInt> FoldAttempt =
7885 FoldValue(Opcode, C1->getAPIntValue(), C2->getAPIntValue());
7886 if (!FoldAttempt)
7887 return SDValue();
7888
7889 SDValue Folded = getConstant(*FoldAttempt, DL, VT);
7890 assert((!Folded || !VT.isVector()) &&
7891 "Can't fold vectors ops with scalar operands");
7892 return Folded;
7893 }
7894 }
7895
7896 // fold (add Sym, c) -> Sym+c
7898 return FoldSymbolOffset(Opcode, VT, GA, Ops[1].getNode());
7899 if (TLI->isCommutativeBinOp(Opcode))
7901 return FoldSymbolOffset(Opcode, VT, GA, Ops[0].getNode());
7902
7903 // fold (sext_in_reg c1) -> c2
7904 if (Opcode == ISD::SIGN_EXTEND_INREG) {
7905 EVT EVT = cast<VTSDNode>(Ops[1])->getVT();
7906
7907 auto SignExtendInReg = [&](APInt Val, llvm::EVT ConstantVT) {
7908 unsigned FromBits = EVT.getScalarSizeInBits();
7909 Val <<= Val.getBitWidth() - FromBits;
7910 Val.ashrInPlace(Val.getBitWidth() - FromBits);
7911 return getConstant(Val, DL, ConstantVT);
7912 };
7913
7914 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7915 const APInt &Val = C1->getAPIntValue();
7916 return SignExtendInReg(Val, VT);
7917 }
7918
7920 SmallVector<SDValue, 8> ScalarOps;
7921 llvm::EVT OpVT = Ops[0].getOperand(0).getValueType();
7922 for (int I = 0, E = VT.getVectorNumElements(); I != E; ++I) {
7923 SDValue Op = Ops[0].getOperand(I);
7924 if (Op.isUndef()) {
7925 ScalarOps.push_back(getUNDEF(OpVT));
7926 continue;
7927 }
7928 const APInt &Val = cast<ConstantSDNode>(Op)->getAPIntValue();
7929 ScalarOps.push_back(SignExtendInReg(Val, OpVT));
7930 }
7931 return getBuildVector(VT, DL, ScalarOps);
7932 }
7933
7934 if (Ops[0].getOpcode() == ISD::SPLAT_VECTOR &&
7935 isa<ConstantSDNode>(Ops[0].getOperand(0)))
7936 return getNode(ISD::SPLAT_VECTOR, DL, VT,
7937 SignExtendInReg(Ops[0].getConstantOperandAPInt(0),
7938 Ops[0].getOperand(0).getValueType()));
7939 }
7940 }
7941
7942 // Handle fshl/fshr special cases.
7943 if (Opcode == ISD::FSHL || Opcode == ISD::FSHR) {
7944 auto *C1 = dyn_cast<ConstantSDNode>(Ops[0]);
7945 auto *C2 = dyn_cast<ConstantSDNode>(Ops[1]);
7946 auto *C3 = dyn_cast<ConstantSDNode>(Ops[2]);
7947
7948 if (C1 && C2 && C3) {
7949 if (C1->isOpaque() || C2->isOpaque() || C3->isOpaque())
7950 return SDValue();
7951 const APInt &V1 = C1->getAPIntValue(), &V2 = C2->getAPIntValue(),
7952 &V3 = C3->getAPIntValue();
7953
7954 APInt FoldedVal = Opcode == ISD::FSHL ? APIntOps::fshl(V1, V2, V3)
7955 : APIntOps::fshr(V1, V2, V3);
7956 return getConstant(FoldedVal, DL, VT);
7957 }
7958 }
7959
7960 // Handle fma/fmad special cases.
7961 if (Opcode == ISD::FMA || Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7962 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
7963 assert(Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
7964 Ops[2].getValueType() == VT && "FMA types must match!");
7968 if (C1 && C2 && C3) {
7969 APFloat V1 = C1->getValueAPF();
7970 const APFloat &V2 = C2->getValueAPF();
7971 const APFloat &V3 = C3->getValueAPF();
7972 if (Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7973 V1.multiply(V2, APFloat::rmNearestTiesToEven);
7975 } else
7976 V1.fusedMultiplyAdd(V2, V3, APFloat::rmNearestTiesToEven);
7977 return getConstantFP(V1, DL, VT);
7978 }
7979 }
7980
7981 // This is for vector folding only from here on.
7982 if (!VT.isVector())
7983 return SDValue();
7984
7985 // Constant fold integer partial reductions with constant BUILD_VECTOR
7986 // operands. The reduction order is deliberately unspecified. Use the same
7987 // subvector layout as TargetLowering::expandPartialReduceMLA(), where input
7988 // lane I contributes to accumulator lane I % NumAccElts.
7989 if (Opcode == ISD::PARTIAL_REDUCE_SMLA ||
7990 Opcode == ISD::PARTIAL_REDUCE_UMLA ||
7991 Opcode == ISD::PARTIAL_REDUCE_SUMLA) {
7992 // These nodes have no scalar form, so unsupported cases must not fall
7993 // through to generic per-lane vector folding.
7994 if (!llvm::all_of(Ops, [](SDValue Op) {
7995 return ISD::isBuildVectorOfConstantSDNodes(Op.getNode());
7996 }))
7997 return SDValue();
7998
7999 unsigned AccEltBits = VT.getScalarSizeInBits();
8000 unsigned InputEltBits = Ops[1].getScalarValueSizeInBits();
8001 unsigned NumAccElts = VT.getVectorNumElements();
8002 unsigned NumInputElts = Ops[1].getValueType().getVectorNumElements();
8003 SmallVector<APInt, 8> Results(NumAccElts, APInt::getZero(AccEltBits));
8004 BitVector PoisonElts(NumAccElts);
8005
8006 for (unsigned I = 0; I != NumAccElts; ++I) {
8007 SDValue Elt = Ops[0].getOperand(I);
8008 if (Elt.getOpcode() == ISD::POISON) {
8009 PoisonElts.set(I);
8010 continue;
8011 }
8012 auto *C = dyn_cast<ConstantSDNode>(Elt);
8013 if (!C || C->isOpaque())
8014 return SDValue();
8015 Results[I] = C->getAPIntValue().trunc(AccEltBits);
8016 }
8017
8018 bool IsLHSSigned = Opcode != ISD::PARTIAL_REDUCE_UMLA;
8019 bool IsRHSSigned = Opcode == ISD::PARTIAL_REDUCE_SMLA;
8020 for (unsigned I = 0; I != NumInputElts; ++I) {
8021 const unsigned AccIdx = I % NumAccElts;
8022 SDValue LHSElt = Ops[1].getOperand(I);
8023 SDValue RHSElt = Ops[2].getOperand(I);
8024 if (LHSElt.getOpcode() == ISD::POISON ||
8025 RHSElt.getOpcode() == ISD::POISON) {
8026 PoisonElts.set(AccIdx);
8027 continue;
8028 }
8029
8030 auto *LHS = dyn_cast<ConstantSDNode>(LHSElt);
8031 auto *RHS = dyn_cast<ConstantSDNode>(RHSElt);
8032 if (!LHS || !RHS || LHS->isOpaque() || RHS->isOpaque())
8033 return SDValue();
8034
8035 APInt LHSVal = LHS->getAPIntValue().trunc(InputEltBits);
8036 APInt RHSVal = RHS->getAPIntValue().trunc(InputEltBits);
8037 LHSVal = IsLHSSigned ? LHSVal.sext(AccEltBits) : LHSVal.zext(AccEltBits);
8038 RHSVal = IsRHSSigned ? RHSVal.sext(AccEltBits) : RHSVal.zext(AccEltBits);
8039 Results[AccIdx] += LHSVal * RHSVal;
8040 }
8041
8042 // After type legalization the vector element type may not be a legal
8043 // scalar type (e.g. i16 on AArch64). Create the folded constants in the
8044 // promoted legal scalar type instead, matching the generic per-lane path
8045 // below. Bail out if legalization would narrow the type, since the lane
8046 // value would not fit.
8047 EVT AccEltVT = VT.getVectorElementType();
8048 EVT LegalSVT = AccEltVT;
8049 if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
8050 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
8051 if (LegalSVT.bitsLT(AccEltVT))
8052 return SDValue();
8053 }
8054
8055 SmallVector<SDValue, 8> ResultOps;
8056 for (unsigned I = 0; I != NumAccElts; ++I)
8057 ResultOps.push_back(
8058 PoisonElts[I] ? getPOISON(LegalSVT)
8059 : getConstant(Results[I].sext(LegalSVT.getSizeInBits()),
8060 DL, LegalSVT));
8061 return getBuildVector(VT, DL, ResultOps);
8062 }
8063
8064 ElementCount NumElts = VT.getVectorElementCount();
8065
8066 // See if we can fold through any bitcasted integer ops.
8067 if (NumOps == 2 && VT.isFixedLengthVector() && VT.isInteger() &&
8068 Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
8069 (Ops[0].getOpcode() == ISD::BITCAST ||
8070 Ops[1].getOpcode() == ISD::BITCAST)) {
8073 auto *BV1 = dyn_cast<BuildVectorSDNode>(N1);
8074 auto *BV2 = dyn_cast<BuildVectorSDNode>(N2);
8075 if (BV1 && BV2 && N1.getValueType().isInteger() &&
8076 N2.getValueType().isInteger()) {
8077 bool IsLE = getDataLayout().isLittleEndian();
8078 unsigned EltBits = VT.getScalarSizeInBits();
8079 SmallVector<APInt> RawBits1, RawBits2;
8080 BitVector UndefElts1, UndefElts2;
8081 if (BV1->getConstantRawBits(IsLE, EltBits, RawBits1, UndefElts1) &&
8082 BV2->getConstantRawBits(IsLE, EltBits, RawBits2, UndefElts2)) {
8083 SmallVector<APInt> RawBits;
8084 for (unsigned I = 0, E = NumElts.getFixedValue(); I != E; ++I) {
8085 std::optional<APInt> Fold = FoldValueWithUndef(
8086 Opcode, RawBits1[I], UndefElts1[I], RawBits2[I], UndefElts2[I]);
8087 if (!Fold)
8088 break;
8089 RawBits.push_back(*Fold);
8090 }
8091 if (RawBits.size() == NumElts.getFixedValue()) {
8092 // We have constant folded, but we might need to cast this again back
8093 // to the original (possibly legalized) type.
8094 EVT BVVT, BVEltVT;
8095 if (N1.getValueType() == VT) {
8096 BVVT = N1.getValueType();
8097 BVEltVT = BV1->getOperand(0).getValueType();
8098 } else {
8099 BVVT = N2.getValueType();
8100 BVEltVT = BV2->getOperand(0).getValueType();
8101 }
8102 unsigned BVEltBits = BVEltVT.getSizeInBits();
8103 SmallVector<APInt> DstBits;
8104 BitVector DstUndefs;
8106 DstBits, RawBits, DstUndefs,
8107 BitVector(RawBits.size(), false));
8108 SmallVector<SDValue> Ops(DstBits.size(), getUNDEF(BVEltVT));
8109 for (unsigned I = 0, E = DstBits.size(); I != E; ++I) {
8110 if (DstUndefs[I])
8111 continue;
8112 Ops[I] = getConstant(DstBits[I].sext(BVEltBits), DL, BVEltVT);
8113 }
8114 return getBitcast(VT, getBuildVector(BVVT, DL, Ops));
8115 }
8116 }
8117 }
8118 // Logic ops can be folded from raw integer bits - mainly for AVX512 masks.
8119 if (ISD::isBitwiseLogicOp(Opcode) && isa<ConstantSDNode>(N1) &&
8120 isa<ConstantSDNode>(N2)) {
8121 if (SDValue Res = FoldConstantArithmetic(Opcode, DL, N1.getValueType(),
8122 {N1, N2}, Flags))
8123 return getBitcast(VT, Res);
8124 }
8125 }
8126
8127 // Fold (mul step_vector(C0), C1) to (step_vector(C0 * C1)).
8128 // (shl step_vector(C0), C1) -> (step_vector(C0 << C1))
8129 if ((Opcode == ISD::MUL || Opcode == ISD::SHL) &&
8130 Ops[0].getOpcode() == ISD::STEP_VECTOR) {
8131 APInt RHSVal;
8132 if (ISD::isConstantSplatVector(Ops[1].getNode(), RHSVal)) {
8133 APInt NewStep = Opcode == ISD::MUL
8134 ? Ops[0].getConstantOperandAPInt(0) * RHSVal
8135 : Ops[0].getConstantOperandAPInt(0) << RHSVal;
8136 return getStepVector(DL, VT, NewStep);
8137 }
8138 }
8139
8140 auto IsScalarOrSameVectorSize = [NumElts](const SDValue &Op) {
8141 return !Op.getValueType().isVector() ||
8142 Op.getValueType().getVectorElementCount() == NumElts;
8143 };
8144
8145 auto IsBuildVectorSplatVectorOrUndef = [](const SDValue &Op) {
8146 return Op.isUndef() || Op.getOpcode() == ISD::CONDCODE ||
8147 Op.getOpcode() == ISD::BUILD_VECTOR ||
8148 Op.getOpcode() == ISD::SPLAT_VECTOR;
8149 };
8150
8151 // All operands must be vector types with the same number of elements as
8152 // the result type and must be either UNDEF or a build/splat vector
8153 // or UNDEF scalars.
8154 if (!llvm::all_of(Ops, IsBuildVectorSplatVectorOrUndef) ||
8155 !llvm::all_of(Ops, IsScalarOrSameVectorSize))
8156 return SDValue();
8157
8158 // If we are comparing vectors, then the result needs to be a i1 boolean that
8159 // is then extended back to the legal result type depending on how booleans
8160 // are represented.
8161 EVT SVT = (Opcode == ISD::SETCC ? MVT::i1 : VT.getScalarType());
8162 ISD::NodeType ExtendCode =
8163 (Opcode == ISD::SETCC && SVT != VT.getScalarType())
8164 ? TargetLowering::getExtendForContent(TLI->getBooleanContents(VT))
8166
8167 // Find legal integer scalar type for constant promotion and
8168 // ensure that its scalar size is at least as large as source.
8169 EVT LegalSVT = VT.getScalarType();
8170 if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
8171 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
8172 if (LegalSVT.bitsLT(VT.getScalarType()))
8173 return SDValue();
8174 }
8175
8176 // For scalable vector types we know we're dealing with SPLAT_VECTORs. We
8177 // only have one operand to check. For fixed-length vector types we may have
8178 // a combination of BUILD_VECTOR and SPLAT_VECTOR.
8179 unsigned NumVectorElts = NumElts.isScalable() ? 1 : NumElts.getFixedValue();
8180
8181 // Constant fold each scalar lane separately.
8182 SmallVector<SDValue, 4> ScalarResults;
8183 for (unsigned I = 0; I != NumVectorElts; I++) {
8184 SmallVector<SDValue, 4> ScalarOps;
8185 for (SDValue Op : Ops) {
8186 EVT InSVT = Op.getValueType().getScalarType();
8187 if (Op.getOpcode() != ISD::BUILD_VECTOR &&
8188 Op.getOpcode() != ISD::SPLAT_VECTOR) {
8189 if (Op.isUndef())
8190 ScalarOps.push_back(getUNDEF(InSVT));
8191 else
8192 ScalarOps.push_back(Op);
8193 continue;
8194 }
8195
8196 SDValue ScalarOp =
8197 Op.getOperand(Op.getOpcode() == ISD::SPLAT_VECTOR ? 0 : I);
8198 EVT ScalarVT = ScalarOp.getValueType();
8199
8200 // Build vector (integer) scalar operands may need implicit
8201 // truncation - do this before constant folding.
8202 if (ScalarVT.isInteger() && ScalarVT.bitsGT(InSVT)) {
8203 // Don't create illegally-typed nodes unless they're constants or undef
8204 // - if we fail to constant fold we can't guarantee the (dead) nodes
8205 // we're creating will be cleaned up before being visited for
8206 // legalization.
8207 if (NewNodesMustHaveLegalTypes && !ScalarOp.isUndef() &&
8208 !isa<ConstantSDNode>(ScalarOp) &&
8209 TLI->getTypeAction(*getContext(), InSVT) !=
8211 return SDValue();
8212 ScalarOp = getNode(ISD::TRUNCATE, DL, InSVT, ScalarOp);
8213 }
8214
8215 ScalarOps.push_back(ScalarOp);
8216 }
8217
8218 // Constant fold the scalar operands.
8219 SDValue ScalarResult = getNode(Opcode, DL, SVT, ScalarOps, Flags);
8220
8221 // Scalar folding only succeeded if the result is a constant or UNDEF.
8222 if (!ScalarResult.isUndef() && ScalarResult.getOpcode() != ISD::Constant &&
8223 ScalarResult.getOpcode() != ISD::ConstantFP)
8224 return SDValue();
8225
8226 // Legalize the (integer) scalar constant if necessary. We only do
8227 // this once we know the folding succeeded, since otherwise we would
8228 // get a node with illegal type which has a user.
8229 if (LegalSVT != SVT)
8230 ScalarResult = getNode(ExtendCode, DL, LegalSVT, ScalarResult);
8231
8232 ScalarResults.push_back(ScalarResult);
8233 }
8234
8235 SDValue V = NumElts.isScalable() ? getSplatVector(VT, DL, ScalarResults[0])
8236 : getBuildVector(VT, DL, ScalarResults);
8237 NewSDValueDbgMsg(V, "New node fold constant vector: ", this);
8238 return V;
8239}
8240
8243 // TODO: Add support for unary/ternary fp opcodes.
8244 if (Ops.size() != 2)
8245 return SDValue();
8246
8247 // TODO: We don't do any constant folding for strict FP opcodes here, but we
8248 // should. That will require dealing with a potentially non-default
8249 // rounding mode, checking the "opStatus" return value from the APFloat
8250 // math calculations, and possibly other variations.
8251 SDValue N1 = Ops[0];
8252 SDValue N2 = Ops[1];
8253 ConstantFPSDNode *N1CFP = isConstOrConstSplatFP(N1, /*AllowUndefs*/ false);
8254 ConstantFPSDNode *N2CFP = isConstOrConstSplatFP(N2, /*AllowUndefs*/ false);
8255 if (N1CFP && N2CFP) {
8256 APFloat C1 = N1CFP->getValueAPF(); // make copy
8257 const APFloat &C2 = N2CFP->getValueAPF();
8258 switch (Opcode) {
8259 case ISD::FADD:
8261 return getConstantFP(C1, DL, VT);
8262 case ISD::FSUB:
8264 return getConstantFP(C1, DL, VT);
8265 case ISD::FMUL:
8267 return getConstantFP(C1, DL, VT);
8268 case ISD::FDIV:
8270 return getConstantFP(C1, DL, VT);
8271 case ISD::FREM:
8272 C1.mod(C2);
8273 return getConstantFP(C1, DL, VT);
8274 case ISD::FCOPYSIGN:
8275 C1.copySign(C2);
8276 return getConstantFP(C1, DL, VT);
8277 case ISD::FMINNUM:
8278 return getConstantFP(minnum(C1, C2), DL, VT);
8279 case ISD::FMAXNUM:
8280 return getConstantFP(maxnum(C1, C2), DL, VT);
8281 case ISD::FMINIMUM:
8282 return getConstantFP(minimum(C1, C2), DL, VT);
8283 case ISD::FMAXIMUM:
8284 return getConstantFP(maximum(C1, C2), DL, VT);
8285 case ISD::FMINIMUMNUM:
8286 return getConstantFP(minimumnum(C1, C2), DL, VT);
8287 case ISD::FMAXIMUMNUM:
8288 return getConstantFP(maximumnum(C1, C2), DL, VT);
8289 default: break;
8290 }
8291 }
8292 if (N1CFP && Opcode == ISD::FP_ROUND) {
8293 APFloat C1 = N1CFP->getValueAPF(); // make copy
8294 bool Unused;
8295 // This can return overflow, underflow, or inexact; we don't care.
8296 // FIXME need to be more flexible about rounding mode.
8298 &Unused);
8299 return getConstantFP(C1, DL, VT);
8300 }
8301
8302 switch (Opcode) {
8303 case ISD::FSUB:
8304 // -0.0 - undef --> undef (consistent with "fneg undef")
8305 if (ConstantFPSDNode *N1C = isConstOrConstSplatFP(N1, /*AllowUndefs*/ true))
8306 if (N1C && N1C->getValueAPF().isNegZero() && N2.isUndef())
8307 return getUNDEF(VT);
8308 [[fallthrough]];
8309
8310 case ISD::FADD:
8311 case ISD::FMUL:
8312 case ISD::FDIV:
8313 case ISD::FREM:
8314 // If both operands are undef, the result is undef. If 1 operand is undef,
8315 // the result is NaN. This should match the behavior of the IR optimizer.
8316 if (N1.isUndef() && N2.isUndef())
8317 return getUNDEF(VT);
8318 if (N1.isUndef() || N2.isUndef())
8320 }
8321 return SDValue();
8322}
8323
8325 const SDLoc &DL, EVT DstEltVT) {
8326 EVT SrcEltVT = BV->getValueType(0).getVectorElementType();
8327
8328 // If this is already the right type, we're done.
8329 if (SrcEltVT == DstEltVT)
8330 return SDValue(BV, 0);
8331
8332 unsigned SrcBitSize = SrcEltVT.getSizeInBits();
8333 unsigned DstBitSize = DstEltVT.getSizeInBits();
8334
8335 // If this is a conversion of N elements of one type to N elements of another
8336 // type, convert each element. This handles FP<->INT cases.
8337 if (SrcBitSize == DstBitSize) {
8339 for (SDValue Op : BV->op_values()) {
8340 // If the vector element type is not legal, the BUILD_VECTOR operands
8341 // are promoted and implicitly truncated. Make that explicit here.
8342 if (Op.getValueType() != SrcEltVT)
8343 Op = getNode(ISD::TRUNCATE, DL, SrcEltVT, Op);
8344 Ops.push_back(getBitcast(DstEltVT, Op));
8345 }
8346 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT,
8348 return getBuildVector(VT, DL, Ops);
8349 }
8350
8351 // Otherwise, we're growing or shrinking the elements. To avoid having to
8352 // handle annoying details of growing/shrinking FP values, we convert them to
8353 // int first.
8354 if (SrcEltVT.isFloatingPoint()) {
8355 // Convert the input float vector to a int vector where the elements are the
8356 // same sizes.
8357 EVT IntEltVT = EVT::getIntegerVT(*getContext(), SrcEltVT.getSizeInBits());
8358 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8360 DstEltVT);
8361 return SDValue();
8362 }
8363
8364 // Now we know the input is an integer vector. If the output is a FP type,
8365 // convert to integer first, then to FP of the right size.
8366 if (DstEltVT.isFloatingPoint()) {
8367 EVT IntEltVT = EVT::getIntegerVT(*getContext(), DstEltVT.getSizeInBits());
8368 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8370 DstEltVT);
8371 return SDValue();
8372 }
8373
8374 // Okay, we know the src/dst types are both integers of differing types.
8375 assert(SrcEltVT.isInteger() && DstEltVT.isInteger());
8376
8377 // Extract the constant raw bit data.
8378 BitVector UndefElements;
8379 SmallVector<APInt> RawBits;
8380 bool IsLE = getDataLayout().isLittleEndian();
8381 if (!BV->getConstantRawBits(IsLE, DstBitSize, RawBits, UndefElements))
8382 return SDValue();
8383
8385 for (unsigned I = 0, E = RawBits.size(); I != E; ++I) {
8386 if (UndefElements[I])
8387 Ops.push_back(getUNDEF(DstEltVT));
8388 else
8389 Ops.push_back(getConstant(RawBits[I], DL, DstEltVT));
8390 }
8391
8392 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT, Ops.size());
8393 return getBuildVector(VT, DL, Ops);
8394}
8395
8397 assert(Val.getValueType().isInteger() && "Invalid AssertAlign!");
8398
8399 // There's no need to assert on a byte-aligned pointer. All pointers are at
8400 // least byte aligned.
8401 if (A == Align(1))
8402 return Val;
8403
8404 SDVTList VTs = getVTList(Val.getValueType());
8405 SDValue Ops[] = {Val};
8406 SDNodeKey ID(ISD::AssertAlign, VTs, Ops);
8407 ID.AddInteger(A.value());
8408
8409 FoldingSetInsertToken InsertToken;
8410 if (SDNode *E = lookupNode(ID, DL, InsertToken))
8411 return SDValue(E, 0);
8412
8413 auto *N =
8414 newSDNode<AssertAlignSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, A);
8415 createOperands(N, {Val});
8416
8417 CSEMap.insert(N, InsertToken);
8418 InsertNode(N);
8419
8420 SDValue V(N, 0);
8421 NewSDValueDbgMsg(V, "Creating new node: ", this);
8422 return V;
8423}
8424
8425SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8426 SDValue N1, SDValue N2) {
8427 SDNodeFlags Flags;
8428 if (Inserter)
8429 Flags = Inserter->getFlags();
8430 return getNode(Opcode, DL, VT, N1, N2, Flags);
8431}
8432
8434 SDValue &N2) const {
8435 if (!TLI->isCommutativeBinOp(Opcode))
8436 return;
8437
8438 // Canonicalize:
8439 // binop(const, nonconst) -> binop(nonconst, const)
8442 bool N1CFP = isConstantFPBuildVectorOrConstantFP(N1);
8443 bool N2CFP = isConstantFPBuildVectorOrConstantFP(N2);
8444 if ((N1C && !N2C) || (N1CFP && !N2CFP))
8445 std::swap(N1, N2);
8446
8447 // Canonicalize:
8448 // binop(splat(x), step_vector) -> binop(step_vector, splat(x))
8449 else if (N1.getOpcode() == ISD::SPLAT_VECTOR &&
8451 std::swap(N1, N2);
8452}
8453
8454SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8455 SDValue N1, SDValue N2, const SDNodeFlags Flags) {
8457 N2.getOpcode() != ISD::DELETED_NODE &&
8458 "Operand is DELETED_NODE!");
8459
8460 canonicalizeCommutativeBinop(Opcode, N1, N2);
8461
8462 auto *N1C = dyn_cast<ConstantSDNode>(N1);
8463 auto *N2C = dyn_cast<ConstantSDNode>(N2);
8464
8465 // Don't allow undefs in vector splats - we might be returning N2 when folding
8466 // to zero etc.
8467 ConstantSDNode *N2CV =
8468 isConstOrConstSplat(N2, /*AllowUndefs*/ false, /*AllowTruncation*/ true);
8469
8470 switch (Opcode) {
8471 default: break;
8472 case ISD::TokenFactor:
8473 assert(VT == MVT::Other && N1.getValueType() == MVT::Other &&
8474 N2.getValueType() == MVT::Other && "Invalid token factor!");
8475 // Fold trivial token factors.
8476 if (N1.getOpcode() == ISD::EntryToken) return N2;
8477 if (N2.getOpcode() == ISD::EntryToken) return N1;
8478 if (N1 == N2) return N1;
8479 break;
8480 case ISD::BUILD_VECTOR: {
8481 // Attempt to simplify BUILD_VECTOR.
8482 SDValue Ops[] = {N1, N2};
8483 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
8484 return V;
8485 break;
8486 }
8487 case ISD::CONCAT_VECTORS: {
8488 SDValue Ops[] = {N1, N2};
8489 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
8490 return V;
8491 break;
8492 }
8493 case ISD::AND:
8494 assert(VT.isInteger() && "This operator does not apply to FP types!");
8495 assert(N1.getValueType() == N2.getValueType() &&
8496 N1.getValueType() == VT && "Binary operator types must match!");
8497 // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's
8498 // worth handling here.
8499 if (N2CV && N2CV->isZero())
8500 return N2;
8501 if (N2CV && N2CV->isAllOnes()) // X & -1 -> X
8502 return N1;
8503 break;
8504 case ISD::OR:
8505 case ISD::XOR:
8506 case ISD::ADD:
8507 case ISD::PTRADD:
8508 case ISD::SUB:
8509 assert(VT.isInteger() && "This operator does not apply to FP types!");
8510 assert(N1.getValueType() == N2.getValueType() &&
8511 N1.getValueType() == VT && "Binary operator types must match!");
8512 // The equal operand types requirement is unnecessarily strong for PTRADD.
8513 // However, the SelectionDAGBuilder does not generate PTRADDs with different
8514 // operand types, and we'd need to re-implement GEP's non-standard wrapping
8515 // logic everywhere where PTRADDs may be folded or combined to properly
8516 // support them. If/when we introduce pointer types to the SDAG, we will
8517 // need to relax this constraint.
8518
8519 // (X ^|+- 0) -> X. This commonly occurs when legalizing i64 values, so
8520 // it's worth handling here.
8521 if (N2CV && N2CV->isZero())
8522 return N1;
8523 if ((Opcode == ISD::ADD || Opcode == ISD::SUB) &&
8524 VT.getScalarType() == MVT::i1)
8525 return getNode(ISD::XOR, DL, VT, N1, N2);
8526 // Fold (add (vscale * C0), (vscale * C1)) to (vscale * (C0 + C1)).
8527 if (Opcode == ISD::ADD && N1.getOpcode() == ISD::VSCALE &&
8528 N2.getOpcode() == ISD::VSCALE) {
8529 const APInt &C1 = N1->getConstantOperandAPInt(0);
8530 const APInt &C2 = N2->getConstantOperandAPInt(0);
8531 return getVScale(DL, VT, C1 + C2);
8532 }
8533 break;
8534 case ISD::MUL:
8535 assert(VT.isInteger() && "This operator does not apply to FP types!");
8536 assert(N1.getValueType() == N2.getValueType() &&
8537 N1.getValueType() == VT && "Binary operator types must match!");
8538 if (VT.getScalarType() == MVT::i1)
8539 return getNode(ISD::AND, DL, VT, N1, N2);
8540 if (N2CV && N2CV->isZero())
8541 return N2;
8542 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8543 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8544 const APInt &N2CImm = N2C->getAPIntValue();
8545 return getVScale(DL, VT, MulImm * N2CImm);
8546 }
8547 break;
8548 case ISD::UDIV:
8549 case ISD::UREM:
8550 case ISD::MULHU:
8551 case ISD::MULHS:
8552 case ISD::SDIV:
8553 case ISD::SREM:
8554 case ISD::SADDSAT:
8555 case ISD::SSUBSAT:
8556 case ISD::UADDSAT:
8557 case ISD::USUBSAT:
8558 assert(VT.isInteger() && "This operator does not apply to FP types!");
8559 assert(N1.getValueType() == N2.getValueType() &&
8560 N1.getValueType() == VT && "Binary operator types must match!");
8561 if (VT.getScalarType() == MVT::i1) {
8562 // fold (add_sat x, y) -> (or x, y) for bool types.
8563 if (Opcode == ISD::SADDSAT || Opcode == ISD::UADDSAT)
8564 return getNode(ISD::OR, DL, VT, N1, N2);
8565 // fold (sub_sat x, y) -> (and x, ~y) for bool types.
8566 if (Opcode == ISD::SSUBSAT || Opcode == ISD::USUBSAT)
8567 return getNode(ISD::AND, DL, VT, N1, getNOT(DL, N2, VT));
8568 }
8569 break;
8570 case ISD::SCMP:
8571 case ISD::UCMP:
8572 assert(N1.getValueType() == N2.getValueType() &&
8573 "Types of operands of UCMP/SCMP must match");
8574 assert(N1.getValueType().isVector() == VT.isVector() &&
8575 "Operands and return type of must both be scalars or vectors");
8576 if (VT.isVector())
8579 "Result and operands must have the same number of elements");
8580 break;
8581 case ISD::AVGFLOORS:
8582 case ISD::AVGFLOORU:
8583 case ISD::AVGCEILS:
8584 case ISD::AVGCEILU:
8585 assert(VT.isInteger() && "This operator does not apply to FP types!");
8586 assert(N1.getValueType() == N2.getValueType() &&
8587 N1.getValueType() == VT && "Binary operator types must match!");
8588 break;
8589 case ISD::ABDS:
8590 case ISD::ABDU:
8591 assert(VT.isInteger() && "This operator does not apply to FP types!");
8592 assert(N1.getValueType() == N2.getValueType() &&
8593 N1.getValueType() == VT && "Binary operator types must match!");
8594 if (VT.getScalarType() == MVT::i1)
8595 return getNode(ISD::XOR, DL, VT, N1, N2);
8596 break;
8597 case ISD::SMIN:
8598 case ISD::UMAX:
8599 assert(VT.isInteger() && "This operator does not apply to FP types!");
8600 assert(N1.getValueType() == N2.getValueType() &&
8601 N1.getValueType() == VT && "Binary operator types must match!");
8602 if (VT.getScalarType() == MVT::i1)
8603 return getNode(ISD::OR, DL, VT, N1, N2);
8604 break;
8605 case ISD::SMAX:
8606 case ISD::UMIN:
8607 assert(VT.isInteger() && "This operator does not apply to FP types!");
8608 assert(N1.getValueType() == N2.getValueType() &&
8609 N1.getValueType() == VT && "Binary operator types must match!");
8610 if (VT.getScalarType() == MVT::i1)
8611 return getNode(ISD::AND, DL, VT, N1, N2);
8612 break;
8613 case ISD::FADD:
8614 case ISD::FSUB:
8615 case ISD::FMUL:
8616 case ISD::FDIV:
8617 case ISD::FREM:
8618 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
8619 assert(N1.getValueType() == N2.getValueType() &&
8620 N1.getValueType() == VT && "Binary operator types must match!");
8621 if (SDValue V = simplifyFPBinop(Opcode, N1, N2, Flags))
8622 return V;
8623 break;
8624 case ISD::FCOPYSIGN: // N1 and result must match. N1/N2 need not match.
8625 assert(N1.getValueType() == VT &&
8628 "Invalid FCOPYSIGN!");
8629 break;
8630 case ISD::SHL:
8631 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8632 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8633 const APInt &ShiftImm = N2C->getAPIntValue();
8634 return getVScale(DL, VT, MulImm << ShiftImm);
8635 }
8636 [[fallthrough]];
8637 case ISD::SRA:
8638 case ISD::SRL:
8639 if (SDValue V = simplifyShift(N1, N2))
8640 return V;
8641 [[fallthrough]];
8642 case ISD::ROTL:
8643 case ISD::ROTR:
8644 case ISD::SSHLSAT:
8645 case ISD::USHLSAT:
8646 assert(VT == N1.getValueType() &&
8647 "Shift operators return type must be the same as their first arg");
8648 assert(VT.isInteger() && N2.getValueType().isInteger() &&
8649 "Shifts only work on integers");
8650 assert((!VT.isVector() || VT == N2.getValueType()) &&
8651 "Vector shift amounts must be in the same as their first arg");
8652 // Verify that the shift amount VT is big enough to hold valid shift
8653 // amounts. This catches things like trying to shift an i1024 value by an
8654 // i8, which is easy to fall into in generic code that uses
8655 // TLI.getShiftAmount().
8658 "Invalid use of small shift amount with oversized value!");
8659
8660 // Always fold shifts of i1 values so the code generator doesn't need to
8661 // handle them. Since we know the size of the shift has to be less than the
8662 // size of the value, the shift/rotate count is guaranteed to be zero.
8663 if (VT == MVT::i1)
8664 return N1;
8665 if (N2CV && N2CV->isZero())
8666 return N1;
8667 break;
8668 case ISD::FP_ROUND:
8670 VT.bitsLE(N1.getValueType()) && N2C &&
8671 (N2C->getZExtValue() == 0 || N2C->getZExtValue() == 1) &&
8672 N2.getOpcode() == ISD::TargetConstant && "Invalid FP_ROUND!");
8673 if (N1.getValueType() == VT) return N1; // noop conversion.
8674 break;
8675 case ISD::IS_FPCLASS: {
8677 "IS_FPCLASS is used for a non-floating type");
8678 assert(isa<ConstantSDNode>(N2) && "FPClassTest is not Constant");
8679 // is.fpclass(poison, mask) -> poison
8680 if (N1.getOpcode() == ISD::POISON)
8681 return getPOISON(VT);
8682 FPClassTest Mask = static_cast<FPClassTest>(N2->getAsZExtVal());
8683 // If all tests are made, it doesn't matter what the value is.
8684 if ((Mask & fcAllFlags) == fcAllFlags)
8685 return getBoolConstant(true, DL, VT, N1.getValueType());
8686 if ((Mask & fcAllFlags) == 0)
8687 return getBoolConstant(false, DL, VT, N1.getValueType());
8688 break;
8689 }
8690 case ISD::AssertNoFPClass: {
8692 "AssertNoFPClass is used for a non-floating type");
8693 assert(isa<ConstantSDNode>(N2) && "NoFPClass is not Constant");
8694 FPClassTest NoFPClass = static_cast<FPClassTest>(N2->getAsZExtVal());
8695 assert(llvm::to_underlying(NoFPClass) <=
8697 "FPClassTest value too large");
8698 (void)NoFPClass;
8699 break;
8700 }
8701 case ISD::AssertSext:
8702 case ISD::AssertZext: {
8703 EVT EVT = cast<VTSDNode>(N2)->getVT();
8704 assert(VT == N1.getValueType() && "Not an inreg extend!");
8705 assert(VT.isInteger() && EVT.isInteger() &&
8706 "Cannot *_EXTEND_INREG FP types");
8707 assert(!EVT.isVector() &&
8708 "AssertSExt/AssertZExt type should be the vector element type "
8709 "rather than the vector type!");
8710 assert(EVT.bitsLE(VT.getScalarType()) && "Not extending!");
8711 if (VT.getScalarType() == EVT) return N1; // noop assertion.
8712 break;
8713 }
8715 EVT EVT = cast<VTSDNode>(N2)->getVT();
8716 assert(VT == N1.getValueType() && "Not an inreg extend!");
8717 assert(VT.isInteger() && EVT.isInteger() &&
8718 "Cannot *_EXTEND_INREG FP types");
8719 assert(EVT.isVector() == VT.isVector() &&
8720 "SIGN_EXTEND_INREG type should be vector iff the operand "
8721 "type is vector!");
8722 assert((!EVT.isVector() ||
8724 "Vector element counts must match in SIGN_EXTEND_INREG");
8725 assert(EVT.getScalarType().bitsLE(VT.getScalarType()) && "Not extending!");
8726 if (EVT == VT) return N1; // Not actually extending
8727 break;
8728 }
8730 case ISD::FP_TO_UINT_SAT: {
8731 assert(VT.isInteger() && cast<VTSDNode>(N2)->getVT().isInteger() &&
8732 N1.getValueType().isFloatingPoint() && "Invalid FP_TO_*INT_SAT");
8733 assert(N1.getValueType().isVector() == VT.isVector() &&
8734 "FP_TO_*INT_SAT type should be vector iff the operand type is "
8735 "vector!");
8736 assert((!VT.isVector() || VT.getVectorElementCount() ==
8738 "Vector element counts must match in FP_TO_*INT_SAT");
8739 assert(!cast<VTSDNode>(N2)->getVT().isVector() &&
8740 "Type to saturate to must be a scalar.");
8741 assert(cast<VTSDNode>(N2)->getVT().bitsLE(VT.getScalarType()) &&
8742 "Not extending!");
8743 break;
8744 }
8747 "The result of EXTRACT_VECTOR_ELT must be at least as wide as the \
8748 element type of the vector.");
8749
8750 // Extract from an undefined value or using an undefined index is undefined.
8751 if (N1.isUndef() || N2.isUndef())
8752 return getUNDEF(VT);
8753
8754 // EXTRACT_VECTOR_ELT of out-of-bounds element is POISON for fixed length
8755 // vectors. For scalable vectors we will provide appropriate support for
8756 // dealing with arbitrary indices.
8757 if (N2C && N1.getValueType().isFixedLengthVector() &&
8758 N2C->getAPIntValue().uge(N1.getValueType().getVectorNumElements()))
8759 return getPOISON(VT);
8760
8761 // EXTRACT_VECTOR_ELT of CONCAT_VECTORS is often formed while lowering is
8762 // expanding copies of large vectors from registers. This only works for
8763 // fixed length vectors, since we need to know the exact number of
8764 // elements.
8765 if (N2C && N1.getOpcode() == ISD::CONCAT_VECTORS &&
8767 unsigned Factor = N1.getOperand(0).getValueType().getVectorNumElements();
8768 return getExtractVectorElt(DL, VT,
8769 N1.getOperand(N2C->getZExtValue() / Factor),
8770 N2C->getZExtValue() % Factor);
8771 }
8772
8773 // EXTRACT_VECTOR_ELT of BUILD_VECTOR or SPLAT_VECTOR is often formed while
8774 // lowering is expanding large vector constants.
8775 if (N2C && (N1.getOpcode() == ISD::BUILD_VECTOR ||
8776 N1.getOpcode() == ISD::SPLAT_VECTOR)) {
8779 "BUILD_VECTOR used for scalable vectors");
8780 unsigned Index =
8781 N1.getOpcode() == ISD::BUILD_VECTOR ? N2C->getZExtValue() : 0;
8782 SDValue Elt = N1.getOperand(Index);
8783
8784 if (VT != Elt.getValueType())
8785 // If the vector element type is not legal, the BUILD_VECTOR operands
8786 // are promoted and implicitly truncated, and the result implicitly
8787 // extended. Make that explicit here.
8788 Elt = getAnyExtOrTrunc(Elt, DL, VT);
8789
8790 return Elt;
8791 }
8792
8793 // EXTRACT_VECTOR_ELT of INSERT_VECTOR_ELT is often formed when vector
8794 // operations are lowered to scalars.
8795 if (N1.getOpcode() == ISD::INSERT_VECTOR_ELT) {
8796 // If the indices are the same, return the inserted element else
8797 // if the indices are known different, extract the element from
8798 // the original vector.
8799 SDValue N1Op2 = N1.getOperand(2);
8801
8802 if (N1Op2C && N2C) {
8803 if (N1Op2C->getZExtValue() == N2C->getZExtValue()) {
8804 if (VT == N1.getOperand(1).getValueType())
8805 return N1.getOperand(1);
8806 if (VT.isFloatingPoint()) {
8808 return getFPExtendOrRound(N1.getOperand(1), DL, VT);
8809 }
8810 return getSExtOrTrunc(N1.getOperand(1), DL, VT);
8811 }
8812 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0), N2);
8813 }
8814 }
8815
8816 // EXTRACT_VECTOR_ELT of v1iX EXTRACT_SUBVECTOR could be formed
8817 // when vector types are scalarized and v1iX is legal.
8818 // vextract (v1iX extract_subvector(vNiX, Idx)) -> vextract(vNiX,Idx).
8819 // Here we are completely ignoring the extract element index (N2),
8820 // which is fine for fixed width vectors, since any index other than 0
8821 // is undefined anyway. However, this cannot be ignored for scalable
8822 // vectors - in theory we could support this, but we don't want to do this
8823 // without a profitability check.
8824 if (N1.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
8826 N1.getValueType().getVectorNumElements() == 1) {
8827 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0),
8828 N1.getOperand(1));
8829 }
8830 break;
8832 assert(N2C && (unsigned)N2C->getZExtValue() < 2 && "Bad EXTRACT_ELEMENT!");
8833 assert(!N1.getValueType().isVector() && !VT.isVector() &&
8834 (N1.getValueType().isInteger() == VT.isInteger()) &&
8835 N1.getValueType() != VT &&
8836 "Wrong types for EXTRACT_ELEMENT!");
8837
8838 // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding
8839 // 64-bit integers into 32-bit parts. Instead of building the extract of
8840 // the BUILD_PAIR, only to have legalize rip it apart, just do it now.
8841 if (N1.getOpcode() == ISD::BUILD_PAIR)
8842 return N1.getOperand(N2C->getZExtValue());
8843
8844 // EXTRACT_ELEMENT of a constant int is also very common.
8845 if (N1C) {
8846 unsigned ElementSize = VT.getSizeInBits();
8847 unsigned Shift = ElementSize * N2C->getZExtValue();
8848 const APInt &Val = N1C->getAPIntValue();
8849 return getConstant(Val.extractBits(ElementSize, Shift), DL, VT);
8850 }
8851 break;
8853 EVT N1VT = N1.getValueType();
8854 assert(VT.isVector() && N1VT.isVector() &&
8855 "Extract subvector VTs must be vectors!");
8857 "Extract subvector VTs must have the same element type!");
8858 assert((VT.isFixedLengthVector() || N1VT.isScalableVector()) &&
8859 "Cannot extract a scalable vector from a fixed length vector!");
8860 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8862 "Extract subvector must be from larger vector to smaller vector!");
8863 assert(N2C && "Extract subvector index must be a constant");
8864 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8865 (VT.getVectorMinNumElements() + N2C->getZExtValue()) <=
8866 N1VT.getVectorMinNumElements()) &&
8867 "Extract subvector overflow!");
8868 assert(N2C->getAPIntValue().getBitWidth() ==
8869 TLI->getVectorIdxWidth(getDataLayout()) &&
8870 "Constant index for EXTRACT_SUBVECTOR has an invalid size");
8871 assert(N2C->getZExtValue() % VT.getVectorMinNumElements() == 0 &&
8872 "Extract index is not a multiple of the output vector length");
8873
8874 // Trivial extraction.
8875 if (VT == N1VT)
8876 return N1;
8877
8878 // EXTRACT_SUBVECTOR of an UNDEF is an UNDEF.
8879 if (N1.isUndef())
8880 return getUNDEF(VT);
8881
8882 // EXTRACT_SUBVECTOR of CONCAT_VECTOR can be simplified if the pieces of
8883 // the concat have the same type as the extract.
8884 if (N1.getOpcode() == ISD::CONCAT_VECTORS &&
8885 VT == N1.getOperand(0).getValueType()) {
8886 unsigned Factor = VT.getVectorMinNumElements();
8887 return N1.getOperand(N2C->getZExtValue() / Factor);
8888 }
8889
8890 // EXTRACT_SUBVECTOR of INSERT_SUBVECTOR is often created
8891 // during shuffle legalization.
8892 if (N1.getOpcode() == ISD::INSERT_SUBVECTOR && N2 == N1.getOperand(2) &&
8893 VT == N1.getOperand(1).getValueType())
8894 return N1.getOperand(1);
8895 break;
8896 }
8897 }
8898
8899 if (N1.getOpcode() == ISD::POISON || N2.getOpcode() == ISD::POISON) {
8900 switch (Opcode) {
8901 case ISD::XOR:
8902 case ISD::ADD:
8903 case ISD::PTRADD:
8904 case ISD::SUB:
8906 case ISD::UDIV:
8907 case ISD::SDIV:
8908 case ISD::UREM:
8909 case ISD::SREM:
8910 case ISD::MUL:
8911 case ISD::AND:
8912 case ISD::SSUBSAT:
8913 case ISD::USUBSAT:
8914 case ISD::UMIN:
8915 case ISD::OR:
8916 case ISD::SADDSAT:
8917 case ISD::UADDSAT:
8918 case ISD::UMAX:
8919 case ISD::SMAX:
8920 case ISD::SMIN:
8921 // fold op(arg1, poison) -> poison, fold op(poison, arg2) -> poison.
8922 return N2.getOpcode() == ISD::POISON ? N2 : N1;
8923 }
8924 }
8925
8926 // Canonicalize an UNDEF to the RHS, even over a constant.
8927 if (N1.getOpcode() == ISD::UNDEF && N2.getOpcode() != ISD::UNDEF) {
8928 if (TLI->isCommutativeBinOp(Opcode)) {
8929 std::swap(N1, N2);
8930 } else {
8931 switch (Opcode) {
8932 case ISD::PTRADD:
8933 case ISD::SUB:
8934 // fold op(undef, non_undef_arg2) -> undef.
8935 return N1;
8937 case ISD::UDIV:
8938 case ISD::SDIV:
8939 case ISD::UREM:
8940 case ISD::SREM:
8941 case ISD::SSUBSAT:
8942 case ISD::USUBSAT:
8943 // fold op(undef, non_undef_arg2) -> 0.
8944 return getConstant(0, DL, VT);
8945 }
8946 }
8947 }
8948
8949 // Fold a bunch of operators when the RHS is undef.
8950 if (N2.getOpcode() == ISD::UNDEF) {
8951 switch (Opcode) {
8952 case ISD::XOR:
8953 if (N1.getOpcode() == ISD::UNDEF)
8954 // Handle undef ^ undef -> 0 special case. This is a common
8955 // idiom (misuse).
8956 return getConstant(0, DL, VT);
8957 [[fallthrough]];
8958 case ISD::ADD:
8959 case ISD::PTRADD:
8960 case ISD::SUB:
8961 // fold op(arg1, undef) -> undef.
8962 return N2;
8963 case ISD::UDIV:
8964 case ISD::SDIV:
8965 case ISD::UREM:
8966 case ISD::SREM:
8967 // fold op(arg1, undef) -> poison.
8968 return getPOISON(VT);
8969 case ISD::MUL:
8970 case ISD::AND:
8971 case ISD::SSUBSAT:
8972 case ISD::USUBSAT:
8973 case ISD::UMIN:
8974 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> 0.
8975 return N1.getOpcode() == ISD::UNDEF ? N2 : getConstant(0, DL, VT);
8976 case ISD::OR:
8977 case ISD::SADDSAT:
8978 case ISD::UADDSAT:
8979 case ISD::UMAX:
8980 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> -1.
8981 return N1.getOpcode() == ISD::UNDEF ? N2 : getAllOnesConstant(DL, VT);
8982 case ISD::SMAX:
8983 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MAX_INT.
8984 return N1.getOpcode() == ISD::UNDEF
8985 ? N2
8986 : getConstant(
8988 VT);
8989 case ISD::SMIN:
8990 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MIN_INT.
8991 return N1.getOpcode() == ISD::UNDEF
8992 ? N2
8993 : getConstant(
8995 VT);
8996 }
8997 }
8998
8999 // Perform trivial constant folding.
9000 if (SDValue SV = FoldConstantArithmetic(Opcode, DL, VT, {N1, N2}, Flags))
9001 return SV;
9002
9003 // Memoize this node if possible.
9004 SDNode *N;
9005 SDVTList VTs = getVTList(VT);
9006 SDValue Ops[] = {N1, N2};
9007 if (VT != MVT::Glue) {
9008 SDNodeKey ID(Opcode, VTs, Ops);
9009 FoldingSetInsertToken InsertToken;
9010 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
9011 E->intersectFlagsWith(Flags);
9012 return SDValue(E, 0);
9013 }
9014
9015 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9016 N->setFlags(Flags);
9017 createOperands(N, Ops);
9018 CSEMap.insert(N, InsertToken);
9019 } else {
9020 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9021 createOperands(N, Ops);
9022 }
9023
9024 InsertNode(N);
9025 SDValue V = SDValue(N, 0);
9026 NewSDValueDbgMsg(V, "Creating new node: ", this);
9027 return V;
9028}
9029
9030SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9031 SDValue N1, SDValue N2, SDValue N3) {
9032 SDNodeFlags Flags;
9033 if (Inserter)
9034 Flags = Inserter->getFlags();
9035 return getNode(Opcode, DL, VT, N1, N2, N3, Flags);
9036}
9037
9038SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9039 SDValue N1, SDValue N2, SDValue N3,
9040 const SDNodeFlags Flags) {
9042 N2.getOpcode() != ISD::DELETED_NODE &&
9043 N3.getOpcode() != ISD::DELETED_NODE &&
9044 "Operand is DELETED_NODE!");
9045 // Perform various simplifications.
9046 switch (Opcode) {
9047 case ISD::BUILD_VECTOR: {
9048 // Attempt to simplify BUILD_VECTOR.
9049 SDValue Ops[] = {N1, N2, N3};
9050 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
9051 return V;
9052 break;
9053 }
9054 case ISD::CONCAT_VECTORS: {
9055 SDValue Ops[] = {N1, N2, N3};
9056 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
9057 return V;
9058 break;
9059 }
9060 case ISD::SETCC: {
9061 assert(VT.isInteger() && "SETCC result type must be an integer!");
9062 assert(N1.getValueType() == N2.getValueType() &&
9063 "SETCC operands must have the same type!");
9064 assert(VT.isVector() == N1.getValueType().isVector() &&
9065 "SETCC type should be vector iff the operand type is vector!");
9066 assert((!VT.isVector() || VT.getVectorElementCount() ==
9068 "SETCC vector element counts must match!");
9069 // Use FoldSetCC to simplify SETCC's.
9070 if (SDValue V =
9071 FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get(), DL, Flags))
9072 return V;
9073 break;
9074 }
9075 case ISD::SELECT:
9076 case ISD::VSELECT:
9077 if (SDValue V = simplifySelect(N1, N2, N3))
9078 return V;
9079 break;
9081 llvm_unreachable("should use getVectorShuffle constructor!");
9083 if (isNullConstant(N3))
9084 return N1;
9085 break;
9087 if (isNullConstant(N3))
9088 return N2;
9089 break;
9091 assert(VT.isVector() && VT == N1.getValueType() &&
9092 "INSERT_VECTOR_ELT vector type mismatch");
9094 "INSERT_VECTOR_ELT scalar fp/int mismatch");
9095 assert((!VT.isFloatingPoint() ||
9096 VT.getVectorElementType() == N2.getValueType()) &&
9097 "INSERT_VECTOR_ELT fp scalar type mismatch");
9098 assert((!VT.isInteger() ||
9100 "INSERT_VECTOR_ELT int scalar size mismatch");
9101
9102 auto *N3C = dyn_cast<ConstantSDNode>(N3);
9103 // INSERT_VECTOR_ELT into out-of-bounds element is an UNDEF, except
9104 // for scalable vectors where we will generate appropriate code to
9105 // deal with out-of-bounds cases correctly.
9106 if (N3C && VT.isFixedLengthVector() &&
9107 N3C->getZExtValue() >= VT.getVectorNumElements())
9108 return getUNDEF(VT);
9109
9110 // Undefined index can be assumed out-of-bounds, so that's UNDEF too.
9111 if (N3.isUndef())
9112 return getUNDEF(VT);
9113
9114 // If inserting poison, just use the input vector.
9115 if (N2.getOpcode() == ISD::POISON)
9116 return N1;
9117
9118 // Inserting undef into undef/poison is still undef.
9119 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
9120 return getUNDEF(VT);
9121
9122 // If the inserted element is an UNDEF, just use the input vector.
9123 // But not if skipping the insert could make the result more poisonous.
9124 if (N2.isUndef()) {
9125 if (N3C && VT.isFixedLengthVector()) {
9126 APInt EltMask =
9127 APInt::getOneBitSet(VT.getVectorNumElements(), N3C->getZExtValue());
9128 if (isGuaranteedNotToBePoison(N1, EltMask))
9129 return N1;
9130 } else if (isGuaranteedNotToBePoison(N1))
9131 return N1;
9132 }
9133 break;
9134 }
9135 case ISD::INSERT_SUBVECTOR: {
9136 // If inserting poison, just use the input vector,
9137 if (N2.getOpcode() == ISD::POISON)
9138 return N1;
9139
9140 // Inserting undef into undef/poison is still undef.
9141 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
9142 return getUNDEF(VT);
9143
9144 EVT N2VT = N2.getValueType();
9145 assert(VT == N1.getValueType() &&
9146 "Dest and insert subvector source types must match!");
9147 assert(VT.isVector() && N2VT.isVector() &&
9148 "Insert subvector VTs must be vectors!");
9150 "Insert subvector VTs must have the same element type!");
9151 assert((VT.isScalableVector() || N2VT.isFixedLengthVector()) &&
9152 "Cannot insert a scalable vector into a fixed length vector!");
9153 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
9155 "Insert subvector must be from smaller vector to larger vector!");
9157 "Insert subvector index must be constant");
9158 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
9159 (N2VT.getVectorMinNumElements() + N3->getAsZExtVal()) <=
9161 "Insert subvector overflow!");
9163 TLI->getVectorIdxWidth(getDataLayout()) &&
9164 "Constant index for INSERT_SUBVECTOR has an invalid size");
9165
9166 // Trivial insertion.
9167 if (VT == N2VT)
9168 return N2;
9169
9170 // If this is an insert of an extracted vector into an undef/poison vector,
9171 // we can just use the input to the extract. But not if skipping the
9172 // extract+insert could make the result more poisonous.
9173 if (N1.isUndef() && N2.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
9174 N2.getOperand(1) == N3 && N2.getOperand(0).getValueType() == VT) {
9175 if (N1.getOpcode() == ISD::POISON)
9176 return N2.getOperand(0);
9177 if (VT.isFixedLengthVector() && N2VT.isFixedLengthVector()) {
9178 unsigned LoBit = N3->getAsZExtVal();
9179 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
9180 APInt EltMask =
9181 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
9182 if (isGuaranteedNotToBePoison(N2.getOperand(0), ~EltMask))
9183 return N2.getOperand(0);
9184 } else if (isGuaranteedNotToBePoison(N2.getOperand(0)))
9185 return N2.getOperand(0);
9186 }
9187
9188 // If the inserted subvector is UNDEF, just use the input vector.
9189 // But not if skipping the insert could make the result more poisonous.
9190 if (N2.isUndef()) {
9191 if (VT.isFixedLengthVector()) {
9192 unsigned LoBit = N3->getAsZExtVal();
9193 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
9194 APInt EltMask =
9195 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
9196 if (isGuaranteedNotToBePoison(N1, EltMask))
9197 return N1;
9198 } else if (isGuaranteedNotToBePoison(N1))
9199 return N1;
9200 }
9201 break;
9202 }
9203 case ISD::BITCAST:
9204 // Fold bit_convert nodes from a type to themselves.
9205 if (N1.getValueType() == VT)
9206 return N1;
9207 break;
9208 case ISD::VECTOR_COMPRESS: {
9209 [[maybe_unused]] EVT VecVT = N1.getValueType();
9210 [[maybe_unused]] EVT MaskVT = N2.getValueType();
9211 [[maybe_unused]] EVT PassthruVT = N3.getValueType();
9212 assert(VT == VecVT && "Vector and result type don't match.");
9213 assert(VecVT.isVector() && MaskVT.isVector() && PassthruVT.isVector() &&
9214 "All inputs must be vectors.");
9215 assert(VecVT == PassthruVT && "Vector and passthru types don't match.");
9217 "Vector and mask must have same number of elements.");
9218
9219 if (N1.isUndef() || N2.isUndef())
9220 return N3;
9221
9222 break;
9223 }
9228 [[maybe_unused]] EVT AccVT = N1.getValueType();
9229 [[maybe_unused]] EVT Input1VT = N2.getValueType();
9230 [[maybe_unused]] EVT Input2VT = N3.getValueType();
9231 assert(Input1VT.isVector() && Input1VT == Input2VT &&
9232 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
9233 "node to have the same type!");
9234 assert(VT.isVector() && VT == AccVT &&
9235 "Expected the first operand of the PARTIAL_REDUCE_MLA node to have "
9236 "the same type as its result!");
9238 AccVT.getVectorElementCount()) &&
9239 "Expected the element count of the second and third operands of the "
9240 "PARTIAL_REDUCE_MLA node to be a positive integer multiple of the "
9241 "element count of the first operand and the result!");
9243 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
9244 "node to have an element type which is the same as or smaller than "
9245 "the element type of the first operand and result!");
9246 break;
9247 }
9248 }
9249
9250 // Perform trivial constant folding for arithmetic operators.
9251 switch (Opcode) {
9255 case ISD::FMA:
9256 case ISD::FMAD:
9257 case ISD::SETCC:
9258 case ISD::FSHL:
9259 case ISD::FSHR:
9260 if (SDValue SV =
9261 FoldConstantArithmetic(Opcode, DL, VT, {N1, N2, N3}, Flags))
9262 return SV;
9263 break;
9264 }
9265
9266 // Memoize node if it doesn't produce a glue result.
9267 SDNode *N;
9268 SDVTList VTs = getVTList(VT);
9269 SDValue Ops[] = {N1, N2, N3};
9270 if (VT != MVT::Glue) {
9271 SDNodeKey ID(Opcode, VTs, Ops);
9272 FoldingSetInsertToken InsertToken;
9273 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
9274 E->intersectFlagsWith(Flags);
9275 return SDValue(E, 0);
9276 }
9277
9278 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9279 N->setFlags(Flags);
9280 createOperands(N, Ops);
9281 CSEMap.insert(N, InsertToken);
9282 } else {
9283 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9284 createOperands(N, Ops);
9285 }
9286
9287 InsertNode(N);
9288 SDValue V = SDValue(N, 0);
9289 NewSDValueDbgMsg(V, "Creating new node: ", this);
9290 return V;
9291}
9292
9293SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9294 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9295 const SDNodeFlags Flags) {
9296 SDValue Ops[] = { N1, N2, N3, N4 };
9297 return getNode(Opcode, DL, VT, Ops, Flags);
9298}
9299
9300SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9301 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
9302 SDNodeFlags Flags;
9303 if (Inserter)
9304 Flags = Inserter->getFlags();
9305 return getNode(Opcode, DL, VT, N1, N2, N3, N4, Flags);
9306}
9307
9308SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9309 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9310 SDValue N5, const SDNodeFlags Flags) {
9311 SDValue Ops[] = { N1, N2, N3, N4, N5 };
9312 return getNode(Opcode, DL, VT, Ops, Flags);
9313}
9314
9315SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9316 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9317 SDValue N5) {
9318 SDNodeFlags Flags;
9319 if (Inserter)
9320 Flags = Inserter->getFlags();
9321 return getNode(Opcode, DL, VT, N1, N2, N3, N4, N5, Flags);
9322}
9323
9324/// getStackArgumentTokenFactor - Compute a TokenFactor to force all
9325/// the incoming stack arguments to be loaded from the stack.
9327 SmallVector<SDValue, 8> ArgChains;
9328
9329 // Include the original chain at the beginning of the list. When this is
9330 // used by target LowerCall hooks, this helps legalize find the
9331 // CALLSEQ_BEGIN node.
9332 ArgChains.push_back(Chain);
9333
9334 // Add a chain value for each stack argument.
9335 for (SDNode *U : getEntryNode().getNode()->users())
9336 if (LoadSDNode *L = dyn_cast<LoadSDNode>(U))
9337 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(L->getBasePtr()))
9338 if (FI->getIndex() < 0)
9339 ArgChains.push_back(SDValue(L, 1));
9340
9341 // Build a tokenfactor for all the chains.
9342 return getNode(ISD::TokenFactor, SDLoc(Chain), MVT::Other, ArgChains);
9343}
9344
9345/// getMemsetValue - Vectorized representation of the memset value
9346/// operand.
9348 const SDLoc &dl) {
9349 assert(!Value.isUndef());
9350
9351 unsigned NumBits = VT.getScalarSizeInBits();
9353 assert(C->getAPIntValue().getBitWidth() == 8);
9354 APInt Val = APInt::getSplat(NumBits, C->getAPIntValue());
9355 if (VT.isInteger()) {
9356 bool IsOpaque = VT.getSizeInBits() > 64 ||
9357 !DAG.getTargetLoweringInfo().isLegalStoreImmediate(C->getSExtValue());
9358 return DAG.getConstant(Val, dl, VT, false, IsOpaque);
9359 }
9360 return DAG.getConstantFP(APFloat(VT.getFltSemantics(), Val), dl, VT);
9361 }
9362
9363 assert(Value.getValueType() == MVT::i8 && "memset with non-byte fill value?");
9364 EVT IntVT = VT.getScalarType();
9365 if (!IntVT.isInteger())
9366 IntVT = EVT::getIntegerVT(*DAG.getContext(), IntVT.getSizeInBits());
9367
9368 Value = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, Value);
9369 if (NumBits > 8) {
9370 // Use a multiplication with 0x010101... to extend the input to the
9371 // required length.
9372 APInt Magic = APInt::getSplat(NumBits, APInt(8, 0x01));
9373 Value = DAG.getNode(ISD::MUL, dl, IntVT, Value,
9374 DAG.getConstant(Magic, dl, IntVT));
9375 }
9376
9377 if (VT != Value.getValueType() && !VT.isInteger())
9378 Value = DAG.getBitcast(VT.getScalarType(), Value);
9379 if (VT != Value.getValueType())
9380 Value = DAG.getSplatBuildVector(VT, dl, Value);
9381
9382 return Value;
9383}
9384
9385/// getMemsetStringVal - Similar to getMemsetValue. Except this is only
9386/// used when a memcpy is turned into a memset when the source is a constant
9387/// string ptr.
9389 const TargetLowering &TLI,
9390 const ConstantDataArraySlice &Slice) {
9391 // Handle vector with all elements zero.
9392 if (Slice.Array == nullptr) {
9393 if (VT.isInteger())
9394 return DAG.getConstant(0, dl, VT);
9395 return DAG.getNode(ISD::BITCAST, dl, VT,
9396 DAG.getConstant(0, dl, VT.changeTypeToInteger()));
9397 }
9398
9399 assert(!VT.isVector() && "Can't handle vector type here!");
9400 unsigned NumVTBits = VT.getSizeInBits();
9401 unsigned NumVTBytes = NumVTBits / 8;
9402 unsigned NumBytes = std::min(NumVTBytes, unsigned(Slice.Length));
9403
9404 APInt Val(NumVTBits, 0);
9405 if (DAG.getDataLayout().isLittleEndian()) {
9406 for (unsigned i = 0; i != NumBytes; ++i)
9407 Val |= (uint64_t)(unsigned char)Slice[i] << i*8;
9408 } else {
9409 for (unsigned i = 0; i != NumBytes; ++i)
9410 Val |= (uint64_t)(unsigned char)Slice[i] << (NumVTBytes-i-1)*8;
9411 }
9412
9413 // If the "cost" of materializing the integer immediate is less than the cost
9414 // of a load, then it is cost effective to turn the load into the immediate.
9415 Type *Ty = VT.getTypeForEVT(*DAG.getContext());
9416 if (TLI.shouldConvertConstantLoadToIntImm(Val, Ty))
9417 return DAG.getConstant(Val, dl, VT);
9418 return SDValue();
9419}
9420
9422 const SDLoc &DL,
9423 const SDNodeFlags Flags) {
9424 SDValue Index = getTypeSize(DL, Base.getValueType(), Offset);
9425 return getMemBasePlusOffset(Base, Index, DL, Flags);
9426}
9427
9429 const SDLoc &DL,
9430 const SDNodeFlags Flags) {
9431 assert(Offset.getValueType().isInteger());
9432 EVT BasePtrVT = Ptr.getValueType();
9433 if (TLI->shouldPreservePtrArith(this->getMachineFunction().getFunction(),
9434 BasePtrVT))
9435 return getNode(ISD::PTRADD, DL, BasePtrVT, Ptr, Offset, Flags);
9436 // InBounds only applies to PTRADD, don't set it if we generate ADD.
9437 SDNodeFlags AddFlags = Flags;
9438 AddFlags.setInBounds(false);
9439 return getNode(ISD::ADD, DL, BasePtrVT, Ptr, Offset, AddFlags);
9440}
9441
9442/// Returns true if memcpy source is constant data.
9444 uint64_t SrcDelta = 0;
9445 GlobalAddressSDNode *G = nullptr;
9446 if (Src.getOpcode() == ISD::GlobalAddress)
9448 else if (Src->isAnyAdd() &&
9449 Src.getOperand(0).getOpcode() == ISD::GlobalAddress &&
9450 Src.getOperand(1).getOpcode() == ISD::Constant) {
9451 G = cast<GlobalAddressSDNode>(Src.getOperand(0));
9452 SrcDelta = Src.getConstantOperandVal(1);
9453 }
9454 if (!G)
9455 return false;
9456
9457 return getConstantDataArrayInfo(G->getGlobal(), Slice, 8,
9458 SrcDelta + G->getOffset());
9459}
9460
9462 SelectionDAG &DAG) {
9463 // On Darwin, -Os means optimize for size without hurting performance, so
9464 // only really optimize for size when -Oz (MinSize) is used.
9466 return MF.getFunction().hasMinSize();
9467 return DAG.shouldOptForSize();
9468}
9469
9471 SmallVector<SDValue, 32> &OutChains, unsigned From,
9472 unsigned To, SmallVector<SDValue, 16> &OutLoadChains,
9473 SmallVector<SDValue, 16> &OutStoreChains) {
9474 assert(OutLoadChains.size() && "Missing loads in memcpy inlining");
9475 assert(OutStoreChains.size() && "Missing stores in memcpy inlining");
9476 SmallVector<SDValue, 16> GluedLoadChains;
9477 for (unsigned i = From; i < To; ++i) {
9478 OutChains.push_back(OutLoadChains[i]);
9479 GluedLoadChains.push_back(OutLoadChains[i]);
9480 }
9481
9482 // Chain for all loads.
9483 SDValue LoadToken = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
9484 GluedLoadChains);
9485
9486 for (unsigned i = From; i < To; ++i) {
9487 StoreSDNode *ST = dyn_cast<StoreSDNode>(OutStoreChains[i]);
9488 SDValue NewStore = DAG.getTruncStore(LoadToken, dl, ST->getValue(),
9489 ST->getBasePtr(), ST->getMemoryVT(),
9490 ST->getMemOperand());
9491 OutChains.push_back(NewStore);
9492 }
9493}
9494
9495static SDValue
9497 SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign,
9498 Align SrcAlign, bool isVol, bool AlwaysInline,
9499 MachinePointerInfo DstPtrInfo,
9500 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo,
9501 BatchAAResults *BatchAA, const MDNode *DstMemCacheHint,
9502 const MDNode *SrcMemCacheHint) {
9503 // Turn a memcpy of undef to nop.
9504 // FIXME: We need to honor volatile even is Src is undef.
9505 if (Src.isUndef())
9506 return Chain;
9507
9508 // Expand memcpy to a series of load and store ops if the size operand falls
9509 // below a certain threshold.
9510 // TODO: In the AlwaysInline case, if the size is big then generate a loop
9511 // rather than maybe a humongous number of loads and stores.
9512 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9513 const DataLayout &DL = DAG.getDataLayout();
9514 LLVMContext &C = *DAG.getContext();
9515 std::vector<EVT> MemOps;
9516 bool DstAlignCanChange = false;
9518 MachineFrameInfo &MFI = MF.getFrameInfo();
9519 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9521 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9522 DstAlignCanChange = true;
9523 SrcAlign = std::max(SrcAlign, DAG.InferPtrAlign(Src).valueOrOne());
9525 // If marked as volatile, perform a copy even when marked as constant.
9526 bool CopyFromConstant = !isVol && isMemSrcFromConstant(Src, Slice);
9527 bool isZeroConstant = CopyFromConstant && Slice.Array == nullptr;
9528 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemcpy(OptSize);
9529 const MemOp Op = isZeroConstant
9530 ? MemOp::Set(Size, DstAlignCanChange, DstAlign,
9531 /*IsZeroMemset*/ true, isVol)
9532 : MemOp::Copy(Size, DstAlignCanChange, DstAlign,
9533 SrcAlign, isVol, CopyFromConstant);
9534 if (!TLI.findOptimalMemOpLowering(
9535 C, MemOps, Limit, Op, DstPtrInfo.getAddrSpace(),
9536 SrcPtrInfo.getAddrSpace(), MF.getFunction().getAttributes(), nullptr))
9537 return SDValue();
9538
9539 if (DstAlignCanChange) {
9540 Type *Ty = MemOps[0].getTypeForEVT(C);
9541 Align NewDstAlign = DL.getABITypeAlign(Ty);
9542
9543 // Don't promote to an alignment that would require dynamic stack
9544 // realignment which may conflict with optimizations such as tail call
9545 // optimization.
9547 if (!TRI->hasStackRealignment(MF))
9548 if (MaybeAlign StackAlign = DL.getStackAlignment())
9549 NewDstAlign = std::min(NewDstAlign, *StackAlign);
9550
9551 if (NewDstAlign > DstAlign) {
9552 // Give the stack frame object a larger alignment if needed.
9553 if (MFI.getObjectAlign(FI->getIndex()) < NewDstAlign)
9554 MFI.setObjectAlignment(FI->getIndex(), NewDstAlign);
9555 DstAlign = NewDstAlign;
9556 }
9557 }
9558
9559 // Prepare AAInfo for loads/stores after lowering this memcpy.
9560 AAMDNodes NewAAInfo = AAInfo;
9561 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9562
9563 const Value *SrcVal = dyn_cast_if_present<const Value *>(SrcPtrInfo.V);
9564 bool isConstant =
9565 BatchAA && SrcVal &&
9566 BatchAA->pointsToConstantMemory(MemoryLocation(SrcVal, Size, AAInfo));
9567
9568 MachineMemOperand::Flags MMOFlags =
9570 SmallVector<SDValue, 16> OutLoadChains;
9571 SmallVector<SDValue, 16> OutStoreChains;
9572 SmallVector<SDValue, 32> OutChains;
9573 unsigned NumMemOps = MemOps.size();
9574 uint64_t SrcOff = 0, DstOff = 0;
9575 for (unsigned i = 0; i != NumMemOps; ++i) {
9576 EVT VT = MemOps[i];
9577 unsigned VTSize = VT.getSizeInBits() / 8;
9579
9580 if (VTSize > Size) {
9581 // Issuing an unaligned load / store pair that overlaps with the previous
9582 // pair. Adjust the offset accordingly.
9583 assert(i == NumMemOps-1 && i != 0);
9584 SrcOff -= VTSize - Size;
9585 DstOff -= VTSize - Size;
9586 }
9587
9588 if (CopyFromConstant &&
9589 (isZeroConstant || (VT.isInteger() && !VT.isVector()))) {
9590 // It's unlikely a store of a vector immediate can be done in a single
9591 // instruction. It would require a load from a constantpool first.
9592 // We only handle zero vectors here.
9593 // FIXME: Handle other cases where store of vector immediate is done in
9594 // a single instruction.
9595 ConstantDataArraySlice SubSlice;
9596 if (SrcOff < Slice.Length) {
9597 SubSlice = Slice;
9598 SubSlice.move(SrcOff);
9599 } else {
9600 // This is an out-of-bounds access and hence UB. Pretend we read zero.
9601 SubSlice.Array = nullptr;
9602 SubSlice.Offset = 0;
9603 SubSlice.Length = VTSize;
9604 }
9605 Value = getMemsetStringVal(VT, dl, DAG, TLI, SubSlice);
9606 if (Value.getNode()) {
9607 Store = DAG.getStore(
9608 Chain, dl, Value,
9609 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9610 DstPtrInfo.getWithOffset(DstOff), DstAlign, MMOFlags,
9611 MMOMetadata(NewAAInfo, /*Ranges=*/nullptr, DstMemCacheHint));
9612 OutChains.push_back(Store);
9613 }
9614 }
9615
9616 if (!Store.getNode()) {
9617 // The type might not be legal for the target. This should only happen
9618 // if the type is smaller than a legal type, as on PPC, so the right
9619 // thing to do is generate a LoadExt/StoreTrunc pair. These simplify
9620 // to Load/Store if NVT==VT.
9621 // FIXME does the case above also need this?
9622 EVT NVT = TLI.getTypeToTransformTo(C, VT);
9623 assert(NVT.bitsGE(VT));
9624
9625 bool isDereferenceable =
9626 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9627 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9628 if (isDereferenceable)
9630 if (isConstant)
9631 SrcMMOFlags |= MachineMemOperand::MOInvariant;
9632
9633 Value = DAG.getExtLoad(
9634 ISD::EXTLOAD, dl, NVT, Chain,
9635 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9636 SrcPtrInfo.getWithOffset(SrcOff), VT,
9637 commonAlignment(SrcAlign, SrcOff), SrcMMOFlags,
9638 MMOMetadata(NewAAInfo, /*Ranges=*/nullptr, SrcMemCacheHint));
9639 OutLoadChains.push_back(Value.getValue(1));
9640
9641 Store = DAG.getTruncStore(
9642 Chain, dl, Value,
9643 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9644 DstPtrInfo.getWithOffset(DstOff), VT, DstAlign, MMOFlags,
9645 MMOMetadata(NewAAInfo, /*Ranges=*/nullptr, DstMemCacheHint));
9646 OutStoreChains.push_back(Store);
9647 }
9648 SrcOff += VTSize;
9649 DstOff += VTSize;
9650 Size -= VTSize;
9651 }
9652
9653 unsigned GluedLdStLimit = MaxLdStGlue == 0 ?
9655 unsigned NumLdStInMemcpy = OutStoreChains.size();
9656
9657 if (NumLdStInMemcpy) {
9658 // It may be that memcpy might be converted to memset if it's memcpy
9659 // of constants. In such a case, we won't have loads and stores, but
9660 // just stores. In the absence of loads, there is nothing to gang up.
9661 if ((GluedLdStLimit <= 1) || !EnableMemCpyDAGOpt) {
9662 // If target does not care, just leave as it.
9663 for (unsigned i = 0; i < NumLdStInMemcpy; ++i) {
9664 OutChains.push_back(OutLoadChains[i]);
9665 OutChains.push_back(OutStoreChains[i]);
9666 }
9667 } else {
9668 // Ld/St less than/equal limit set by target.
9669 if (NumLdStInMemcpy <= GluedLdStLimit) {
9670 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, 0,
9671 NumLdStInMemcpy, OutLoadChains,
9672 OutStoreChains);
9673 } else {
9674 unsigned NumberLdChain = NumLdStInMemcpy / GluedLdStLimit;
9675 unsigned RemainingLdStInMemcpy = NumLdStInMemcpy % GluedLdStLimit;
9676 unsigned GlueIter = 0;
9677
9678 // Residual ld/st.
9679 if (RemainingLdStInMemcpy) {
9681 DAG, dl, OutChains, NumLdStInMemcpy - RemainingLdStInMemcpy,
9682 NumLdStInMemcpy, OutLoadChains, OutStoreChains);
9683 }
9684
9685 for (unsigned cnt = 0; cnt < NumberLdChain; ++cnt) {
9686 unsigned IndexFrom = NumLdStInMemcpy - RemainingLdStInMemcpy -
9687 GlueIter - GluedLdStLimit;
9688 unsigned IndexTo = NumLdStInMemcpy - RemainingLdStInMemcpy - GlueIter;
9689 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, IndexFrom, IndexTo,
9690 OutLoadChains, OutStoreChains);
9691 GlueIter += GluedLdStLimit;
9692 }
9693 }
9694 }
9695 }
9696 return DAG.getTokenFactor(dl, OutChains);
9697}
9698
9700 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
9701 uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol,
9702 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9703 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo) {
9704 // Turn a memmove of undef to nop.
9705 // FIXME: We need to honor volatile even is Src is undef.
9706 if (Src.isUndef())
9707 return Chain;
9708
9709 // Expand memmove to a series of load and store ops if the size operand falls
9710 // below a certain threshold.
9711 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9712 const DataLayout &DL = DAG.getDataLayout();
9713 LLVMContext &C = *DAG.getContext();
9714 std::vector<EVT> MemOps;
9715 bool DstAlignCanChange = false;
9717 MachineFrameInfo &MFI = MF.getFrameInfo();
9718 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9720 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9721 DstAlignCanChange = true;
9722 SrcAlign = std::max(SrcAlign, DAG.InferPtrAlign(Src).valueOrOne());
9723 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemmove(OptSize);
9724 if (!TLI.findOptimalMemOpLowering(
9725 C, MemOps, Limit,
9726 MemOp::Move(Size, DstAlignCanChange, DstAlign, SrcAlign, isVol),
9727 DstPtrInfo.getAddrSpace(), SrcPtrInfo.getAddrSpace(),
9728 MF.getFunction().getAttributes(), nullptr))
9729 return SDValue();
9730
9731 if (DstAlignCanChange) {
9732 Type *Ty = MemOps[0].getTypeForEVT(C);
9733 Align NewDstAlign = DL.getABITypeAlign(Ty);
9734
9735 // Don't promote to an alignment that would require dynamic stack
9736 // realignment which may conflict with optimizations such as tail call
9737 // optimization.
9739 if (!TRI->hasStackRealignment(MF))
9740 if (MaybeAlign StackAlign = DL.getStackAlignment())
9741 NewDstAlign = std::min(NewDstAlign, *StackAlign);
9742
9743 if (NewDstAlign > DstAlign) {
9744 // Give the stack frame object a larger alignment if needed.
9745 if (MFI.getObjectAlign(FI->getIndex()) < NewDstAlign)
9746 MFI.setObjectAlignment(FI->getIndex(), NewDstAlign);
9747 DstAlign = NewDstAlign;
9748 }
9749 }
9750
9751 // Prepare AAInfo for loads/stores after lowering this memmove.
9752 AAMDNodes NewAAInfo = AAInfo;
9753 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9754
9755 MachineMemOperand::Flags MMOFlags =
9757 uint64_t SrcOff = 0;
9758 SmallVector<SDValue, 8> LoadValues;
9759 SmallVector<SDValue, 8> LoadChains;
9760 SmallVector<SDValue, 8> OutChains;
9761 unsigned NumMemOps = MemOps.size();
9762 for (unsigned i = 0; i < NumMemOps; i++) {
9763 EVT VT = MemOps[i];
9764 unsigned VTSize = VT.getSizeInBits() / 8;
9765 SDValue Value;
9766 bool IsOverlapping = false;
9767
9768 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - SrcOff) {
9769 // Issuing an unaligned load / store pair that overlaps with the previous
9770 // pair. Adjust the offset accordingly.
9771 SrcOff = Size - VTSize;
9772 IsOverlapping = true;
9773 }
9774
9775 // Calculate the actual alignment at the current offset. The alignment at
9776 // SrcOff may be lower than the base alignment, especially when using
9777 // overlapping loads.
9778 Align SrcAlignAtOffset = commonAlignment(SrcAlign, SrcOff);
9779 if (IsOverlapping) {
9780 // Verify that the target allows misaligned memory accesses at the
9781 // adjusted offset when using overlapping loads.
9782 unsigned Fast;
9783 if (!TLI.allowsMisalignedMemoryAccesses(VT, SrcPtrInfo.getAddrSpace(),
9784 SrcAlignAtOffset, MMOFlags,
9785 &Fast) ||
9786 !Fast) {
9787 // This should have been caught by findOptimalMemOpLowering, but verify
9788 // here for safety.
9789 return SDValue();
9790 }
9791 }
9792
9793 bool isDereferenceable =
9794 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9795 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9796 if (isDereferenceable)
9798 Value =
9799 DAG.getLoad(VT, dl, Chain,
9800 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9801 SrcPtrInfo.getWithOffset(SrcOff), SrcAlignAtOffset,
9802 SrcMMOFlags, NewAAInfo);
9803 LoadValues.push_back(Value);
9804 LoadChains.push_back(Value.getValue(1));
9805 SrcOff += VTSize;
9806 }
9807 Chain = DAG.getTokenFactor(dl, LoadChains);
9808 OutChains.clear();
9809 uint64_t DstOff = 0;
9810 for (unsigned i = 0; i < NumMemOps; i++) {
9811 EVT VT = MemOps[i];
9812 unsigned VTSize = VT.getSizeInBits() / 8;
9813 SDValue Store;
9814 bool IsOverlapping = false;
9815
9816 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - DstOff) {
9817 // Issuing an unaligned load / store pair that overlaps with the previous
9818 // pair. Adjust the offset accordingly.
9819 DstOff = Size - VTSize;
9820 IsOverlapping = true;
9821 }
9822
9823 // Calculate the actual alignment at the current offset. The alignment at
9824 // DstOff may be lower than the base alignment, especially when using
9825 // overlapping stores.
9826 Align DstAlignAtOffset = commonAlignment(DstAlign, DstOff);
9827 if (IsOverlapping) {
9828 // Verify that the target allows misaligned memory accesses at the
9829 // adjusted offset when using overlapping stores.
9830 unsigned Fast;
9831 if (!TLI.allowsMisalignedMemoryAccesses(VT, DstPtrInfo.getAddrSpace(),
9832 DstAlignAtOffset, MMOFlags,
9833 &Fast) ||
9834 !Fast) {
9835 // This should have been caught by findOptimalMemOpLowering, but verify
9836 // here for safety.
9837 return SDValue();
9838 }
9839 }
9840 Store = DAG.getStore(
9841 Chain, dl, LoadValues[i],
9842 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9843 DstPtrInfo.getWithOffset(DstOff), DstAlignAtOffset, MMOFlags,
9844 NewAAInfo);
9845 OutChains.push_back(Store);
9846 DstOff += VTSize;
9847 }
9848
9849 return DAG.getTokenFactor(dl, OutChains);
9850}
9851
9852/// Lower the call to 'memset' intrinsic function into a series of store
9853/// operations.
9854///
9855/// \param DAG Selection DAG where lowered code is placed.
9856/// \param dl Link to corresponding IR location.
9857/// \param Chain Control flow dependency.
9858/// \param Dst Pointer to destination memory location.
9859/// \param Src Value of byte to write into the memory.
9860/// \param Size Number of bytes to write.
9861/// \param Alignment Alignment of the destination in bytes.
9862/// \param isVol True if destination is volatile.
9863/// \param AlwaysInline Makes sure no function call is generated.
9864/// \param DstPtrInfo IR information on the memory pointer.
9865/// \returns New head in the control flow, if lowering was successful, empty
9866/// SDValue otherwise.
9867///
9868/// The function tries to replace 'llvm.memset' intrinsic with several store
9869/// operations and value calculation code. This is usually profitable for small
9870/// memory size or when the semantic requires inlining.
9872 SDValue Chain, SDValue Dst, SDValue Src,
9873 uint64_t Size, Align Alignment, bool isVol,
9874 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9875 const AAMDNodes &AAInfo) {
9876 // Turn a memset of undef to nop.
9877 // FIXME: We need to honor volatile even is Src is undef.
9878 if (Src.isUndef())
9879 return Chain;
9880
9881 // Expand memset to a series of load/store ops if the size operand
9882 // falls below a certain threshold.
9883 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9884 std::vector<EVT> MemOps;
9885 bool DstAlignCanChange = false;
9886 LLVMContext &C = *DAG.getContext();
9888 MachineFrameInfo &MFI = MF.getFrameInfo();
9889 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9891 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9892 DstAlignCanChange = true;
9893 bool IsZeroVal = isNullConstant(Src);
9894 unsigned Limit = AlwaysInline ? ~0 : TLI.getMaxStoresPerMemset(OptSize);
9895
9896 EVT LargestVT;
9897 if (!TLI.findOptimalMemOpLowering(
9898 C, MemOps, Limit,
9899 MemOp::Set(Size, DstAlignCanChange, Alignment, IsZeroVal, isVol),
9900 DstPtrInfo.getAddrSpace(), ~0u, MF.getFunction().getAttributes(),
9901 &LargestVT))
9902 return SDValue();
9903
9904 if (DstAlignCanChange) {
9905 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext());
9906 const DataLayout &DL = DAG.getDataLayout();
9907 Align NewAlign = DL.getABITypeAlign(Ty);
9908
9909 // Don't promote to an alignment that would require dynamic stack
9910 // realignment which may conflict with optimizations such as tail call
9911 // optimization.
9913 if (!TRI->hasStackRealignment(MF))
9914 if (MaybeAlign StackAlign = DL.getStackAlignment())
9915 NewAlign = std::min(NewAlign, *StackAlign);
9916
9917 if (NewAlign > Alignment) {
9918 // Give the stack frame object a larger alignment if needed.
9919 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
9920 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
9921 Alignment = NewAlign;
9922 }
9923 }
9924
9925 SmallVector<SDValue, 8> OutChains;
9926 uint64_t DstOff = 0;
9927 unsigned NumMemOps = MemOps.size();
9928
9929 // Find the largest store and generate the bit pattern for it.
9930 // If target didn't set LargestVT, compute it from MemOps.
9931 if (!LargestVT.isSimple()) {
9932 LargestVT = MemOps[0];
9933 for (unsigned i = 1; i < NumMemOps; i++)
9934 if (MemOps[i].bitsGT(LargestVT))
9935 LargestVT = MemOps[i];
9936 }
9937 SDValue MemSetValue = getMemsetValue(Src, LargestVT, DAG, dl);
9938
9939 // Prepare AAInfo for loads/stores after lowering this memset.
9940 AAMDNodes NewAAInfo = AAInfo;
9941 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9942
9943 for (unsigned i = 0; i < NumMemOps; i++) {
9944 EVT VT = MemOps[i];
9945 unsigned VTSize = VT.getSizeInBits() / 8;
9946 // The target should specify store types that exactly cover the memset size
9947 // (with the last store potentially being oversized for overlapping stores).
9948 assert(Size > 0 && "Target specified more stores than needed in "
9949 "findOptimalMemOpLowering");
9950 if (VTSize > Size) {
9951 // Issuing an unaligned load / store pair that overlaps with the previous
9952 // pair. Adjust the offset accordingly.
9953 assert(i == NumMemOps-1 && i != 0);
9954 DstOff -= VTSize - Size;
9955 }
9956
9957 // If this store is smaller than the largest store see whether we can get
9958 // the smaller value for free with a truncate or extract vector element and
9959 // then store.
9960 SDValue Value = MemSetValue;
9961 if (VT.bitsLT(LargestVT)) {
9962 unsigned Index;
9963 unsigned NElts = LargestVT.getSizeInBits() / VT.getSizeInBits();
9964 EVT SVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(), NElts);
9965 if (!LargestVT.isVector() && !VT.isVector() &&
9966 TLI.isTruncateFree(LargestVT, VT))
9967 Value = DAG.getNode(ISD::TRUNCATE, dl, VT, MemSetValue);
9968 else if (LargestVT.isVector() && !VT.isVector() &&
9970 LargestVT.getTypeForEVT(*DAG.getContext()),
9971 VT.getSizeInBits(), Index) &&
9972 TLI.isTypeLegal(SVT) &&
9973 LargestVT.getSizeInBits() == SVT.getSizeInBits()) {
9974 // Target which can combine store(extractelement VectorTy, Idx) can get
9975 // the smaller value for free.
9976 SDValue TailValue = DAG.getNode(ISD::BITCAST, dl, SVT, MemSetValue);
9977 Value = DAG.getExtractVectorElt(dl, VT, TailValue, Index);
9978 } else
9979 Value = getMemsetValue(Src, VT, DAG, dl);
9980 }
9981 assert(Value.getValueType() == VT && "Value with wrong type.");
9982 SDValue Store = DAG.getStore(
9983 Chain, dl, Value,
9984 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9985 DstPtrInfo.getWithOffset(DstOff), Alignment,
9987 NewAAInfo);
9988 OutChains.push_back(Store);
9989 DstOff += VT.getSizeInBits() / 8;
9990 // For oversized overlapping stores, only subtract the remaining bytes.
9991 // For normal stores, subtract the full store size.
9992 if (VTSize > Size) {
9993 Size = 0;
9994 } else {
9995 Size -= VTSize;
9996 }
9997 }
9998
9999 // After processing all stores, Size should be exactly 0. Any remaining bytes
10000 // indicate a bug in the target's findOptimalMemOpLowering implementation.
10001 assert(Size == 0 && "Target's findOptimalMemOpLowering did not specify "
10002 "stores that exactly cover the memset size");
10003
10004 return DAG.getTokenFactor(dl, OutChains);
10005}
10006
10008 const DataLayout &DL, unsigned AS) {
10009 // Lowering memcpy / memset / memmove intrinsics to calls is only valid if all
10010 // pointer operands can be losslessly bitcasted to pointers of address space 0
10011 if (AS != 0 && !TLI->getTargetMachine().isNoopAddrSpaceCast(DL, AS, 0)) {
10012 report_fatal_error("cannot lower memory intrinsic in address space " +
10013 Twine(AS));
10014 }
10015}
10016
10018 const SelectionDAG *SelDAG,
10019 bool AllowReturnsFirstArg) {
10020 if (!CI || !CI->isTailCall())
10021 return false;
10022 // TODO: Fix "returns-first-arg" determination so it doesn't depend on which
10023 // helper symbol we lower to.
10024 return isInTailCallPosition(*CI, SelDAG->getTarget(),
10025 AllowReturnsFirstArg &&
10027}
10028
10029static std::pair<SDValue, SDValue>
10032 const CallInst *CI, RTLIB::Libcall Call,
10033 SelectionDAG *DAG, const TargetLowering *TLI) {
10034 RTLIB::LibcallImpl LCImpl = DAG->getLibcalls().getLibcallImpl(Call);
10035
10036 if (LCImpl == RTLIB::Unsupported)
10037 return {};
10038
10040 bool IsTailCall =
10041 isInTailCallPositionWrapper(CI, DAG, /*AllowReturnsFirstArg=*/true) &&
10042 // Lowering doesn't support tail calling inside a function with
10043 // a swifterror argument yet.
10044 !DAG->hasSwiftErrorArg();
10045 SDValue Callee =
10046 DAG->getExternalSymbol(LCImpl, TLI->getPointerTy(DAG->getDataLayout()));
10047
10048 CLI.setDebugLoc(dl)
10049 .setChain(Chain)
10051 CI->getType(), Callee, std::move(Args))
10052 .setTailCall(IsTailCall);
10053
10054 return TLI->LowerCallTo(CLI);
10055}
10056
10057std::pair<SDValue, SDValue> SelectionDAG::getStrcmp(SDValue Chain,
10058 const SDLoc &dl, SDValue S1,
10059 SDValue S2,
10060 const CallInst *CI) {
10062 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
10063 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10064 RTLIB::STRCMP, this, TLI);
10065}
10066
10067std::pair<SDValue, SDValue> SelectionDAG::getStrstr(SDValue Chain,
10068 const SDLoc &dl, SDValue S1,
10069 SDValue S2,
10070 const CallInst *CI) {
10072 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
10073 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10074 RTLIB::STRSTR, this, TLI);
10075}
10076
10077std::pair<SDValue, SDValue> SelectionDAG::getMemccpy(SDValue Chain,
10078 const SDLoc &dl,
10079 SDValue Dst, SDValue Src,
10081 const CallInst *CI) {
10083
10085 {Dst, PT},
10086 {Src, PT},
10089 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10090 RTLIB::MEMCCPY, this, TLI);
10091}
10092
10093std::pair<SDValue, SDValue>
10095 SDValue Mem1, SDValue Size, const CallInst *CI) {
10098 {Mem0, PT},
10099 {Mem1, PT},
10101 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10102 RTLIB::MEMCMP, this, TLI);
10103}
10104
10105std::pair<SDValue, SDValue> SelectionDAG::getStrcpy(SDValue Chain,
10106 const SDLoc &dl,
10107 SDValue Dst, SDValue Src,
10108 const CallInst *CI) {
10110 TargetLowering::ArgListTy Args = {{Dst, PT}, {Src, PT}};
10111 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10112 RTLIB::STRCPY, this, TLI);
10113}
10114
10115std::pair<SDValue, SDValue> SelectionDAG::getStrlen(SDValue Chain,
10116 const SDLoc &dl,
10117 SDValue Src,
10118 const CallInst *CI) {
10119 // Emit a library call.
10122 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10123 RTLIB::STRLEN, this, TLI);
10124}
10125
10127 return TLI->supportSwiftError() &&
10128 MF->getFunction().getAttributes().hasAttrSomewhere(
10129 Attribute::SwiftError);
10130}
10131
10133 SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size,
10134 Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline,
10135 const CallInst *CI, std::optional<bool> OverrideTailCall,
10136 MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo,
10137 const AAMDNodes &AAInfo, BatchAAResults *BatchAA) {
10138 // Check to see if we should lower the memcpy to loads and stores first.
10139 // For cases within the target-specified limits, this is the best choice.
10140 const MDNode *DstMemCacheHint =
10141 CI ? getMemCacheHintMetadata(*CI, /*OperandNo=*/0) : nullptr;
10142 const MDNode *SrcMemCacheHint =
10143 CI ? getMemCacheHintMetadata(*CI, /*OperandNo=*/1) : nullptr;
10144
10146 if (ConstantSize) {
10147 // Memcpy with size zero? Just return the original chain.
10148 if (ConstantSize->isZero())
10149 return Chain;
10150
10152 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10153 SrcAlign, isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA,
10154 DstMemCacheHint, SrcMemCacheHint);
10155 if (Result.getNode())
10156 return Result;
10157 }
10158
10159 // Then check to see if we should lower the memcpy with target-specific
10160 // code. If the target chooses to do this, this is the next best.
10161 if (TSI) {
10162 SDValue Result = TSI->EmitTargetCodeForMemcpy(
10163 *this, dl, Chain, Dst, Src, Size, DstAlign, SrcAlign, isVol,
10164 AlwaysInline, DstPtrInfo, SrcPtrInfo);
10165 if (Result.getNode())
10166 return Result;
10167 }
10168
10169 // If we really need inline code and the target declined to provide it,
10170 // use a (potentially long) sequence of loads and stores.
10171 if (AlwaysInline) {
10172 assert(ConstantSize && "AlwaysInline requires a constant size!");
10174 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10175 SrcAlign, isVol, true, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA,
10176 DstMemCacheHint, SrcMemCacheHint);
10177 }
10178
10180 DstPtrInfo.getAddrSpace());
10182 SrcPtrInfo.getAddrSpace());
10183
10184 // FIXME: If the memcpy is volatile (isVol), lowering it to a plain libc
10185 // memcpy is not guaranteed to be safe. libc memcpys aren't required to
10186 // respect volatile, so they may do things like read or write memory
10187 // beyond the given memory regions. But fixing this isn't easy, and most
10188 // people don't care.
10189
10190 // Emit a library call.
10193 Args.emplace_back(Dst, PtrTy);
10194 Args.emplace_back(Src, PtrTy);
10195 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
10196 // FIXME: pass in SDLoc
10198 bool IsTailCall = false;
10199 RTLIB::LibcallImpl MemCpyImpl = TLI->getMemcpyImpl();
10200
10201 if (OverrideTailCall.has_value()) {
10202 IsTailCall = *OverrideTailCall;
10203 } else {
10204 bool LowersToMemcpy = MemCpyImpl == RTLIB::impl_memcpy;
10205 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemcpy);
10206 }
10207 // Lowering doesn't support tail calling inside a function with a
10208 // swifterror argument yet.
10209 IsTailCall &= !hasSwiftErrorArg();
10210
10211 CLI.setDebugLoc(dl)
10212 .setChain(Chain)
10213 .setLibCallee(
10214 Libcalls->getLibcallImplCallingConv(MemCpyImpl),
10215 Dst.getValueType().getTypeForEVT(*getContext()),
10216 getExternalSymbol(MemCpyImpl, TLI->getPointerTy(getDataLayout())),
10217 std::move(Args))
10219 .setTailCall(IsTailCall);
10220
10221 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
10222 return CallResult.second;
10223}
10224
10226 SDValue Dst, SDValue Src, SDValue Size,
10227 Type *SizeTy, unsigned ElemSz,
10228 bool isTailCall,
10229 MachinePointerInfo DstPtrInfo,
10230 MachinePointerInfo SrcPtrInfo) {
10231 // Lowering doesn't support tail calling inside a function with a
10232 // swifterror argument yet.
10233 isTailCall &= !hasSwiftErrorArg();
10234
10235 // Emit a library call.
10238 Args.emplace_back(Dst, ArgTy);
10239 Args.emplace_back(Src, ArgTy);
10240 Args.emplace_back(Size, SizeTy);
10241
10242 RTLIB::Libcall LibraryCall =
10244 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10245 if (LibcallImpl == RTLIB::Unsupported)
10246 report_fatal_error("Unsupported element size");
10247
10249 CLI.setDebugLoc(dl)
10250 .setChain(Chain)
10251 .setLibCallee(
10252 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10254 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10255 std::move(Args))
10257 .setTailCall(isTailCall);
10258
10259 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10260 return CallResult.second;
10261}
10262
10264 SDValue Src, SDValue Size, Align DstAlign,
10265 Align SrcAlign, bool isVol, const CallInst *CI,
10266 std::optional<bool> OverrideTailCall,
10267 MachinePointerInfo DstPtrInfo,
10268 MachinePointerInfo SrcPtrInfo,
10269 const AAMDNodes &AAInfo,
10270 BatchAAResults *BatchAA) {
10271 // Check to see if we should lower the memmove to loads and stores first.
10272 // For cases within the target-specified limits, this is the best choice.
10274 if (ConstantSize) {
10275 // Memmove with size zero? Just return the original chain.
10276 if (ConstantSize->isZero())
10277 return Chain;
10278
10280 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10281 SrcAlign, isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo);
10282 if (Result.getNode())
10283 return Result;
10284 }
10285
10286 // Then check to see if we should lower the memmove with target-specific
10287 // code. If the target chooses to do this, this is the next best.
10288 if (TSI) {
10289 SDValue Result = TSI->EmitTargetCodeForMemmove(
10290 *this, dl, Chain, Dst, Src, Size, DstAlign, SrcAlign, isVol, DstPtrInfo,
10291 SrcPtrInfo);
10292 if (Result.getNode())
10293 return Result;
10294 }
10295
10297 DstPtrInfo.getAddrSpace());
10299 SrcPtrInfo.getAddrSpace());
10300
10301 // FIXME: If the memmove is volatile, lowering it to plain libc memmove may
10302 // not be safe. See memcpy above for more details.
10303
10304 // Emit a library call.
10307 Args.emplace_back(Dst, PtrTy);
10308 Args.emplace_back(Src, PtrTy);
10309 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
10310 // FIXME: pass in SDLoc
10312
10313 RTLIB::LibcallImpl MemmoveImpl = Libcalls->getLibcallImpl(RTLIB::MEMMOVE);
10314
10315 bool IsTailCall = false;
10316 if (OverrideTailCall.has_value()) {
10317 IsTailCall = *OverrideTailCall;
10318 } else {
10319 bool LowersToMemmove = MemmoveImpl == RTLIB::impl_memmove;
10320 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemmove);
10321 }
10322 // Lowering doesn't support tail calling inside a function with a
10323 // swifterror argument yet.
10324 IsTailCall &= !hasSwiftErrorArg();
10325
10326 CLI.setDebugLoc(dl)
10327 .setChain(Chain)
10328 .setLibCallee(
10329 Libcalls->getLibcallImplCallingConv(MemmoveImpl),
10330 Dst.getValueType().getTypeForEVT(*getContext()),
10331 getExternalSymbol(MemmoveImpl, TLI->getPointerTy(getDataLayout())),
10332 std::move(Args))
10334 .setTailCall(IsTailCall);
10335
10336 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
10337 return CallResult.second;
10338}
10339
10341 SDValue Dst, SDValue Src, SDValue Size,
10342 Type *SizeTy, unsigned ElemSz,
10343 bool isTailCall,
10344 MachinePointerInfo DstPtrInfo,
10345 MachinePointerInfo SrcPtrInfo) {
10346 // Lowering doesn't support tail calling inside a function with a
10347 // swifterror argument yet.
10348 isTailCall &= !hasSwiftErrorArg();
10349
10350 // Emit a library call.
10353 Args.emplace_back(Dst, IntPtrTy);
10354 Args.emplace_back(Src, IntPtrTy);
10355 Args.emplace_back(Size, SizeTy);
10356
10357 RTLIB::Libcall LibraryCall =
10359 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10360 if (LibcallImpl == RTLIB::Unsupported)
10361 report_fatal_error("Unsupported element size");
10362
10364 CLI.setDebugLoc(dl)
10365 .setChain(Chain)
10366 .setLibCallee(
10367 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10369 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10370 std::move(Args))
10372 .setTailCall(isTailCall);
10373
10374 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10375 return CallResult.second;
10376}
10377
10379 SDValue Src, SDValue Size, Align Alignment,
10380 bool isVol, bool AlwaysInline,
10381 const CallInst *CI,
10382 MachinePointerInfo DstPtrInfo,
10383 const AAMDNodes &AAInfo) {
10384 // Check to see if we should lower the memset to stores first.
10385 // For cases within the target-specified limits, this is the best choice.
10387 if (ConstantSize) {
10388 // Memset with size zero? Just return the original chain.
10389 if (ConstantSize->isZero())
10390 return Chain;
10391
10392 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10393 ConstantSize->getZExtValue(), Alignment,
10394 isVol, false, DstPtrInfo, AAInfo);
10395
10396 if (Result.getNode())
10397 return Result;
10398 }
10399
10400 // Then check to see if we should lower the memset with target-specific
10401 // code. If the target chooses to do this, this is the next best.
10402 if (TSI) {
10403 SDValue Result = TSI->EmitTargetCodeForMemset(
10404 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline, DstPtrInfo);
10405 if (Result.getNode())
10406 return Result;
10407 }
10408
10409 // If we really need inline code and the target declined to provide it,
10410 // use a (potentially long) sequence of loads and stores.
10411 if (AlwaysInline) {
10412 assert(ConstantSize && "AlwaysInline requires a constant size!");
10413 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10414 ConstantSize->getZExtValue(), Alignment,
10415 isVol, true, DstPtrInfo, AAInfo);
10416 assert(Result &&
10417 "getMemsetStores must return a valid sequence when AlwaysInline");
10418 return Result;
10419 }
10420
10422 DstPtrInfo.getAddrSpace());
10423
10424 // Emit a library call.
10425 auto &Ctx = *getContext();
10426 const auto& DL = getDataLayout();
10427
10429 // FIXME: pass in SDLoc
10430 CLI.setDebugLoc(dl).setChain(Chain);
10431
10432 RTLIB::LibcallImpl BzeroImpl = Libcalls->getLibcallImpl(RTLIB::BZERO);
10433 bool UseBZero = BzeroImpl != RTLIB::Unsupported && isNullConstant(Src);
10434
10435 // If zeroing out and bzero is present, use it.
10436 if (UseBZero) {
10438 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10439 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10440 CLI.setLibCallee(
10441 Libcalls->getLibcallImplCallingConv(BzeroImpl), Type::getVoidTy(Ctx),
10442 getExternalSymbol(BzeroImpl, TLI->getPointerTy(DL)), std::move(Args));
10443 } else {
10444 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10445
10447 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10448 Args.emplace_back(Src, Src.getValueType().getTypeForEVT(Ctx));
10449 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10450 CLI.setLibCallee(Libcalls->getLibcallImplCallingConv(MemsetImpl),
10451 Dst.getValueType().getTypeForEVT(Ctx),
10452 getExternalSymbol(MemsetImpl, TLI->getPointerTy(DL)),
10453 std::move(Args));
10454 }
10455
10456 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10457 bool LowersToMemset = MemsetImpl == RTLIB::impl_memset;
10458
10459 // If we're going to use bzero, make sure not to tail call unless the
10460 // subsequent return doesn't need a value, as bzero doesn't return the first
10461 // arg unlike memset.
10462 bool ReturnsFirstArg = CI && funcReturnsFirstArgOfCall(*CI) && !UseBZero;
10463 bool IsTailCall = CI && CI->isTailCall() &&
10465 ReturnsFirstArg && LowersToMemset) &&
10466 // Lowering doesn't support tail calling inside a function
10467 // with a swifterror argument yet.
10469 CLI.setDiscardResult().setTailCall(IsTailCall);
10470
10471 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10472 return CallResult.second;
10473}
10474
10477 Type *SizeTy, unsigned ElemSz,
10478 bool isTailCall,
10479 MachinePointerInfo DstPtrInfo) {
10480 // Lowering doesn't support tail calling inside a function with a
10481 // swifterror argument yet.
10482 isTailCall &= !hasSwiftErrorArg();
10483
10484 // Emit a library call.
10486 Args.emplace_back(Dst, getDataLayout().getIntPtrType(*getContext()));
10487 Args.emplace_back(Value, Type::getInt8Ty(*getContext()));
10488 Args.emplace_back(Size, SizeTy);
10489
10490 RTLIB::Libcall LibraryCall =
10492 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10493 if (LibcallImpl == RTLIB::Unsupported)
10494 report_fatal_error("Unsupported element size");
10495
10497 CLI.setDebugLoc(dl)
10498 .setChain(Chain)
10499 .setLibCallee(
10500 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10502 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10503 std::move(Args))
10505 .setTailCall(isTailCall);
10506
10507 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10508 return CallResult.second;
10509}
10510
10511SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10513 MachineMemOperand *MMO,
10514 ISD::LoadExtType ExtType) {
10515 SDNodeKey ID(Opcode, VTList, Ops);
10516 ID.AddInteger(MemVT.getRawBits());
10517 ID.AddInteger(getSyntheticNodeSubclassData<AtomicSDNode>(
10518 dl.getIROrder(), Opcode, VTList, MemVT, MMO, ExtType));
10519 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10520 ID.AddInteger(MMO->getFlags());
10521 FoldingSetInsertToken InsertToken;
10522 if (auto *E = cast_or_null<AtomicSDNode>(lookupNode(ID, dl, InsertToken))) {
10523 E->refineAlignment(MMO);
10524 E->refineMMOMetadata(MMO);
10525 return SDValue(E, 0);
10526 }
10527
10528 auto *N = newSDNode<AtomicSDNode>(dl.getIROrder(), dl.getDebugLoc(), Opcode,
10529 VTList, MemVT, MMO, ExtType);
10530 createOperands(N, Ops);
10531
10532 CSEMap.insert(N, InsertToken);
10533 InsertNode(N);
10534 SDValue V(N, 0);
10535 NewSDValueDbgMsg(V, "Creating new node: ", this);
10536 return V;
10537}
10538
10540 EVT MemVT, SDVTList VTs, SDValue Chain,
10541 SDValue Ptr, SDValue Cmp, SDValue Swp,
10542 MachineMemOperand *MMO) {
10543 assert(Opcode == ISD::ATOMIC_CMP_SWAP ||
10545 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types");
10546
10547 SDValue Ops[] = {Chain, Ptr, Cmp, Swp};
10548 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10549}
10550
10551SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10552 SDValue Chain, SDValue Ptr, SDValue Val,
10553 MachineMemOperand *MMO) {
10554 assert((Opcode == ISD::ATOMIC_LOAD_ADD || Opcode == ISD::ATOMIC_LOAD_SUB ||
10555 Opcode == ISD::ATOMIC_LOAD_AND || Opcode == ISD::ATOMIC_LOAD_CLR ||
10556 Opcode == ISD::ATOMIC_LOAD_OR || Opcode == ISD::ATOMIC_LOAD_XOR ||
10557 Opcode == ISD::ATOMIC_LOAD_NAND || Opcode == ISD::ATOMIC_LOAD_MIN ||
10558 Opcode == ISD::ATOMIC_LOAD_MAX || Opcode == ISD::ATOMIC_LOAD_UMIN ||
10559 Opcode == ISD::ATOMIC_LOAD_UMAX || Opcode == ISD::ATOMIC_LOAD_FADD ||
10560 Opcode == ISD::ATOMIC_LOAD_FSUB || Opcode == ISD::ATOMIC_LOAD_FMAX ||
10561 Opcode == ISD::ATOMIC_LOAD_FMIN ||
10562 Opcode == ISD::ATOMIC_LOAD_FMINIMUM ||
10563 Opcode == ISD::ATOMIC_LOAD_FMAXIMUM ||
10564 Opcode == ISD::ATOMIC_LOAD_UINC_WRAP ||
10565 Opcode == ISD::ATOMIC_LOAD_UDEC_WRAP ||
10566 Opcode == ISD::ATOMIC_LOAD_USUB_COND ||
10567 Opcode == ISD::ATOMIC_LOAD_USUB_SAT || Opcode == ISD::ATOMIC_SWAP ||
10568 Opcode == ISD::ATOMIC_STORE) &&
10569 "Invalid Atomic Op");
10570
10571 EVT VT = Val.getValueType();
10572
10573 SDVTList VTs = Opcode == ISD::ATOMIC_STORE ? getVTList(MVT::Other) :
10574 getVTList(VT, MVT::Other);
10575 SDValue Ops[] = {Chain, Ptr, Val};
10576 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10577}
10578
10580 EVT MemVT, EVT VT, SDValue Chain,
10581 SDValue Ptr, MachineMemOperand *MMO) {
10582 SDVTList VTs = getVTList(VT, MVT::Other);
10583 SDValue Ops[] = {Chain, Ptr};
10584 return getAtomic(ISD::ATOMIC_LOAD, dl, MemVT, VTs, Ops, MMO, ExtType);
10585}
10586
10587/// getMergeValues - Create a MERGE_VALUES node from the given operands.
10589 if (Ops.size() == 1)
10590 return Ops[0];
10591
10593 VTs.reserve(Ops.size());
10594 for (const SDValue &Op : Ops)
10595 VTs.push_back(Op.getValueType());
10596 return getNode(ISD::MERGE_VALUES, dl, getVTList(VTs), Ops);
10597}
10598
10600 SDValue Chain, const SDLoc &dl) {
10601 SmallVector<SDValue, 4> RetValues;
10602 RetValues.reserve(ResultTypes.size());
10603 for (EVT VT : ResultTypes)
10604 RetValues.push_back(VT == MVT::Other ? Chain : getPOISON(VT));
10605 return getMergeValues(RetValues, dl);
10606}
10607
10609 unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef<SDValue> Ops,
10610 EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment,
10612 const AAMDNodes &AAInfo) {
10613 if (Size.hasValue() && !Size.getValue())
10615
10617 MachineMemOperand *MMO =
10618 MF.getMachineMemOperand(PtrInfo, Flags, Size, Alignment, AAInfo);
10619
10620 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, MMO);
10621}
10622
10624 SDVTList VTList,
10625 ArrayRef<SDValue> Ops, EVT MemVT,
10626 MachineMemOperand *MMO) {
10627 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, ArrayRef(MMO));
10628}
10629
10631 SDVTList VTList,
10632 ArrayRef<SDValue> Ops, EVT MemVT,
10634 assert(!MMOs.empty() && "Must have at least one MMO");
10635 assert(
10636 (Opcode == ISD::INTRINSIC_VOID || Opcode == ISD::INTRINSIC_W_CHAIN ||
10637 Opcode == ISD::PREFETCH ||
10638 (Opcode <= (unsigned)std::numeric_limits<int>::max() &&
10639 Opcode >= ISD::BUILTIN_OP_END && TSI->isTargetMemoryOpcode(Opcode))) &&
10640 "Opcode is not a memory-accessing opcode!");
10641
10643 if (MMOs.size() == 1) {
10644 MemRefs = MMOs[0];
10645 } else {
10646 // Allocate: [size_t count][MMO*][MMO*]...
10647 size_t AllocSize =
10648 sizeof(size_t) + MMOs.size() * sizeof(MachineMemOperand *);
10649 void *Buffer = Allocator.Allocate(AllocSize, alignof(size_t));
10650 size_t *CountPtr = static_cast<size_t *>(Buffer);
10651 *CountPtr = MMOs.size();
10652 MachineMemOperand **Array =
10653 reinterpret_cast<MachineMemOperand **>(CountPtr + 1);
10654 llvm::copy(MMOs, Array);
10655 MemRefs = Array;
10656 }
10657
10658 // Memoize the node unless it returns a glue result.
10660 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
10661 SDNodeKey ID(Opcode, VTList, Ops);
10662 ID.AddInteger(getSyntheticNodeSubclassData<MemIntrinsicSDNode>(
10663 Opcode, dl.getIROrder(), VTList, MemVT, MemRefs));
10664 ID.AddInteger(MemVT.getRawBits());
10665 for (const MachineMemOperand *MMO : MMOs) {
10666 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10667 ID.AddInteger(MMO->getFlags());
10668 }
10669 FoldingSetInsertToken InsertToken;
10670 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
10671 cast<MemIntrinsicSDNode>(E)->refineAlignment(MMOs);
10672 return SDValue(E, 0);
10673 }
10674
10675 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10676 VTList, MemVT, MemRefs);
10677 createOperands(N, Ops);
10678 CSEMap.insert(N, InsertToken);
10679 } else {
10680 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10681 VTList, MemVT, MemRefs);
10682 createOperands(N, Ops);
10683 }
10684 InsertNode(N);
10685 SDValue V(N, 0);
10686 NewSDValueDbgMsg(V, "Creating new node: ", this);
10687 return V;
10688}
10689
10691 SDValue Chain, int FrameIndex) {
10692 const unsigned Opcode = IsStart ? ISD::LIFETIME_START : ISD::LIFETIME_END;
10693 const auto VTs = getVTList(MVT::Other);
10694 SDValue Ops[2] = {
10695 Chain,
10696 getFrameIndex(FrameIndex,
10697 getTargetLoweringInfo().getFrameIndexTy(getDataLayout()),
10698 true)};
10699
10700 SDNodeKey ID(Opcode, VTs, Ops);
10701 FoldingSetInsertToken InsertToken;
10702 if (SDNode *E = lookupNode(ID, dl, InsertToken))
10703 return SDValue(E, 0);
10704
10705 LifetimeSDNode *N =
10706 newSDNode<LifetimeSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), VTs);
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
10716 uint64_t Guid, uint64_t Index,
10717 uint32_t Attr) {
10718 const unsigned Opcode = ISD::PSEUDO_PROBE;
10719 const auto VTs = getVTList(MVT::Other);
10720 SDValue Ops[] = {Chain};
10721 SDNodeKey ID(Opcode, VTs, Ops);
10722 ID.AddInteger(Guid);
10723 ID.AddInteger(Index);
10724 ID.AddInteger(Attr);
10725 FoldingSetInsertToken InsertToken;
10726 if (SDNode *E = lookupNode(ID, Dl, InsertToken))
10727 return SDValue(E, 0);
10728
10729 auto *N = newSDNode<PseudoProbeSDNode>(
10730 Opcode, Dl.getIROrder(), Dl.getDebugLoc(), VTs, Guid, Index, Attr);
10731 createOperands(N, Ops);
10732 CSEMap.insert(N, InsertToken);
10733 InsertNode(N);
10734 SDValue V(N, 0);
10735 NewSDValueDbgMsg(V, "Creating new node: ", this);
10736 return V;
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 int64_t Offset = 0) {
10746 // If this is FI+Offset, we can model it.
10747 if (const FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr))
10749 FI->getIndex(), Offset);
10750
10751 // If this is (FI+Offset1)+Offset2, we can model it.
10752 if (Ptr.getOpcode() != ISD::ADD ||
10755 return Info;
10756
10757 int FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
10759 DAG.getMachineFunction(), FI,
10760 Offset + cast<ConstantSDNode>(Ptr.getOperand(1))->getSExtValue());
10761}
10762
10763/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10764/// MachinePointerInfo record from it. This is particularly useful because the
10765/// code generator has many cases where it doesn't bother passing in a
10766/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10768 SelectionDAG &DAG, SDValue Ptr,
10769 SDValue OffsetOp) {
10770 // If the 'Offset' value isn't a constant, we can't handle this.
10772 return InferPointerInfo(Info, DAG, Ptr, OffsetNode->getSExtValue());
10773 if (OffsetOp.isUndef())
10774 return InferPointerInfo(Info, DAG, Ptr);
10775 return Info;
10776}
10777
10779 EVT VT, const SDLoc &dl, SDValue Chain,
10780 SDValue Ptr, SDValue Offset,
10781 MachinePointerInfo PtrInfo, EVT MemVT,
10782 Align Alignment,
10783 MachineMemOperand::Flags MMOFlags,
10784 const MMOMetadata &Metadata) {
10785 assert(Chain.getValueType() == MVT::Other &&
10786 "Invalid chain type");
10787
10788 MMOFlags |= MachineMemOperand::MOLoad;
10789 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10790 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10791 // clients.
10792 if (PtrInfo.V.isNull())
10793 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10794
10795 TypeSize Size = MemVT.getStoreSize();
10797 MachineMemOperand *MMO =
10798 MF.getMachineMemOperand(PtrInfo, MMOFlags, Size, Alignment, Metadata);
10799 return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO);
10800}
10801
10803 EVT VT, const SDLoc &dl, SDValue Chain,
10804 SDValue Ptr, SDValue Offset, EVT MemVT,
10805 MachineMemOperand *MMO) {
10806 if (VT == MemVT) {
10807 ExtType = ISD::NON_EXTLOAD;
10808 } else if (ExtType == ISD::NON_EXTLOAD) {
10809 assert(VT == MemVT && "Non-extending load from different memory type!");
10810 } else {
10811 // Extending load.
10812 assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) &&
10813 "Should only be an extending load, not truncating!");
10814 assert(VT.isInteger() == MemVT.isInteger() &&
10815 "Cannot convert from FP to Int or Int -> FP!");
10816 assert(VT.isVector() == MemVT.isVector() &&
10817 "Cannot use an ext load to convert to or from a vector!");
10818 assert((!VT.isVector() ||
10820 "Cannot use an ext load to change the number of vector elements!");
10821 }
10822
10823 assert((!MMO->getRanges() ||
10825 ->getBitWidth() == MemVT.getScalarSizeInBits() &&
10826 MemVT.isInteger())) &&
10827 "Range metadata and load type must match!");
10828
10829 bool Indexed = AM != ISD::UNINDEXED;
10830 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
10831 "Unindexed load with an offset!");
10832
10833 SDVTList VTs = Indexed ?
10834 getVTList(VT, Ptr.getValueType(), MVT::Other) : getVTList(VT, MVT::Other);
10835 SDValue Ops[] = { Chain, Ptr, Offset };
10836 SDNodeKey ID(ISD::LOAD, VTs, Ops);
10837 ID.AddInteger(MemVT.getRawBits());
10838 ID.AddInteger(getSyntheticNodeSubclassData<LoadSDNode>(
10839 dl.getIROrder(), VTs, AM, ExtType, MemVT, MMO));
10840 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10841 ID.AddInteger(MMO->getFlags());
10842 FoldingSetInsertToken InsertToken;
10843 if (auto *E = cast_or_null<LoadSDNode>(lookupNode(ID, dl, InsertToken))) {
10844 E->refineAlignment(MMO);
10845 E->refineMMOMetadata(MMO);
10846 return SDValue(E, 0);
10847 }
10848 auto *N = newSDNode<LoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10849 ExtType, MemVT, MMO);
10850 createOperands(N, Ops);
10851
10852 CSEMap.insert(N, InsertToken);
10853 InsertNode(N);
10854 SDValue V(N, 0);
10855 NewSDValueDbgMsg(V, "Creating new node: ", this);
10856 return V;
10857}
10858
10860 SDValue Ptr, MachinePointerInfo PtrInfo,
10861 MaybeAlign Alignment,
10862 MachineMemOperand::Flags MMOFlags,
10863 const MMOMetadata &Metadata) {
10865 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10866 PtrInfo, VT, Alignment, MMOFlags, Metadata);
10867}
10868
10870 SDValue Ptr, MachineMemOperand *MMO) {
10872 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10873 VT, MMO);
10874}
10875
10877 EVT VT, SDValue Chain, SDValue Ptr,
10878 MachinePointerInfo PtrInfo, EVT MemVT,
10879 MaybeAlign Alignment,
10880 MachineMemOperand::Flags MMOFlags,
10881 const MMOMetadata &Metadata) {
10883 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, PtrInfo,
10884 MemVT, Alignment, MMOFlags, Metadata);
10885}
10886
10888 EVT VT, SDValue Chain, SDValue Ptr, EVT MemVT,
10889 MachineMemOperand *MMO) {
10891 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef,
10892 MemVT, MMO);
10893}
10894
10898 LoadSDNode *LD = cast<LoadSDNode>(OrigLoad);
10899 assert(LD->getOffset().getOpcode() == ISD::POISON &&
10900 "Load is already a indexed load!");
10901 // Don't propagate the invariant or dereferenceable flags.
10902 auto MMOFlags =
10903 LD->getMemOperand()->getFlags() &
10905 return getLoad(
10906 AM, LD->getExtensionType(), OrigLoad.getValueType(), dl, LD->getChain(),
10907 Base, Offset, LD->getPointerInfo(), LD->getMemoryVT(), LD->getAlign(),
10908 MMOFlags,
10909 MMOMetadata(LD->getAAInfo(), LD->getRanges(), LD->getMemCacheHint()));
10910}
10911
10913 SDValue Ptr, MachinePointerInfo PtrInfo,
10914 Align Alignment,
10915 MachineMemOperand::Flags MMOFlags,
10916 const MMOMetadata &Metadata) {
10917 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10918
10919 MMOFlags |= MachineMemOperand::MOStore;
10920 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10921 assert(!Metadata.Ranges && "range metadata is invalid for stores");
10922
10923 if (PtrInfo.V.isNull())
10924 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10925
10928 MachineMemOperand *MMO =
10929 MF.getMachineMemOperand(PtrInfo, MMOFlags, Size, Alignment, Metadata);
10930 return getStore(Chain, dl, Val, Ptr, MMO);
10931}
10932
10934 SDValue Ptr, MachineMemOperand *MMO) {
10936 return getStore(Chain, dl, Val, Ptr, Undef, Val.getValueType(), MMO,
10938}
10939
10941 SDValue Ptr, SDValue Offset, EVT SVT,
10943 bool IsTruncating) {
10944 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10945 EVT VT = Val.getValueType();
10946 if (VT == SVT) {
10947 IsTruncating = false;
10948 } else if (!IsTruncating) {
10949 assert(VT == SVT && "No-truncating store from different memory type!");
10950 } else {
10952 "Should only be a truncating store, not extending!");
10953 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
10954 assert(VT.isVector() == SVT.isVector() &&
10955 "Cannot use trunc store to convert to or from a vector!");
10956 assert((!VT.isVector() ||
10958 "Cannot use trunc store to change the number of vector elements!");
10959 }
10960
10961 bool Indexed = AM != ISD::UNINDEXED;
10962 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
10963 "Unindexed store with an offset!");
10964 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10965 : getVTList(MVT::Other);
10966 SDValue Ops[] = {Chain, Val, Ptr, Offset};
10967 SDNodeKey ID(ISD::STORE, VTs, Ops);
10968 ID.AddInteger(SVT.getRawBits());
10969 ID.AddInteger(getSyntheticNodeSubclassData<StoreSDNode>(
10970 dl.getIROrder(), VTs, AM, IsTruncating, SVT, MMO));
10971 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10972 ID.AddInteger(MMO->getFlags());
10973 FoldingSetInsertToken InsertToken;
10974 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
10975 cast<StoreSDNode>(E)->refineAlignment(MMO);
10976 cast<StoreSDNode>(E)->refineMMOMetadata(MMO);
10977 return SDValue(E, 0);
10978 }
10979 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10980 IsTruncating, SVT, MMO);
10981 createOperands(N, Ops);
10982
10983 CSEMap.insert(N, InsertToken);
10984 InsertNode(N);
10985 SDValue V(N, 0);
10986 NewSDValueDbgMsg(V, "Creating new node: ", this);
10987 return V;
10988}
10989
10991 SDValue Ptr, SDValue Offset,
10992 MachinePointerInfo PtrInfo, EVT SVT,
10993 Align Alignment,
10994 MachineMemOperand::Flags MMOFlags,
10995 const MMOMetadata &Metadata) {
10996 assert(Chain.getValueType() == MVT::Other &&
10997 "Invalid chain type");
10998
10999 MMOFlags |= MachineMemOperand::MOStore;
11000 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
11001 assert(!Metadata.Ranges && "range metadata is invalid for stores");
11002
11003 if (PtrInfo.V.isNull())
11004 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
11005
11007 MachineMemOperand *MMO = MF.getMachineMemOperand(
11008 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, Metadata);
11009 return getTruncStore(Chain, dl, Val, Ptr, Offset, SVT, MMO);
11010}
11011
11013 SDValue Ptr, MachinePointerInfo PtrInfo,
11014 EVT SVT, Align Alignment,
11015 MachineMemOperand::Flags MMOFlags,
11016 const MMOMetadata &Metadata) {
11017 return getTruncStore(Chain, dl, Val, Ptr, getPOISON(Ptr.getValueType()),
11018 PtrInfo, SVT, Alignment, MMOFlags, Metadata);
11019}
11020
11022 SDValue Ptr, SDValue Offset, EVT SVT,
11023 MachineMemOperand *MMO) {
11024 return getStore(Chain, dl, Val, Ptr, Offset, SVT, MMO, ISD::UNINDEXED, true);
11025}
11026
11028 SDValue Ptr, EVT SVT,
11029 MachineMemOperand *MMO) {
11030 return getStore(Chain, dl, Val, Ptr, getPOISON(Ptr.getValueType()), SVT, MMO,
11031 ISD::UNINDEXED, true);
11032}
11033
11037 StoreSDNode *ST = cast<StoreSDNode>(OrigStore);
11038 assert(ST->getOffset().getOpcode() == ISD::POISON &&
11039 "Store is already a indexed store!");
11040 return getStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
11041 ST->getMemoryVT(), ST->getMemOperand(), AM,
11042 ST->isTruncatingStore());
11043}
11044
11046 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl,
11047 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL,
11048 MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment,
11049 MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo,
11050 const MDNode *Ranges, bool IsExpanding) {
11051 MMOFlags |= MachineMemOperand::MOLoad;
11052 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
11053 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
11054 // clients.
11055 if (PtrInfo.V.isNull())
11056 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
11057
11058 TypeSize Size = MemVT.getStoreSize();
11060 MachineMemOperand *MMO = MF.getMachineMemOperand(
11061 PtrInfo, MMOFlags, Size, Alignment, MMOMetadata(AAInfo, Ranges));
11062 return getLoadVP(AM, ExtType, VT, dl, Chain, Ptr, Offset, Mask, EVL, MemVT,
11063 MMO, IsExpanding);
11064}
11065
11067 ISD::LoadExtType ExtType, EVT VT,
11068 const SDLoc &dl, SDValue Chain, SDValue Ptr,
11069 SDValue Offset, SDValue Mask, SDValue EVL,
11070 EVT MemVT, MachineMemOperand *MMO,
11071 bool IsExpanding) {
11072 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11073 assert(Mask.getValueType().getVectorElementCount() ==
11074 VT.getVectorElementCount() &&
11075 "Vector width mismatch between mask and data");
11076
11077 bool Indexed = AM != ISD::UNINDEXED;
11078 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11079 "Unindexed load with an offset!");
11080
11081 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
11082 : getVTList(VT, MVT::Other);
11083 SDValue Ops[] = {Chain, Ptr, Offset, Mask, EVL};
11084 SDNodeKey ID(ISD::VP_LOAD, VTs, Ops);
11085 ID.AddInteger(MemVT.getRawBits());
11086 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadSDNode>(
11087 dl.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
11088 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11089 ID.AddInteger(MMO->getFlags());
11090 FoldingSetInsertToken InsertToken;
11091 if (auto *E = cast_or_null<VPLoadSDNode>(lookupNode(ID, dl, InsertToken))) {
11092 E->refineAlignment(MMO);
11093 E->refineMMOMetadata(MMO);
11094 return SDValue(E, 0);
11095 }
11096 auto *N = newSDNode<VPLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11097 ExtType, IsExpanding, MemVT, MMO);
11098 createOperands(N, Ops);
11099
11100 CSEMap.insert(N, InsertToken);
11101 InsertNode(N);
11102 SDValue V(N, 0);
11103 NewSDValueDbgMsg(V, "Creating new node: ", this);
11104 return V;
11105}
11106
11108 SDValue Ptr, SDValue Mask, SDValue EVL,
11109 MachinePointerInfo PtrInfo,
11110 MaybeAlign Alignment,
11111 MachineMemOperand::Flags MMOFlags,
11112 const AAMDNodes &AAInfo, const MDNode *Ranges,
11113 bool IsExpanding) {
11115 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
11116 Mask, EVL, PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges,
11117 IsExpanding);
11118}
11119
11121 SDValue Ptr, SDValue Mask, SDValue EVL,
11122 MachineMemOperand *MMO, bool IsExpanding) {
11124 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
11125 Mask, EVL, VT, MMO, IsExpanding);
11126}
11127
11129 EVT VT, SDValue Chain, SDValue Ptr,
11130 SDValue Mask, SDValue EVL,
11131 MachinePointerInfo PtrInfo, EVT MemVT,
11132 MaybeAlign Alignment,
11133 MachineMemOperand::Flags MMOFlags,
11134 const AAMDNodes &AAInfo, bool IsExpanding) {
11136 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
11137 EVL, PtrInfo, MemVT, Alignment, MMOFlags, AAInfo, nullptr,
11138 IsExpanding);
11139}
11140
11142 EVT VT, SDValue Chain, SDValue Ptr,
11143 SDValue Mask, SDValue EVL, EVT MemVT,
11144 MachineMemOperand *MMO, bool IsExpanding) {
11146 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
11147 EVL, MemVT, MMO, IsExpanding);
11148}
11149
11151 SDValue Ptr, SDValue Offset, SDValue Mask,
11152 SDValue EVL, EVT MemVT, MachineMemOperand *MMO,
11153 ISD::MemIndexedMode AM, bool IsTruncating,
11154 bool IsCompressing) {
11155 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11156 assert(Mask.getValueType().getVectorElementCount() ==
11158 "Vector width mismatch between mask and data");
11159
11160 bool Indexed = AM != ISD::UNINDEXED;
11161 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11162 "Unindexed vp_store with an offset!");
11163 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
11164 : getVTList(MVT::Other);
11165 SDValue Ops[] = {Chain, Val, Ptr, Offset, Mask, EVL};
11166 SDNodeKey ID(ISD::VP_STORE, VTs, Ops);
11167 ID.AddInteger(MemVT.getRawBits());
11168 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
11169 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11170 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11171 ID.AddInteger(MMO->getFlags());
11172 FoldingSetInsertToken InsertToken;
11173 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11174 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
11175 return SDValue(E, 0);
11176 }
11177 auto *N = newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11178 IsTruncating, IsCompressing, MemVT, MMO);
11179 createOperands(N, Ops);
11180
11181 CSEMap.insert(N, InsertToken);
11182 InsertNode(N);
11183 SDValue V(N, 0);
11184 NewSDValueDbgMsg(V, "Creating new node: ", this);
11185 return V;
11186}
11187
11189 SDValue Val, SDValue Ptr, SDValue Mask,
11190 SDValue EVL, MachinePointerInfo PtrInfo,
11191 EVT SVT, Align Alignment,
11192 MachineMemOperand::Flags MMOFlags,
11193 const AAMDNodes &AAInfo,
11194 bool IsCompressing) {
11195 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11196
11197 MMOFlags |= MachineMemOperand::MOStore;
11198 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
11199
11200 if (PtrInfo.V.isNull())
11201 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
11202
11204 MachineMemOperand *MMO = MF.getMachineMemOperand(
11205 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
11206 return getTruncStoreVP(Chain, dl, Val, Ptr, Mask, EVL, SVT, MMO,
11207 IsCompressing);
11208}
11209
11211 SDValue Val, SDValue Ptr, SDValue Mask,
11212 SDValue EVL, EVT SVT,
11213 MachineMemOperand *MMO,
11214 bool IsCompressing) {
11215 EVT VT = Val.getValueType();
11216
11217 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11218 if (VT == SVT)
11219 return getStoreVP(Chain, dl, Val, Ptr, getPOISON(Ptr.getValueType()), Mask,
11220 EVL, VT, MMO, ISD::UNINDEXED,
11221 /*IsTruncating*/ false, IsCompressing);
11222
11224 "Should only be a truncating store, not extending!");
11225 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
11226 assert(VT.isVector() == SVT.isVector() &&
11227 "Cannot use trunc store to convert to or from a vector!");
11228 assert((!VT.isVector() ||
11230 "Cannot use trunc store to change the number of vector elements!");
11231
11232 SDVTList VTs = getVTList(MVT::Other);
11234 SDValue Ops[] = {Chain, Val, Ptr, Undef, Mask, EVL};
11235 SDNodeKey ID(ISD::VP_STORE, VTs, Ops);
11236 ID.AddInteger(SVT.getRawBits());
11237 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
11238 dl.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
11239 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11240 ID.AddInteger(MMO->getFlags());
11241 FoldingSetInsertToken InsertToken;
11242 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11243 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
11244 return SDValue(E, 0);
11245 }
11246 auto *N =
11247 newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11248 ISD::UNINDEXED, true, IsCompressing, SVT, MMO);
11249 createOperands(N, Ops);
11250
11251 CSEMap.insert(N, InsertToken);
11252 InsertNode(N);
11253 SDValue V(N, 0);
11254 NewSDValueDbgMsg(V, "Creating new node: ", this);
11255 return V;
11256}
11257
11259 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL,
11260 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask,
11261 SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding) {
11262 bool Indexed = AM != ISD::UNINDEXED;
11263 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11264 "Unindexed load with an offset!");
11265
11266 SDValue Ops[] = {Chain, Ptr, Offset, Stride, Mask, EVL};
11267 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
11268 : getVTList(VT, MVT::Other);
11269 SDNodeKey ID(ISD::EXPERIMENTAL_VP_STRIDED_LOAD, VTs, Ops);
11270 ID.AddInteger(MemVT.getRawBits());
11271 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedLoadSDNode>(
11272 DL.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
11273 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11274
11275 FoldingSetInsertToken InsertToken;
11276 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
11277 cast<VPStridedLoadSDNode>(E)->refineAlignment(MMO);
11278 return SDValue(E, 0);
11279 }
11280
11281 auto *N =
11282 newSDNode<VPStridedLoadSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, AM,
11283 ExtType, IsExpanding, MemVT, MMO);
11284 createOperands(N, Ops);
11285 CSEMap.insert(N, InsertToken);
11286 InsertNode(N);
11287 SDValue V(N, 0);
11288 NewSDValueDbgMsg(V, "Creating new node: ", this);
11289 return V;
11290}
11291
11293 SDValue Ptr, SDValue Stride,
11294 SDValue Mask, SDValue EVL,
11295 MachineMemOperand *MMO,
11296 bool IsExpanding) {
11298 return getStridedLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, DL, Chain, Ptr,
11299 Undef, Stride, Mask, EVL, VT, MMO, IsExpanding);
11300}
11301
11303 ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain,
11304 SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT,
11305 MachineMemOperand *MMO, bool IsExpanding) {
11307 return getStridedLoadVP(ISD::UNINDEXED, ExtType, VT, DL, Chain, Ptr, Undef,
11308 Stride, Mask, EVL, MemVT, MMO, IsExpanding);
11309}
11310
11312 SDValue Val, SDValue Ptr,
11313 SDValue Offset, SDValue Stride,
11314 SDValue Mask, SDValue EVL, EVT MemVT,
11315 MachineMemOperand *MMO,
11317 bool IsTruncating, bool IsCompressing) {
11318 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11319 bool Indexed = AM != ISD::UNINDEXED;
11320 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11321 "Unindexed vp_store with an offset!");
11322 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
11323 : getVTList(MVT::Other);
11324 SDValue Ops[] = {Chain, Val, Ptr, Offset, Stride, Mask, EVL};
11325 SDNodeKey ID(ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
11326 ID.AddInteger(MemVT.getRawBits());
11327 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
11328 DL.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11329 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11330 FoldingSetInsertToken InsertToken;
11331 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
11332 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
11333 return SDValue(E, 0);
11334 }
11335 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
11336 VTs, AM, IsTruncating,
11337 IsCompressing, MemVT, MMO);
11338 createOperands(N, Ops);
11339
11340 CSEMap.insert(N, InsertToken);
11341 InsertNode(N);
11342 SDValue V(N, 0);
11343 NewSDValueDbgMsg(V, "Creating new node: ", this);
11344 return V;
11345}
11346
11349 ISD::MemIndexType IndexType) {
11350 assert(Ops.size() == 6 && "Incompatible number of operands");
11351
11352 SDNodeKey ID(ISD::VP_GATHER, VTs, Ops);
11353 ID.AddInteger(VT.getRawBits());
11354 ID.AddInteger(getSyntheticNodeSubclassData<VPGatherSDNode>(
11355 dl.getIROrder(), VTs, VT, MMO, IndexType));
11356 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11357 ID.AddInteger(MMO->getFlags());
11358 FoldingSetInsertToken InsertToken;
11359 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11360 cast<VPGatherSDNode>(E)->refineAlignment(MMO);
11361 return SDValue(E, 0);
11362 }
11363
11364 auto *N = newSDNode<VPGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11365 VT, MMO, IndexType);
11366 createOperands(N, Ops);
11367
11368 assert(N->getMask().getValueType().getVectorElementCount() ==
11369 N->getValueType(0).getVectorElementCount() &&
11370 "Vector width mismatch between mask and data");
11371 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11372 N->getValueType(0).getVectorElementCount().isScalable() &&
11373 "Scalable flags of index and data do not match");
11375 N->getIndex().getValueType().getVectorElementCount(),
11376 N->getValueType(0).getVectorElementCount()) &&
11377 "Vector width mismatch between index and data");
11378 assert(isa<ConstantSDNode>(N->getScale()) &&
11379 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11380 "Scale should be a constant power of 2");
11381
11382 CSEMap.insert(N, InsertToken);
11383 InsertNode(N);
11384 SDValue V(N, 0);
11385 NewSDValueDbgMsg(V, "Creating new node: ", this);
11386 return V;
11387}
11388
11391 MachineMemOperand *MMO,
11392 ISD::MemIndexType IndexType) {
11393 assert(Ops.size() == 7 && "Incompatible number of operands");
11394
11395 SDNodeKey ID(ISD::VP_SCATTER, VTs, Ops);
11396 ID.AddInteger(VT.getRawBits());
11397 ID.AddInteger(getSyntheticNodeSubclassData<VPScatterSDNode>(
11398 dl.getIROrder(), VTs, VT, MMO, IndexType));
11399 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11400 ID.AddInteger(MMO->getFlags());
11401 FoldingSetInsertToken InsertToken;
11402 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11403 cast<VPScatterSDNode>(E)->refineAlignment(MMO);
11404 return SDValue(E, 0);
11405 }
11406 auto *N = newSDNode<VPScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11407 VT, MMO, IndexType);
11408 createOperands(N, Ops);
11409
11410 assert(N->getMask().getValueType().getVectorElementCount() ==
11411 N->getValue().getValueType().getVectorElementCount() &&
11412 "Vector width mismatch between mask and data");
11413 assert(
11414 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11415 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11416 "Scalable flags of index and data do not match");
11418 N->getIndex().getValueType().getVectorElementCount(),
11419 N->getValue().getValueType().getVectorElementCount()) &&
11420 "Vector width mismatch between index and data");
11421 assert(isa<ConstantSDNode>(N->getScale()) &&
11422 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11423 "Scale should be a constant power of 2");
11424
11425 CSEMap.insert(N, InsertToken);
11426 InsertNode(N);
11427 SDValue V(N, 0);
11428 NewSDValueDbgMsg(V, "Creating new node: ", this);
11429 return V;
11430}
11431
11434 SDValue PassThru, EVT MemVT,
11435 MachineMemOperand *MMO,
11437 ISD::LoadExtType ExtTy, bool isExpanding) {
11438 bool Indexed = AM != ISD::UNINDEXED;
11439 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11440 "Unindexed masked load with an offset!");
11441 SDVTList VTs = Indexed ? getVTList(VT, Base.getValueType(), MVT::Other)
11442 : getVTList(VT, MVT::Other);
11443 SDValue Ops[] = {Chain, Base, Offset, Mask, PassThru};
11444 SDNodeKey ID(ISD::MLOAD, VTs, Ops);
11445 ID.AddInteger(MemVT.getRawBits());
11446 ID.AddInteger(getSyntheticNodeSubclassData<MaskedLoadSDNode>(
11447 dl.getIROrder(), VTs, AM, ExtTy, isExpanding, MemVT, MMO));
11448 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11449 ID.AddInteger(MMO->getFlags());
11450 FoldingSetInsertToken InsertToken;
11451 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11452 cast<MaskedLoadSDNode>(E)->refineAlignment(MMO);
11453 return SDValue(E, 0);
11454 }
11455 auto *N = newSDNode<MaskedLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11456 AM, ExtTy, isExpanding, MemVT, MMO);
11457 createOperands(N, Ops);
11458
11459 CSEMap.insert(N, InsertToken);
11460 InsertNode(N);
11461 SDValue V(N, 0);
11462 NewSDValueDbgMsg(V, "Creating new node: ", this);
11463 return V;
11464}
11465
11470 assert(LD->getOffset().getOpcode() == ISD::POISON &&
11471 "Masked load is already a indexed load!");
11472 return getMaskedLoad(OrigLoad.getValueType(), dl, LD->getChain(), Base,
11473 Offset, LD->getMask(), LD->getPassThru(),
11474 LD->getMemoryVT(), LD->getMemOperand(), AM,
11475 LD->getExtensionType(), LD->isExpandingLoad());
11476}
11477
11480 SDValue Mask, EVT MemVT,
11481 MachineMemOperand *MMO,
11482 ISD::MemIndexedMode AM, bool IsTruncating,
11483 bool IsCompressing) {
11484 assert(Chain.getValueType() == MVT::Other &&
11485 "Invalid chain type");
11486 bool Indexed = AM != ISD::UNINDEXED;
11487 assert((Indexed || Offset.getOpcode() == ISD::POISON) &&
11488 "Unindexed masked store with an offset!");
11489 SDVTList VTs = Indexed ? getVTList(Base.getValueType(), MVT::Other)
11490 : getVTList(MVT::Other);
11491 SDValue Ops[] = {Chain, Val, Base, Offset, Mask};
11492 SDNodeKey ID(ISD::MSTORE, VTs, Ops);
11493 ID.AddInteger(MemVT.getRawBits());
11494 ID.AddInteger(getSyntheticNodeSubclassData<MaskedStoreSDNode>(
11495 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11496 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11497 ID.AddInteger(MMO->getFlags());
11498 FoldingSetInsertToken InsertToken;
11499 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11500 cast<MaskedStoreSDNode>(E)->refineAlignment(MMO);
11501 return SDValue(E, 0);
11502 }
11503 auto *N =
11504 newSDNode<MaskedStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11505 IsTruncating, IsCompressing, MemVT, MMO);
11506 createOperands(N, Ops);
11507
11508 CSEMap.insert(N, InsertToken);
11509 InsertNode(N);
11510 SDValue V(N, 0);
11511 NewSDValueDbgMsg(V, "Creating new node: ", this);
11512 return V;
11513}
11514
11519 assert(ST->getOffset().getOpcode() == ISD::POISON &&
11520 "Masked store is already a indexed store!");
11521 return getMaskedStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
11522 ST->getMask(), ST->getMemoryVT(), ST->getMemOperand(),
11523 AM, ST->isTruncatingStore(), ST->isCompressingStore());
11524}
11525
11528 MachineMemOperand *MMO,
11529 ISD::MemIndexType IndexType,
11530 ISD::LoadExtType ExtTy) {
11531 assert(Ops.size() == 6 && "Incompatible number of operands");
11532
11533 SDNodeKey ID(ISD::MGATHER, VTs, Ops);
11534 ID.AddInteger(MemVT.getRawBits());
11535 ID.AddInteger(getSyntheticNodeSubclassData<MaskedGatherSDNode>(
11536 dl.getIROrder(), VTs, MemVT, MMO, IndexType, ExtTy));
11537 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11538 ID.AddInteger(MMO->getFlags());
11539 FoldingSetInsertToken InsertToken;
11540 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11541 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11542 return SDValue(E, 0);
11543 }
11544
11545 auto *N = newSDNode<MaskedGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11546 VTs, MemVT, MMO, IndexType, ExtTy);
11547 createOperands(N, Ops);
11548
11549 assert(N->getPassThru().getValueType() == N->getValueType(0) &&
11550 "Incompatible type of the PassThru value in MaskedGatherSDNode");
11551 assert(N->getMask().getValueType().getVectorElementCount() ==
11552 N->getValueType(0).getVectorElementCount() &&
11553 "Vector width mismatch between mask and data");
11554 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11555 N->getValueType(0).getVectorElementCount().isScalable() &&
11556 "Scalable flags of index and data do not match");
11558 N->getIndex().getValueType().getVectorElementCount(),
11559 N->getValueType(0).getVectorElementCount()) &&
11560 "Vector width mismatch between index and data");
11561 assert(isa<ConstantSDNode>(N->getScale()) &&
11562 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11563 "Scale should be a constant power of 2");
11564
11565 CSEMap.insert(N, InsertToken);
11566 InsertNode(N);
11567 SDValue V(N, 0);
11568 NewSDValueDbgMsg(V, "Creating new node: ", this);
11569 return V;
11570}
11571
11574 MachineMemOperand *MMO,
11575 ISD::MemIndexType IndexType,
11576 bool IsTrunc) {
11577 assert(Ops.size() == 6 && "Incompatible number of operands");
11578
11579 SDNodeKey ID(ISD::MSCATTER, VTs, Ops);
11580 ID.AddInteger(MemVT.getRawBits());
11581 ID.AddInteger(getSyntheticNodeSubclassData<MaskedScatterSDNode>(
11582 dl.getIROrder(), VTs, MemVT, MMO, IndexType, IsTrunc));
11583 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11584 ID.AddInteger(MMO->getFlags());
11585 FoldingSetInsertToken InsertToken;
11586 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11587 cast<MaskedScatterSDNode>(E)->refineAlignment(MMO);
11588 return SDValue(E, 0);
11589 }
11590
11591 auto *N = newSDNode<MaskedScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11592 VTs, MemVT, MMO, IndexType, IsTrunc);
11593 createOperands(N, Ops);
11594
11595 assert(N->getMask().getValueType().getVectorElementCount() ==
11596 N->getValue().getValueType().getVectorElementCount() &&
11597 "Vector width mismatch between mask and data");
11598 assert(
11599 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11600 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11601 "Scalable flags of index and data do not match");
11603 N->getIndex().getValueType().getVectorElementCount(),
11604 N->getValue().getValueType().getVectorElementCount()) &&
11605 "Vector width mismatch between index and data");
11606 assert(isa<ConstantSDNode>(N->getScale()) &&
11607 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11608 "Scale should be a constant power of 2");
11609
11610 CSEMap.insert(N, InsertToken);
11611 InsertNode(N);
11612 SDValue V(N, 0);
11613 NewSDValueDbgMsg(V, "Creating new node: ", this);
11614 return V;
11615}
11616
11618 const SDLoc &dl, ArrayRef<SDValue> Ops,
11619 MachineMemOperand *MMO,
11620 ISD::MemIndexType IndexType) {
11621 assert(Ops.size() == 7 && "Incompatible number of operands");
11622
11624 ID.AddInteger(MemVT.getRawBits());
11625 ID.AddInteger(getSyntheticNodeSubclassData<MaskedHistogramSDNode>(
11626 dl.getIROrder(), VTs, MemVT, MMO, IndexType));
11627 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11628 ID.AddInteger(MMO->getFlags());
11629 FoldingSetInsertToken InsertToken;
11630 if (SDNode *E = lookupNode(ID, dl, InsertToken)) {
11631 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11632 return SDValue(E, 0);
11633 }
11634
11635 auto *N = newSDNode<MaskedHistogramSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11636 VTs, MemVT, MMO, IndexType);
11637 createOperands(N, Ops);
11638
11639 assert(N->getMask().getValueType().getVectorElementCount() ==
11640 N->getIndex().getValueType().getVectorElementCount() &&
11641 "Vector width mismatch between mask and data");
11642 assert(isa<ConstantSDNode>(N->getScale()) &&
11643 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11644 "Scale should be a constant power of 2");
11645 assert(N->getInc().getValueType().isInteger() && "Non integer update value");
11646
11647 CSEMap.insert(N, InsertToken);
11648 InsertNode(N);
11649 SDValue V(N, 0);
11650 NewSDValueDbgMsg(V, "Creating new node: ", this);
11651 return V;
11652}
11653
11655 SDValue Ptr, SDValue Mask, SDValue EVL,
11656 MachineMemOperand *MMO) {
11657 SDVTList VTs = getVTList(VT, EVL.getValueType(), MVT::Other);
11658 SDValue Ops[] = {Chain, Ptr, Mask, EVL};
11659 SDNodeKey ID(ISD::VP_LOAD_FF, VTs, Ops);
11660 ID.AddInteger(VT.getRawBits());
11661 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadFFSDNode>(DL.getIROrder(),
11662 VTs, VT, MMO));
11663 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11664 ID.AddInteger(MMO->getFlags());
11665 FoldingSetInsertToken InsertToken;
11666 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
11667 cast<VPLoadFFSDNode>(E)->refineAlignment(MMO);
11668 return SDValue(E, 0);
11669 }
11670 auto *N = newSDNode<VPLoadFFSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs,
11671 VT, MMO);
11672 createOperands(N, Ops);
11673
11674 CSEMap.insert(N, InsertToken);
11675 InsertNode(N);
11676 SDValue V(N, 0);
11677 NewSDValueDbgMsg(V, "Creating new node: ", this);
11678 return V;
11679}
11680
11682 EVT MemVT, MachineMemOperand *MMO) {
11683 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11684 SDVTList VTs = getVTList(MVT::Other);
11685 SDValue Ops[] = {Chain, Ptr};
11687 ID.AddInteger(MemVT.getRawBits());
11688 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11689 ISD::GET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11690 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11691 ID.AddInteger(MMO->getFlags());
11692 FoldingSetInsertToken InsertToken;
11693 if (SDNode *E = lookupNode(ID, dl, InsertToken))
11694 return SDValue(E, 0);
11695
11696 auto *N = newSDNode<FPStateAccessSDNode>(ISD::GET_FPENV_MEM, dl.getIROrder(),
11697 dl.getDebugLoc(), VTs, MemVT, MMO);
11698 createOperands(N, Ops);
11699
11700 CSEMap.insert(N, InsertToken);
11701 InsertNode(N);
11702 SDValue V(N, 0);
11703 NewSDValueDbgMsg(V, "Creating new node: ", this);
11704 return V;
11705}
11706
11708 EVT MemVT, MachineMemOperand *MMO) {
11709 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11710 SDVTList VTs = getVTList(MVT::Other);
11711 SDValue Ops[] = {Chain, Ptr};
11713 ID.AddInteger(MemVT.getRawBits());
11714 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11715 ISD::SET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11716 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11717 ID.AddInteger(MMO->getFlags());
11718 FoldingSetInsertToken InsertToken;
11719 if (SDNode *E = lookupNode(ID, dl, InsertToken))
11720 return SDValue(E, 0);
11721
11722 auto *N = newSDNode<FPStateAccessSDNode>(ISD::SET_FPENV_MEM, dl.getIROrder(),
11723 dl.getDebugLoc(), VTs, MemVT, MMO);
11724 createOperands(N, Ops);
11725
11726 CSEMap.insert(N, InsertToken);
11727 InsertNode(N);
11728 SDValue V(N, 0);
11729 NewSDValueDbgMsg(V, "Creating new node: ", this);
11730 return V;
11731}
11732
11734 // select undef, T, F --> T (if T is a constant), otherwise F
11735 // select, ?, undef, F --> F
11736 // select, ?, T, undef --> T
11737 if (Cond.isUndef())
11738 return isConstantValueOfAnyType(T) ? T : F;
11739 if (T.isUndef())
11741 if (F.isUndef())
11743
11744 // select true, T, F --> T
11745 // select false, T, F --> F
11746 if (auto C = isBoolConstant(Cond))
11747 return *C ? T : F;
11748
11749 // select ?, T, T --> T
11750 if (T == F)
11751 return T;
11752
11753 return SDValue();
11754}
11755
11757 // shift undef, Y --> 0 (can always assume that the undef value is 0)
11758 if (X.isUndef())
11759 return getConstant(0, SDLoc(X.getNode()), X.getValueType());
11760 // shift X, undef --> undef (because it may shift by the bitwidth)
11761 if (Y.isUndef())
11762 return getUNDEF(X.getValueType());
11763
11764 // shift 0, Y --> 0
11765 // shift X, 0 --> X
11767 return X;
11768
11769 // shift X, C >= bitwidth(X) --> undef
11770 // All vector elements must be too big (or undef) to avoid partial undefs.
11771 auto isShiftTooBig = [X](ConstantSDNode *Val) {
11772 return !Val || Val->getAPIntValue().uge(X.getScalarValueSizeInBits());
11773 };
11774 if (ISD::matchUnaryPredicate(Y, isShiftTooBig, true))
11775 return getUNDEF(X.getValueType());
11776
11777 // shift i1/vXi1 X, Y --> X (any non-zero shift amount is undefined).
11778 if (X.getValueType().getScalarType() == MVT::i1)
11779 return X;
11780
11781 return SDValue();
11782}
11783
11785 SDNodeFlags Flags) {
11786 // If this operation has 'nnan' or 'ninf' and at least 1 disallowed operand
11787 // (an undef operand can be chosen to be Nan/Inf), then the result of this
11788 // operation is poison. That result can be relaxed to undef.
11789 ConstantFPSDNode *XC = isConstOrConstSplatFP(X, /* AllowUndefs */ true);
11790 ConstantFPSDNode *YC = isConstOrConstSplatFP(Y, /* AllowUndefs */ true);
11791 bool HasNan = (XC && XC->getValueAPF().isNaN()) ||
11792 (YC && YC->getValueAPF().isNaN());
11793 bool HasInf = (XC && XC->getValueAPF().isInfinity()) ||
11794 (YC && YC->getValueAPF().isInfinity());
11795
11796 if (Flags.hasNoNaNs() && (HasNan || X.isUndef() || Y.isUndef()))
11797 return getUNDEF(X.getValueType());
11798
11799 if (Flags.hasNoInfs() && (HasInf || X.isUndef() || Y.isUndef()))
11800 return getUNDEF(X.getValueType());
11801
11802 if (!YC)
11803 return SDValue();
11804
11805 // X + -0.0 --> X
11806 if (Opcode == ISD::FADD)
11807 if (YC->getValueAPF().isNegZero())
11808 return X;
11809
11810 // X - +0.0 --> X
11811 if (Opcode == ISD::FSUB)
11812 if (YC->getValueAPF().isPosZero())
11813 return X;
11814
11815 // X * 1.0 --> X
11816 // X / 1.0 --> X
11817 if (Opcode == ISD::FMUL || Opcode == ISD::FDIV)
11818 if (YC->getValueAPF().isOne())
11819 return X;
11820
11821 // X * 0.0 --> 0.0
11822 if (Opcode == ISD::FMUL && Flags.hasNoNaNs() && Flags.hasNoSignedZeros())
11823 if (YC->getValueAPF().isZero())
11824 return getConstantFP(0.0, SDLoc(Y), Y.getValueType());
11825
11826 return SDValue();
11827}
11828
11830 SDValue Ptr, SDValue SV, unsigned Align) {
11831 SDValue Ops[] = { Chain, Ptr, SV, getTargetConstant(Align, dl, MVT::i32) };
11832 return getNode(ISD::VAARG, dl, getVTList(VT, MVT::Other), Ops);
11833}
11834
11835SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11837 switch (Ops.size()) {
11838 case 0: return getNode(Opcode, DL, VT);
11839 case 1: return getNode(Opcode, DL, VT, Ops[0].get());
11840 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]);
11841 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]);
11842 default: break;
11843 }
11844
11845 // Copy from an SDUse array into an SDValue array for use with
11846 // the regular getNode logic.
11848 return getNode(Opcode, DL, VT, NewOps);
11849}
11850
11851SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11853 SDNodeFlags Flags;
11854 if (Inserter)
11855 Flags = Inserter->getFlags();
11856 return getNode(Opcode, DL, VT, Ops, Flags);
11857}
11858
11859SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11860 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11861 unsigned NumOps = Ops.size();
11862 switch (NumOps) {
11863 case 0: return getNode(Opcode, DL, VT);
11864 case 1: return getNode(Opcode, DL, VT, Ops[0], Flags);
11865 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Flags);
11866 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2], Flags);
11867 default: break;
11868 }
11869
11870#ifndef NDEBUG
11871 for (const auto &Op : Ops)
11872 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11873 "Operand is DELETED_NODE!");
11874#endif
11875
11876 switch (Opcode) {
11877 default: break;
11878 case ISD::BUILD_VECTOR:
11879 // Attempt to simplify BUILD_VECTOR.
11880 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
11881 return V;
11882 break;
11884 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
11885 return V;
11886 break;
11887 case ISD::SELECT_CC:
11888 assert(NumOps == 5 && "SELECT_CC takes 5 operands!");
11889 assert(Ops[0].getValueType() == Ops[1].getValueType() &&
11890 "LHS and RHS of condition must have same type!");
11891 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11892 "True and False arms of SelectCC must have same type!");
11893 assert(Ops[2].getValueType() == VT &&
11894 "select_cc node must be of same type as true and false value!");
11895 assert((!Ops[0].getValueType().isVector() ||
11896 Ops[0].getValueType().getVectorElementCount() ==
11897 VT.getVectorElementCount()) &&
11898 "Expected select_cc with vector result to have the same sized "
11899 "comparison type!");
11900 break;
11901 case ISD::BR_CC:
11902 assert(NumOps == 5 && "BR_CC takes 5 operands!");
11903 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11904 "LHS/RHS of comparison should match types!");
11905 break;
11906 case ISD::VP_REDUCE_MUL:
11907 // If it is VP_REDUCE_MUL mask operation then turn it to VP_REDUCE_AND
11908 if (VT == MVT::i1)
11909 Opcode = ISD::VP_REDUCE_AND;
11910 break;
11911 case ISD::VP_REDUCE_ADD:
11912 // If it is VP_REDUCE_ADD mask operation then turn it to VP_REDUCE_XOR
11913 if (VT == MVT::i1)
11914 Opcode = ISD::VP_REDUCE_XOR;
11915 break;
11916 case ISD::VP_REDUCE_SMAX:
11917 case ISD::VP_REDUCE_UMIN:
11918 // If it is VP_REDUCE_SMAX/VP_REDUCE_UMIN mask operation then turn it to
11919 // VP_REDUCE_AND.
11920 if (VT == MVT::i1)
11921 Opcode = ISD::VP_REDUCE_AND;
11922 break;
11923 case ISD::VP_REDUCE_SMIN:
11924 case ISD::VP_REDUCE_UMAX:
11925 // If it is VP_REDUCE_SMIN/VP_REDUCE_UMAX mask operation then turn it to
11926 // VP_REDUCE_OR.
11927 if (VT == MVT::i1)
11928 Opcode = ISD::VP_REDUCE_OR;
11929 break;
11930 }
11931
11932 // Memoize nodes.
11933 SDNode *N;
11934 SDVTList VTs = getVTList(VT);
11935
11936 if (VT != MVT::Glue) {
11937 SDNodeKey ID(Opcode, VTs, Ops);
11938 FoldingSetInsertToken InsertToken;
11939
11940 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
11941 E->intersectFlagsWith(Flags);
11942 return SDValue(E, 0);
11943 }
11944
11945 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11946 createOperands(N, Ops);
11947
11948 CSEMap.insert(N, InsertToken);
11949 } else {
11950 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11951 createOperands(N, Ops);
11952 }
11953
11954 N->setFlags(Flags);
11955 InsertNode(N);
11956 SDValue V(N, 0);
11957 NewSDValueDbgMsg(V, "Creating new node: ", this);
11958 return V;
11959}
11960
11961SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11962 ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops) {
11963 SDNodeFlags Flags;
11964 if (Inserter)
11965 Flags = Inserter->getFlags();
11966 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11967}
11968
11969SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11971 const SDNodeFlags Flags) {
11972 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11973}
11974
11975SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11977 SDNodeFlags Flags;
11978 if (Inserter)
11979 Flags = Inserter->getFlags();
11980 return getNode(Opcode, DL, VTList, Ops, Flags);
11981}
11982
11983SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11984 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11985 if (VTList.NumVTs == 1)
11986 return getNode(Opcode, DL, VTList.VTs[0], Ops, Flags);
11987
11988#ifndef NDEBUG
11989 for (const auto &Op : Ops)
11990 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11991 "Operand is DELETED_NODE!");
11992#endif
11993
11994 switch (Opcode) {
11995 case ISD::SADDO:
11996 case ISD::UADDO:
11997 case ISD::SSUBO:
11998 case ISD::USUBO: {
11999 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
12000 "Invalid add/sub overflow op!");
12001 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
12002 Ops[0].getValueType() == Ops[1].getValueType() &&
12003 Ops[0].getValueType() == VTList.VTs[0] &&
12004 "Binary operator types must match!");
12005 SDValue N1 = Ops[0], N2 = Ops[1];
12006 canonicalizeCommutativeBinop(Opcode, N1, N2);
12007
12008 // (X +- 0) -> X with zero-overflow.
12009 ConstantSDNode *N2CV = isConstOrConstSplat(N2, /*AllowUndefs*/ false,
12010 /*AllowTruncation*/ true);
12011 if (N2CV && N2CV->isZero()) {
12012 SDValue ZeroOverFlow = getConstant(0, DL, VTList.VTs[1]);
12013 return getNode(ISD::MERGE_VALUES, DL, VTList, {N1, ZeroOverFlow}, Flags);
12014 }
12015
12016 if (VTList.VTs[0].getScalarType() == MVT::i1 &&
12017 VTList.VTs[1].getScalarType() == MVT::i1) {
12018 SDValue F1 = getFreeze(N1);
12019 SDValue F2 = getFreeze(N2);
12020 // {vXi1,vXi1} (u/s)addo(vXi1 x, vXi1y) -> {xor(x,y),and(x,y)}
12021 if (Opcode == ISD::UADDO || Opcode == ISD::SADDO)
12022 return getNode(ISD::MERGE_VALUES, DL, VTList,
12023 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
12024 getNode(ISD::AND, DL, VTList.VTs[1], F1, F2)},
12025 Flags);
12026 // {vXi1,vXi1} (u/s)subo(vXi1 x, vXi1y) -> {xor(x,y),and(~x,y)}
12027 if (Opcode == ISD::USUBO || Opcode == ISD::SSUBO) {
12028 SDValue NotF1 = getNOT(DL, F1, VTList.VTs[0]);
12029 return getNode(ISD::MERGE_VALUES, DL, VTList,
12030 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
12031 getNode(ISD::AND, DL, VTList.VTs[1], NotF1, F2)},
12032 Flags);
12033 }
12034 }
12035 break;
12036 }
12037 case ISD::SADDO_CARRY:
12038 case ISD::UADDO_CARRY:
12039 case ISD::SSUBO_CARRY:
12040 case ISD::USUBO_CARRY:
12041 assert(VTList.NumVTs == 2 && Ops.size() == 3 &&
12042 "Invalid add/sub overflow op!");
12043 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
12044 Ops[0].getValueType() == Ops[1].getValueType() &&
12045 Ops[0].getValueType() == VTList.VTs[0] &&
12046 Ops[2].getValueType() == VTList.VTs[1] &&
12047 "Binary operator types must match!");
12048 break;
12049 case ISD::SMUL_LOHI:
12050 case ISD::UMUL_LOHI: {
12051 assert(VTList.NumVTs == 2 && Ops.size() == 2 && "Invalid mul lo/hi op!");
12052 assert(VTList.VTs[0].isInteger() && VTList.VTs[0] == VTList.VTs[1] &&
12053 VTList.VTs[0] == Ops[0].getValueType() &&
12054 VTList.VTs[0] == Ops[1].getValueType() &&
12055 "Binary operator types must match!");
12056 // Constant fold.
12059 if (LHS && RHS) {
12060 unsigned Width = VTList.VTs[0].getScalarSizeInBits();
12061 unsigned OutWidth = Width * 2;
12062 APInt Val = LHS->getAPIntValue();
12063 APInt Mul = RHS->getAPIntValue();
12064 if (Opcode == ISD::SMUL_LOHI) {
12065 Val = Val.sext(OutWidth);
12066 Mul = Mul.sext(OutWidth);
12067 } else {
12068 Val = Val.zext(OutWidth);
12069 Mul = Mul.zext(OutWidth);
12070 }
12071 Val *= Mul;
12072
12073 SDValue Hi =
12074 getConstant(Val.extractBits(Width, Width), DL, VTList.VTs[0]);
12075 SDValue Lo = getConstant(Val.trunc(Width), DL, VTList.VTs[0]);
12076 return getNode(ISD::MERGE_VALUES, DL, VTList, {Lo, Hi}, Flags);
12077 }
12078 break;
12079 }
12080 case ISD::FFREXP: {
12081 assert(VTList.NumVTs == 2 && Ops.size() == 1 && "Invalid ffrexp op!");
12082 assert(VTList.VTs[0].isFloatingPoint() && VTList.VTs[1].isInteger() &&
12083 VTList.VTs[0] == Ops[0].getValueType() && "frexp type mismatch");
12084
12086 int FrexpExp;
12087 APFloat FrexpMant =
12088 frexp(C->getValueAPF(), FrexpExp, APFloat::rmNearestTiesToEven);
12089 SDValue Result0 = getConstantFP(FrexpMant, DL, VTList.VTs[0]);
12090 SDValue Result1 = getSignedConstant(FrexpMant.isFinite() ? FrexpExp : 0,
12091 DL, VTList.VTs[1]);
12092 return getNode(ISD::MERGE_VALUES, DL, VTList, {Result0, Result1}, Flags);
12093 }
12094
12095 break;
12096 }
12098 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
12099 "Invalid STRICT_FP_EXTEND!");
12100 assert(VTList.VTs[0].isFloatingPoint() &&
12101 Ops[1].getValueType().isFloatingPoint() && "Invalid FP cast!");
12102 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
12103 "STRICT_FP_EXTEND result type should be vector iff the operand "
12104 "type is vector!");
12105 assert((!VTList.VTs[0].isVector() ||
12106 VTList.VTs[0].getVectorElementCount() ==
12107 Ops[1].getValueType().getVectorElementCount()) &&
12108 "Vector element count mismatch!");
12109 assert(Ops[1].getValueType().bitsLT(VTList.VTs[0]) &&
12110 "Invalid fpext node, dst <= src!");
12111 break;
12113 assert(VTList.NumVTs == 2 && Ops.size() == 3 && "Invalid STRICT_FP_ROUND!");
12114 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
12115 "STRICT_FP_ROUND result type should be vector iff the operand "
12116 "type is vector!");
12117 assert((!VTList.VTs[0].isVector() ||
12118 VTList.VTs[0].getVectorElementCount() ==
12119 Ops[1].getValueType().getVectorElementCount()) &&
12120 "Vector element count mismatch!");
12121 assert(VTList.VTs[0].isFloatingPoint() &&
12122 Ops[1].getValueType().isFloatingPoint() &&
12123 VTList.VTs[0].bitsLT(Ops[1].getValueType()) &&
12124 Ops[2].getOpcode() == ISD::TargetConstant &&
12125 (Ops[2]->getAsZExtVal() == 0 || Ops[2]->getAsZExtVal() == 1) &&
12126 "Invalid STRICT_FP_ROUND!");
12127 break;
12128 }
12129
12130 // Memoize the node unless it returns a glue result.
12131 SDNode *N;
12132 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
12133 SDNodeKey ID(Opcode, VTList, Ops);
12134 FoldingSetInsertToken InsertToken;
12135 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
12136 E->intersectFlagsWith(Flags);
12137 return SDValue(E, 0);
12138 }
12139
12140 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
12141 createOperands(N, Ops);
12142 CSEMap.insert(N, InsertToken);
12143 } else {
12144 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
12145 createOperands(N, Ops);
12146 }
12147
12148 N->setFlags(Flags);
12149 InsertNode(N);
12150 SDValue V(N, 0);
12151 NewSDValueDbgMsg(V, "Creating new node: ", this);
12152 return V;
12153}
12154
12155SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
12156 SDVTList VTList) {
12157 return getNode(Opcode, DL, VTList, ArrayRef<SDValue>());
12158}
12159
12160SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12161 SDValue N1) {
12162 SDValue Ops[] = { N1 };
12163 return getNode(Opcode, DL, VTList, Ops);
12164}
12165
12166SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12167 SDValue N1, SDValue N2) {
12168 SDValue Ops[] = { N1, N2 };
12169 return getNode(Opcode, DL, VTList, Ops);
12170}
12171
12172SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12173 SDValue N1, SDValue N2, SDValue N3) {
12174 SDValue Ops[] = { N1, N2, N3 };
12175 return getNode(Opcode, DL, VTList, Ops);
12176}
12177
12178SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12179 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
12180 SDValue Ops[] = { N1, N2, N3, N4 };
12181 return getNode(Opcode, DL, VTList, Ops);
12182}
12183
12184SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12185 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
12186 SDValue N5) {
12187 SDValue Ops[] = { N1, N2, N3, N4, N5 };
12188 return getNode(Opcode, DL, VTList, Ops);
12189}
12190
12192 if (!VT.isExtended())
12193 return makeVTList(SDNode::getValueTypeList(VT.getSimpleVT()), 1);
12194
12195 EVT VTs[] = {VT};
12196 return getVTList(VTs);
12197}
12198
12200 EVT VTs[] = {VT1, VT2};
12201 return getVTList(VTs);
12202}
12203
12205 EVT VTs[] = {VT1, VT2, VT3};
12206 return getVTList(VTs);
12207}
12208
12210 EVT VTs[] = {VT1, VT2, VT3, VT4};
12211 return getVTList(VTs);
12212}
12213
12215 auto It = VTLists.find(VTs);
12216 if (It == VTLists.end()) {
12217 EVT *Array = Allocator.Allocate<EVT>(VTs.size());
12218 llvm::copy(VTs, Array);
12219 It = VTLists.insert(ArrayRef(Array, VTs.size())).first;
12220 }
12221 return makeVTList(It->data(), It->size());
12222}
12223
12224/// UpdateNodeOperands - *Mutate* the specified node in-place to have the
12225/// specified operands. If the resultant node already exists in the DAG,
12226/// this does not modify the specified node, instead it returns the node that
12227/// already exists. If the resultant node does not exist in the DAG, the
12228/// input node is returned. As a degenerate case, if you specify the same
12229/// input operands as the node already has, the input node is returned.
12231 assert(N->getNumOperands() == 1 && "Update with wrong number of operands");
12232
12233 // Check to see if there is no change.
12234 if (Op == N->getOperand(0)) return N;
12235
12236 // See if the modified node already exists.
12237 FoldingSetInsertToken InsertToken;
12238 if (SDNode *Existing = FindModifiedNodeSlot(N, Op, InsertToken))
12239 return Existing;
12240
12241 // Nope it doesn't. Remove the node from its current place in the maps.
12242 if (InsertToken)
12243 if (!RemoveNodeFromCSEMaps(N))
12244 InsertToken = {};
12245
12246 // Now we update the operands.
12247 N->OperandList[0].set(Op);
12248
12250 // If this gets put into a CSE map, add it.
12251 if (InsertToken)
12252 CSEMap.insert(N, InsertToken);
12253 return N;
12254}
12255
12257 assert(N->getNumOperands() == 2 && "Update with wrong number of operands");
12258
12259 // Check to see if there is no change.
12260 if (Op1 == N->getOperand(0) && Op2 == N->getOperand(1))
12261 return N; // No operands changed, just return the input node.
12262
12263 // See if the modified node already exists.
12264 FoldingSetInsertToken InsertToken;
12265 if (SDNode *Existing = FindModifiedNodeSlot(N, Op1, Op2, InsertToken))
12266 return Existing;
12267
12268 // Nope it doesn't. Remove the node from its current place in the maps.
12269 if (InsertToken)
12270 if (!RemoveNodeFromCSEMaps(N))
12271 InsertToken = {};
12272
12273 // Now we update the operands.
12274 if (N->OperandList[0] != Op1)
12275 N->OperandList[0].set(Op1);
12276 if (N->OperandList[1] != Op2)
12277 N->OperandList[1].set(Op2);
12278
12280 // If this gets put into a CSE map, add it.
12281 if (InsertToken)
12282 CSEMap.insert(N, InsertToken);
12283 return N;
12284}
12285
12288 SDValue Ops[] = { Op1, Op2, Op3 };
12289 return UpdateNodeOperands(N, Ops);
12290}
12291
12294 SDValue Op3, SDValue Op4) {
12295 SDValue Ops[] = { Op1, Op2, Op3, Op4 };
12296 return UpdateNodeOperands(N, Ops);
12297}
12298
12301 SDValue Op3, SDValue Op4, SDValue Op5) {
12302 SDValue Ops[] = { Op1, Op2, Op3, Op4, Op5 };
12303 return UpdateNodeOperands(N, Ops);
12304}
12305
12308 unsigned NumOps = Ops.size();
12309 assert(N->getNumOperands() == NumOps &&
12310 "Update with wrong number of operands");
12311
12312 // If no operands changed just return the input node.
12313 if (std::equal(Ops.begin(), Ops.end(), N->op_begin()))
12314 return N;
12315
12316 // See if the modified node already exists.
12317 FoldingSetInsertToken InsertToken;
12318 if (SDNode *Existing = FindModifiedNodeSlot(N, Ops, InsertToken))
12319 return Existing;
12320
12321 // Nope it doesn't. Remove the node from its current place in the maps.
12322 if (InsertToken)
12323 if (!RemoveNodeFromCSEMaps(N))
12324 InsertToken = {};
12325
12326 // Now we update the operands.
12327 for (unsigned i = 0; i != NumOps; ++i)
12328 if (N->OperandList[i] != Ops[i])
12329 N->OperandList[i].set(Ops[i]);
12330
12332 // If this gets put into a CSE map, add it.
12333 if (InsertToken)
12334 CSEMap.insert(N, InsertToken);
12335 return N;
12336}
12337
12338/// DropOperands - Release the operands and set this node to have
12339/// zero operands.
12341 // Unlike the code in MorphNodeTo that does this, we don't need to
12342 // watch for dead nodes here.
12343 for (op_iterator I = op_begin(), E = op_end(); I != E; ) {
12344 SDUse &Use = *I++;
12345 Use.set(SDValue());
12346 }
12347}
12348
12350 ArrayRef<MachineMemOperand *> NewMemRefs) {
12351 if (NewMemRefs.empty()) {
12352 N->clearMemRefs();
12353 return;
12354 }
12355
12356 // Check if we can avoid allocating by storing a single reference directly.
12357 if (NewMemRefs.size() == 1) {
12358 N->MemRefs = NewMemRefs[0];
12359 N->NumMemRefs = 1;
12360 return;
12361 }
12362
12363 MachineMemOperand **MemRefsBuffer =
12364 Allocator.template Allocate<MachineMemOperand *>(NewMemRefs.size());
12365 llvm::copy(NewMemRefs, MemRefsBuffer);
12366 N->MemRefs = MemRefsBuffer;
12367 N->NumMemRefs = static_cast<int>(NewMemRefs.size());
12368}
12369
12370/// SelectNodeTo - These are wrappers around MorphNodeTo that accept a
12371/// machine opcode.
12372///
12374 EVT VT) {
12375 SDVTList VTs = getVTList(VT);
12376 return SelectNodeTo(N, MachineOpc, VTs, {});
12377}
12378
12380 EVT VT, SDValue Op1) {
12381 SDVTList VTs = getVTList(VT);
12382 SDValue Ops[] = { Op1 };
12383 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12384}
12385
12387 EVT VT, SDValue Op1,
12388 SDValue Op2) {
12389 SDVTList VTs = getVTList(VT);
12390 SDValue Ops[] = { Op1, Op2 };
12391 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12392}
12393
12395 EVT VT, SDValue Op1,
12396 SDValue Op2, SDValue Op3) {
12397 SDVTList VTs = getVTList(VT);
12398 SDValue Ops[] = { Op1, Op2, Op3 };
12399 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12400}
12401
12404 SDVTList VTs = getVTList(VT);
12405 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12406}
12407
12409 EVT VT1, EVT VT2, ArrayRef<SDValue> Ops) {
12410 SDVTList VTs = getVTList(VT1, VT2);
12411 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12412}
12413
12415 EVT VT1, EVT VT2) {
12416 SDVTList VTs = getVTList(VT1, VT2);
12417 return SelectNodeTo(N, MachineOpc, VTs, {});
12418}
12419
12421 EVT VT1, EVT VT2, EVT VT3,
12423 SDVTList VTs = getVTList(VT1, VT2, VT3);
12424 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12425}
12426
12428 EVT VT1, EVT VT2,
12429 SDValue Op1, SDValue Op2) {
12430 SDVTList VTs = getVTList(VT1, VT2);
12431 SDValue Ops[] = { Op1, Op2 };
12432 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12433}
12434
12437 SDNode *New = MorphNodeTo(N, ~MachineOpc, VTs, Ops);
12438 // Reset the NodeID to -1.
12439 New->setNodeId(-1);
12440 if (New != N) {
12441 ReplaceAllUsesWith(N, New);
12443 }
12444 return New;
12445}
12446
12447/// UpdateSDLocOnMergeSDNode - If the opt level is -O0 then it throws away
12448/// the line number information on the merged node since it is not possible to
12449/// preserve the information that operation is associated with multiple lines.
12450/// This will make the debugger working better at -O0, were there is a higher
12451/// probability having other instructions associated with that line.
12452///
12453/// For IROrder, we keep the smaller of the two
12454SDNode *SelectionDAG::UpdateSDLocOnMergeSDNode(SDNode *N, const SDLoc &OLoc) {
12455 DebugLoc NLoc = N->getDebugLoc();
12456 if (NLoc && OptLevel == CodeGenOptLevel::None && OLoc.getDebugLoc() != NLoc) {
12457 N->setDebugLoc(DebugLoc());
12458 }
12459 unsigned Order = std::min(N->getIROrder(), OLoc.getIROrder());
12460 N->setIROrder(Order);
12461 return N;
12462}
12463
12464/// MorphNodeTo - This *mutates* the specified node to have the specified
12465/// return type, opcode, and operands.
12466///
12467/// Note that MorphNodeTo returns the resultant node. If there is already a
12468/// node of the specified opcode and operands, it returns that node instead of
12469/// the current one. Note that the SDLoc need not be the same.
12470///
12471/// Using MorphNodeTo is faster than creating a new node and swapping it in
12472/// with ReplaceAllUsesWith both because it often avoids allocating a new
12473/// node, and because it doesn't require CSE recalculation for any of
12474/// the node's users.
12475///
12476/// However, note that MorphNodeTo recursively deletes dead nodes from the DAG.
12477/// As a consequence it isn't appropriate to use from within the DAG combiner or
12478/// the legalizer which maintain worklists that would need to be updated when
12479/// deleting things.
12482 // If an identical node already exists, use it.
12483 FoldingSetInsertToken InsertToken;
12484 if (VTs.VTs[VTs.NumVTs-1] != MVT::Glue) {
12485 SDNodeKey ID(Opc, VTs, Ops);
12486 AddNodeIDCustom(ID.Tail, N, Opc);
12487 if (SDNode *ON = lookupNode(ID, SDLoc(N), InsertToken))
12488 return UpdateSDLocOnMergeSDNode(ON, SDLoc(N));
12489 }
12490
12491 if (!RemoveNodeFromCSEMaps(N))
12492 InsertToken = {};
12493
12494 // Start the morphing.
12495 N->NodeType = Opc;
12496 N->ValueList = VTs.VTs;
12497 N->NumValues = VTs.NumVTs;
12498
12499 // Clear the operands list, updating used nodes to remove this from their
12500 // use list. Keep track of any operands that become dead as a result.
12501 SmallPtrSet<SDNode*, 16> DeadNodeSet;
12502 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
12503 SDUse &Use = *I++;
12504 SDNode *Used = Use.getNode();
12505 Use.set(SDValue());
12506 if (Used->use_empty())
12507 DeadNodeSet.insert(Used);
12508 }
12509
12510 // For MachineNode, initialize the memory references information.
12512 MN->clearMemRefs();
12513
12514 // Swap for an appropriately sized array from the recycler.
12515 removeOperands(N);
12516 createOperands(N, Ops);
12517
12518 // Delete any nodes that are still dead after adding the uses for the
12519 // new operands.
12520 if (!DeadNodeSet.empty()) {
12521 SmallVector<SDNode *, 16> DeadNodes;
12522 for (SDNode *N : DeadNodeSet)
12523 if (N->use_empty())
12524 DeadNodes.push_back(N);
12525 RemoveDeadNodes(DeadNodes);
12526 }
12527
12528 if (InsertToken)
12529 CSEMap.insert(N, InsertToken); // Memoize the new node.
12530 return N;
12531}
12532
12534 unsigned OrigOpc = Node->getOpcode();
12535 unsigned NewOpc;
12536 switch (OrigOpc) {
12537 default:
12538 llvm_unreachable("mutateStrictFPToFP called with unexpected opcode!");
12539#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12540 case ISD::STRICT_##DAGN: NewOpc = ISD::DAGN; break;
12541#define CMP_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12542 case ISD::STRICT_##DAGN: NewOpc = ISD::SETCC; break;
12543#include "llvm/IR/ConstrainedOps.def"
12544 }
12545
12546 assert(Node->getNumValues() == 2 && "Unexpected number of results!");
12547
12548 // We're taking this node out of the chain, so we need to re-link things.
12549 SDValue InputChain = Node->getOperand(0);
12550 SDValue OutputChain = SDValue(Node, 1);
12551 ReplaceAllUsesOfValueWith(OutputChain, InputChain);
12552
12554 for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
12555 Ops.push_back(Node->getOperand(i));
12556
12557 SDVTList VTs = getVTList(Node->getValueType(0));
12558 SDNode *Res = MorphNodeTo(Node, NewOpc, VTs, Ops);
12559
12560 // MorphNodeTo can operate in two ways: if an existing node with the
12561 // specified operands exists, it can just return it. Otherwise, it
12562 // updates the node in place to have the requested operands.
12563 if (Res == Node) {
12564 // If we updated the node in place, reset the node ID. To the isel,
12565 // this should be just like a newly allocated machine node.
12566 Res->setNodeId(-1);
12567 } else {
12570 }
12571
12572 return Res;
12573}
12574
12575/// getMachineNode - These are used for target selectors to create a new node
12576/// with specified return type(s), MachineInstr opcode, and operands.
12577///
12578/// Note that getMachineNode returns the resultant node. If there is already a
12579/// node of the specified opcode and operands, it returns that node instead of
12580/// the current one.
12582 EVT VT) {
12583 SDVTList VTs = getVTList(VT);
12584 return getMachineNode(Opcode, dl, VTs, {});
12585}
12586
12588 EVT VT, SDValue Op1) {
12589 SDVTList VTs = getVTList(VT);
12590 SDValue Ops[] = { Op1 };
12591 return getMachineNode(Opcode, dl, VTs, Ops);
12592}
12593
12595 EVT VT, SDValue Op1, SDValue Op2) {
12596 SDVTList VTs = getVTList(VT);
12597 SDValue Ops[] = { Op1, Op2 };
12598 return getMachineNode(Opcode, dl, VTs, Ops);
12599}
12600
12602 EVT VT, SDValue Op1, SDValue Op2,
12603 SDValue Op3) {
12604 SDVTList VTs = getVTList(VT);
12605 SDValue Ops[] = { Op1, Op2, Op3 };
12606 return getMachineNode(Opcode, dl, VTs, Ops);
12607}
12608
12611 SDVTList VTs = getVTList(VT);
12612 return getMachineNode(Opcode, dl, VTs, Ops);
12613}
12614
12616 EVT VT1, EVT VT2, SDValue Op1,
12617 SDValue Op2) {
12618 SDVTList VTs = getVTList(VT1, VT2);
12619 SDValue Ops[] = { Op1, Op2 };
12620 return getMachineNode(Opcode, dl, VTs, Ops);
12621}
12622
12624 EVT VT1, EVT VT2, SDValue Op1,
12625 SDValue Op2, SDValue Op3) {
12626 SDVTList VTs = getVTList(VT1, VT2);
12627 SDValue Ops[] = { Op1, Op2, Op3 };
12628 return getMachineNode(Opcode, dl, VTs, Ops);
12629}
12630
12632 EVT VT1, EVT VT2,
12634 SDVTList VTs = getVTList(VT1, VT2);
12635 return getMachineNode(Opcode, dl, VTs, Ops);
12636}
12637
12639 EVT VT1, EVT VT2, EVT VT3,
12640 SDValue Op1, SDValue Op2) {
12641 SDVTList VTs = getVTList(VT1, VT2, VT3);
12642 SDValue Ops[] = { Op1, Op2 };
12643 return getMachineNode(Opcode, dl, VTs, Ops);
12644}
12645
12647 EVT VT1, EVT VT2, EVT VT3,
12648 SDValue Op1, SDValue Op2,
12649 SDValue Op3) {
12650 SDVTList VTs = getVTList(VT1, VT2, VT3);
12651 SDValue Ops[] = { Op1, Op2, Op3 };
12652 return getMachineNode(Opcode, dl, VTs, Ops);
12653}
12654
12656 EVT VT1, EVT VT2, EVT VT3,
12658 SDVTList VTs = getVTList(VT1, VT2, VT3);
12659 return getMachineNode(Opcode, dl, VTs, Ops);
12660}
12661
12663 ArrayRef<EVT> ResultTys,
12665 SDVTList VTs = getVTList(ResultTys);
12666 return getMachineNode(Opcode, dl, VTs, Ops);
12667}
12668
12670 SDVTList VTs,
12672 bool DoCSE = VTs.VTs[VTs.NumVTs-1] != MVT::Glue;
12674 FoldingSetInsertToken InsertToken;
12675
12676 if (DoCSE) {
12677 SDNodeKey ID(~Opcode, VTs, Ops);
12678 if (SDNode *E = lookupNode(ID, DL, InsertToken)) {
12679 return cast<MachineSDNode>(UpdateSDLocOnMergeSDNode(E, DL));
12680 }
12681 }
12682
12683 // Allocate a new MachineSDNode.
12684 N = newSDNode<MachineSDNode>(~Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
12685 createOperands(N, Ops);
12686
12687 if (DoCSE)
12688 CSEMap.insert(N, InsertToken);
12689
12690 InsertNode(N);
12691 NewSDValueDbgMsg(SDValue(N, 0), "Creating new machine node: ", this);
12692 return N;
12693}
12694
12695/// getTargetExtractSubreg - A convenience function for creating
12696/// TargetOpcode::EXTRACT_SUBREG nodes.
12698 SDValue Operand) {
12699 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12700 SDNode *Subreg = getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL,
12701 VT, Operand, SRIdxVal);
12702 return SDValue(Subreg, 0);
12703}
12704
12705/// getTargetInsertSubreg - A convenience function for creating
12706/// TargetOpcode::INSERT_SUBREG nodes.
12708 SDValue Operand, SDValue Subreg) {
12709 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12710 SDNode *Result = getMachineNode(TargetOpcode::INSERT_SUBREG, DL,
12711 VT, Operand, Subreg, SRIdxVal);
12712 return SDValue(Result, 0);
12713}
12714
12715/// getNodeIfExists - Get the specified node if it's already available, or
12716/// else return NULL.
12719 bool AllowCommute) {
12720 SDNodeFlags Flags;
12721 if (Inserter)
12722 Flags = Inserter->getFlags();
12723 return getNodeIfExists(Opcode, VTList, Ops, Flags, AllowCommute);
12724}
12725
12728 const SDNodeFlags Flags,
12729 bool AllowCommute) {
12730 if (VTList.VTs[VTList.NumVTs - 1] == MVT::Glue)
12731 return nullptr;
12732
12733 auto Lookup = [&](ArrayRef<SDValue> LookupOps) -> SDNode * {
12734 SDNodeKey ID(Opcode, VTList, LookupOps);
12735 FoldingSetInsertToken InsertToken;
12736 if (SDNode *E = lookupNode(ID, InsertToken)) {
12737 E->intersectFlagsWith(Flags);
12738 return E;
12739 }
12740 return nullptr;
12741 };
12742
12743 if (SDNode *Existing = Lookup(Ops))
12744 return Existing;
12745
12746 if (AllowCommute && TLI->isCommutativeBinOp(Opcode))
12747 return Lookup({Ops[1], Ops[0]});
12748
12749 return nullptr;
12750}
12751
12752/// doesNodeExist - Check if a node exists without modifying its flags.
12753bool SelectionDAG::doesNodeExist(unsigned Opcode, SDVTList VTList,
12755 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {
12756 SDNodeKey ID(Opcode, VTList, Ops);
12757 FoldingSetInsertToken InsertToken;
12758 if (lookupNode(ID, SDLoc(), InsertToken))
12759 return true;
12760 }
12761 return false;
12762}
12763
12764/// getDbgValue - Creates a SDDbgValue node.
12765///
12766/// SDNode
12768 SDNode *N, unsigned R, bool IsIndirect,
12769 const DebugLoc &DL, unsigned O) {
12770 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12771 "Expected inlined-at fields to agree");
12772 return new (DbgInfo->getAlloc())
12773 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromNode(N, R),
12774 {}, IsIndirect, DL, O,
12775 /*IsVariadic=*/false);
12776}
12777
12778/// Constant
12780 DIExpression *Expr,
12781 const Value *C,
12782 const DebugLoc &DL, unsigned O) {
12783 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12784 "Expected inlined-at fields to agree");
12785 return new (DbgInfo->getAlloc())
12786 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromConst(C), {},
12787 /*IsIndirect=*/false, DL, O,
12788 /*IsVariadic=*/false);
12789}
12790
12791/// FrameIndex
12793 DIExpression *Expr, unsigned FI,
12794 bool IsIndirect,
12795 const DebugLoc &DL,
12796 unsigned O) {
12797 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12798 "Expected inlined-at fields to agree");
12799 return getFrameIndexDbgValue(Var, Expr, FI, {}, IsIndirect, DL, O);
12800}
12801
12802/// FrameIndex with dependencies
12804 DIExpression *Expr, unsigned FI,
12805 ArrayRef<SDNode *> Dependencies,
12806 bool IsIndirect,
12807 const DebugLoc &DL,
12808 unsigned O) {
12809 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12810 "Expected inlined-at fields to agree");
12811 return new (DbgInfo->getAlloc())
12812 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromFrameIdx(FI),
12813 Dependencies, IsIndirect, DL, O,
12814 /*IsVariadic=*/false);
12815}
12816
12817/// VReg
12819 Register VReg, bool IsIndirect,
12820 const DebugLoc &DL, unsigned O) {
12821 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12822 "Expected inlined-at fields to agree");
12823 return new (DbgInfo->getAlloc())
12824 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromVReg(VReg),
12825 {}, IsIndirect, DL, O,
12826 /*IsVariadic=*/false);
12827}
12828
12831 ArrayRef<SDNode *> Dependencies,
12832 bool IsIndirect, const DebugLoc &DL,
12833 unsigned O, bool IsVariadic) {
12834 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12835 "Expected inlined-at fields to agree");
12836 return new (DbgInfo->getAlloc())
12837 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, Locs, Dependencies, IsIndirect,
12838 DL, O, IsVariadic);
12839}
12840
12842 unsigned OffsetInBits, unsigned SizeInBits,
12843 bool InvalidateDbg) {
12844 SDNode *FromNode = From.getNode();
12845 SDNode *ToNode = To.getNode();
12846 assert(FromNode && ToNode && "Can't modify dbg values");
12847
12848 // PR35338
12849 // TODO: assert(From != To && "Redundant dbg value transfer");
12850 // TODO: assert(FromNode != ToNode && "Intranode dbg value transfer");
12851 if (From == To || FromNode == ToNode)
12852 return;
12853
12854 if (!FromNode->getHasDebugValue())
12855 return;
12856
12857 SDDbgOperand FromLocOp =
12858 SDDbgOperand::fromNode(From.getNode(), From.getResNo());
12860
12862 for (SDDbgValue *Dbg : GetDbgValues(FromNode)) {
12863 if (Dbg->isInvalidated())
12864 continue;
12865
12866 // TODO: assert(!Dbg->isInvalidated() && "Transfer of invalid dbg value");
12867
12868 // Create a new location ops vector that is equal to the old vector, but
12869 // with each instance of FromLocOp replaced with ToLocOp.
12870 bool Changed = false;
12871 auto NewLocOps = Dbg->copyLocationOps();
12872 std::replace_if(
12873 NewLocOps.begin(), NewLocOps.end(),
12874 [&Changed, FromLocOp](const SDDbgOperand &Op) {
12875 bool Match = Op == FromLocOp;
12876 Changed |= Match;
12877 return Match;
12878 },
12879 ToLocOp);
12880 // Ignore this SDDbgValue if we didn't find a matching location.
12881 if (!Changed)
12882 continue;
12883
12884 DIVariable *Var = Dbg->getVariable();
12885 auto *Expr = Dbg->getExpression();
12886 // If a fragment is requested, update the expression.
12887 if (SizeInBits) {
12888 // When splitting a larger (e.g., sign-extended) value whose
12889 // lower bits are described with an SDDbgValue, do not attempt
12890 // to transfer the SDDbgValue to the upper bits.
12891 if (auto FI = Expr->getFragmentInfo())
12892 if (OffsetInBits + SizeInBits > FI->SizeInBits)
12893 continue;
12894 auto Fragment = DIExpression::createFragmentExpression(Expr, OffsetInBits,
12895 SizeInBits);
12896 if (!Fragment)
12897 continue;
12898 Expr = *Fragment;
12899 }
12900
12901 auto AdditionalDependencies = Dbg->getAdditionalDependencies();
12902 // Clone the SDDbgValue and move it to To.
12903 SDDbgValue *Clone = getDbgValueList(
12904 Var, Expr, NewLocOps, AdditionalDependencies, Dbg->isIndirect(),
12905 Dbg->getDebugLoc(), std::max(ToNode->getIROrder(), Dbg->getOrder()),
12906 Dbg->isVariadic());
12907 ClonedDVs.push_back(Clone);
12908
12909 if (InvalidateDbg) {
12910 // Invalidate value and indicate the SDDbgValue should not be emitted.
12911 Dbg->setIsInvalidated();
12912 Dbg->setIsEmitted();
12913 }
12914 }
12915
12916 for (SDDbgValue *Dbg : ClonedDVs) {
12917 assert(is_contained(Dbg->getSDNodes(), ToNode) &&
12918 "Transferred DbgValues should depend on the new SDNode");
12919 AddDbgValue(Dbg, false);
12920 }
12921}
12922
12924 if (!N.getHasDebugValue())
12925 return;
12926
12927 auto GetLocationOperand = [](SDNode *Node, unsigned ResNo) {
12928 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(Node))
12929 return SDDbgOperand::fromFrameIdx(FISDN->getIndex());
12930 return SDDbgOperand::fromNode(Node, ResNo);
12931 };
12932
12934 for (auto *DV : GetDbgValues(&N)) {
12935 if (DV->isInvalidated())
12936 continue;
12937 switch (N.getOpcode()) {
12938 default:
12939 break;
12940 case ISD::ADD: {
12941 SDValue N0 = N.getOperand(0);
12942 SDValue N1 = N.getOperand(1);
12943 if (!isa<ConstantSDNode>(N0)) {
12944 bool RHSConstant = isa<ConstantSDNode>(N1);
12945 uint64_t Offset;
12946 if (RHSConstant)
12947 Offset = N.getConstantOperandVal(1);
12948 // We are not allowed to turn indirect debug values variadic, so
12949 // don't salvage those.
12950 if (!RHSConstant && DV->isIndirect())
12951 continue;
12952
12953 // Rewrite an ADD constant node into a DIExpression. Since we are
12954 // performing arithmetic to compute the variable's *value* in the
12955 // DIExpression, we need to mark the expression with a
12956 // DW_OP_stack_value.
12957 auto *DIExpr = DV->getExpression();
12958 auto NewLocOps = DV->copyLocationOps();
12959 bool Changed = false;
12960 size_t OrigLocOpsSize = NewLocOps.size();
12961 for (size_t i = 0; i < OrigLocOpsSize; ++i) {
12962 // We're not given a ResNo to compare against because the whole
12963 // node is going away. We know that any ISD::ADD only has one
12964 // result, so we can assume any node match is using the result.
12965 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
12966 NewLocOps[i].getSDNode() != &N)
12967 continue;
12968 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
12969 if (RHSConstant) {
12972 DIExpr = DIExpression::appendOpsToArg(DIExpr, ExprOps, i, true);
12973 } else {
12974 // Convert to a variadic expression (if not already).
12975 // convertToVariadicExpression() returns a const pointer, so we use
12976 // a temporary const variable here.
12977 const auto *TmpDIExpr =
12981 ExprOps.push_back(NewLocOps.size());
12982 ExprOps.push_back(dwarf::DW_OP_plus);
12983 SDDbgOperand RHS =
12985 NewLocOps.push_back(RHS);
12986 DIExpr = DIExpression::appendOpsToArg(TmpDIExpr, ExprOps, i, true);
12987 }
12988 Changed = true;
12989 }
12990 (void)Changed;
12991 assert(Changed && "Salvage target doesn't use N");
12992
12993 bool IsVariadic =
12994 DV->isVariadic() || OrigLocOpsSize != NewLocOps.size();
12995
12996 auto AdditionalDependencies = DV->getAdditionalDependencies();
12997 SDDbgValue *Clone = getDbgValueList(
12998 DV->getVariable(), DIExpr, NewLocOps, AdditionalDependencies,
12999 DV->isIndirect(), DV->getDebugLoc(), DV->getOrder(), IsVariadic);
13000 ClonedDVs.push_back(Clone);
13001 DV->setIsInvalidated();
13002 DV->setIsEmitted();
13003 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting";
13004 N0.getNode()->dumprFull(this);
13005 dbgs() << " into " << *DIExpr << '\n');
13006 }
13007 break;
13008 }
13009 case ISD::TRUNCATE: {
13010 SDValue N0 = N.getOperand(0);
13011 TypeSize FromSize = N0.getValueSizeInBits();
13012 TypeSize ToSize = N.getValueSizeInBits(0);
13013
13014 DIExpression *DbgExpression = DV->getExpression();
13015 auto ExtOps = DIExpression::getExtOps(FromSize, ToSize, false);
13016 auto NewLocOps = DV->copyLocationOps();
13017 bool Changed = false;
13018 for (size_t i = 0; i < NewLocOps.size(); ++i) {
13019 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
13020 NewLocOps[i].getSDNode() != &N)
13021 continue;
13022
13023 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
13024 DbgExpression = DIExpression::appendOpsToArg(DbgExpression, ExtOps, i);
13025 Changed = true;
13026 }
13027 assert(Changed && "Salvage target doesn't use N");
13028 (void)Changed;
13029
13030 SDDbgValue *Clone =
13031 getDbgValueList(DV->getVariable(), DbgExpression, NewLocOps,
13032 DV->getAdditionalDependencies(), DV->isIndirect(),
13033 DV->getDebugLoc(), DV->getOrder(), DV->isVariadic());
13034
13035 ClonedDVs.push_back(Clone);
13036 DV->setIsInvalidated();
13037 DV->setIsEmitted();
13038 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting"; N0.getNode()->dumprFull(this);
13039 dbgs() << " into " << *DbgExpression << '\n');
13040 break;
13041 }
13042 }
13043 }
13044
13045 for (SDDbgValue *Dbg : ClonedDVs) {
13046 assert((!Dbg->getSDNodes().empty() ||
13047 llvm::any_of(Dbg->getLocationOps(),
13048 [&](const SDDbgOperand &Op) {
13049 return Op.getKind() == SDDbgOperand::FRAMEIX;
13050 })) &&
13051 "Salvaged DbgValue should depend on a new SDNode");
13052 AddDbgValue(Dbg, false);
13053 }
13054}
13055
13056/// Creates a SDDbgLabel node.
13058 const DebugLoc &DL, unsigned O) {
13059 assert(cast<DILabel>(Label)->isValidLocationForIntrinsic(DL) &&
13060 "Expected inlined-at fields to agree");
13061 return new (DbgInfo->getAlloc()) SDDbgLabel(Label, DL, O);
13062}
13063
13064namespace {
13065
13066/// RAUWUpdateListener - Helper for ReplaceAllUsesWith - When the node
13067/// pointed to by a use iterator is deleted, increment the use iterator
13068/// so that it doesn't dangle.
13069///
13070class RAUWUpdateListener : public SelectionDAG::DAGUpdateListener {
13073
13074 void NodeDeleted(SDNode *N, SDNode *E) override {
13075 // Increment the iterator as needed.
13076 while (UI != UE && N == UI->getUser())
13077 ++UI;
13078 }
13079
13080public:
13081 RAUWUpdateListener(SelectionDAG &d,
13084 : SelectionDAG::DAGUpdateListener(d), UI(ui), UE(ue) {}
13085};
13086
13087} // end anonymous namespace
13088
13089/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13090/// This can cause recursive merging of nodes in the DAG.
13091///
13092/// This version assumes From has a single result value.
13093///
13095 SDNode *From = FromN.getNode();
13096 assert(From->getNumValues() == 1 && FromN.getResNo() == 0 &&
13097 "Cannot replace with this method!");
13098 assert(From != To.getNode() && "Cannot replace uses of with self");
13099
13100 // Preserve Debug Values
13101 transferDbgValues(FromN, To);
13102 // Preserve extra info.
13103 copyExtraInfo(From, To.getNode());
13104
13105 // Iterate over all the existing uses of From. New uses will be added
13106 // to the beginning of the use list, which we avoid visiting.
13107 // This specifically avoids visiting uses of From that arise while the
13108 // replacement is happening, because any such uses would be the result
13109 // of CSE: If an existing node looks like From after one of its operands
13110 // is replaced by To, we don't want to replace of all its users with To
13111 // too. See PR3018 for more info.
13112 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13113 RAUWUpdateListener Listener(*this, UI, UE);
13114 while (UI != UE) {
13115 SDNode *User = UI->getUser();
13116
13117 // This node is about to morph, remove its old self from the CSE maps.
13118 RemoveNodeFromCSEMaps(User);
13119
13120 // A user can appear in a use list multiple times, and when this
13121 // happens the uses are usually next to each other in the list.
13122 // To help reduce the number of CSE recomputations, process all
13123 // the uses of this user that we can find this way.
13124 do {
13125 SDUse &Use = *UI;
13126 ++UI;
13127 Use.set(To);
13128 if (To->isDivergent() != From->isDivergent())
13130 } while (UI != UE && UI->getUser() == User);
13131 // Now that we have modified User, add it back to the CSE maps. If it
13132 // already exists there, recursively merge the results together.
13133 AddModifiedNodeToCSEMaps(User);
13134 }
13135
13136 // If we just RAUW'd the root, take note.
13137 if (FromN == getRoot())
13138 setRoot(To);
13139}
13140
13141/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13142/// This can cause recursive merging of nodes in the DAG.
13143///
13144/// This version assumes that for each value of From, there is a
13145/// corresponding value in To in the same position with the same type.
13146///
13148#ifndef NDEBUG
13149 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
13150 assert((!From->hasAnyUseOfValue(i) ||
13151 From->getValueType(i) == To->getValueType(i)) &&
13152 "Cannot use this version of ReplaceAllUsesWith!");
13153#endif
13154
13155 // Handle the trivial case.
13156 if (From == To)
13157 return;
13158
13159 // Preserve Debug Info. Only do this if there's a use.
13160 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
13161 if (From->hasAnyUseOfValue(i)) {
13162 assert((i < To->getNumValues()) && "Invalid To location");
13163 transferDbgValues(SDValue(From, i), SDValue(To, i));
13164 }
13165 // Preserve extra info.
13166 copyExtraInfo(From, To);
13167
13168 // Iterate over just the existing users of From. See the comments in
13169 // the ReplaceAllUsesWith above.
13170 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13171 RAUWUpdateListener Listener(*this, UI, UE);
13172 while (UI != UE) {
13173 SDNode *User = UI->getUser();
13174
13175 // This node is about to morph, remove its old self from the CSE maps.
13176 RemoveNodeFromCSEMaps(User);
13177
13178 // A user can appear in a use list multiple times, and when this
13179 // happens the uses are usually next to each other in the list.
13180 // To help reduce the number of CSE recomputations, process all
13181 // the uses of this user that we can find this way.
13182 do {
13183 SDUse &Use = *UI;
13184 ++UI;
13185 Use.setNode(To);
13186 if (To->isDivergent() != From->isDivergent())
13188 } while (UI != UE && UI->getUser() == User);
13189
13190 // Now that we have modified User, add it back to the CSE maps. If it
13191 // already exists there, recursively merge the results together.
13192 AddModifiedNodeToCSEMaps(User);
13193 }
13194
13195 // If we just RAUW'd the root, take note.
13196 if (From == getRoot().getNode())
13197 setRoot(SDValue(To, getRoot().getResNo()));
13198}
13199
13200/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13201/// This can cause recursive merging of nodes in the DAG.
13202///
13203/// This version can replace From with any result values. To must match the
13204/// number and types of values returned by From.
13206 if (From->getNumValues() == 1) // Handle the simple case efficiently.
13207 return ReplaceAllUsesWith(SDValue(From, 0), To[0]);
13208
13209 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) {
13210 // Preserve Debug Info.
13211 transferDbgValues(SDValue(From, i), To[i]);
13212 // Preserve extra info.
13213 copyExtraInfo(From, To[i].getNode());
13214 }
13215
13216 // Iterate over just the existing users of From. See the comments in
13217 // the ReplaceAllUsesWith above.
13218 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13219 RAUWUpdateListener Listener(*this, UI, UE);
13220 while (UI != UE) {
13221 SDNode *User = UI->getUser();
13222
13223 // This node is about to morph, remove its old self from the CSE maps.
13224 RemoveNodeFromCSEMaps(User);
13225
13226 // A user can appear in a use list multiple times, and when this happens the
13227 // uses are usually next to each other in the list. To help reduce the
13228 // number of CSE and divergence recomputations, process all the uses of this
13229 // user that we can find this way.
13230 bool To_IsDivergent = false;
13231 do {
13232 SDUse &Use = *UI;
13233 const SDValue &ToOp = To[Use.getResNo()];
13234 ++UI;
13235 Use.set(ToOp);
13236 if (ToOp.getValueType() != MVT::Other)
13237 To_IsDivergent |= ToOp->isDivergent();
13238 } while (UI != UE && UI->getUser() == User);
13239
13240 if (To_IsDivergent != From->isDivergent())
13242
13243 // Now that we have modified User, add it back to the CSE maps. If it
13244 // already exists there, recursively merge the results together.
13245 AddModifiedNodeToCSEMaps(User);
13246 }
13247
13248 // If we just RAUW'd the root, take note.
13249 if (From == getRoot().getNode())
13250 setRoot(SDValue(To[getRoot().getResNo()]));
13251}
13252
13253/// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
13254/// uses of other values produced by From.getNode() alone. The Deleted
13255/// vector is handled the same way as for ReplaceAllUsesWith.
13257 // Handle the really simple, really trivial case efficiently.
13258 if (From == To) return;
13259
13260 // Handle the simple, trivial, case efficiently.
13261 if (From.getNode()->getNumValues() == 1) {
13262 ReplaceAllUsesWith(From, To);
13263 return;
13264 }
13265
13266 // Preserve Debug Info.
13267 transferDbgValues(From, To);
13268 copyExtraInfo(From.getNode(), To.getNode());
13269
13270 // Iterate over just the existing users of From. See the comments in
13271 // the ReplaceAllUsesWith above.
13272 SDNode::use_iterator UI = From.getNode()->use_begin(),
13273 UE = From.getNode()->use_end();
13274 RAUWUpdateListener Listener(*this, UI, UE);
13275 while (UI != UE) {
13276 SDNode *User = UI->getUser();
13277 bool UserRemovedFromCSEMaps = false;
13278
13279 // A user can appear in a use list multiple times, and when this
13280 // happens the uses are usually next to each other in the list.
13281 // To help reduce the number of CSE recomputations, process all
13282 // the uses of this user that we can find this way.
13283 do {
13284 SDUse &Use = *UI;
13285
13286 // Skip uses of different values from the same node.
13287 if (Use.getResNo() != From.getResNo()) {
13288 ++UI;
13289 continue;
13290 }
13291
13292 // If this node hasn't been modified yet, it's still in the CSE maps,
13293 // so remove its old self from the CSE maps.
13294 if (!UserRemovedFromCSEMaps) {
13295 RemoveNodeFromCSEMaps(User);
13296 UserRemovedFromCSEMaps = true;
13297 }
13298
13299 ++UI;
13300 Use.set(To);
13301 if (To->isDivergent() != From->isDivergent())
13303 } while (UI != UE && UI->getUser() == User);
13304 // We are iterating over all uses of the From node, so if a use
13305 // doesn't use the specific value, no changes are made.
13306 if (!UserRemovedFromCSEMaps)
13307 continue;
13308
13309 // Now that we have modified User, add it back to the CSE maps. If it
13310 // already exists there, recursively merge the results together.
13311 AddModifiedNodeToCSEMaps(User);
13312 }
13313
13314 // If we just RAUW'd the root, take note.
13315 if (From == getRoot())
13316 setRoot(To);
13317}
13318
13319namespace {
13320
13321/// UseMemo - This class is used by SelectionDAG::ReplaceAllUsesOfValuesWith
13322/// to record information about a use.
13323struct UseMemo {
13324 SDNode *User;
13325 unsigned Index;
13326 SDUse *Use;
13327};
13328
13329/// operator< - Sort Memos by User.
13330bool operator<(const UseMemo &L, const UseMemo &R) {
13331 return (intptr_t)L.User < (intptr_t)R.User;
13332}
13333
13334/// RAUOVWUpdateListener - Helper for ReplaceAllUsesOfValuesWith - When the node
13335/// pointed to by a UseMemo is deleted, set the User to nullptr to indicate that
13336/// the node already has been taken care of recursively.
13337class RAUOVWUpdateListener : public SelectionDAG::DAGUpdateListener {
13338 SmallVectorImpl<UseMemo> &Uses;
13339
13340 void NodeDeleted(SDNode *N, SDNode *E) override {
13341 for (UseMemo &Memo : Uses)
13342 if (Memo.User == N)
13343 Memo.User = nullptr;
13344 }
13345
13346public:
13347 RAUOVWUpdateListener(SelectionDAG &d, SmallVectorImpl<UseMemo> &uses)
13348 : SelectionDAG::DAGUpdateListener(d), Uses(uses) {}
13349};
13350
13351} // end anonymous namespace
13352
13353/// Return true if a glue output should propagate divergence information.
13355 switch (Node->getOpcode()) {
13356 case ISD::CopyFromReg:
13357 case ISD::CopyToReg:
13358 return false;
13359 default:
13360 return true;
13361 }
13362
13363 llvm_unreachable("covered opcode switch");
13364}
13365
13367 if (TLI->isSDNodeAlwaysUniform(N)) {
13368 assert(!TLI->isSDNodeSourceOfDivergence(N, FLI, UA) &&
13369 "Conflicting divergence information!");
13370 return false;
13371 }
13372 if (TLI->isSDNodeSourceOfDivergence(N, FLI, UA))
13373 return true;
13374 for (const auto &Op : N->ops()) {
13375 EVT VT = Op.getValueType();
13376
13377 // Skip Chain. It does not carry divergence.
13378 if (VT != MVT::Other && Op.getNode()->isDivergent() &&
13379 (VT != MVT::Glue || gluePropagatesDivergence(Op.getNode())))
13380 return true;
13381 }
13382 return false;
13383}
13384
13386 SmallVector<SDNode *, 16> Worklist(1, N);
13387 do {
13388 N = Worklist.pop_back_val();
13389 bool IsDivergent = calculateDivergence(N);
13390 if (N->SDNodeBits.IsDivergent != IsDivergent) {
13391 N->SDNodeBits.IsDivergent = IsDivergent;
13392 llvm::append_range(Worklist, N->users());
13393 }
13394 } while (!Worklist.empty());
13395}
13396
13397void SelectionDAG::CreateTopologicalOrder(std::vector<SDNode *> &Order) {
13399 Order.reserve(AllNodes.size());
13400 for (auto &N : allnodes()) {
13401 unsigned NOps = N.getNumOperands();
13402 Degree[&N] = NOps;
13403 if (0 == NOps)
13404 Order.push_back(&N);
13405 }
13406 for (size_t I = 0; I != Order.size(); ++I) {
13407 SDNode *N = Order[I];
13408 for (auto *U : N->users()) {
13409 unsigned &UnsortedOps = Degree[U];
13410 if (0 == --UnsortedOps)
13411 Order.push_back(U);
13412 }
13413 }
13414}
13415
13416#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
13417void SelectionDAG::VerifyDAGDivergence() {
13418 std::vector<SDNode *> TopoOrder;
13419 CreateTopologicalOrder(TopoOrder);
13420 for (auto *N : TopoOrder) {
13421 assert(calculateDivergence(N) == N->isDivergent() &&
13422 "Divergence bit inconsistency detected");
13423 }
13424}
13425#endif
13426
13427/// ReplaceAllUsesOfValuesWith - Replace any uses of From with To, leaving
13428/// uses of other values produced by From.getNode() alone. The same value
13429/// may appear in both the From and To list. The Deleted vector is
13430/// handled the same way as for ReplaceAllUsesWith.
13432 const SDValue *To,
13433 unsigned Num){
13434 // Handle the simple, trivial case efficiently.
13435 if (Num == 1)
13436 return ReplaceAllUsesOfValueWith(*From, *To);
13437
13438 transferDbgValues(*From, *To);
13439 copyExtraInfo(From->getNode(), To->getNode());
13440
13441 // Read up all the uses and make records of them. This helps
13442 // processing new uses that are introduced during the
13443 // replacement process.
13445 for (unsigned i = 0; i != Num; ++i) {
13446 unsigned FromResNo = From[i].getResNo();
13447 SDNode *FromNode = From[i].getNode();
13448 for (SDUse &Use : FromNode->uses()) {
13449 if (Use.getResNo() == FromResNo) {
13450 UseMemo Memo = {Use.getUser(), i, &Use};
13451 Uses.push_back(Memo);
13452 }
13453 }
13454 }
13455
13456 // Sort the uses, so that all the uses from a given User are together.
13458 RAUOVWUpdateListener Listener(*this, Uses);
13459
13460 for (unsigned UseIndex = 0, UseIndexEnd = Uses.size();
13461 UseIndex != UseIndexEnd; ) {
13462 // We know that this user uses some value of From. If it is the right
13463 // value, update it.
13464 SDNode *User = Uses[UseIndex].User;
13465 // If the node has been deleted by recursive CSE updates when updating
13466 // another node, then just skip this entry.
13467 if (User == nullptr) {
13468 ++UseIndex;
13469 continue;
13470 }
13471
13472 // This node is about to morph, remove its old self from the CSE maps.
13473 RemoveNodeFromCSEMaps(User);
13474
13475 // The Uses array is sorted, so all the uses for a given User
13476 // are next to each other in the list.
13477 // To help reduce the number of CSE recomputations, process all
13478 // the uses of this user that we can find this way.
13479 do {
13480 unsigned i = Uses[UseIndex].Index;
13481 SDUse &Use = *Uses[UseIndex].Use;
13482 ++UseIndex;
13483
13484 Use.set(To[i]);
13485 } while (UseIndex != UseIndexEnd && Uses[UseIndex].User == User);
13486
13487 // Now that we have modified User, add it back to the CSE maps. If it
13488 // already exists there, recursively merge the results together.
13489 AddModifiedNodeToCSEMaps(User);
13490 }
13491}
13492
13493/// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
13494/// based on their topological order. It returns the maximum id and a vector
13495/// of the SDNodes* in assigned order by reference.
13497 unsigned DAGSize = 0;
13498
13499 // SortedPos tracks the progress of the algorithm. Nodes before it are
13500 // sorted, nodes after it are unsorted. When the algorithm completes
13501 // it is at the end of the list.
13502 allnodes_iterator SortedPos = allnodes_begin();
13503
13504 // Visit all the nodes. Move nodes with no operands to the front of
13505 // the list immediately. Annotate nodes that do have operands with their
13506 // operand count. Before we do this, the Node Id fields of the nodes
13507 // may contain arbitrary values. After, the Node Id fields for nodes
13508 // before SortedPos will contain the topological sort index, and the
13509 // Node Id fields for nodes At SortedPos and after will contain the
13510 // count of outstanding operands.
13512 checkForCycles(&N, this);
13513 unsigned Degree = N.getNumOperands();
13514 if (Degree == 0) {
13515 // A node with no uses, add it to the result array immediately.
13516 N.setNodeId(DAGSize++);
13517 allnodes_iterator Q(&N);
13518 if (Q != SortedPos)
13519 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(Q));
13520 assert(SortedPos != AllNodes.end() && "Overran node list");
13521 ++SortedPos;
13522 } else {
13523 // Temporarily use the Node Id as scratch space for the degree count.
13524 N.setNodeId(Degree);
13525 }
13526 }
13527
13528 // Visit all the nodes. As we iterate, move nodes into sorted order,
13529 // such that by the time the end is reached all nodes will be sorted.
13530 for (SDNode &Node : allnodes()) {
13531 SDNode *N = &Node;
13532 checkForCycles(N, this);
13533 // N is in sorted position, so all its uses have one less operand
13534 // that needs to be sorted.
13535 for (SDNode *P : N->users()) {
13536 unsigned Degree = P->getNodeId();
13537 assert(Degree != 0 && "Invalid node degree");
13538 --Degree;
13539 if (Degree == 0) {
13540 // All of P's operands are sorted, so P may sorted now.
13541 P->setNodeId(DAGSize++);
13542 if (P->getIterator() != SortedPos)
13543 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(P));
13544 assert(SortedPos != AllNodes.end() && "Overran node list");
13545 ++SortedPos;
13546 } else {
13547 // Update P's outstanding operand count.
13548 P->setNodeId(Degree);
13549 }
13550 }
13551 if (Node.getIterator() == SortedPos) {
13552#ifndef NDEBUG
13554 SDNode *S = &*++I;
13555 dbgs() << "Overran sorted position:\n";
13556 S->dumprFull(this); dbgs() << "\n";
13557 dbgs() << "Checking if this is due to cycles\n";
13558 checkForCycles(this, true);
13559#endif
13560 llvm_unreachable(nullptr);
13561 }
13562 }
13563
13564 assert(SortedPos == AllNodes.end() &&
13565 "Topological sort incomplete!");
13566 assert(AllNodes.front().getOpcode() == ISD::EntryToken &&
13567 "First node in topological sort is not the entry token!");
13568 assert(AllNodes.front().getNodeId() == 0 &&
13569 "First node in topological sort has non-zero id!");
13570 assert(AllNodes.front().getNumOperands() == 0 &&
13571 "First node in topological sort has operands!");
13572 assert(AllNodes.back().getNodeId() == (int)DAGSize-1 &&
13573 "Last node in topologic sort has unexpected id!");
13574 assert(AllNodes.back().use_empty() &&
13575 "Last node in topologic sort has users!");
13576 assert(DAGSize == allnodes_size() && "Node count mismatch!");
13577 return DAGSize;
13578}
13579
13581 SmallVectorImpl<const SDNode *> &SortedNodes) const {
13582 SortedNodes.clear();
13583 // Node -> remaining number of outstanding operands.
13584 DenseMap<const SDNode *, unsigned> RemainingOperands;
13585
13586 // Put nodes without any operands into SortedNodes first.
13587 for (const SDNode &N : allnodes()) {
13588 checkForCycles(&N, this);
13589 unsigned NumOperands = N.getNumOperands();
13590 if (NumOperands == 0)
13591 SortedNodes.push_back(&N);
13592 else
13593 // Record their total number of outstanding operands.
13594 RemainingOperands[&N] = NumOperands;
13595 }
13596
13597 // A node is pushed into SortedNodes when all of its operands (predecessors in
13598 // the graph) are also in SortedNodes.
13599 for (unsigned i = 0U; i < SortedNodes.size(); ++i) {
13600 const SDNode *N = SortedNodes[i];
13601 for (const SDNode *U : N->users()) {
13602 // HandleSDNode is never part of a DAG and therefore has no entry in
13603 // RemainingOperands.
13604 if (U->getOpcode() == ISD::HANDLENODE)
13605 continue;
13606 unsigned &NumRemOperands = RemainingOperands[U];
13607 assert(NumRemOperands && "Invalid number of remaining operands");
13608 --NumRemOperands;
13609 if (!NumRemOperands)
13610 SortedNodes.push_back(U);
13611 }
13612 }
13613
13614 assert(SortedNodes.size() == AllNodes.size() && "Node count mismatch");
13615 assert(SortedNodes.front()->getOpcode() == ISD::EntryToken &&
13616 "First node in topological sort is not the entry token");
13617 assert(SortedNodes.front()->getNumOperands() == 0 &&
13618 "First node in topological sort has operands");
13619}
13620
13621/// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the
13622/// value is produced by SD.
13623void SelectionDAG::AddDbgValue(SDDbgValue *DB, bool isParameter) {
13624 for (SDNode *SD : DB->getSDNodes()) {
13625 if (!SD)
13626 continue;
13627 assert(DbgInfo->getSDDbgValues(SD).empty() || SD->getHasDebugValue());
13628 SD->setHasDebugValue(true);
13629 }
13630 DbgInfo->add(DB, isParameter);
13631}
13632
13633void SelectionDAG::AddDbgLabel(SDDbgLabel *DB) { DbgInfo->add(DB); }
13634
13636 SDValue NewMemOpChain) {
13637 assert(isa<MemSDNode>(NewMemOpChain) && "Expected a memop node");
13638 assert(NewMemOpChain.getValueType() == MVT::Other && "Expected a token VT");
13639 // The new memory operation must have the same position as the old load in
13640 // terms of memory dependency. Create a TokenFactor for the old load and new
13641 // memory operation and update uses of the old load's output chain to use that
13642 // TokenFactor.
13643 if (OldChain == NewMemOpChain || OldChain.use_empty())
13644 return NewMemOpChain;
13645
13646 SDValue TokenFactor = getNode(ISD::TokenFactor, SDLoc(OldChain), MVT::Other,
13647 OldChain, NewMemOpChain);
13648 ReplaceAllUsesOfValueWith(OldChain, TokenFactor);
13649 UpdateNodeOperands(TokenFactor.getNode(), OldChain, NewMemOpChain);
13650 return TokenFactor;
13651}
13652
13654 SDValue NewMemOp) {
13655 assert(isa<MemSDNode>(NewMemOp.getNode()) && "Expected a memop node");
13656 SDValue OldChain = SDValue(OldLoad, 1);
13657 SDValue NewMemOpChain = NewMemOp.getValue(1);
13658 return makeEquivalentMemoryOrdering(OldChain, NewMemOpChain);
13659}
13660
13662 Function **OutFunction) {
13663 assert(isa<ExternalSymbolSDNode>(Op) && "Node should be an ExternalSymbol");
13664
13665 auto *Symbol = cast<ExternalSymbolSDNode>(Op)->getSymbol();
13666 auto *Module = MF->getFunction().getParent();
13667 auto *Function = Module->getFunction(Symbol);
13668
13669 if (OutFunction != nullptr)
13670 *OutFunction = Function;
13671
13672 if (Function != nullptr) {
13673 auto PtrTy = TLI->getPointerTy(getDataLayout(), Function->getAddressSpace());
13674 return getGlobalAddress(Function, SDLoc(Op), PtrTy);
13675 }
13676
13677 std::string ErrorStr;
13678 raw_string_ostream ErrorFormatter(ErrorStr);
13679 ErrorFormatter << "Undefined external symbol ";
13680 ErrorFormatter << '"' << Symbol << '"';
13681 report_fatal_error(Twine(ErrorStr));
13682}
13683
13684//===----------------------------------------------------------------------===//
13685// SDNode Class
13686//===----------------------------------------------------------------------===//
13687
13690 return Const != nullptr && Const->isZero();
13691}
13692
13694 return V.isUndef() || isNullConstant(V);
13695}
13696
13699 return Const != nullptr && Const->isZero() && !Const->isNegative();
13700}
13701
13704 return Const != nullptr && Const->isAllOnes();
13705}
13706
13709 return Const != nullptr && Const->isOne();
13710}
13711
13714 return Const != nullptr && Const->isMinSignedValue();
13715}
13716
13718 SDValue V, unsigned OperandNo,
13719 unsigned Depth) const {
13720 APInt DemandedElts = getDemandAllEltsMask(V);
13721 return isIdentityElement(Opcode, Flags, V, DemandedElts, OperandNo, Depth);
13722}
13723
13725 SDValue V, const APInt &DemandedElts,
13726 unsigned OperandNo, unsigned Depth) const {
13727 // NOTE: The cases should match with IR's ConstantExpr::getBinOpIdentity().
13728 // TODO: Target-specific opcodes could be added.
13729 if (V.getValueType().isInteger()) {
13730 KnownBits Known = computeKnownBits(V, DemandedElts, Depth);
13731 if (Known.isConstant()) {
13732 const APInt &Const = Known.getConstant();
13733 switch (Opcode) {
13734 case ISD::ADD:
13735 case ISD::OR:
13736 case ISD::XOR:
13737 case ISD::UMAX:
13738 return Const.isZero();
13739 case ISD::MUL:
13740 return Const.isOne();
13741 case ISD::AND:
13742 case ISD::UMIN:
13743 return Const.isAllOnes();
13744 case ISD::SMAX:
13745 return Const.isMinSignedValue();
13746 case ISD::SMIN:
13747 return Const.isMaxSignedValue();
13748 case ISD::SUB:
13749 case ISD::SHL:
13750 case ISD::SRA:
13751 case ISD::SRL:
13752 return OperandNo == 1 && Const.isZero();
13753 case ISD::UDIV:
13754 case ISD::SDIV:
13755 return OperandNo == 1 && Const.isOne();
13756 }
13757 }
13758 } else if (auto *ConstFP = isConstOrConstSplatFP(V, DemandedElts)) {
13759 switch (Opcode) {
13760 case ISD::FADD:
13761 return ConstFP->isZero() &&
13762 (Flags.hasNoSignedZeros() || ConstFP->isNegative());
13763 case ISD::FSUB:
13764 return OperandNo == 1 && ConstFP->isZero() &&
13765 (Flags.hasNoSignedZeros() || !ConstFP->isNegative());
13766 case ISD::FMUL:
13767 return ConstFP->isOne();
13768 case ISD::FDIV:
13769 return OperandNo == 1 && ConstFP->isOne();
13770 case ISD::FMINNUM:
13771 case ISD::FMAXNUM:
13772 case ISD::FMINIMUMNUM:
13773 case ISD::FMAXIMUMNUM: {
13774 // Neutral element for fminnum/fminimumnum is NaN, Inf or FLT_MAX,
13775 // depending on fast-math flags (FMF).
13776 EVT VT = V.getValueType();
13777 const fltSemantics &Semantics = VT.getFltSemantics();
13778 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics)
13779 : !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
13780 : APFloat::getLargest(Semantics);
13781 if (Opcode == ISD::FMAXNUM || Opcode == ISD::FMAXIMUMNUM)
13782 NeutralAF.changeSign();
13783
13784 return ConstFP->isExactlyValue(NeutralAF);
13785 }
13786 case ISD::FMINIMUM:
13787 case ISD::FMAXIMUM: {
13788 // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
13789 const APFloat &VAPF = ConstFP->getValueAPF();
13790 bool NeutralNegative = (Opcode == ISD::FMAXIMUM);
13791 if (Flags.hasNoInfs())
13792 return VAPF.isLargest() && VAPF.isNegative() == NeutralNegative;
13793 return VAPF.isInfinity() && VAPF.isNegative() == NeutralNegative;
13794 }
13795 }
13796 }
13797 return false;
13798}
13799
13801 while (V.getOpcode() == ISD::BITCAST)
13802 V = V.getOperand(0);
13803 return V;
13804}
13805
13807 while (V.getOpcode() == ISD::BITCAST && V.getOperand(0).hasOneUse())
13808 V = V.getOperand(0);
13809 return V;
13810}
13811
13813 while (V.getOpcode() == ISD::EXTRACT_SUBVECTOR)
13814 V = V.getOperand(0);
13815 return V;
13816}
13817
13819 while (V.getOpcode() == ISD::INSERT_VECTOR_ELT) {
13820 SDValue InVec = V.getOperand(0);
13821 SDValue EltNo = V.getOperand(2);
13822 EVT VT = InVec.getValueType();
13823 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
13824 if (IndexC && VT.isFixedLengthVector() &&
13825 IndexC->getAPIntValue().ult(VT.getVectorNumElements()) &&
13826 !DemandedElts[IndexC->getZExtValue()]) {
13827 V = InVec;
13828 continue;
13829 }
13830 break;
13831 }
13832 return V;
13833}
13834
13836 while (V.getOpcode() == ISD::TRUNCATE)
13837 V = V.getOperand(0);
13838 return V;
13839}
13840
13841bool llvm::isBitwiseNot(SDValue V, bool AllowUndefs) {
13842 if (V.getOpcode() != ISD::XOR)
13843 return false;
13844 V = peekThroughBitcasts(V.getOperand(1));
13845 unsigned NumBits = V.getScalarValueSizeInBits();
13846 ConstantSDNode *C =
13847 isConstOrConstSplat(V, AllowUndefs, /*AllowTruncation*/ true);
13848 return C && (C->getAPIntValue().countr_one() >= NumBits);
13849}
13850
13852 bool AllowTruncation) {
13853 APInt DemandedElts = getDemandAllEltsMask(N);
13854 return isConstOrConstSplat(N, DemandedElts, AllowUndefs, AllowTruncation);
13855}
13856
13858 bool AllowUndefs,
13859 bool AllowTruncation) {
13861 return CN;
13862
13863 // SplatVectors can truncate their operands. Ignore that case here unless
13864 // AllowTruncation is set.
13865 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
13866 EVT VecEltVT = N->getValueType(0).getVectorElementType();
13867 if (auto *CN = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
13868 EVT CVT = CN->getValueType(0);
13869 assert(CVT.bitsGE(VecEltVT) && "Illegal splat_vector element extension");
13870 if (AllowTruncation || CVT == VecEltVT)
13871 return CN;
13872 }
13873 }
13874
13876 BitVector UndefElements;
13877 ConstantSDNode *CN = BV->getConstantSplatNode(DemandedElts, &UndefElements);
13878
13879 // BuildVectors can truncate their operands. Ignore that case here unless
13880 // AllowTruncation is set.
13881 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13882 if (CN && (UndefElements.none() || AllowUndefs)) {
13883 EVT CVT = CN->getValueType(0);
13884 EVT NSVT = N.getValueType().getScalarType();
13885 assert(CVT.bitsGE(NSVT) && "Illegal build vector element extension");
13886 if (AllowTruncation || (CVT == NSVT))
13887 return CN;
13888 }
13889 }
13890
13891 return nullptr;
13892}
13893
13895 APInt DemandedElts = getDemandAllEltsMask(N);
13896 return isConstOrConstSplatFP(N, DemandedElts, AllowUndefs);
13897}
13898
13900 const APInt &DemandedElts,
13901 bool AllowUndefs) {
13903 return CN;
13904
13906 BitVector UndefElements;
13907 ConstantFPSDNode *CN =
13908 BV->getConstantFPSplatNode(DemandedElts, &UndefElements);
13909 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13910 if (CN && (UndefElements.none() || AllowUndefs))
13911 return CN;
13912 }
13913
13914 if (N.getOpcode() == ISD::SPLAT_VECTOR)
13915 if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N.getOperand(0)))
13916 return CN;
13917
13918 return nullptr;
13919}
13920
13921bool llvm::isNullOrNullSplat(SDValue N, bool AllowUndefs) {
13922 // TODO: may want to use peekThroughBitcast() here.
13923 ConstantSDNode *C =
13924 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
13925 return C && C->isZero();
13926}
13927
13928bool llvm::isOneOrOneSplat(SDValue N, bool AllowUndefs) {
13929 ConstantSDNode *C =
13930 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation*/ true);
13931 return C && C->isOne();
13932}
13933
13934bool llvm::isOneOrOneSplatFP(SDValue N, bool AllowUndefs) {
13935 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13936 return C && C->isOne();
13937}
13938
13939bool llvm::isAllOnesOrAllOnesSplat(SDValue N, bool AllowUndefs) {
13941 unsigned BitWidth = N.getScalarValueSizeInBits();
13942 ConstantSDNode *C =
13943 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
13944 return C && C->getAPIntValue().countTrailingOnes() >= BitWidth;
13945}
13946
13947bool llvm::isOnesOrOnesSplat(SDValue N, bool AllowUndefs) {
13948 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs);
13949 return C && APInt::isSameValue(C->getAPIntValue(),
13950 APInt(C->getAPIntValue().getBitWidth(), 1));
13951}
13952
13953bool llvm::isZeroOrZeroSplat(SDValue N, bool AllowUndefs) {
13955 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs, true);
13956 return C && C->isZero();
13957}
13958
13959bool llvm::isZeroOrZeroSplatFP(SDValue N, bool AllowUndefs) {
13960 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13961 return C && C->isZero();
13962}
13963
13967
13969 unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt,
13971 : SDNode(Opc, Order, dl, VTs), MemoryVT(memvt), MemRefs(memrefs) {
13972 bool IsVolatile = false;
13973 bool IsNonTemporal = false;
13974 bool IsDereferenceable = true;
13975 bool IsInvariant = true;
13976 for (const MachineMemOperand *MMO : memoperands()) {
13977 IsVolatile |= MMO->isVolatile();
13978 IsNonTemporal |= MMO->isNonTemporal();
13979 IsDereferenceable &= MMO->isDereferenceable();
13980 IsInvariant &= MMO->isInvariant();
13981 }
13982 MemSDNodeBits.IsVolatile = IsVolatile;
13983 MemSDNodeBits.IsNonTemporal = IsNonTemporal;
13984 MemSDNodeBits.IsDereferenceable = IsDereferenceable;
13985 MemSDNodeBits.IsInvariant = IsInvariant;
13986
13987 // For the single-MMO case, we check here that the size of the memory operand
13988 // fits within the size of the MMO. This is because the MMO might indicate
13989 // only a possible address range instead of specifying the affected memory
13990 // addresses precisely.
13993 getMemOperand()->getSize().getValue())) &&
13994 "Size mismatch!");
13995}
13996
13997namespace {
13998
13999 struct EVTArray {
14000 std::vector<EVT> VTs;
14001
14002 EVTArray() {
14003 VTs.reserve(MVT::VALUETYPE_SIZE);
14004 for (unsigned i = 0; i < MVT::VALUETYPE_SIZE; ++i)
14005 VTs.push_back(MVT((MVT::SimpleValueType)i));
14006 }
14007 };
14008
14009} // end anonymous namespace
14010
14011/// getValueTypeList - Return a pointer to the specified value type.
14012///
14013const EVT *SDNode::getValueTypeList(MVT VT) {
14014 static EVTArray SimpleVTArray;
14015
14016 assert(VT < MVT::VALUETYPE_SIZE && "Value type out of range!");
14017 return &SimpleVTArray.VTs[VT.SimpleTy];
14018}
14019
14020/// hasAnyUseOfValue - Return true if there are any use of the indicated
14021/// value. This method ignores uses of other values defined by this operation.
14022bool SDNode::hasAnyUseOfValue(unsigned Value) const {
14023 assert(Value < getNumValues() && "Bad value!");
14024
14025 for (SDUse &U : uses())
14026 if (U.getResNo() == Value)
14027 return true;
14028
14029 return false;
14030}
14031
14032/// isOnlyUserOf - Return true if this node is the only use of N.
14033bool SDNode::isOnlyUserOf(const SDNode *N) const {
14034 bool Seen = false;
14035 for (const SDNode *User : N->users()) {
14036 if (User == this)
14037 Seen = true;
14038 else
14039 return false;
14040 }
14041
14042 return Seen;
14043}
14044
14045/// Return true if the only users of N are contained in Nodes.
14047 bool Seen = false;
14048 for (const SDNode *User : N->users()) {
14049 if (llvm::is_contained(Nodes, User))
14050 Seen = true;
14051 else
14052 return false;
14053 }
14054
14055 return Seen;
14056}
14057
14058/// Return true if the referenced return value is an operand of N.
14059bool SDValue::isOperandOf(const SDNode *N) const {
14060 return is_contained(N->op_values(), *this);
14061}
14062
14063bool SDNode::isOperandOf(const SDNode *N) const {
14064 return any_of(N->op_values(),
14065 [this](SDValue Op) { return this == Op.getNode(); });
14066}
14067
14068/// reachesChainWithoutSideEffects - Return true if this operand (which must
14069/// be a chain) reaches the specified operand without crossing any
14070/// side-effecting instructions on any chain path. In practice, this looks
14071/// through token factors and non-volatile loads. In order to remain efficient,
14072/// this only looks a couple of nodes in, it does not do an exhaustive search.
14073///
14074/// Note that we only need to examine chains when we're searching for
14075/// side-effects; SelectionDAG requires that all side-effects are represented
14076/// by chains, even if another operand would force a specific ordering. This
14077/// constraint is necessary to allow transformations like splitting loads.
14079 unsigned Depth) const {
14080 if (*this == Dest) return true;
14081
14082 // Don't search too deeply, we just want to be able to see through
14083 // TokenFactor's etc.
14084 if (Depth == 0) return false;
14085
14086 // If this is a token factor, all inputs to the TF happen in parallel.
14087 if (getOpcode() == ISD::TokenFactor) {
14088 // First, try a shallow search.
14089 if (is_contained((*this)->ops(), Dest)) {
14090 // We found the chain we want as an operand of this TokenFactor.
14091 // Essentially, we reach the chain without side-effects if we could
14092 // serialize the TokenFactor into a simple chain of operations with
14093 // Dest as the last operation. This is automatically true if the
14094 // chain has one use: there are no other ordering constraints.
14095 // If the chain has more than one use, we give up: some other
14096 // use of Dest might force a side-effect between Dest and the current
14097 // node.
14098 if (Dest.hasOneUse())
14099 return true;
14100 }
14101 // Next, try a deep search: check whether every operand of the TokenFactor
14102 // reaches Dest.
14103 return llvm::all_of((*this)->ops(), [=](SDValue Op) {
14104 return Op.reachesChainWithoutSideEffects(Dest, Depth - 1);
14105 });
14106 }
14107
14108 // Loads don't have side effects, look through them.
14109 if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(*this)) {
14110 if (Ld->isUnordered())
14111 return Ld->getChain().reachesChainWithoutSideEffects(Dest, Depth-1);
14112 }
14113 return false;
14114}
14115
14116bool SDNode::hasPredecessor(const SDNode *N) const {
14119 Worklist.push_back(this);
14120 return hasPredecessorHelper(N, Visited, Worklist);
14121}
14122
14124 this->Flags &= Flags;
14125}
14126
14127SDValue
14129 ArrayRef<ISD::NodeType> CandidateBinOps,
14130 bool AllowPartials) {
14131 // The pattern must end in an extract from index 0.
14132 if (Extract->getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
14133 !isNullConstant(Extract->getOperand(1)))
14134 return SDValue();
14135
14136 // Match against one of the candidate binary ops.
14137 SDValue Op = Extract->getOperand(0);
14138 if (llvm::none_of(CandidateBinOps, [Op](ISD::NodeType BinOp) {
14139 return Op.getOpcode() == unsigned(BinOp);
14140 }))
14141 return SDValue();
14142
14143 // Floating-point reductions may require relaxed constraints on the final step
14144 // of the reduction because they may reorder intermediate operations.
14145 unsigned CandidateBinOp = Op.getOpcode();
14146 if (Op.getValueType().isFloatingPoint()) {
14147 SDNodeFlags Flags = Op->getFlags();
14148 switch (CandidateBinOp) {
14149 case ISD::FADD:
14150 if (!Flags.hasNoSignedZeros() || !Flags.hasAllowReassociation())
14151 return SDValue();
14152 break;
14153 default:
14154 llvm_unreachable("Unhandled FP opcode for binop reduction");
14155 }
14156 }
14157
14158 // Matching failed - attempt to see if we did enough stages that a partial
14159 // reduction from a subvector is possible.
14160 auto PartialReduction = [&](SDValue Op, unsigned NumSubElts) {
14161 if (!AllowPartials || !Op)
14162 return SDValue();
14163 EVT OpVT = Op.getValueType();
14164 EVT OpSVT = OpVT.getScalarType();
14165 EVT SubVT = EVT::getVectorVT(*getContext(), OpSVT, NumSubElts);
14166 if (TLI->getExtractSubvectorCost(SubVT, OpVT, 0) >
14168 return SDValue();
14169 BinOp = (ISD::NodeType)CandidateBinOp;
14170 return getExtractSubvector(SDLoc(Op), SubVT, Op, 0);
14171 };
14172
14173 // At each stage, we're looking for something that looks like:
14174 // %s = shufflevector <8 x i32> %op, <8 x i32> undef,
14175 // <8 x i32> <i32 2, i32 3, i32 undef, i32 undef,
14176 // i32 undef, i32 undef, i32 undef, i32 undef>
14177 // %a = binop <8 x i32> %op, %s
14178 // Where the mask changes according to the stage. E.g. for a 3-stage pyramid,
14179 // we expect something like:
14180 // <4,5,6,7,u,u,u,u>
14181 // <2,3,u,u,u,u,u,u>
14182 // <1,u,u,u,u,u,u,u>
14183 // While a partial reduction match would be:
14184 // <2,3,u,u,u,u,u,u>
14185 // <1,u,u,u,u,u,u,u>
14186 unsigned Stages = Log2_32(Op.getValueType().getVectorNumElements());
14187 SDValue PrevOp;
14188 for (unsigned i = 0; i < Stages; ++i) {
14189 unsigned MaskEnd = (1 << i);
14190
14191 if (Op.getOpcode() != CandidateBinOp)
14192 return PartialReduction(PrevOp, MaskEnd);
14193
14194 SDValue Op0 = Op.getOperand(0);
14195 SDValue Op1 = Op.getOperand(1);
14196
14198 if (Shuffle) {
14199 Op = Op1;
14200 } else {
14201 Shuffle = dyn_cast<ShuffleVectorSDNode>(Op1);
14202 Op = Op0;
14203 }
14204
14205 // The first operand of the shuffle should be the same as the other operand
14206 // of the binop.
14207 if (!Shuffle || Shuffle->getOperand(0) != Op)
14208 return PartialReduction(PrevOp, MaskEnd);
14209
14210 // Verify the shuffle has the expected (at this stage of the pyramid) mask.
14211 for (int Index = 0; Index < (int)MaskEnd; ++Index)
14212 if (Shuffle->getMaskElt(Index) != (int)(MaskEnd + Index))
14213 return PartialReduction(PrevOp, MaskEnd);
14214
14215 PrevOp = Op;
14216 }
14217
14218 // Handle subvector reductions, which tend to appear after the shuffle
14219 // reduction stages.
14220 while (Op.getOpcode() == CandidateBinOp) {
14221 unsigned NumElts = Op.getValueType().getVectorNumElements();
14222 SDValue Op0 = Op.getOperand(0);
14223 SDValue Op1 = Op.getOperand(1);
14224 if (Op0.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
14226 Op0.getOperand(0) != Op1.getOperand(0))
14227 break;
14228 SDValue Src = Op0.getOperand(0);
14229 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
14230 if (NumSrcElts != (2 * NumElts))
14231 break;
14232 if (!(Op0.getConstantOperandAPInt(1) == 0 &&
14233 Op1.getConstantOperandAPInt(1) == NumElts) &&
14234 !(Op1.getConstantOperandAPInt(1) == 0 &&
14235 Op0.getConstantOperandAPInt(1) == NumElts))
14236 break;
14237 Op = Src;
14238 }
14239
14240 BinOp = (ISD::NodeType)CandidateBinOp;
14241 return Op;
14242}
14243
14245 EVT VT = N->getValueType(0);
14246 EVT EltVT = VT.getVectorElementType();
14247 unsigned NE = getMaxRuntimeNumElements(VT);
14248
14249 if (VT.isScalableVector() && (NE == 0 || ResNE != 0))
14250 reportFatalUsageError("Cannot unroll scalable vector!");
14251
14252 assert(NE && "Nothing to unroll!");
14253 SDLoc dl(N);
14254
14255 // If ResNE is 0, fully unroll the vector op.
14256 if (ResNE == 0)
14257 ResNE = NE;
14258 else if (NE > ResNE)
14259 NE = ResNE;
14260
14261 if (N->getNumValues() == 2) {
14262 SmallVector<SDValue, 8> Scalars0, Scalars1;
14263 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14264 EVT VT1 = N->getValueType(1);
14265 EVT EltVT1 = VT1.getVectorElementType();
14266
14267 unsigned i;
14268 for (i = 0; i != NE; ++i) {
14269 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14270 SDValue Operand = N->getOperand(j);
14271 EVT OperandVT = Operand.getValueType();
14272
14273 // A vector operand; extract a single element.
14274 EVT OperandEltVT = OperandVT.getVectorElementType();
14275 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14276 }
14277
14278 SDValue EltOp = getNode(N->getOpcode(), dl, {EltVT, EltVT1}, Operands);
14279 Scalars0.push_back(EltOp);
14280 Scalars1.push_back(EltOp.getValue(1));
14281 }
14282
14283 for (; i < ResNE; ++i) {
14284 Scalars0.push_back(getUNDEF(EltVT));
14285 Scalars1.push_back(getUNDEF(EltVT1));
14286 }
14287
14289 : ElementCount::getFixed(ResNE);
14290 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResEC);
14291 EVT VecVT1 = EVT::getVectorVT(*getContext(), EltVT1, ResEC);
14292 SDValue Vec0 = buildVectorFromUnrolledParts(VecVT, dl, Scalars0);
14293 SDValue Vec1 = buildVectorFromUnrolledParts(VecVT1, dl, Scalars1);
14294 return getMergeValues({Vec0, Vec1}, dl);
14295 }
14296
14297 assert(N->getNumValues() == 1 &&
14298 "Can't unroll a vector with multiple results!");
14299
14301 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14302
14303 unsigned i;
14304 for (i= 0; i != NE; ++i) {
14305 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14306 SDValue Operand = N->getOperand(j);
14307 EVT OperandVT = Operand.getValueType();
14308 if (OperandVT.isVector()) {
14309 // A vector operand; extract a single element.
14310 EVT OperandEltVT = OperandVT.getVectorElementType();
14311 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14312 } else {
14313 // A scalar operand; just use it as is.
14314 Operands[j] = Operand;
14315 }
14316 }
14317
14318 switch (N->getOpcode()) {
14319 default: {
14320 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands,
14321 N->getFlags()));
14322 break;
14323 }
14324 case ISD::VSELECT:
14325 Scalars.push_back(
14326 getNode(ISD::SELECT, dl, EltVT, Operands, N->getFlags()));
14327 break;
14328 case ISD::SHL:
14329 case ISD::SRA:
14330 case ISD::SRL:
14331 case ISD::ROTL:
14332 case ISD::ROTR:
14333 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands[0],
14335 Operands[1])));
14336 break;
14338 EVT ExtVT = cast<VTSDNode>(Operands[1])->getVT().getVectorElementType();
14339 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT,
14340 Operands[0],
14341 getValueType(ExtVT)));
14342 break;
14343 }
14344 case ISD::ADDRSPACECAST: {
14345 const auto *ASC = cast<AddrSpaceCastSDNode>(N);
14346 Scalars.push_back(
14347 getAddrSpaceCast(dl, EltVT, Operands[0], ASC->getSrcAddressSpace(),
14348 ASC->getDestAddressSpace(), ASC->getFlags()));
14349 break;
14350 }
14351 }
14352 }
14353
14354 for (; i < ResNE; ++i)
14355 Scalars.push_back(getUNDEF(EltVT));
14356
14357 EVT VecVT = VT.isScalableVector()
14358 ? VT
14359 : EVT::getVectorVT(*getContext(), EltVT, ResNE);
14360 return buildVectorFromUnrolledParts(VecVT, dl, Scalars);
14361}
14362
14363std::pair<SDValue, SDValue> SelectionDAG::UnrollVectorOverflowOp(
14364 SDNode *N, unsigned ResNE) {
14365 unsigned Opcode = N->getOpcode();
14366 assert((Opcode == ISD::UADDO || Opcode == ISD::SADDO ||
14367 Opcode == ISD::USUBO || Opcode == ISD::SSUBO ||
14368 Opcode == ISD::UMULO || Opcode == ISD::SMULO) &&
14369 "Expected an overflow opcode");
14370
14371 EVT ResVT = N->getValueType(0);
14372 EVT OvVT = N->getValueType(1);
14373 EVT ResEltVT = ResVT.getVectorElementType();
14374 EVT OvEltVT = OvVT.getVectorElementType();
14375 SDLoc dl(N);
14376
14377 // If ResNE is 0, fully unroll the vector op.
14378 unsigned NE = ResVT.getVectorNumElements();
14379 if (ResNE == 0)
14380 ResNE = NE;
14381 else if (NE > ResNE)
14382 NE = ResNE;
14383
14384 SmallVector<SDValue, 8> LHSScalars;
14385 SmallVector<SDValue, 8> RHSScalars;
14386 ExtractVectorElements(N->getOperand(0), LHSScalars, 0, NE);
14387 ExtractVectorElements(N->getOperand(1), RHSScalars, 0, NE);
14388
14389 EVT SVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), ResEltVT);
14390 SDVTList VTs = getVTList(ResEltVT, SVT);
14391 SmallVector<SDValue, 8> ResScalars;
14392 SmallVector<SDValue, 8> OvScalars;
14393 for (unsigned i = 0; i < NE; ++i) {
14394 SDValue Res = getNode(Opcode, dl, VTs, LHSScalars[i], RHSScalars[i]);
14395 SDValue Ov =
14396 getSelect(dl, OvEltVT, Res.getValue(1),
14397 getBoolConstant(true, dl, OvEltVT, ResVT),
14398 getConstant(0, dl, OvEltVT));
14399
14400 ResScalars.push_back(Res);
14401 OvScalars.push_back(Ov);
14402 }
14403
14404 ResScalars.append(ResNE - NE, getUNDEF(ResEltVT));
14405 OvScalars.append(ResNE - NE, getUNDEF(OvEltVT));
14406
14407 EVT NewResVT = EVT::getVectorVT(*getContext(), ResEltVT, ResNE);
14408 EVT NewOvVT = EVT::getVectorVT(*getContext(), OvEltVT, ResNE);
14409 return std::make_pair(getBuildVector(NewResVT, dl, ResScalars),
14410 getBuildVector(NewOvVT, dl, OvScalars));
14411}
14412
14415 unsigned Bytes, int Dist,
14416 const SelectionDAG &DAG) {
14417 if (LS->isVolatile() || Base->isVolatile())
14418 return false;
14419 // TODO: probably too restrictive for atomics, revisit
14420 if (!LS->isSimple())
14421 return false;
14422 if (LS->isIndexed() || Base->isIndexed())
14423 return false;
14424 if (LS->getChain() != Base->getChain())
14425 return false;
14426 EVT VT = LS->getMemoryVT();
14427 if (VT.getSizeInBits() / 8 != Bytes)
14428 return false;
14429
14430 auto BaseLocDecomp = BaseIndexOffset::match(Base, DAG);
14431 auto LocDecomp = BaseIndexOffset::match(LS, DAG);
14432
14433 int64_t Offset = 0;
14434 if (BaseLocDecomp.equalBaseIndex(LocDecomp, DAG, Offset))
14435 return (Dist * (int64_t)Bytes == Offset);
14436 return false;
14437}
14438
14441 unsigned Bytes,
14442 int Dist) const {
14443 return areNonVolatileConsecutiveLoadsOrStores(LD, Base, Bytes, Dist, *this);
14444}
14445
14448 unsigned Bytes,
14449 int Dist) const {
14450 return areNonVolatileConsecutiveLoadsOrStores(ST, Base, Bytes, Dist, *this);
14451}
14452
14453/// InferPtrAlignment - Infer alignment of a load / store address. Return
14454/// std::nullopt if it cannot be inferred.
14456 // If this is a GlobalAddress + cst, return the alignment.
14457 const GlobalValue *GV = nullptr;
14458 int64_t GVOffset = 0;
14459 if (TLI->isGAPlusOffset(Ptr.getNode(), GV, GVOffset)) {
14460 unsigned PtrWidth = getDataLayout().getPointerTypeSizeInBits(GV->getType());
14461 KnownBits Known(PtrWidth);
14463 unsigned AlignBits = Known.countMinTrailingZeros();
14464 if (AlignBits)
14465 return commonAlignment(Align(1ull << std::min(31U, AlignBits)), GVOffset);
14466 }
14467
14468 // If this is a direct reference to a stack slot, use information about the
14469 // stack slot's alignment.
14470 int FrameIdx = INT_MIN;
14471 int64_t FrameOffset = 0;
14473 FrameIdx = FI->getIndex();
14474 } else if (isBaseWithConstantOffset(Ptr) &&
14476 // Handle FI+Cst
14477 FrameIdx = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
14478 FrameOffset = Ptr.getConstantOperandVal(1);
14479 }
14480
14481 if (FrameIdx != INT_MIN) {
14483 return commonAlignment(MFI.getObjectAlign(FrameIdx), FrameOffset);
14484 }
14485
14486 return std::nullopt;
14487}
14488
14489/// Split the scalar node with EXTRACT_ELEMENT using the provided
14490/// VTs and return the low/high part.
14491std::pair<SDValue, SDValue> SelectionDAG::SplitScalar(const SDValue &N,
14492 const SDLoc &DL,
14493 const EVT &LoVT,
14494 const EVT &HiVT) {
14495 assert(!LoVT.isVector() && !HiVT.isVector() && !N.getValueType().isVector() &&
14496 "Split node must be a scalar type");
14497 SDValue Lo =
14499 SDValue Hi =
14501 return std::make_pair(Lo, Hi);
14502}
14503
14504/// GetSplitDestVTs - Compute the VTs needed for the low/hi parts of a type
14505/// which is split (or expanded) into two not necessarily identical pieces.
14506std::pair<EVT, EVT> SelectionDAG::GetSplitDestVTs(const EVT &VT) const {
14507 // Currently all types are split in half.
14508 EVT LoVT, HiVT;
14509 if (!VT.isVector())
14510 LoVT = HiVT = TLI->getTypeToTransformTo(*getContext(), VT);
14511 else
14512 LoVT = HiVT = VT.getHalfNumVectorElementsVT(*getContext());
14513
14514 return std::make_pair(LoVT, HiVT);
14515}
14516
14517/// GetDependentSplitDestVTs - Compute the VTs needed for the low/hi parts of a
14518/// type, dependent on an enveloping VT that has been split into two identical
14519/// pieces. Sets the HiIsEmpty flag when hi type has zero storage size.
14520std::pair<EVT, EVT>
14522 bool *HiIsEmpty) const {
14523 EVT EltTp = VT.getVectorElementType();
14524 // Examples:
14525 // custom VL=8 with enveloping VL=8/8 yields 8/0 (hi empty)
14526 // custom VL=9 with enveloping VL=8/8 yields 8/1
14527 // custom VL=10 with enveloping VL=8/8 yields 8/2
14528 // etc.
14529 ElementCount VTNumElts = VT.getVectorElementCount();
14530 ElementCount EnvNumElts = EnvVT.getVectorElementCount();
14531 assert(VTNumElts.isScalable() == EnvNumElts.isScalable() &&
14532 "Mixing fixed width and scalable vectors when enveloping a type");
14533 EVT LoVT, HiVT;
14534 if (VTNumElts.getKnownMinValue() > EnvNumElts.getKnownMinValue()) {
14535 LoVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14536 HiVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts - EnvNumElts);
14537 *HiIsEmpty = false;
14538 } else {
14539 // Flag that hi type has zero storage size, but return split envelop type
14540 // (this would be easier if vector types with zero elements were allowed).
14541 LoVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts);
14542 HiVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14543 *HiIsEmpty = true;
14544 }
14545 return std::make_pair(LoVT, HiVT);
14546}
14547
14548/// SplitVector - Split the vector with EXTRACT_SUBVECTOR and return the
14549/// low/high part.
14550std::pair<SDValue, SDValue>
14551SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT,
14552 const EVT &HiVT) {
14553 assert(LoVT.isScalableVector() == HiVT.isScalableVector() &&
14554 LoVT.isScalableVector() == N.getValueType().isScalableVector() &&
14555 "Splitting vector with an invalid mixture of fixed and scalable "
14556 "vector types");
14558 N.getValueType().getVectorMinNumElements() &&
14559 "More vector elements requested than available!");
14560 SDValue Lo, Hi;
14561 Lo = getExtractSubvector(DL, LoVT, N, 0);
14562 // For scalable vectors it is safe to use LoVT.getVectorMinNumElements()
14563 // (rather than having to use ElementCount), because EXTRACT_SUBVECTOR scales
14564 // IDX with the runtime scaling factor of the result vector type. For
14565 // fixed-width result vectors, that runtime scaling factor is 1.
14567 return std::make_pair(Lo, Hi);
14568}
14569
14570std::pair<SDValue, SDValue> SelectionDAG::SplitEVL(SDValue N, EVT VecVT,
14571 const SDLoc &DL) {
14572 // Split the vector length parameter.
14573 // %evl -> umin(%evl, %halfnumelts) and usubsat(%evl - %halfnumelts).
14574 EVT VT = N.getValueType();
14576 "Expecting the mask to be an evenly-sized vector");
14577 SDValue HalfNumElts = getElementCount(
14579 SDValue Lo = getNode(ISD::UMIN, DL, VT, N, HalfNumElts);
14580 SDValue Hi = getNode(ISD::USUBSAT, DL, VT, N, HalfNumElts);
14581 return std::make_pair(Lo, Hi);
14582}
14583
14584/// Widen the vector up to the next power of two using INSERT_SUBVECTOR.
14586 EVT VT = N.getValueType();
14589 return getInsertSubvector(DL, getPOISON(WideVT), N, 0);
14590}
14591
14594 unsigned Start, unsigned Count,
14595 EVT EltVT) {
14596 EVT VT = Op.getValueType();
14597 if (Count == 0)
14599 if (EltVT == EVT())
14600 EltVT = VT.getVectorElementType();
14601 SDLoc SL(Op);
14602 for (unsigned i = Start, e = Start + Count; i != e; ++i) {
14603 Args.push_back(getExtractVectorElt(SL, EltVT, Op, i));
14604 }
14605}
14606
14607// getAddressSpace - Return the address space this GlobalAddress belongs to.
14609 return getGlobal()->getType()->getAddressSpace();
14610}
14611
14614 return Val.MachineCPVal->getType();
14615 return Val.ConstVal->getType();
14616}
14617
14618bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue, APInt &SplatUndef,
14619 unsigned &SplatBitSize,
14620 bool &HasAnyUndefs,
14621 unsigned MinSplatBits,
14622 bool IsBigEndian) const {
14623 EVT VT = getValueType(0);
14624 assert(VT.isVector() && "Expected a vector type");
14625 unsigned VecWidth = VT.getSizeInBits();
14626 if (MinSplatBits > VecWidth)
14627 return false;
14628
14629 // FIXME: The widths are based on this node's type, but build vectors can
14630 // truncate their operands.
14631 SplatValue = APInt(VecWidth, 0);
14632 SplatUndef = APInt(VecWidth, 0);
14633
14634 // Get the bits. Bits with undefined values (when the corresponding element
14635 // of the vector is an ISD::UNDEF value) are set in SplatUndef and cleared
14636 // in SplatValue. If any of the values are not constant, give up and return
14637 // false.
14638 unsigned int NumOps = getNumOperands();
14639 assert(NumOps > 0 && "isConstantSplat has 0-size build vector");
14640 unsigned EltWidth = VT.getScalarSizeInBits();
14641
14642 for (unsigned j = 0; j < NumOps; ++j) {
14643 unsigned i = IsBigEndian ? NumOps - 1 - j : j;
14644 SDValue OpVal = getOperand(i);
14645 unsigned BitPos = j * EltWidth;
14646
14647 if (OpVal.isUndef())
14648 SplatUndef.setBits(BitPos, BitPos + EltWidth);
14649 else if (auto *CN = dyn_cast<ConstantSDNode>(OpVal))
14650 SplatValue.insertBits(CN->getAPIntValue().zextOrTrunc(EltWidth), BitPos);
14651 else if (auto *CN = dyn_cast<ConstantFPSDNode>(OpVal))
14652 SplatValue.insertBits(CN->getValueAPF().bitcastToAPInt(), BitPos);
14653 else
14654 return false;
14655 }
14656
14657 // The build_vector is all constants or undefs. Find the smallest element
14658 // size that splats the vector.
14659 HasAnyUndefs = (SplatUndef != 0);
14660
14661 // FIXME: This does not work for vectors with elements less than 8 bits.
14662 while (VecWidth > 8) {
14663 // If we can't split in half, stop here.
14664 if (VecWidth & 1)
14665 break;
14666
14667 unsigned HalfSize = VecWidth / 2;
14668 APInt HighValue = SplatValue.extractBits(HalfSize, HalfSize);
14669 APInt LowValue = SplatValue.extractBits(HalfSize, 0);
14670 APInt HighUndef = SplatUndef.extractBits(HalfSize, HalfSize);
14671 APInt LowUndef = SplatUndef.extractBits(HalfSize, 0);
14672
14673 // If the two halves do not match (ignoring undef bits), stop here.
14674 if ((HighValue & ~LowUndef) != (LowValue & ~HighUndef) ||
14675 MinSplatBits > HalfSize)
14676 break;
14677
14678 SplatValue = HighValue | LowValue;
14679 SplatUndef = HighUndef & LowUndef;
14680
14681 VecWidth = HalfSize;
14682 }
14683
14684 // FIXME: The loop above only tries to split in halves. But if the input
14685 // vector for example is <3 x i16> it wouldn't be able to detect a
14686 // SplatBitSize of 16. No idea if that is a design flaw currently limiting
14687 // optimizations. I guess that back in the days when this helper was created
14688 // vectors normally was power-of-2 sized.
14689
14690 SplatBitSize = VecWidth;
14691 return true;
14692}
14693
14695 BitVector *UndefElements) const {
14696 unsigned NumOps = getNumOperands();
14697 if (UndefElements) {
14698 UndefElements->clear();
14699 UndefElements->resize(NumOps);
14700 }
14701 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14702 if (!DemandedElts)
14703 return SDValue();
14704 SDValue Splatted;
14705 for (unsigned i = 0; i != NumOps; ++i) {
14706 if (!DemandedElts[i])
14707 continue;
14708 SDValue Op = getOperand(i);
14709 if (Op.isUndef()) {
14710 if (UndefElements)
14711 (*UndefElements)[i] = true;
14712 } else if (!Splatted) {
14713 Splatted = Op;
14714 } else if (Splatted != Op) {
14715 return SDValue();
14716 }
14717 }
14718
14719 if (!Splatted) {
14720 unsigned FirstDemandedIdx = DemandedElts.countr_zero();
14721 assert(getOperand(FirstDemandedIdx).isUndef() &&
14722 "Can only have a splat without a constant for all undefs.");
14723 return getOperand(FirstDemandedIdx);
14724 }
14725
14726 return Splatted;
14727}
14728
14730 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14731 return getSplatValue(DemandedElts, UndefElements);
14732}
14733
14735 SmallVectorImpl<SDValue> &Sequence,
14736 BitVector *UndefElements) const {
14737 unsigned NumOps = getNumOperands();
14738 Sequence.clear();
14739 if (UndefElements) {
14740 UndefElements->clear();
14741 UndefElements->resize(NumOps);
14742 }
14743 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14744 if (!DemandedElts || NumOps < 2 || !isPowerOf2_32(NumOps))
14745 return false;
14746
14747 // Set the undefs even if we don't find a sequence (like getSplatValue).
14748 if (UndefElements)
14749 for (unsigned I = 0; I != NumOps; ++I)
14750 if (DemandedElts[I] && getOperand(I).isUndef())
14751 (*UndefElements)[I] = true;
14752
14753 // Iteratively widen the sequence length looking for repetitions.
14754 for (unsigned SeqLen = 1; SeqLen < NumOps; SeqLen *= 2) {
14755 Sequence.append(SeqLen, SDValue());
14756 for (unsigned I = 0; I != NumOps; ++I) {
14757 if (!DemandedElts[I])
14758 continue;
14759 SDValue &SeqOp = Sequence[I % SeqLen];
14761 if (Op.isUndef()) {
14762 if (!SeqOp)
14763 SeqOp = Op;
14764 continue;
14765 }
14766 if (SeqOp && !SeqOp.isUndef() && SeqOp != Op) {
14767 Sequence.clear();
14768 break;
14769 }
14770 SeqOp = Op;
14771 }
14772 if (!Sequence.empty())
14773 return true;
14774 }
14775
14776 assert(Sequence.empty() && "Failed to empty non-repeating sequence pattern");
14777 return false;
14778}
14779
14781 BitVector *UndefElements) const {
14782 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14783 return getRepeatedSequence(DemandedElts, Sequence, UndefElements);
14784}
14785
14788 BitVector *UndefElements) const {
14790 getSplatValue(DemandedElts, UndefElements));
14791}
14792
14795 return dyn_cast_or_null<ConstantSDNode>(getSplatValue(UndefElements));
14796}
14797
14800 BitVector *UndefElements) const {
14802 getSplatValue(DemandedElts, UndefElements));
14803}
14804
14809
14810int32_t
14812 uint32_t BitWidth) const {
14813 if (ConstantFPSDNode *CN =
14815 bool IsExact;
14816 APSInt IntVal(BitWidth);
14817 const APFloat &APF = CN->getValueAPF();
14818 if (APF.convertToInteger(IntVal, APFloat::rmTowardZero, &IsExact) !=
14819 APFloat::opOK ||
14820 !IsExact)
14821 return -1;
14822
14823 return IntVal.exactLogBase2();
14824 }
14825 return -1;
14826}
14827
14829 bool IsLittleEndian, unsigned DstEltSizeInBits,
14830 SmallVectorImpl<APInt> &RawBitElements, BitVector &UndefElements) const {
14831 // Early-out if this contains anything but Undef/Constant/ConstantFP.
14832 if (!isConstant())
14833 return false;
14834
14835 unsigned NumSrcOps = getNumOperands();
14836 unsigned SrcEltSizeInBits = getValueType(0).getScalarSizeInBits();
14837 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14838 "Invalid bitcast scale");
14839
14840 // Extract raw src bits.
14841 SmallVector<APInt> SrcBitElements(NumSrcOps,
14842 APInt::getZero(SrcEltSizeInBits));
14843 BitVector SrcUndeElements(NumSrcOps, false);
14844
14845 for (unsigned I = 0; I != NumSrcOps; ++I) {
14847 if (Op.isUndef()) {
14848 SrcUndeElements.set(I);
14849 continue;
14850 }
14851 auto *CInt = dyn_cast<ConstantSDNode>(Op);
14852 auto *CFP = dyn_cast<ConstantFPSDNode>(Op);
14853 assert((CInt || CFP) && "Unknown constant");
14854 SrcBitElements[I] = CInt ? CInt->getAPIntValue().trunc(SrcEltSizeInBits)
14855 : CFP->getValueAPF().bitcastToAPInt();
14856 }
14857
14858 // Recast to dst width.
14859 recastRawBits(IsLittleEndian, DstEltSizeInBits, RawBitElements,
14860 SrcBitElements, UndefElements, SrcUndeElements);
14861 return true;
14862}
14863
14864void BuildVectorSDNode::recastRawBits(bool IsLittleEndian,
14865 unsigned DstEltSizeInBits,
14866 SmallVectorImpl<APInt> &DstBitElements,
14867 ArrayRef<APInt> SrcBitElements,
14868 BitVector &DstUndefElements,
14869 const BitVector &SrcUndefElements) {
14870 unsigned NumSrcOps = SrcBitElements.size();
14871 unsigned SrcEltSizeInBits = SrcBitElements[0].getBitWidth();
14872 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14873 "Invalid bitcast scale");
14874 assert(NumSrcOps == SrcUndefElements.size() &&
14875 "Vector size mismatch");
14876
14877 unsigned NumDstOps = (NumSrcOps * SrcEltSizeInBits) / DstEltSizeInBits;
14878 DstUndefElements.clear();
14879 DstUndefElements.resize(NumDstOps, false);
14880 DstBitElements.assign(NumDstOps, APInt::getZero(DstEltSizeInBits));
14881
14882 // Concatenate src elements constant bits together into dst element.
14883 if (SrcEltSizeInBits <= DstEltSizeInBits) {
14884 unsigned Scale = DstEltSizeInBits / SrcEltSizeInBits;
14885 for (unsigned I = 0; I != NumDstOps; ++I) {
14886 DstUndefElements.set(I);
14887 APInt &DstBits = DstBitElements[I];
14888 for (unsigned J = 0; J != Scale; ++J) {
14889 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14890 if (SrcUndefElements[Idx])
14891 continue;
14892 DstUndefElements.reset(I);
14893 const APInt &SrcBits = SrcBitElements[Idx];
14894 assert(SrcBits.getBitWidth() == SrcEltSizeInBits &&
14895 "Illegal constant bitwidths");
14896 DstBits.insertBits(SrcBits, J * SrcEltSizeInBits);
14897 }
14898 }
14899 return;
14900 }
14901
14902 // Split src element constant bits into dst elements.
14903 unsigned Scale = SrcEltSizeInBits / DstEltSizeInBits;
14904 for (unsigned I = 0; I != NumSrcOps; ++I) {
14905 if (SrcUndefElements[I]) {
14906 DstUndefElements.set(I * Scale, (I + 1) * Scale);
14907 continue;
14908 }
14909 const APInt &SrcBits = SrcBitElements[I];
14910 for (unsigned J = 0; J != Scale; ++J) {
14911 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14912 APInt &DstBits = DstBitElements[Idx];
14913 DstBits = SrcBits.extractBits(DstEltSizeInBits, J * DstEltSizeInBits);
14914 }
14915 }
14916}
14917
14919 for (const SDValue &Op : op_values()) {
14920 unsigned Opc = Op.getOpcode();
14921 if (!Op.isUndef() && Opc != ISD::Constant && Opc != ISD::ConstantFP)
14922 return false;
14923 }
14924 return true;
14925}
14926
14927std::optional<std::pair<APInt, APInt>>
14929 unsigned NumOps = getNumOperands();
14930 if (NumOps < 2)
14931 return std::nullopt;
14932
14933 unsigned EltSize = getValueType(0).getScalarSizeInBits();
14934 APInt Start, Stride;
14935 int FirstIdx = -1, SecondIdx = -1;
14936
14937 // Find the first two non-undef constant elements to determine Start and
14938 // Stride, then verify all remaining elements match the sequence.
14939 for (unsigned I = 0; I < NumOps; ++I) {
14941 if (Op->isUndef())
14942 continue;
14943 if (!isa<ConstantSDNode>(Op))
14944 return std::nullopt;
14945
14946 APInt Val = getConstantOperandAPInt(I).trunc(EltSize);
14947 if (FirstIdx < 0) {
14948 FirstIdx = I;
14949 Start = Val;
14950 } else if (SecondIdx < 0) {
14951 SecondIdx = I;
14952 // Compute stride using modular arithmetic. Simple division would handle
14953 // common strides (1, 2, -1, etc.), but modular inverse maximizes matches.
14954 // Example: <0, poison, poison, 0xFF> has stride 0x55 since 3*0x55 = 0xFF
14955 // Note that modular arithmetic is agnostic to signed/unsigned.
14956 unsigned IdxDiff = I - FirstIdx;
14957 APInt ValDiff = Val - Start;
14958
14959 // Step 1: Factor out common powers of 2 from IdxDiff and ValDiff.
14960 unsigned CommonPow2Bits = llvm::countr_zero(IdxDiff);
14961 if (ValDiff.countr_zero() < CommonPow2Bits)
14962 return std::nullopt; // ValDiff not divisible by 2^CommonPow2Bits
14963 IdxDiff >>= CommonPow2Bits;
14964 ValDiff.lshrInPlace(CommonPow2Bits);
14965
14966 // Step 2: IdxDiff is now odd, so its inverse mod 2^EltSize exists.
14967 // TODO: There are 2^CommonPow2Bits valid strides; currently we only try
14968 // one, but we could try all candidates to handle more cases.
14969 Stride = ValDiff * APInt(EltSize, IdxDiff).multiplicativeInverse();
14970 if (Stride.isZero())
14971 return std::nullopt;
14972
14973 // Step 3: Adjust Start based on the first defined element's index.
14974 Start -= Stride * FirstIdx;
14975 } else {
14976 // Verify this element matches the sequence.
14977 if (Val != Start + Stride * I)
14978 return std::nullopt;
14979 }
14980 }
14981
14982 // Need at least two defined elements.
14983 if (SecondIdx < 0)
14984 return std::nullopt;
14985
14986 return std::make_pair(Start, Stride);
14987}
14988
14990 // Find the first non-undef value in the shuffle mask.
14991 unsigned i, e;
14992 for (i = 0, e = Mask.size(); i != e && Mask[i] < 0; ++i)
14993 /* search */;
14994
14995 // If all elements are undefined, this shuffle can be considered a splat
14996 // (although it should eventually get simplified away completely).
14997 if (i == e)
14998 return true;
14999
15000 // Make sure all remaining elements are either undef or the same as the first
15001 // non-undef value.
15002 for (int Idx = Mask[i]; i != e; ++i)
15003 if (Mask[i] >= 0 && Mask[i] != Idx)
15004 return false;
15005 return true;
15006}
15007
15008// Returns true if it is a constant integer BuildVector or constant integer,
15009// possibly hidden by a bitcast.
15011 SDValue N, bool AllowOpaques) const {
15013
15014 if (auto *C = dyn_cast<ConstantSDNode>(N))
15015 return AllowOpaques || !C->isOpaque();
15016
15018 return true;
15019
15020 // Treat a GlobalAddress supporting constant offset folding as a
15021 // constant integer.
15022 if (auto *GA = dyn_cast<GlobalAddressSDNode>(N))
15023 if (GA->getOpcode() == ISD::GlobalAddress &&
15024 TLI->isOffsetFoldingLegal(GA))
15025 return true;
15026
15027 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
15028 isa<ConstantSDNode>(N.getOperand(0)))
15029 return true;
15030 return false;
15031}
15032
15033// Returns true if it is a constant float BuildVector or constant float.
15036 return true;
15037
15039 return true;
15040
15041 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
15042 isa<ConstantFPSDNode>(N.getOperand(0)))
15043 return true;
15044
15045 return false;
15046}
15047
15048std::optional<bool> SelectionDAG::isBoolConstant(SDValue N) const {
15049 ConstantSDNode *Const =
15050 isConstOrConstSplat(N, false, /*AllowTruncation=*/true);
15051 if (!Const)
15052 return std::nullopt;
15053
15054 EVT VT = N->getValueType(0);
15055 const APInt CVal = Const->getAPIntValue().trunc(VT.getScalarSizeInBits());
15056 switch (TLI->getBooleanContents(N.getValueType())) {
15058 if (CVal.isOne())
15059 return true;
15060 if (CVal.isZero())
15061 return false;
15062 return std::nullopt;
15064 if (CVal.isAllOnes())
15065 return true;
15066 if (CVal.isZero())
15067 return false;
15068 return std::nullopt;
15070 return CVal[0];
15071 }
15072 llvm_unreachable("Unknown BooleanContent enum");
15073}
15074
15075void SelectionDAG::createOperands(SDNode *Node, ArrayRef<SDValue> Vals) {
15076 assert(!Node->OperandList && "Node already has operands");
15078 "too many operands to fit into SDNode");
15079 SDUse *Ops = OperandRecycler.allocate(
15080 ArrayRecycler<SDUse>::Capacity::get(Vals.size()), OperandAllocator);
15081
15082 bool IsDivergent = false;
15083 for (unsigned I = 0; I != Vals.size(); ++I) {
15084 Ops[I].setUser(Node);
15085 Ops[I].setInitial(Vals[I]);
15086 EVT VT = Ops[I].getValueType();
15087
15088 // Skip Chain. It does not carry divergence.
15089 if (VT != MVT::Other &&
15090 (VT != MVT::Glue || gluePropagatesDivergence(Ops[I].getNode())) &&
15091 Ops[I].getNode()->isDivergent()) {
15092 IsDivergent = true;
15093 }
15094 }
15095 Node->NumOperands = Vals.size();
15096 Node->OperandList = Ops;
15097 if (!TLI->isSDNodeAlwaysUniform(Node)) {
15098 IsDivergent |= TLI->isSDNodeSourceOfDivergence(Node, FLI, UA);
15099 Node->SDNodeBits.IsDivergent = IsDivergent;
15100 }
15101 checkForCycles(Node);
15102}
15103
15106 size_t Limit = SDNode::getMaxNumOperands();
15107 while (Vals.size() > Limit) {
15108 unsigned SliceIdx = Vals.size() - Limit;
15109 auto ExtractedTFs = ArrayRef<SDValue>(Vals).slice(SliceIdx, Limit);
15110 SDValue NewTF = getNode(ISD::TokenFactor, DL, MVT::Other, ExtractedTFs);
15111 Vals.erase(Vals.begin() + SliceIdx, Vals.end());
15112 Vals.emplace_back(NewTF);
15113 }
15114 return getNode(ISD::TokenFactor, DL, MVT::Other, Vals);
15115}
15116
15118 EVT VT, SDNodeFlags Flags) {
15119 switch (Opcode) {
15120 default:
15121 return SDValue();
15122 case ISD::ADD:
15123 case ISD::OR:
15124 case ISD::XOR:
15125 case ISD::UMAX:
15126 case ISD::MUL:
15127 case ISD::AND:
15128 case ISD::UMIN:
15129 case ISD::SMAX:
15130 case ISD::SMIN:
15132 VT);
15133 case ISD::FADD:
15134 // If flags allow, prefer positive zero since it's generally cheaper
15135 // to materialize on most targets.
15136 return getConstantFP(Flags.hasNoSignedZeros() ? 0.0 : -0.0, DL, VT);
15137 case ISD::FMUL:
15138 return getConstantFP(1.0, DL, VT);
15139 case ISD::FMINNUM:
15140 case ISD::FMAXNUM:
15141 case ISD::FMINIMUMNUM:
15142 case ISD::FMAXIMUMNUM: {
15143 // Neutral element for fminnum/fminimumnum is NaN, Inf or FLT_MAX,
15144 // depending on fast-math flags (FMF).
15145 const fltSemantics &Semantics = VT.getFltSemantics();
15146 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics) :
15147 !Flags.hasNoInfs() ? APFloat::getInf(Semantics) :
15148 APFloat::getLargest(Semantics);
15149 if (Opcode == ISD::FMAXNUM || Opcode == ISD::FMAXIMUMNUM)
15150 NeutralAF.changeSign();
15151
15152 return getConstantFP(NeutralAF, DL, VT);
15153 }
15154 case ISD::FMINIMUM:
15155 case ISD::FMAXIMUM: {
15156 // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
15157 const fltSemantics &Semantics = VT.getFltSemantics();
15158 APFloat NeutralAF = !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
15159 : APFloat::getLargest(Semantics);
15160 if (Opcode == ISD::FMAXIMUM)
15161 NeutralAF.changeSign();
15162
15163 return getConstantFP(NeutralAF, DL, VT);
15164 }
15165
15166 }
15167}
15168
15170 SDValue Acc, SDValue LHS,
15171 SDValue RHS) {
15172 EVT AccVT = Acc.getValueType();
15173 if (AccVT.isFloatingPoint()) {
15174 assert(Opc == ISD::PARTIAL_REDUCE_FMLA && "Unexpected opcode");
15175 SDValue NegRHS = getNode(ISD::FNEG, DL, RHS.getValueType(), RHS);
15176 return getNode(Opc, DL, AccVT, Acc, LHS, NegRHS);
15177 }
15180 "Unexpected opcode");
15181 SDValue NegAcc = getNegative(Acc, DL, AccVT);
15182 SDValue MLA = getNode(Opc, DL, AccVT, NegAcc, LHS, RHS);
15183 return getNegative(MLA, DL, AccVT);
15184}
15185
15186/// Helper used to make a call to a library function that has one argument of
15187/// pointer type.
15188///
15189/// Such functions include 'fegetmode', 'fesetenv' and some others, which are
15190/// used to get or set floating-point state. They have one argument of pointer
15191/// type, which points to the memory region containing bits of the
15192/// floating-point state. The value returned by such function is ignored in the
15193/// created call.
15194///
15195/// \param LibFunc Reference to library function (value of RTLIB::Libcall).
15196/// \param Ptr Pointer used to save/load state.
15197/// \param InChain Ingoing token chain.
15198/// \returns Outgoing chain token.
15200 SDValue InChain,
15201 const SDLoc &DLoc) {
15202 assert(InChain.getValueType() == MVT::Other && "Expected token chain");
15204 Args.emplace_back(Ptr, Ptr.getValueType().getTypeForEVT(*getContext()));
15205 RTLIB::LibcallImpl LibcallImpl =
15206 Libcalls->getLibcallImpl(static_cast<RTLIB::Libcall>(LibFunc));
15207 if (LibcallImpl == RTLIB::Unsupported)
15208 reportFatalUsageError("emitting call to unsupported libcall");
15209
15210 SDValue Callee =
15211 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout()));
15213 CLI.setDebugLoc(DLoc).setChain(InChain).setLibCallee(
15214 Libcalls->getLibcallImplCallingConv(LibcallImpl),
15215 Type::getVoidTy(*getContext()), Callee, std::move(Args));
15216 return TLI->LowerCallTo(CLI).second;
15217}
15218
15220 assert(From && To && "Invalid SDNode; empty source SDValue?");
15221 auto I = SDEI.find(From);
15222 if (I == SDEI.end())
15223 return;
15224
15225 // Use of operator[] on the DenseMap may cause an insertion, which invalidates
15226 // the iterator, hence the need to make a copy to prevent a use-after-free.
15227 NodeExtraInfo NEI = I->second;
15228 if (LLVM_LIKELY(!NEI.PCSections)) {
15229 // No deep copy required for the types of extra info set.
15230 //
15231 // FIXME: Investigate if other types of extra info also need deep copy. This
15232 // depends on the types of nodes they can be attached to: if some extra info
15233 // is only ever attached to nodes where a replacement To node is always the
15234 // node where later use and propagation of the extra info has the intended
15235 // semantics, no deep copy is required.
15236 SDEI[To] = std::move(NEI);
15237 return;
15238 }
15239
15240 const SDNode *EntrySDN = getEntryNode().getNode();
15241
15242 // We need to copy NodeExtraInfo to all _new_ nodes that are being introduced
15243 // through the replacement of From with To. Otherwise, replacements of a node
15244 // (From) with more complex nodes (To and its operands) may result in lost
15245 // extra info where the root node (To) is insignificant in further propagating
15246 // and using extra info when further lowering to MIR.
15247 //
15248 // In the first step pre-populate the visited set with the nodes reachable
15249 // from the old From node. This avoids copying NodeExtraInfo to parts of the
15250 // DAG that is not new and should be left untouched.
15251 SmallVector<const SDNode *> Leafs{From}; // Leafs reachable with VisitFrom.
15252 DenseSet<const SDNode *> FromReach; // The set of nodes reachable from From.
15253 auto VisitFrom = [&](auto &&Self, const SDNode *N, int MaxDepth) {
15254 if (MaxDepth == 0) {
15255 // Remember this node in case we need to increase MaxDepth and continue
15256 // populating FromReach from this node.
15257 Leafs.emplace_back(N);
15258 return;
15259 }
15260 if (!FromReach.insert(N).second)
15261 return;
15262 for (const SDValue &Op : N->op_values())
15263 Self(Self, Op.getNode(), MaxDepth - 1);
15264 };
15265
15266 // Copy extra info to To and all its transitive operands (that are new).
15268 auto DeepCopyTo = [&](auto &&Self, const SDNode *N) {
15269 if (FromReach.contains(N))
15270 return true;
15271 if (!Visited.insert(N).second)
15272 return true;
15273 if (EntrySDN == N)
15274 return false;
15275 for (const SDValue &Op : N->op_values()) {
15276 if (N == To && Op.getNode() == EntrySDN) {
15277 // Special case: New node's operand is the entry node; just need to
15278 // copy extra info to new node.
15279 break;
15280 }
15281 if (!Self(Self, Op.getNode()))
15282 return false;
15283 }
15284 // Copy only if entry node was not reached.
15285 SDEI[N] = std::move(NEI);
15286 return true;
15287 };
15288
15289 // We first try with a lower MaxDepth, assuming that the path to common
15290 // operands between From and To is relatively short. This significantly
15291 // improves performance in the common case. The initial MaxDepth is big
15292 // enough to avoid retry in the common case; the last MaxDepth is large
15293 // enough to avoid having to use the fallback below (and protects from
15294 // potential stack exhaustion from recursion).
15295 for (int PrevDepth = 0, MaxDepth = 16; MaxDepth <= 1024;
15296 PrevDepth = MaxDepth, MaxDepth *= 2, Visited.clear()) {
15297 // StartFrom is the previous (or initial) set of leafs reachable at the
15298 // previous maximum depth.
15300 std::swap(StartFrom, Leafs);
15301 for (const SDNode *N : StartFrom)
15302 VisitFrom(VisitFrom, N, MaxDepth - PrevDepth);
15303 if (LLVM_LIKELY(DeepCopyTo(DeepCopyTo, To)))
15304 return;
15305 // This should happen very rarely (reached the entry node).
15306 LLVM_DEBUG(dbgs() << __func__ << ": MaxDepth=" << MaxDepth << " too low\n");
15307 assert(!Leafs.empty());
15308 }
15309
15310 // This should not happen - but if it did, that means the subgraph reachable
15311 // from From has depth greater or equal to maximum MaxDepth, and VisitFrom()
15312 // could not visit all reachable common operands. Consequently, we were able
15313 // to reach the entry node.
15314 errs() << "warning: incomplete propagation of SelectionDAG::NodeExtraInfo\n";
15315 assert(false && "From subgraph too complex - increase max. MaxDepth?");
15316 // Best-effort fallback if assertions disabled.
15317 SDEI[To] = std::move(NEI);
15318}
15319
15321 assert(VT.isVector() && "Can only unroll vector types!");
15322 if (VT.isFixedLengthVector())
15323 return VT.getVectorNumElements();
15324
15325 const MachineFunction &MF = getMachineFunction();
15326 const Function &F = MF.getFunction();
15327
15328 APInt MaxVScale = getVScaleRange(&F, sizeof(unsigned) * 8).getUnsignedMax();
15329 if (MaxVScale.ugt(VScaleUnrollLimit))
15330 return 0;
15331
15332 bool Overflow;
15333 APInt MinNElts(sizeof(unsigned) * 8, VT.getVectorMinNumElements());
15334 APInt MaxNElts = MinNElts.umul_ov(MaxVScale, Overflow);
15335 if (Overflow)
15336 return 0;
15337
15338 return MaxNElts.getZExtValue();
15339}
15340
15342 ArrayRef<SDValue> Scalars) {
15343 assert(Scalars.size() == getMaxRuntimeNumElements(VT) &&
15344 "Element count mismatch!");
15345 if (VT.isFixedLengthVector())
15346 return getBuildVector(VT, DL, Scalars);
15347
15348 SDValue Vec = getPOISON(VT);
15349 // Iterate in reverse so result remains poison until we encounter a lane that
15350 // exists, after which all lower-numbered lanes must also exist.
15351 for (unsigned IdxVal : reverse(seq(Scalars.size())))
15352 Vec = getInsertVectorElt(DL, Vec, Scalars[IdxVal], IdxVal);
15353
15354 return Vec;
15355}
15356
15357#ifndef NDEBUG
15358static void checkForCyclesHelper(const SDNode *N,
15361 const llvm::SelectionDAG *DAG) {
15362 // If this node has already been checked, don't check it again.
15363 if (Checked.count(N))
15364 return;
15365
15366 // If a node has already been visited on this depth-first walk, reject it as
15367 // a cycle.
15368 if (!Visited.insert(N).second) {
15369 errs() << "Detected cycle in SelectionDAG\n";
15370 dbgs() << "Offending node:\n";
15371 N->dumprFull(DAG); dbgs() << "\n";
15372 abort();
15373 }
15374
15375 for (const SDValue &Op : N->op_values())
15376 checkForCyclesHelper(Op.getNode(), Visited, Checked, DAG);
15377
15378 Checked.insert(N);
15379 Visited.erase(N);
15380}
15381#endif
15382
15384 const llvm::SelectionDAG *DAG,
15385 bool force) {
15386#ifndef NDEBUG
15387 bool check = force;
15388#ifdef EXPENSIVE_CHECKS
15389 check = true;
15390#endif // EXPENSIVE_CHECKS
15391 if (check) {
15392 assert(N && "Checking nonexistent SDNode");
15395 checkForCyclesHelper(N, visited, checked, DAG);
15396 }
15397#endif // !NDEBUG
15398}
15399
15400void llvm::checkForCycles(const llvm::SelectionDAG *DAG, bool force) {
15401 checkForCycles(DAG->getRoot().getNode(), DAG, force);
15402}
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 void checkAddrSpaceIsValidForLibcall(const TargetLowering *TLI, const DataLayout &DL, unsigned AS)
static SDValue foldCONCAT_VECTORS(const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG)
Try to simplify vector concatenation to an input value, undef, or build vector.
static MachinePointerInfo InferPointerInfo(const MachinePointerInfo &Info, SelectionDAG &DAG, SDValue Ptr, int64_t Offset=0)
InferPointerInfo - If the specified ptr/offset is a frame index, infer a MachinePointerInfo record fr...
static bool isInTailCallPositionWrapper(const CallInst *CI, const SelectionDAG *SelDAG, bool AllowReturnsFirstArg)
static bool keyMatches(const SDNodeKey &Key, const SDNode &N)
static bool areNonVolatileConsecutiveLoadsOrStores(LSBaseSDNode *LS, LSBaseSDNode *Base, unsigned Bytes, int Dist, const SelectionDAG &DAG)
static bool gluePropagatesDivergence(const SDNode *Node)
Return true if a glue output should propagate divergence information.
static void AddNodeIDCustom(FoldingSetNodeID &ID, const SDNode *N, unsigned Opc)
If this is an SDNode with special info, add this info to the NodeID data.
static void NewSDValueDbgMsg(SDValue V, StringRef Msg, SelectionDAG *G)
static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs)
makeVTList - Return an instance of the SDVTList struct initialized with the specified members.
static void checkForCyclesHelper(const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallPtrSetImpl< const SDNode * > &Checked, const llvm::SelectionDAG *DAG)
static void chainLoadsAndStoresForMemcpy(SelectionDAG &DAG, const SDLoc &dl, SmallVector< SDValue, 32 > &OutChains, unsigned From, unsigned To, SmallVector< SDValue, 16 > &OutLoadChains, SmallVector< SDValue, 16 > &OutStoreChains)
static int isSignedOp(ISD::CondCode Opcode)
For an integer comparison, return 1 if the comparison is a signed operation and 2 if the result is an...
static std::optional< APInt > FoldValue(unsigned Opcode, const APInt &C1, const APInt &C2)
static SDValue FoldBUILD_VECTOR(const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG)
static cl::opt< unsigned > MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192), cl::desc("DAG combiner limit number of steps when searching DAG " "for predecessor nodes"))
static APInt getDemandAllEltsMask(SDValue V)
Construct a DemandedElts mask which demands all elements of V.
static SDValue getMemcpyLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo, BatchAAResults *BatchAA, const MDNode *DstMemCacheHint, const MDNode *SrcMemCacheHint)
static SDValue getMemmoveLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo)
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:119
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
This file describes how to lower LLVM code to machine code.
static void removeOperands(MachineInstr &MI, unsigned i)
static OverflowResult mapOverflowResult(ConstantRange::OverflowResult OR)
Convert ConstantRange OverflowResult into ValueTracking OverflowResult.
static int Lookup(ArrayRef< TableEntry > Table, unsigned Opcode)
static unsigned getSize(unsigned Kind)
static const fltSemantics & IEEEsingle()
Definition APFloat.h:304
cmpResult
IEEE-754R 5.11: Floating Point Comparison Relations.
Definition APFloat.h:351
static constexpr roundingMode rmTowardZero
Definition APFloat.h:365
static const fltSemantics & BFloat()
Definition APFloat.h:303
static const fltSemantics & IEEEquad()
Definition APFloat.h:306
static const fltSemantics & IEEEdouble()
Definition APFloat.h:305
static constexpr roundingMode rmTowardNegative
Definition APFloat.h:364
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:361
static constexpr roundingMode rmTowardPositive
Definition APFloat.h:363
static const fltSemantics & IEEEhalf()
Definition APFloat.h:302
opStatus
IEEE-754R 7: Default exception handling.
Definition APFloat.h:377
static APFloat getQNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for QNaN values.
Definition APFloat.h:1224
opStatus divide(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1312
void copySign(const APFloat &RHS)
Definition APFloat.h:1406
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:6034
opStatus subtract(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1294
bool isNegative() const
Definition APFloat.h:1583
opStatus add(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1285
bool isFinite() const
Definition APFloat.h:1588
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
Definition APFloat.h:1451
opStatus multiply(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1303
bool isZero() const
Definition APFloat.h:1579
LLVM_READONLY bool isOne() const
Definition APFloat.h:1661
bool isLargest() const
Definition APFloat.h:1599
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1242
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition APFloat.h:1436
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1202
opStatus mod(const APFloat &RHS)
Definition APFloat.h:1330
bool isPosZero() const
Definition APFloat.h:1594
bool isNegZero() const
Definition APFloat.h:1595
void changeSign()
Definition APFloat.h:1401
static APFloat getNaN(const fltSemantics &Sem, bool Negative=false, uint64_t payload=0)
Factory for NaN values.
Definition APFloat.h:1213
bool isInfinity() const
Definition APFloat.h:1580
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:2009
LLVM_ABI APInt usub_sat(const APInt &RHS) const
Definition APInt.cpp:2093
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1602
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:230
void clearBit(unsigned BitPosition)
Set a given bit to 0.
Definition APInt.h:1426
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1057
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:225
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:419
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1560
unsigned popcount() const
Count the number of bits set.
Definition APInt.h:1690
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition APInt.cpp:1078
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1532
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:970
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1350
APInt abs() const
Get the absolute value.
Definition APInt.h:1815
LLVM_ABI APInt sadd_sat(const APInt &RHS) const
Definition APInt.cpp:2064
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:367
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1186
static APInt getBitsSet(unsigned numBits, unsigned loBit, unsigned hiBit)
Get a value with a block of bits set.
Definition APInt.h:254
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:376
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition APInt.cpp:1695
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1508
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1115
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:205
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:325
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1673
LLVM_ABI APInt rotr(unsigned rotateAmt) const
Rotate right by rotateAmt.
Definition APInt.cpp:1199
LLVM_ABI APInt reverseBits() const
Definition APInt.cpp:786
void ashrInPlace(unsigned ShiftAmt)
Arithmetic right-shift this APInt by ShiftAmt in place.
Definition APInt.h:836
bool sle(const APInt &RHS) const
Signed less or equal comparison.
Definition APInt.h:1170
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1659
unsigned getNumSignBits() const
Computes the number of leading bits of this APInt that are equal to its sign bit.
Definition APInt.h:1648
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1618
static LLVM_ABI APInt getSplat(unsigned NewLen, const APInt &V)
Return a value containing V broadcasted over NewLen bits.
Definition APInt.cpp:648
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:215
LLVM_ABI APInt sshl_sat(const APInt &RHS) const
Definition APInt.cpp:2124
LLVM_ABI APInt ushl_sat(const APInt &RHS) const
Definition APInt.cpp:2138
LLVM_ABI APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
Definition APInt.cpp:1086
static bool isSameValue(const APInt &I1, const APInt &I2, bool SignedCompare=false)
Determine if two APInts have the same value, after zero-extending or sign-extending (if SignedCompare...
Definition APInt.h:550
LLVM_ABI APInt rotl(unsigned rotateAmt) const
Rotate left by rotateAmt.
Definition APInt.cpp:1186
LLVM_ABI void insertBits(const APInt &SubBits, unsigned bitPosition)
Insert the bits from a smaller APInt starting at bitPosition.
Definition APInt.cpp:393
unsigned logBase2() const
Definition APInt.h:1781
LLVM_ABI APInt uadd_sat(const APInt &RHS) const
Definition APInt.cpp:2074
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:829
LLVM_ABI APInt multiplicativeInverse() const
Definition APInt.cpp:1303
LLVM_ABI APInt srem(const APInt &RHS) const
Function for signed remainder operation.
Definition APInt.cpp:1774
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:330
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1154
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
Definition APInt.cpp:1030
void setBits(unsigned loBit, unsigned hiBit)
Set the bits from loBit (inclusive) to hiBit (exclusive) to 1.
Definition APInt.h:1387
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:875
LLVM_ABI APInt byteSwap() const
Definition APInt.cpp:764
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1261
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:436
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:302
void clearBits(unsigned LoBit, unsigned HiBit)
Clear the bits from LoBit (inclusive) to HiBit (exclusive) to 0.
Definition APInt.h:1437
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:196
LLVM_ABI APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
Definition APInt.cpp:478
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1241
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:385
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:282
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:235
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
Definition APInt.h:860
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:853
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1225
LLVM_ABI APInt ssub_sat(const APInt &RHS) const
Definition APInt.cpp:2083
An arbitrary precision integer that knows its signedness.
Definition APSInt.h:24
unsigned getSrcAddressSpace() const
unsigned getDestAddressSpace() const
static Capacity get(size_t N)
Get the capacity of an array that can hold at least N elements.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
static LLVM_ABI BaseIndexOffset match(const SDNode *N, const SelectionDAG &DAG)
Parses tree in N for base, index, offset addresses.
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal=false)
BitVector & reset()
Reset all bits in the bitvector.
Definition BitVector.h:409
void resize(unsigned N, bool t=false)
Grow or shrink the bitvector.
Definition BitVector.h:355
void clear()
Removes all bits from the bitvector.
Definition BitVector.h:349
BitVector & set()
Set all bits in the bitvector.
Definition BitVector.h:366
bool none() const
Returns true if none of the bits are set.
Definition BitVector.h:207
size_type size() const
Returns the number of bits in this bitvector.
Definition BitVector.h:178
const BlockAddress * getBlockAddress() const
The address of a basic block.
Definition Constants.h:1088
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
A "pseudo-class" with methods for operating on BUILD_VECTORs.
LLVM_ABI bool getConstantRawBits(bool IsLittleEndian, unsigned DstEltSizeInBits, SmallVectorImpl< APInt > &RawBitElements, BitVector &UndefElements) const
Extract the raw bit data from a build vector of Undef, Constant or ConstantFP node elements.
static LLVM_ABI void recastRawBits(bool IsLittleEndian, unsigned DstEltSizeInBits, SmallVectorImpl< APInt > &DstBitElements, ArrayRef< APInt > SrcBitElements, BitVector &DstUndefElements, const BitVector &SrcUndefElements)
Recast bit data SrcBitElements to DstEltSizeInBits wide elements.
LLVM_ABI bool getRepeatedSequence(const APInt &DemandedElts, SmallVectorImpl< SDValue > &Sequence, BitVector *UndefElements=nullptr) const
Find the shortest repeating sequence of values in the build vector.
LLVM_ABI ConstantFPSDNode * getConstantFPSplatNode(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted constant FP or null if this is not a constant FP splat.
LLVM_ABI SDValue getSplatValue(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted value or a null value if this is not a splat.
LLVM_ABI bool isConstantSplat(APInt &SplatValue, APInt &SplatUndef, unsigned &SplatBitSize, bool &HasAnyUndefs, unsigned MinSplatBits=0, bool isBigEndian=false) const
Check if this is a constant splat, and if so, find the smallest element size that splats the vector.
LLVM_ABI ConstantSDNode * getConstantSplatNode(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted constant or null if this is not a constant splat.
LLVM_ABI int32_t getConstantFPSplatPow2ToLog2Int(BitVector *UndefElements, uint32_t BitWidth) const
If this is a constant FP splat and the splatted constant FP is an exact power or 2,...
LLVM_ABI std::optional< std::pair< APInt, APInt > > isArithmeticSequence() const
If this BuildVector is constant and represents an arithmetic sequence "<a, a+n, a+2n,...
LLVM_ABI bool isConstant() const
This class represents a function call, abstracting a target machine's calling convention.
bool isTailCall() const
static LLVM_ABI bool isValueValidForType(EVT VT, const APFloat &Val)
const APFloat & getValueAPF() const
bool isExactlyValue(double V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:420
const APFloat & getValue() const
Definition Constants.h:464
This is the shared class of boolean and integer constants.
Definition Constants.h:87
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition Constants.h:162
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
MachineConstantPoolValue * getMachineCPVal() const
const Constant * getConstVal() const
LLVM_ABI Type * getType() const
This class represents a range of values.
PreferredRangeType
If represented precisely, the result of some range operations may consist of multiple disjoint ranges...
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
static LLVM_ABI ConstantRange fromKnownBits(const KnownBits &Known, bool IsSigned)
Initialize a range based on a known bits constraint.
LLVM_ABI OverflowResult unsignedSubMayOverflow(const ConstantRange &Other) const
Return whether unsigned sub of the two ranges always/never overflows.
LLVM_ABI OverflowResult unsignedAddMayOverflow(const ConstantRange &Other) const
Return whether unsigned add of the two ranges always/never overflows.
LLVM_ABI KnownBits toKnownBits() const
Return known bits for values in this range.
LLVM_ABI ConstantRange zeroExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
LLVM_ABI APInt getSignedMin() const
Return the smallest signed value contained in the ConstantRange.
LLVM_ABI OverflowResult unsignedMulMayOverflow(const ConstantRange &Other) const
Return whether unsigned mul of the two ranges always/never overflows.
LLVM_ABI ConstantRange signExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
LLVM_ABI ConstantRange multiply(const ConstantRange &Other, unsigned NoWrapKind=0) const
Return a new range representing the possible values resulting from a multiplication of a value in thi...
LLVM_ABI bool contains(const APInt &Val) const
Return true if the specified value is in the set.
LLVM_ABI APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
LLVM_ABI ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
LLVM_ABI APInt getSignedMax() const
Return the largest signed value contained in the ConstantRange.
OverflowResult
Represents whether an operation on the given constant range is known to always or never overflow.
@ AlwaysOverflowsHigh
Always overflows in the direction of signed/unsigned max value.
@ AlwaysOverflowsLow
Always overflows in the direction of signed/unsigned min value.
@ MayOverflow
May or may not overflow.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
LLVM_ABI OverflowResult signedSubMayOverflow(const ConstantRange &Other) const
Return whether signed sub of the two ranges always/never overflows.
uint64_t getZExtValue() const
const APInt & getAPIntValue() const
This is an important base class in LLVM.
Definition Constant.h:43
LLVM_ABI Constant * getSplatValue(bool AllowPoison=false) const
If all elements of the vector constant have the same value, return that value.
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
DWARF expression.
static LLVM_ABI ExtOps getExtOps(unsigned FromSize, unsigned ToSize, bool Signed)
Returns the ops for a zero- or sign-extension in a DIExpression.
static LLVM_ABI void appendOffset(SmallVectorImpl< uint64_t > &Ops, int64_t Offset)
Append Ops with operations to apply the Offset.
static LLVM_ABI DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
static LLVM_ABI const DIExpression * convertToVariadicExpression(const DIExpression *Expr)
If Expr is a non-variadic expression (i.e.
static LLVM_ABI std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
Base class for variables.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
bool isLittleEndian() const
Layout endianness...
Definition DataLayout.h:217
LLVM_ABI IntegerType * getIntPtrType(LLVMContext &C, unsigned AddressSpace=0) const
Returns an integer type with size at least as big as that of a pointer in the given address space.
LLVM_ABI Align getABITypeAlign(Type *Ty) const
Returns the minimum ABI-required alignment for the specified type.
LLVM_ABI unsigned getPointerTypeSizeInBits(Type *) const
The pointer representation size in bits for this type.
LLVM_ABI Align getPrefTypeAlign(Type *Ty) const
Returns the preferred stack/global alignment for the specified type.
A debug info location.
Definition DebugLoc.h:126
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition TypeSize.h:305
const char * getSymbol() const
Insertion token: a failed lookup fills it in, the matching insert consumes it.
Definition FoldingSet.h:284
This class is used to gather all the unique data bits of a node.
Definition FoldingSet.h:162
Data structure describing the variable locations in a function.
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition Function.h:696
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:329
LLVM_ABI unsigned getAddressSpace() const
const GlobalValue * getGlobal() const
bool isThreadLocal() const
If the value is "Thread Local", its value isn't shared by the threads.
unsigned getAddressSpace() const
Module * getParent()
Get the module that this global value is contained inside of...
PointerType * getType() const
Global values are always pointers.
This class is used to form a handle around another node that is persistent and is updated across invo...
const SDValue & getValue() const
static LLVM_ABI bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Base class for LoadSDNode and StoreSDNode.
Tracks which library functions to use for a particular subtarget or function.
CallingConv::ID getLibcallImplCallingConv(RTLIB::LibcallImpl Call) const
Get the CallingConv that should be used for the specified libcall.
RTLIB::LibcallImpl getLibcallImpl(RTLIB::Libcall Call) const
Return the lowering's selection of implementation call for Call.
This SDNode is used for LIFETIME_START/LIFETIME_END values.
This class is used to represent ISD::LOAD nodes.
static LocationSize precise(uint64_t Value)
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1081
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1437
Machine Value Type.
SimpleValueType SimpleTy
Abstract base class for all machine specific constantpool value subclasses.
virtual void addSelectionDAGCSEId(FoldingSetNodeID &ID)=0
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
bool isFixedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a fixed stack object.
void setObjectAlignment(int ObjectIdx, Align Alignment)
setObjectAlignment - Change the alignment of the specified stack object.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
Function & getFunction()
Return the LLVM function that this machine code represents.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
A description of a memory reference used in the backend.
const MDNode * getRanges() const
Return the range tag for the memory reference.
Flags
Flags values. These may be or'd together.
@ MOVolatile
The memory access is volatile.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MOInvariant
The memory access always returns the same value (or traps).
@ MOStore
The memory access writes data.
const MachinePointerInfo & getPointerInfo() const
Flags getFlags() const
Return the raw flags of the source value,.
An SDNode that represents everything that will be needed to construct a MachineInstr.
This class is used to represent an MGATHER node.
This class is used to represent an MLOAD node.
This class is used to represent an MSTORE node.
This SDNode is used for target intrinsics that touch memory and need an associated MachineMemOperand.
This is an abstract virtual class for memory operations.
size_t getNumMemOperands() const
Return the number of memory operands.
LLVM_ABI MemSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt, PointerUnion< MachineMemOperand *, MachineMemOperand ** > memrefs)
Constructor that supports single or multiple MMOs.
PointerUnion< MachineMemOperand *, MachineMemOperand ** > MemRefs
Memory reference information.
MachineMemOperand * getMemOperand() const
Return the unique MachineMemOperand object describing the memory reference performed by operation.
const MachinePointerInfo & getPointerInfo() const
ArrayRef< MachineMemOperand * > memoperands() const
Return the memory operands for this node.
unsigned getRawSubclassData() const
Return the SubclassData value, without HasDebugValue.
EVT getMemoryVT() const
Return the type of the in-memory value.
Representation for a specific memory location.
Root of the metadata hierarchy.
Definition Metadata.h:64
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
Function * getFunction(StringRef Name) const
Look up the specified function in the module symbol table.
Definition Module.cpp:235
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
Class to represent pointers.
static PointerType * getUnqual(LLVMContext &C)
This constructs an opaque pointer to an object in the default address space (address space zero).
static LLVM_ABI PointerType * get(LLVMContext &C, unsigned AddressSpace)
This constructs an opaque pointer to an object in a numbered address space.
Definition Type.cpp:887
unsigned getAddressSpace() const
Return the address space of the Pointer type.
A discriminated union of two or more pointer types, with the discriminator in the low bits of the poi...
bool isNull() const
Test if the pointer held in the union is null, regardless of which type it is.
Analysis providing profile information.
void Deallocate(SubClass *E)
Deallocate - Release storage for the pointed-to object.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Keeps track of dbg_value information through SDISel.
LLVM_ABI void add(SDDbgValue *V, bool isParameter)
LLVM_ABI void erase(const SDNode *Node)
Invalidate all DbgValues attached to the node and remove it from the Node-to-DbgValues map.
Holds the information from a dbg_label node through SDISel.
Holds the information for a single machine location through SDISel; either an SDNode,...
static SDDbgOperand fromNode(SDNode *Node, unsigned ResNo)
static SDDbgOperand fromFrameIdx(unsigned FrameIdx)
static SDDbgOperand fromVReg(Register VReg)
static SDDbgOperand fromConst(const Value *Const)
@ SDNODE
Value is the result of an expression.
Holds the information from a dbg_value node through SDISel.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
const DebugLoc & getDebugLoc() const
unsigned getIROrder() const
This class provides iterator support for SDUse operands that use a specific SDNode.
Represents one node in the SelectionDAG.
const APInt & getAsAPIntVal() const
Helper method returns the APInt value of a ConstantSDNode.
bool isMachineOpcode() const
Test if this node has a post-isel opcode, directly corresponding to a MachineInstr opcode.
LLVM_ABI void dumprFull(const SelectionDAG *G=nullptr) const
printrFull to dbgs().
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
bool isDivergent() const
LLVM_ABI bool isOnlyUserOf(const SDNode *N) const
Return true if this node is the only use of N.
iterator_range< value_op_iterator > op_values() const
unsigned getIROrder() const
Return the node ordering.
static constexpr size_t getMaxNumOperands()
Return the maximum number of operands that a SDNode can hold.
iterator_range< use_iterator > uses()
MemSDNodeBitfields MemSDNodeBits
bool getHasDebugValue() const
SDNodeFlags getFlags() const
void setNodeId(int Id)
Set unique node id.
LLVM_ABI void intersectFlagsWith(const SDNodeFlags Flags)
Clear any flags in this node that aren't also set in Flags.
static bool hasPredecessorHelper(const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallVectorImpl< const SDNode * > &Worklist, unsigned int MaxSteps=0, bool TopologicalPrune=false)
Returns true if N is a predecessor of any node in Worklist.
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
bool use_empty() const
Return true if there are no uses of this node.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
unsigned getNumOperands() const
Return the number of values used by this operation.
const SDValue & getOperand(unsigned Num) const
static LLVM_ABI bool areOnlyUsersOf(ArrayRef< const SDNode * > Nodes, const SDNode *N)
Return true if all the users of N are contained in Nodes.
use_iterator use_begin() const
Provide iteration support to walk over all uses of an SDNode.
LLVM_ABI bool isOperandOf(const SDNode *N) const
Return true if this node is an operand of N.
const APInt & getConstantOperandAPInt(unsigned Num) const
Helper method returns the APInt of a ConstantSDNode operand.
std::optional< APInt > bitcastToAPInt() const
LLVM_ABI bool hasPredecessor(const SDNode *N) const
Return true if N is a predecessor of this node.
LLVM_ABI bool hasAnyUseOfValue(unsigned Value) const
Return true if there are any use of the indicated value.
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
bool isUndef() const
Returns true if the node type is UNDEF or POISON.
op_iterator op_end() const
op_iterator op_begin() const
static use_iterator use_end()
LLVM_ABI void DropOperands()
Release the operands and set this node to have zero operands.
SDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs)
Create an SDNode.
Represents a use of a SDNode.
SDNode * getUser()
This returns the SDNode that contains this Use.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
bool isUndef() const
SDNode * getNode() const
get the SDNode which holds the desired result
bool hasOneUse() const
Return true if there is exactly one node using value ResNo of Node, in exactly one operand.
LLVM_ABI bool isOperandOf(const SDNode *N) const
Return true if the referenced return value is an operand of N.
SDValue()=default
LLVM_ABI bool reachesChainWithoutSideEffects(SDValue Dest, unsigned Depth=2) const
Return true if this operand (which must be a chain) reaches the specified operand without crossing an...
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const SDValue & getOperand(unsigned i) const
bool use_empty() const
Return true if there are no nodes using value ResNo of Node.
const APInt & getConstantOperandAPInt(unsigned i) const
uint64_t getScalarValueSizeInBits() const
unsigned getResNo() const
get the index which selects a specific result in the SDNode
uint64_t getConstantOperandVal(unsigned i) const
unsigned getOpcode() const
virtual void verifyTargetNode(const SelectionDAG &DAG, const SDNode *N) const
Checks that the given target-specific node is valid. Aborts if it is not.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
LLVM_ABI SDValue getElementCount(const SDLoc &DL, EVT VT, ElementCount EC)
LLVM_ABI Align getReducedAlign(EVT VT, bool UseABI)
In most cases this function returns the ABI alignment for a given type, except for illegal vector typ...
LLVM_ABI SDValue getShiftAmountOperand(EVT LHSTy, SDValue Op)
Return the specified value casted to the target's desired shift amount type.
LLVM_ABI std::pair< SDValue, SDValue > getMemccpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue C, SDValue Size, const CallInst *CI)
Lower a memccpy operation into a target library call and return the resulting chain and call result a...
LLVM_ABI SDValue emitStackConvert(SDValue SrcOp, EVT SlotVT, EVT DestVT, const SDLoc &DL, SDValue Chain)
Emit a store/load combination to the stack.
LLVM_ABI bool isKnownNeverLogicalZero(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
Test whether the given floating point SDValue (or all elements of it, if it is a vector) is known to ...
LLVM_ABI SDValue getExtLoadVP(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT, SDValue Chain, SDValue Ptr, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT MemVT, MaybeAlign Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, bool IsExpanding=false)
SDValue getExtractVectorElt(const SDLoc &DL, EVT VT, SDValue Vec, unsigned Idx)
Extract element at Idx from Vec.
LLVM_ABI SDValue getSplatSourceVector(SDValue V, int &SplatIndex)
If V is a splatted value, return the source vector and its splat index.
LLVM_ABI SDValue getLabelNode(unsigned Opcode, const SDLoc &dl, SDValue Root, MCSymbol *Label)
LLVM_ABI OverflowKind computeOverflowForUnsignedSub(SDValue N0, SDValue N1) const
Determine if the result of the unsigned sub of 2 nodes can overflow.
LLVM_ABI unsigned ComputeMaxSignificantBits(SDValue Op, unsigned Depth=0) const
Get the upper bound on bit size for this Value Op as a signed integer.
const SDValue & getRoot() const
Return the root tag of the SelectionDAG.
LLVM_ABI std::pair< SDValue, SDValue > getStrlen(SDValue Chain, const SDLoc &dl, SDValue Src, const CallInst *CI)
Lower a strlen operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getMaskedGather(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType, ISD::LoadExtType ExtTy)
LLVM_ABI SDValue FoldSetCC(EVT VT, SDValue N1, SDValue N2, ISD::CondCode Cond, const SDLoc &dl, SDNodeFlags Flags={})
Constant fold a setcc to true or false.
bool isKnownNeverSNaN(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
LLVM_ABI std::optional< bool > isBoolConstant(SDValue N) const
Check if a value \op N is a constant using the target's BooleanContent for its type.
LLVM_ABI SDValue getStackArgumentTokenFactor(SDValue Chain)
Compute a TokenFactor to force all the incoming stack arguments to be loaded from the stack.
const TargetSubtargetInfo & getSubtarget() const
LLVM_ABI ConstantRange computeConstantRange(SDValue Op, bool ForSigned, unsigned Depth=0) const
Determine the possible constant range of an integer or vector of integers.
LLVM_ABI SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL)
LLVM_ABI void updateDivergence(SDNode *N)
LLVM_ABI SDValue getSplatValue(SDValue V, bool LegalTypes=false)
If V is a splat vector, return its scalar source operand by extracting that element from the source v...
LLVM_ABI SDValue getAllOnesConstant(const SDLoc &DL, EVT VT, bool IsTarget=false, bool IsOpaque=false)
LLVM_ABI MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
LLVM_ABI void ExtractVectorElements(SDValue Op, SmallVectorImpl< SDValue > &Args, unsigned Start=0, unsigned Count=0, EVT EltVT=EVT())
Append the extracted elements from Start to Count out of the vector Op in Args.
LLVM_ABI SDValue getAtomicMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Value, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo)
LLVM_ABI SDValue getAtomicLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT MemVT, EVT VT, SDValue Chain, SDValue Ptr, MachineMemOperand *MMO)
LLVM_ABI SDNode * getNodeIfExists(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops, const SDNodeFlags Flags, bool AllowCommute=false)
Get the specified node if it's already available, or else return NULL.
LLVM_ABI SDValue getPseudoProbeNode(const SDLoc &Dl, SDValue Chain, uint64_t Guid, uint64_t Index, uint32_t Attr)
Creates a PseudoProbeSDNode with function GUID Guid and the index of the block Index it is probing,...
LLVM_ABI SDValue getFreeze(SDValue V)
Return a freeze using the SDLoc of the value operand.
LLVM_ABI SDNode * SelectNodeTo(SDNode *N, unsigned MachineOpc, EVT VT)
These are used for target selectors to mutate the specified node to have the specified return type,...
LLVM_ABI SelectionDAG(const TargetMachine &TM, CodeGenOptLevel)
LLVM_ABI SDValue getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVol, bool AlwaysInline, const CallInst *CI, MachinePointerInfo DstPtrInfo, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI SDValue getConstantPool(const Constant *C, EVT VT, MaybeAlign Align=std::nullopt, int Offs=0, bool isT=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getStridedLoadVP(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL, SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding=false)
LLVM_ABI SDValue getAtomicCmpSwap(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDVTList VTs, SDValue Chain, SDValue Ptr, SDValue Cmp, SDValue Swp, MachineMemOperand *MMO)
Gets a node for an atomic cmpxchg op.
LLVM_ABI SDValue makeEquivalentMemoryOrdering(SDValue OldChain, SDValue NewMemOpChain)
If an existing load has uses of its chain, create a token factor node with that chain and the new mem...
LLVM_ABI bool isConstantIntBuildVectorOrConstantInt(SDValue N, bool AllowOpaques=true) const
Test whether the given value is a constant int or similar node.
LLVM_ABI void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To, unsigned Num)
Like ReplaceAllUsesOfValueWith, but for multiple values at once.
LLVM_ABI SDValue getJumpTableDebugInfo(int JTI, SDValue Chain, const SDLoc &DL)
LLVM_ABI SDValue getSymbolFunctionGlobalAddress(SDValue Op, Function **TargetFunction=nullptr)
Return a GlobalAddress of the function from the current module with name matching the given ExternalS...
LLVM_ABI std::optional< unsigned > getValidMaximumShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue UnrollVectorOp(SDNode *N, unsigned ResNE=0)
Utility function used by legalize and lowering to "unroll" a vector operation by splitting out the sc...
LLVM_ABI SDValue getVScale(const SDLoc &DL, EVT VT, APInt MulImm)
Return a node that represents the runtime scaling 'MulImm * RuntimeVL'.
LLVM_ABI SDValue getConstantFP(double Val, const SDLoc &DL, EVT VT, bool isTarget=false)
Create a ConstantFPSDNode wrapping a constant value.
OverflowKind
Used to represent the possible overflow behavior of an operation.
static LLVM_ABI unsigned getHasPredecessorMaxSteps()
LLVM_ABI bool haveNoCommonBitsSet(SDValue A, SDValue B) const
Return true if A and B have no common bits set.
LLVM_ABI SDValue getAddrSpaceCast(const SDLoc &dl, EVT VT, SDValue Ptr, unsigned SrcAS, unsigned DestAS, const SDNodeFlags Flags=SDNodeFlags())
Return an AddrSpaceCastSDNode.
SDValue getExtractSubvector(const SDLoc &DL, EVT VT, SDValue Vec, unsigned Idx)
Return the VT typed sub-vector of Vec at Idx.
LLVM_ABI bool cannotBeOrderedNegativeFP(SDValue Op) const
Test whether the given float value is known to be positive.
LLVM_ABI SDValue getRegister(Register Reg, EVT VT)
LLVM_ABI bool calculateDivergence(SDNode *N)
LLVM_ABI std::pair< SDValue, SDValue > getStrcmp(SDValue Chain, const SDLoc &dl, SDValue S0, SDValue S1, const CallInst *CI)
Lower a strcmp operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getGetFPEnv(SDValue Chain, const SDLoc &dl, SDValue Ptr, EVT MemVT, MachineMemOperand *MMO)
LLVM_ABI SDValue getAssertAlign(const SDLoc &DL, SDValue V, Align A)
Return an AssertAlignSDNode.
LLVM_ABI SDNode * mutateStrictFPToFP(SDNode *Node)
Mutate the specified strict FP node to its non-strict equivalent, unlinking the node from its chain a...
LLVM_ABI bool canIgnoreSignBitOfZero(const SDUse &Use) const
Check if a use of a float value is insensitive to signed zeros.
LLVM_ABI bool SignBitIsZeroFP(SDValue Op, unsigned Depth=0) const
Return true if the sign bit of Op is known to be zero, for a floating-point value.
LLVM_ABI SDValue getMemIntrinsicNode(unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef< SDValue > Ops, EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags Flags=MachineMemOperand::MOLoad|MachineMemOperand::MOStore, LocationSize Size=LocationSize::precise(0), const AAMDNodes &AAInfo=AAMDNodes())
Creates a MemIntrinsicNode that may produce a result and takes a list of operands.
SDValue getInsertSubvector(const SDLoc &DL, SDValue Vec, SDValue SubVec, unsigned Idx)
Insert SubVec at the Idx element of Vec.
LLVM_ABI SDValue getStepVector(const SDLoc &DL, EVT ResVT, const APInt &StepVal)
Returns a vector of type ResVT whose elements contain the linear sequence <0, Step,...
SDValue getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond, SDValue Chain=SDValue(), bool IsSignaling=false, SDNodeFlags Flags={})
Helper function to make it easier to build SetCC's if you just have an ISD::CondCode instead of an SD...
LLVM_ABI SDValue getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDValue Chain, SDValue Ptr, SDValue Val, MachineMemOperand *MMO)
Gets a node for an atomic op, produces result (if relevant) and chain and takes 2 operands.
LLVM_ABI Align getEVTAlign(EVT MemoryVT) const
Compute the default alignment value for the given type.
LLVM_ABI bool shouldOptForSize() const
LLVM_ABI bool hasSwiftErrorArg() const
LLVM_ABI SDValue buildVectorFromUnrolledParts(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Scalars)
Returns a vector constructed from the scalar values in order.
LLVM_ABI SDValue getNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a bitwise NOT operation as (XOR Val, -1).
LLVM_ABI SDValue getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
const TargetLowering & getTargetLoweringInfo() const
LLVM_ABI bool isEqualTo(SDValue A, SDValue B) const
Test whether two SDValues are known to compare equal.
static constexpr unsigned MaxRecursionDepth
LLVM_ABI unsigned getMaxRuntimeNumElements(EVT VT) const
Returns the maximum runtime number of elements in VT if known, or 0 otherwise.
LLVM_ABI SDValue getStridedStoreVP(SDValue Chain, const SDLoc &DL, SDValue Val, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
bool isGuaranteedNotToBePoison(SDValue Op, unsigned Depth=0) const
Return true if this function can prove that Op is never poison.
LLVM_ABI SDValue getIdentityElement(unsigned Opcode, const SDLoc &DL, EVT VT, SDNodeFlags Flags)
Get the (commutative) identity element for the given opcode, if it exists.
LLVM_ABI SDValue expandVACopy(SDNode *Node)
Expand the specified ISD::VACOPY node as the Legalize pass would.
LLVM_ABI SDValue getIndexedMaskedLoad(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI APInt computeVectorKnownZeroElements(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
For each demanded element of a vector, see if it is known to be zero.
LLVM_ABI void AddDbgValue(SDDbgValue *DB, bool isParameter)
Add a dbg_value SDNode.
bool NewNodesMustHaveLegalTypes
When true, additional steps are taken to ensure that getConstant() and similar functions return DAG n...
LLVM_ABI std::pair< EVT, EVT > GetSplitDestVTs(const EVT &VT) const
Compute the VTs needed for the low/hi parts of a type which is split (or expanded) into two not neces...
LLVM_ABI void salvageDebugInfo(SDNode &N)
To be invoked on an SDNode that is slated to be erased.
LLVM_ABI SDNode * MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs, ArrayRef< SDValue > Ops)
This mutates the specified node to have the specified return type, opcode, and operands.
LLVM_ABI std::pair< SDValue, SDValue > UnrollVectorOverflowOp(SDNode *N, unsigned ResNE=0)
Like UnrollVectorOp(), but for the [US](ADD|SUB|MUL)O family of opcodes.
allnodes_const_iterator allnodes_begin() const
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
LLVM_ABI SDValue getGatherVP(SDVTList VTs, EVT VT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
LLVM_ABI SDValue getBitcastedAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
LLVM_ABI bool isSplatValue(SDValue V, const APInt &DemandedElts, APInt &UndefElts, unsigned Depth=0) const
Test whether V has a splatted value for all the demanded elements.
LLVM_ABI void DeleteNode(SDNode *N)
Remove the specified node from the system.
LLVM_ABI SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Offset, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
LLVM_ABI SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
LLVM_ABI SDDbgValue * getDbgValueList(DIVariable *Var, DIExpression *Expr, ArrayRef< SDDbgOperand > Locs, ArrayRef< SDNode * > Dependencies, bool IsIndirect, const DebugLoc &DL, unsigned O, bool IsVariadic)
Creates a SDDbgValue node from a list of locations.
LLVM_ABI std::pair< SDValue, SDValue > getStrcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, const CallInst *CI)
Lower a strcpy operation into a target library call and return the resulting chain and call result as...
SDValue getSelect(const SDLoc &DL, EVT VT, SDValue Cond, SDValue LHS, SDValue RHS, SDNodeFlags Flags=SDNodeFlags())
Helper function to make it easier to build Select's if you just have operands and don't want to check...
LLVM_ABI SDValue getNegative(SDValue Val, const SDLoc &DL, EVT VT)
Create negative operation as (SUB 0, Val).
LLVM_ABI std::optional< unsigned > getValidShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has a uniform shift amount that is less than the element bit-width of the shi...
LLVM_ABI void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
LLVM_ABI SDValue simplifySelect(SDValue Cond, SDValue TVal, SDValue FVal)
Try to simplify a select/vselect into 1 of its operands or a constant.
LLVM_ABI SDValue getZeroExtendInReg(SDValue Op, const SDLoc &DL, EVT VT)
Return the expression required to zero extend the Op value assuming it was the smaller SrcTy value.
LLVM_ABI bool isConstantFPBuildVectorOrConstantFP(SDValue N) const
Test whether the given value is a constant FP or similar node.
const DataLayout & getDataLayout() const
LLVM_ABI SDValue getPartialReduceMLS(unsigned Opc, const SDLoc &DL, SDValue Acc, SDValue LHS, SDValue RHS)
Get an expression that implements a partial multiply-subtract reduction.
LLVM_ABI SDValue expandVAArg(SDNode *Node)
Expand the specified ISD::VAARG node as the Legalize pass would.
LLVM_ABI SDValue getTokenFactor(const SDLoc &DL, SmallVectorImpl< SDValue > &Vals)
Creates a new TokenFactor containing Vals.
LLVM_ABI SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Helper function to build ISD::STORE nodes.
LLVM_ABI bool doesNodeExist(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops)
Check if a node exists without modifying its flags.
LLVM_ABI ConstantRange computeConstantRangeIncludingKnownBits(SDValue Op, bool ForSigned, unsigned Depth=0) const
Combine constant ranges from computeConstantRange() and computeKnownBits().
const SelectionDAGTargetInfo & getSelectionDAGInfo() const
LLVM_ABI bool areNonVolatileConsecutiveLoads(LoadSDNode *LD, LoadSDNode *Base, unsigned Bytes, int Dist) const
Return true if loads are next to each other and can be merged.
LLVM_ABI SDValue getMaskedHistogram(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
LLVM_ABI SDDbgLabel * getDbgLabel(DILabel *Label, const DebugLoc &DL, unsigned O)
Creates a SDDbgLabel node.
LLVM_ABI SDValue getStoreVP(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
LLVM_ABI OverflowKind computeOverflowForUnsignedMul(SDValue N0, SDValue N1) const
Determine if the result of the unsigned mul of 2 nodes can overflow.
LLVM_ABI void copyExtraInfo(SDNode *From, SDNode *To)
Copy extra info associated with one node to another.
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
LLVM_ABI SDValue getGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT, int64_t offset=0, bool isTargetGA=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getVAArg(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue SV, unsigned Align)
VAArg produces a result and token chain, and takes a pointer and a source value as input.
LLVM_ABI SDValue getLoadFFVP(EVT VT, const SDLoc &DL, SDValue Chain, SDValue Ptr, SDValue Mask, SDValue EVL, MachineMemOperand *MMO)
LLVM_ABI SDValue getTypeSize(const SDLoc &DL, EVT VT, TypeSize TS)
LLVM_ABI SDValue getMDNode(const MDNode *MD)
Return an MDNodeSDNode which holds an MDNode.
LLVM_ABI void clear()
Clear state and free memory necessary to make this SelectionDAG ready to process a new block.
LLVM_ABI std::pair< SDValue, SDValue > getMemcmp(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, const CallInst *CI)
Lower a memcmp operation into a target library call and return the resulting chain and call result as...
LLVM_ABI void ReplaceAllUsesWith(SDValue From, SDValue To)
Modify anything using 'From' to use 'To' instead.
LLVM_ABI SDValue getCommutedVectorShuffle(const ShuffleVectorSDNode &SV)
Returns an ISD::VECTOR_SHUFFLE node semantically equivalent to the shuffle node in input but with swa...
LLVM_ABI SDValue getExtLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, EVT MemVT, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
LLVM_ABI std::pair< SDValue, SDValue > SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the vector with EXTRACT_SUBVECTOR using the provided VTs and return the low/high part.
LLVM_ABI SDValue makeStateFunctionCall(unsigned LibFunc, SDValue Ptr, SDValue InChain, const SDLoc &DLoc)
Helper used to make a call to a library function that has one argument of pointer type.
LLVM_ABI SDValue getSignedConstant(int64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
LLVM_ABI SDValue getSrcValue(const Value *v)
Construct a node to track a Value* through the backend.
SDValue getSplatVector(EVT VT, const SDLoc &DL, SDValue Op)
LLVM_ABI SDValue getAtomicMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo)
LLVM_ABI OverflowKind computeOverflowForSignedMul(SDValue N0, SDValue N1) const
Determine if the result of the signed mul of 2 nodes can overflow.
LLVM_ABI MaybeAlign InferPtrAlign(SDValue Ptr) const
Infer alignment of a load / store address.
LLVM_ABI void dump() const
Dump the textual format of this DAG.
LLVM_ABI bool MaskedValueIsAllOnes(SDValue Op, const APInt &Mask, unsigned Depth=0) const
Return true if '(Op & Mask) == Mask'.
LLVM_ABI bool SignBitIsZero(SDValue Op, unsigned Depth=0) const
Return true if the sign bit of Op is known to be zero.
LLVM_ABI void RemoveDeadNodes()
This method deletes all unreachable nodes in the SelectionDAG.
LLVM_ABI void RemoveDeadNode(SDNode *N)
Remove the specified node from the system.
LLVM_ABI void AddDbgLabel(SDDbgLabel *DB)
Add a dbg_label SDNode.
bool isConstantValueOfAnyType(SDValue N) const
LLVM_ABI bool canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts, UndefPoisonKind Kind=UndefPoisonKind::UndefOrPoison, bool ConsiderFlags=true, unsigned Depth=0) const
Return true if Op can create undef or poison from non-undef & non-poison operands.
SDValue getInsertVectorElt(const SDLoc &DL, SDValue Vec, SDValue Elt, unsigned Idx)
Insert Elt into Vec at offset Idx.
LLVM_ABI SDValue getTargetExtractSubreg(int SRIdx, const SDLoc &DL, EVT VT, SDValue Operand)
A convenience function for creating TargetInstrInfo::EXTRACT_SUBREG nodes.
LLVM_ABI SDValue getBasicBlock(MachineBasicBlock *MBB)
LLVM_ABI SDValue getSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either sign-extending or trunca...
LLVM_ABI SDDbgValue * getVRegDbgValue(DIVariable *Var, DIExpression *Expr, Register VReg, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a VReg SDDbgValue node.
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI KnownFPClass computeKnownFPClass(SDValue Op, FPClassTest InterestedClasses, unsigned Depth=0) const
Determine floating-point class information about Op.
LLVM_ABI bool isIdentityElement(unsigned Opc, SDNodeFlags Flags, SDValue V, unsigned OperandNo, unsigned Depth=0) const
Returns true if V is an identity element of Opc with Flags.
LLVM_ABI SDValue getEHLabel(const SDLoc &dl, SDValue Root, MCSymbol *Label)
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(SDValue Op, UndefPoisonKind Kind=UndefPoisonKind::UndefOrPoison, unsigned Depth=0) const
Return true if this function can prove that Op is never poison and, Kind can be used to track poison ...
LLVM_ABI bool isKnownNeverZero(SDValue Op, unsigned Depth=0) const
Test whether the given SDValue is known to contain non-zero value(s).
LLVM_ABI SDValue getIndexedStore(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SDNodeFlags Flags=SDNodeFlags())
LLVM_ABI std::optional< unsigned > getValidMinimumShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue getSetFPEnv(SDValue Chain, const SDLoc &dl, SDValue Ptr, EVT MemVT, MachineMemOperand *MMO)
LLVM_ABI SDValue getBoolExtOrTrunc(SDValue Op, const SDLoc &SL, EVT VT, EVT OpVT)
Convert Op, which must be of integer type, to the integer type VT, by using an extension appropriate ...
LLVM_ABI SDValue getMaskedStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Base, SDValue Offset, SDValue Mask, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
LLVM_ABI SDValue getExternalSymbol(const char *Sym, EVT VT)
const TargetMachine & getTarget() const
LLVM_ABI std::pair< SDValue, SDValue > getStrictFPExtendOrRound(SDValue Op, SDValue Chain, const SDLoc &DL, EVT VT)
Convert Op, which must be a STRICT operation of float type, to the float type VT, by either extending...
LLVM_ABI std::pair< SDValue, SDValue > SplitEVL(SDValue N, EVT VecVT, const SDLoc &DL)
Split the explicit vector length parameter of a VP operation.
LLVM_ABI SDValue getPtrExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either truncating it or perform...
LLVM_ABI SDValue getMaskFromElementCount(const SDLoc &DL, EVT VT, ElementCount Len)
Return a vector with the first 'Len' lanes set to true and remaining lanes set to false.
LLVM_ABI SDValue getAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either any-extending or truncat...
iterator_range< allnodes_iterator > allnodes()
LLVM_ABI SDValue getBlockAddress(const BlockAddress *BA, EVT VT, int64_t Offset=0, bool isTarget=false, unsigned TargetFlags=0)
LLVM_ABI SDValue WidenVector(const SDValue &N, const SDLoc &DL)
Widen the vector up to the next power of two using INSERT_SUBVECTOR.
const LibcallLoweringInfo & getLibcalls() const
LLVM_ABI SDValue getLoadVP(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, const MDNode *Ranges=nullptr, bool IsExpanding=false)
LLVM_ABI SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI SDDbgValue * getConstantDbgValue(DIVariable *Var, DIExpression *Expr, const Value *C, const DebugLoc &DL, unsigned O)
Creates a constant SDDbgValue node.
LLVM_ABI SDValue getScatterVP(SDVTList VTs, EVT VT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getLifetimeNode(bool IsStart, const SDLoc &dl, SDValue Chain, int FrameIndex)
Creates a LifetimeSDNode that starts (IsStart==true) or ends (IsStart==false) the lifetime of the Fra...
ArrayRef< SDDbgValue * > GetDbgValues(const SDNode *SD) const
Get the debug values which reference the given SDNode.
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI OverflowKind computeOverflowForSignedAdd(SDValue N0, SDValue N1) const
Determine if the result of the signed addition of 2 nodes can overflow.
LLVM_ABI SDValue getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of float type, to the float type VT, by either extending or rounding (by tr...
LLVM_ABI unsigned AssignTopologicalOrder()
Topological-sort the AllNodes list and a assign a unique node id for each node in the DAG based on th...
ilist< SDNode >::size_type allnodes_size() const
LLVM_ABI bool isKnownNeverNaN(SDValue Op, const APInt &DemandedElts, bool SNaN=false, unsigned Depth=0) const
Test whether the given SDValue (or all elements of it, if it is a vector) is known to never be NaN in...
LLVM_ABI SDValue FoldConstantBuildVector(BuildVectorSDNode *BV, const SDLoc &DL, EVT DstEltVT)
Fold BUILD_VECTOR of constants/undefs to the destination type BUILD_VECTOR of constants/undefs elemen...
LLVM_ABI SDValue getAtomicMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo)
LLVM_ABI SDValue getIndexedMaskedStore(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue getTruncStoreVP(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, bool IsCompressing=false)
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
LLVM_ABI unsigned ComputeNumSignBits(SDValue Op, unsigned Depth=0) const
Return the number of times the sign bit of the register is replicated into the other bits.
LLVM_ABI bool MaskedVectorIsZero(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
Return true if 'Op' is known to be zero in DemandedElts.
LLVM_ABI SDValue getBoolConstant(bool V, const SDLoc &DL, EVT VT, EVT OpVT)
Create a true or false constant of type VT using the target's BooleanContent for type OpVT.
LLVM_ABI SDDbgValue * getFrameIndexDbgValue(DIVariable *Var, DIExpression *Expr, unsigned FI, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a FrameIndex SDDbgValue node.
LLVM_ABI SDValue getExtStridedLoadVP(ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain, SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding=false)
LLVM_ABI SDValue getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align DstAlign, Align SrcAlign, bool isVol, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
LLVM_ABI SDValue getJumpTable(int JTI, EVT VT, bool isTarget=false, unsigned TargetFlags=0)
LLVM_ABI bool isBaseWithConstantOffset(SDValue Op) const
Return true if the specified operand is an ISD::ADD with a ConstantSDNode on the right-hand side,...
LLVM_ABI SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI void getTopologicallyOrderedNodes(SmallVectorImpl< const SDNode * > &SortedNodes) const
Get all the nodes in their topological order without modifying any states.
LLVM_ABI void ReplaceAllUsesOfValueWith(SDValue From, SDValue To)
Replace any uses of From with To, leaving uses of other values produced by From.getNode() alone.
MachineFunction & getMachineFunction() const
LLVM_ABI std::pair< SDValue, SDValue > getStrstr(SDValue Chain, const SDLoc &dl, SDValue S0, SDValue S1, const CallInst *CI)
Lower a strstr operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getPtrExtendInReg(SDValue Op, const SDLoc &DL, EVT VT)
Return the expression required to extend the Op as a pointer value assuming it was the smaller SrcTy ...
LLVM_ABI OverflowKind computeOverflowForUnsignedAdd(SDValue N0, SDValue N1) const
Determine if the result of the unsigned addition of 2 nodes can overflow.
SDValue getPOISON(EVT VT)
Return a POISON node. POISON does not have a useful SDLoc.
SDValue getSplatBuildVector(EVT VT, const SDLoc &DL, SDValue Op)
Return a splat ISD::BUILD_VECTOR node, consisting of Op splatted to all elements.
LLVM_ABI SDValue getErrorMergeValues(ArrayRef< EVT > ResultTypes, SDValue Chain, const SDLoc &dl)
Return poison values for each of ResultTypes, substituting Chain for any result of type MVT::Other,...
LLVM_ABI SDValue getFrameIndex(int FI, EVT VT, bool isTarget=false)
LLVM_ABI void canonicalizeCommutativeBinop(unsigned Opcode, SDValue &N1, SDValue &N2) const
Swap N1 and N2 if Opcode is a commutative binary opcode and the canonical form expects the opposite o...
LLVM_ABI KnownBits computeKnownBits(SDValue Op, unsigned Depth=0) const
Determine which bits of Op are known to be either zero or one and return them in Known.
LLVM_ABI SDValue getRegisterMask(const uint32_t *RegMask)
LLVM_ABI SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
LLVM_ABI SDValue getCondCode(ISD::CondCode Cond)
LLVM_ABI bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth=0) const
Return true if 'Op & Mask' is known to be zero.
LLVM_ABI bool isKnownToBeAPowerOfTwoFP(SDValue Val, unsigned Depth=0) const
Test if the given fp value is known to be an integer power-of-2, either positive or negative.
LLVM_ABI OverflowKind computeOverflowForSignedSub(SDValue N0, SDValue N1) const
Determine if the result of the signed sub of 2 nodes can overflow.
LLVM_ABI void init(MachineFunction &NewMF, const TargetLibraryInfo *LibraryInfo, const LibcallLoweringInfo *LibcallsInfo, UniformityInfo *UA, ProfileSummaryInfo *PSIin, BlockFrequencyInfo *BFIin, FunctionVarLocs const *FnVarLocs)
Prepare this SelectionDAG to process code in the given MachineFunction.
SDValue getObjectPtrOffset(const SDLoc &SL, SDValue Ptr, TypeSize Offset)
Create an add instruction with appropriate flags when used for addressing some offset of an object.
LLVMContext * getContext() const
LLVM_ABI SDValue simplifyFPBinop(unsigned Opcode, SDValue X, SDValue Y, SDNodeFlags Flags)
Try to simplify a floating-point binary operation into 1 of its operands or a constant.
const SDValue & setRoot(SDValue N)
Set the current root tag of the SelectionDAG.
LLVM_ABI bool isKnownToBeAPowerOfTwo(SDValue Val, bool OrZero=false, unsigned Depth=0) const
Test if the given value is known to have exactly one bit set.
LLVM_ABI SDValue getDeactivationSymbol(const GlobalValue *GV)
LLVM_ABI SDValue getTargetExternalSymbol(const char *Sym, EVT VT, unsigned TargetFlags=0)
LLVM_ABI SDValue getMCSymbol(MCSymbol *Sym, EVT VT)
LLVM_ABI bool isUndef(unsigned Opcode, ArrayRef< SDValue > Ops)
Return true if the result of this operation is always undefined.
LLVM_ABI SDValue CreateStackTemporary(TypeSize Bytes, Align Alignment)
Create a stack temporary based on the size in bytes and the alignment.
LLVM_ABI SDNode * UpdateNodeOperands(SDNode *N, SDValue Op)
Mutate the specified node in-place to have the specified operands.
LLVM_ABI std::pair< EVT, EVT > GetDependentSplitDestVTs(const EVT &VT, const EVT &EnvVT, bool *HiIsEmpty) const
Compute the VTs needed for the low/hi parts of a type, dependent on an enveloping VT that has been sp...
LLVM_ABI SDValue foldConstantFPMath(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops)
Fold floating-point operations when all operands are constants and/or undefined.
LLVM_ABI std::optional< ConstantRange > getValidShiftAmountRange(SDValue V, const APInt &DemandedElts, unsigned Depth) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue FoldSymbolOffset(unsigned Opcode, EVT VT, const GlobalAddressSDNode *GA, const SDNode *N2)
LLVM_ABI SDValue getIndexedLoad(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue getTargetInsertSubreg(int SRIdx, const SDLoc &DL, EVT VT, SDValue Operand, SDValue Subreg)
A convenience function for creating TargetInstrInfo::INSERT_SUBREG nodes.
SDValue getEntryNode() const
Return the token chain corresponding to the entry of the function.
LLVM_ABI SDDbgValue * getDbgValue(DIVariable *Var, DIExpression *Expr, SDNode *N, unsigned R, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a SDDbgValue node.
LLVM_ABI SDValue getMaskedLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Base, SDValue Offset, SDValue Mask, SDValue Src0, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, ISD::LoadExtType, bool IsExpanding=false)
DenormalMode getDenormalMode(EVT VT) const
Return the current function's default denormal handling kind for the given floating point type.
SDValue getSplat(EVT VT, const SDLoc &DL, SDValue Op)
Returns a node representing a splat of one value into all lanes of the provided vector type.
LLVM_ABI std::pair< SDValue, SDValue > SplitScalar(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the scalar node with EXTRACT_ELEMENT using the provided VTs and return the low/high part.
LLVM_ABI SDValue matchBinOpReduction(SDNode *Extract, ISD::NodeType &BinOp, ArrayRef< ISD::NodeType > CandidateBinOps, bool AllowPartials=false)
Match a binop + shuffle pyramid that represents a horizontal reduction over the elements of a vector ...
LLVM_ABI bool isADDLike(SDValue Op, bool NoWrap=false) const
Return true if the specified operand is an ISD::OR or ISD::XOR node that can be treated as an ISD::AD...
LLVM_ABI SDValue getVectorShuffle(EVT VT, const SDLoc &dl, SDValue N1, SDValue N2, ArrayRef< int > Mask)
Return an ISD::VECTOR_SHUFFLE node.
LLVM_ABI SDValue simplifyShift(SDValue X, SDValue Y)
Try to simplify a shift into 1 of its operands or a constant.
LLVM_ABI bool areNonVolatileConsecutiveStores(StoreSDNode *ST, StoreSDNode *Base, unsigned Bytes, int Dist) const
Return true if stores are next to each other and can be merged.
LLVM_ABI void transferDbgValues(SDValue From, SDValue To, unsigned OffsetInBits=0, unsigned SizeInBits=0, bool InvalidateDbg=true)
Transfer debug values from one node to another, while optionally generating fragment expressions for ...
LLVM_ABI SDValue getLogicalNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a logical NOT operation as (XOR Val, BooleanOne).
LLVM_ABI SDValue getMaskedScatter(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType, bool IsTruncating=false)
ilist< SDNode >::iterator allnodes_iterator
This SDNode is used to implement the code generator support for the llvm IR shufflevector instruction...
int getMaskElt(unsigned Idx) const
ArrayRef< int > getMask() const
static void commuteMask(MutableArrayRef< int > Mask)
Change values in a shuffle permute mask assuming the two vector operands have swapped position.
static LLVM_ABI bool isSplatMask(ArrayRef< int > Mask)
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
bool erase(PtrType Ptr)
Remove pointer from the set.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This class is used to represent ISD::STORE nodes.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:138
Information about stack frame layout on the target.
virtual TargetStackID::Value getStackIDForScalableVectors() const
Returns the StackID that scalable vectors should be associated with.
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
Completely target-dependent object reference.
unsigned getTargetFlags() const
Provides information about what library functions are available for the current target.
virtual bool shouldConvertConstantLoadToIntImm(const APInt &Imm, Type *Ty) const
Return true if it is beneficial to convert a load of a constant to just the constant itself.
const TargetMachine & getTargetMachine() const
virtual bool isZExtFree(Type *FromTy, Type *ToTy) const
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
unsigned getMaxStoresPerMemcpy(bool OptSize) const
Get maximum # of store operations permitted for llvm.memcpy.
unsigned getMaxStoresPerMemset(bool OptSize) const
Get maximum # of store operations permitted for llvm.memset.
virtual bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *=nullptr) const
Determine if the target supports unaligned memory accesses.
virtual bool shallExtractConstSplatVectorElementToStore(Type *VectorTy, unsigned ElemSizeInBits, unsigned &Index) const
Return true if the target shall perform extract vector element and store given that the vector is kno...
virtual bool isTruncateFree(Type *FromTy, Type *ToTy) const
Return true if it's free to truncate a value of type FromTy to type ToTy.
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
BooleanContent
Enum that describes how the target represents true/false values.
virtual unsigned getMaxGluedStoresPerMemcpy() const
Get maximum # of store operations to be glued together.
std::vector< ArgListEntry > ArgListTy
unsigned getMaxStoresPerMemmove(bool OptSize) const
Get maximum # of store operations permitted for llvm.memmove.
virtual bool isLegalStoreImmediate(int64_t Value) const
Return true if the specified immediate is legal for the value input of a store instruction.
static ISD::NodeType getExtendForContent(BooleanContent Content)
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual bool findOptimalMemOpLowering(LLVMContext &Context, std::vector< EVT > &MemOps, unsigned Limit, const MemOp &Op, unsigned DstAS, unsigned SrcAS, const AttributeList &FuncAttributes, EVT *LargestVT=nullptr) const
Determines the optimal series of memory ops to replace the memset / memcpy.
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
Primary interface to the complete machine description for the target machine.
const Triple & getTargetTriple() const
virtual bool isNoopAddrSpaceCast(const DataLayout &DL, unsigned SrcAS, unsigned DestAS) const
Returns true if a cast between SrcAS and DestAS is a noop.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const SelectionDAGTargetInfo * getSelectionDAGInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
virtual const TargetLowering * getTargetLowering() const
bool isOSDarwin() const
Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, DriverKit, XROS, or bridgeOS).
Definition Triple.h:723
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:339
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:283
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:299
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:272
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:297
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:187
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:222
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM_ABI unsigned getOperandNo() const
Return the operand # of this use in its User.
Definition Use.cpp:35
LLVM_ABI void set(Value *Val)
Definition Value.h:876
User * getUser() const
Returns the User that contains this Use.
Definition Use.h:61
Value * getOperand(unsigned i) const
Definition User.h:207
This class is used to represent an VP_GATHER node.
This class is used to represent a VP_LOAD node.
This class is used to represent an VP_SCATTER node.
This class is used to represent a VP_STORE node.
This class is used to represent an EXPERIMENTAL_VP_STRIDED_LOAD node.
This class is used to represent an EXPERIMENTAL_VP_STRIDED_STORE node.
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:209
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition DenseSet.h:182
constexpr bool hasKnownScalarFactor(const FixedOrScalableQuantity &RHS) const
Returns true if there exists a value X where RHS*X will result in a value whose quantity matches our ...
Definition TypeSize.h:265
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr bool isKnownEven() const
A return value of true indicates we know at compile time that the number of elements (vscale * Min) i...
Definition TypeSize.h:176
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
constexpr LeafTy divideCoefficientBy(ScalarTy RHS) const
We do not provide the '/' operator here because division for polynomial types does not work in the sa...
Definition TypeSize.h:252
static constexpr bool isKnownGE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:237
A raw_ostream that writes to an std::string.
CallInst * Call
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI APInt clmulr(const APInt &LHS, const APInt &RHS)
Perform a reversed carry-less multiply.
Definition APInt.cpp:3235
LLVM_ABI APInt mulhu(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on zero-extended operands.
Definition APInt.cpp:3165
LLVM_ABI APInt avgCeilU(const APInt &C1, const APInt &C2)
Compute the ceil of the unsigned average of C1 and C2.
Definition APInt.cpp:3152
LLVM_ABI APInt avgFloorU(const APInt &C1, const APInt &C2)
Compute the floor of the unsigned average of C1 and C2.
Definition APInt.cpp:3142
LLVM_ABI APInt pext(const APInt &Val, const APInt &Mask)
Perform a "compress" operation, also known as pext or bext.
Definition APInt.cpp:3245
LLVM_ABI APInt fshr(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift right.
Definition APInt.cpp:3216
LLVM_ABI APInt mulhs(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on sign-extended operands.
Definition APInt.cpp:3157
LLVM_ABI APInt clmul(const APInt &LHS, const APInt &RHS)
Perform a carry-less multiply, also known as XOR multiplication, and return low-bits.
Definition APInt.cpp:3225
LLVM_ABI APInt pdep(const APInt &Val, const APInt &Mask)
Perform an "expand" operation, also known as pdep or bdep.
Definition APInt.cpp:3255
APInt abds(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be signed.
Definition APInt.h:2294
LLVM_ABI APInt fshl(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift left.
Definition APInt.cpp:3207
LLVM_ABI APInt ScaleBitMask(const APInt &A, unsigned NewBitWidth, bool MatchAllBits=false)
Splat/Merge neighboring bits to widen/narrow the bitmask represented by.
Definition APInt.cpp:3043
LLVM_ABI APInt clmulh(const APInt &LHS, const APInt &RHS)
Perform a carry-less multiply, and return high-bits.
Definition APInt.cpp:3240
APInt abdu(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be unsigned.
Definition APInt.h:2299
LLVM_ABI APInt avgFloorS(const APInt &C1, const APInt &C2)
Compute the floor of the signed average of C1 and C2.
Definition APInt.cpp:3137
LLVM_ABI APInt avgCeilS(const APInt &C1, const APInt &C2)
Compute the ceil of the signed average of C1 and C2.
Definition APInt.cpp:3147
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
LLVM_ABI CondCode getSetCCInverse(CondCode Operation, bool isIntegerLike)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
ISD namespace - This namespace contains an enum which represents all of the SelectionDAG node types a...
Definition ISDOpcodes.h:24
LLVM_ABI CondCode getSetCCAndOperation(CondCode Op1, CondCode Op2, EVT Type)
Return the result of a logical AND between different comparisons of identical values: ((X op1 Y) & (X...
LLVM_ABI bool isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are ~0 ...
bool isNON_EXTLoad(const SDNode *N)
Returns true if the specified node is a non-extending load.
bool matchUnaryPredicateImpl(SDValue Op, const APInt &DemandedElts, std::function< bool(ConstNodeType *)> Match, bool AllowUndefs=false, bool AllowTruncation=false)
Attempt to match a unary predicate against a scalar/splat constant or every element of a constant BUI...
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
Definition ISDOpcodes.h:835
@ 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:514
@ 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:541
@ 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:603
@ JUMP_TABLE_DEBUG_INFO
JUMP_TABLE_DEBUG_INFO - Jumptable debug info.
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:795
@ 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:525
@ 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:869
@ ATOMIC_LOAD_USUB_COND
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:521
@ 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:896
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:587
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:418
@ 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:755
@ SIGN_EXTEND_VECTOR_INREG
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
Definition ISDOpcodes.h:926
@ 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:531
@ 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:786
@ 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:804
@ ANNOTATION_LABEL
ANNOTATION_LABEL - Represents a mid basic block label used by annotations.
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:860
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
Definition ISDOpcodes.h:723
@ SCALAR_TO_VECTOR
SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a scalar value into element 0 of the...
Definition ISDOpcodes.h:673
@ 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:889
@ 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:843
@ FNEG
Perform various unary floating-point operations inspired by libm.
@ BR_CC
BR_CC - Conditional branch.
@ SSUBO
Same for subtraction.
Definition ISDOpcodes.h:353
@ STEP_VECTOR
STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised of a linear sequence of unsign...
Definition ISDOpcodes.h:699
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:544
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:551
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:375
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:812
@ 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:680
@ 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:349
@ 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:808
@ 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:712
@ ATOMIC_LOAD_FMAXIMUM
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:777
@ 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:657
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:617
@ 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:579
@ 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:866
@ 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:827
@ 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:387
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:357
@ 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:661
@ ANY_EXTEND_VECTOR_INREG
ANY_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register any-extension of the low la...
Definition ISDOpcodes.h:915
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition ISDOpcodes.h:904
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:735
@ 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:994
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:821
@ UADDO_CARRY
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:329
@ 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:791
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition ISDOpcodes.h:503
@ 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:942
@ 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:508
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:747
@ 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:743
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
Definition ISDOpcodes.h:718
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:665
@ 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:689
@ 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:568
@ 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:803
@ 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:975
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:707
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
Definition ISDOpcodes.h:937
@ 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:961
@ VECREDUCE_FMINIMUM
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:872
@ 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:849
@ 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:537
@ PARTIAL_REDUCE_SUMLA
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:366
@ VECTOR_REPEAT
VECTOR_REPEAT(FIXED_LENGTH_VECTOR) Repeatedly copies the elements of the source fixed-length vector t...
Definition ISDOpcodes.h:643
@ 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:887
@ ABDS
ABDS/ABDU - Absolute difference - Return the absolute difference between two numbers interpreted as s...
Definition ISDOpcodes.h:730
@ TRUNCATE_USAT_U
Definition ISDOpcodes.h:891
@ SADDO_CARRY
Carry-using overflow-aware nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:339
@ 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:759
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:559
LLVM_ABI NodeType getOppositeSignednessMinMaxOpcode(unsigned MinMaxOpc)
Given a MinMaxOpc of ISD::(U|S)MIN or ISD::(U|S)MAX, returns the corresponding opcode with the opposi...
LLVM_ABI bool isBuildVectorOfConstantSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantSDNode or undef.
LLVM_ABI NodeType getExtForLoadExtType(bool IsFP, LoadExtType)
bool isZEXTLoad(const SDNode *N)
Returns true if the specified node is a ZEXTLOAD.
bool isExtOpcode(unsigned Opcode)
LLVM_ABI bool isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are 0 o...
LLVM_ABI NodeType getUnmaskedBinOpOpcode(unsigned MaskedOpc)
Given a MaskedOpc of ISD::MASKED_(U|S)(DIV|REM), returns the unmasked ISD::(U|S)(DIV|REM).
LLVM_ABI bool isVectorShrinkable(const SDNode *N, unsigned NewEltSize, bool Signed)
Returns true if the specified node is a vector where all elements can be truncated to the specified e...
LLVM_ABI bool isVPBinaryOp(unsigned Opcode)
Whether this is a vector-predicated binary operation opcode.
LLVM_ABI CondCode getSetCCInverse(CondCode Operation, EVT Type)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
LLVM_ABI std::optional< unsigned > getBaseOpcodeForVP(unsigned Opcode, bool hasFPExcept)
Translate this VP Opcode to its corresponding non-VP Opcode.
bool isBitwiseLogicOp(unsigned Opcode)
Whether this is bitwise logic opcode.
bool isTrueWhenEqual(CondCode Cond)
Return true if the specified condition returns true if the two operands to the condition are equal.
LLVM_ABI std::optional< unsigned > getVPMaskIdx(unsigned Opcode)
The operand position of the vector mask.
unsigned getUnorderedFlavor(CondCode Cond)
This function returns 0 if the condition is always false if an operand is a NaN, 1 if the condition i...
LLVM_ABI std::optional< unsigned > getVPExplicitVectorLengthIdx(unsigned Opcode)
The operand position of the explicit vector length parameter.
LLVM_ABI bool matchBinaryPredicate(SDValue LHS, SDValue RHS, const APInt &DemandedElts, std::function< bool(ConstantSDNode *, ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTypeMismatch=false)
Attempt to match a binary predicate against a pair of scalar/splat constants or every element of a pa...
bool isEXTLoad(const SDNode *N)
Returns true if the specified node is a EXTLOAD.
LLVM_ABI bool allOperandsUndef(const SDNode *N)
Return true if the node has at least one operand and all operands of the specified node are ISD::UNDE...
LLVM_ABI bool isFreezeUndef(const SDNode *N)
Return true if the specified node is FREEZE(UNDEF).
LLVM_ABI CondCode getSetCCSwappedOperands(CondCode Operation)
Return the operation corresponding to (Y op X) when given the operation for (X op Y).
LLVM_ABI std::optional< unsigned > getVPForBaseOpcode(unsigned Opcode)
Translate this non-VP Opcode to its corresponding VP Opcode.
MemIndexType
MemIndexType enum - This enum defines how to interpret MGATHER/SCATTER's index parameter when calcula...
LLVM_ABI bool isBuildVectorAllZeros(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are 0 or undef.
LLVM_ABI bool isConstantSplatVector(const SDNode *N, APInt &SplatValue)
Node predicates.
LLVM_ABI NodeType getInverseMinMaxOpcode(unsigned MinMaxOpc)
Given a MinMaxOpc of ISD::(U|S)MIN or ISD::(U|S)MAX, returns ISD::(U|S)MAX and ISD::(U|S)MIN,...
LLVM_ABI bool isVPReduction(unsigned Opcode)
Whether this is a vector-predicated reduction opcode.
MemIndexedMode
MemIndexedMode enum - This enum defines the load / store indexed addressing modes.
LLVM_ABI bool isBuildVectorOfConstantFPSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantFPSDNode or undef.
bool isSEXTLoad(const SDNode *N)
Returns true if the specified node is a SEXTLOAD.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
LLVM_ABI bool isBuildVectorAllOnes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are ~0 or undef.
LLVM_ABI NodeType getVecReduceBaseOpcode(unsigned VecReduceOpcode)
Get underlying scalar opcode for VECREDUCE opcode.
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
LLVM_ABI bool isVPOpcode(unsigned Opcode)
Whether this is a vector-predicated Opcode.
bool matchUnaryPredicate(SDValue Op, const APInt &DemandedElts, std::function< bool(ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTruncation=false)
Hook for matching ConstantSDNode predicate.
LLVM_ABI CondCode getSetCCOrOperation(CondCode Op1, CondCode Op2, EVT Type)
Return the result of a logical OR between different comparisons of identical values: ((X op1 Y) | (X ...
BinaryOp_match< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
match_deferred< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
auto m_Value()
Match an arbitrary value and ignore it.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
LLVM_ABI Libcall getMEMCPY_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMCPY_ELEMENT_UNORDERED_ATOMIC - Return MEMCPY_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
LLVM_ABI Libcall getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMSET_ELEMENT_UNORDERED_ATOMIC - Return MEMSET_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
LLVM_ABI Libcall getMEMMOVE_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMMOVE_ELEMENT_UNORDERED_ATOMIC - Return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_* value for the given e...
bool sd_match(SDValue N, Pattern &&P)
LLVM_ABI unsigned rot(unsigned SrcSignBits, unsigned BitWidth, std::optional< APInt > RotAmt, bool IsRotateRight)
Compute the number of sign bits after rotating a value.
initializer< Ty > init(const Ty &Val)
@ DW_OP_LLVM_arg
Only used in LLVM metadata.
Definition Dwarf.h:149
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:679
NodeAddr< NodeBase * > Node
Definition RDFGraph.h:381
This is an optimization pass for GlobalISel generic memory operations.
GenericUniformityInfo< SSAContext > UniformityInfo
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition MathExtras.h:339
@ Offset
Definition DWP.cpp:577
bool operator<(int64_t V1, const APSInt &V2)
Definition APSInt.h:360
LLVM_ABI ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred)
getICmpCondCode - Return the ISD condition code corresponding to the given LLVM IR integer condition ...
Definition Analysis.cpp:237
void fill(R &&Range, T &&Value)
Provide wrappers to std::fill which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1775
LLVM_ABI SDValue peekThroughExtractSubvectors(SDValue V)
Return the non-extracted vector source operand of V if it exists.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1755
LLVM_ABI bool isNullConstant(SDValue V)
Returns true if V is a constant integer zero.
LLVM_ABI bool isAllOnesOrAllOnesSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant -1 integer or a splatted vector of a constant -1 integer (with...
Definition Utils.cpp:1557
LLVM_ABI SDValue getBitwiseNotOperand(SDValue V, SDValue Mask, bool AllowUndefs)
If V is a bitwise not, returns the inverted operand.
@ Known
Known to have no common set bits.
@ Undef
Value of the register doesn't matter.
LLVM_ABI SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2570
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition bit.h:315
@ Store
The extracted value is stored (ExtractElement only).
bool isIntOrFPConstant(SDValue V)
Return true if V is either a integer or FP constant.
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
Definition Casting.h:732
LLVM_ABI bool getConstantDataArrayInfo(const Value *V, ConstantDataArraySlice &Slice, unsigned ElementSize, uint64_t Offset=0)
Returns true if the value V is a pointer into a ConstantDataArray.
LLVM_ABI bool isOneOrOneSplatFP(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant floating-point value, or a splatted vector of a constant float...
int bit_width(T Value)
Returns the number of bits needed to represent Value if Value is nonzero.
Definition bit.h:325
LLVM_READONLY APFloat maximum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximum semantics.
Definition APFloat.h:1801
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2224
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:244
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:649
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
auto cast_or_null(const Y &Val)
Definition Casting.h:714
LLVM_ABI bool isNullOrNullSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
Definition Utils.cpp:1539
LLVM_ABI bool isMinSignedConstant(SDValue V)
Returns true if V is a constant min signed integer value.
LLVM_ABI ConstantFPSDNode * isConstOrConstSplatFP(SDValue N, bool AllowUndefs=false)
Returns the SDNode if it is a constant splat BuildVector or constant float.
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
APFloat frexp(const APFloat &X, int &Exp, APFloat::roundingMode RM)
Equivalent of C standard library function.
Definition APFloat.h:1713
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition bit.h:204
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1762
LLVM_ABI bool getShuffleDemandedElts(int SrcWidth, ArrayRef< int > Mask, const APInt &DemandedElts, APInt &DemandedLHS, APInt &DemandedRHS, bool AllowUndefElts=false)
Transform a shuffle mask's output demanded element mask into demanded element masks for the 2 operand...
LLVM_READONLY APFloat maxnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2008 maxNum semantics.
Definition APFloat.h:1756
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition MathExtras.h:326
LLVM_ABI bool isBitwiseNot(SDValue V, bool AllowUndefs=false)
Returns true if V is a bitwise not operation.
auto reverse(ContainerTy &&C)
Definition STLExtras.h:408
LLVM_ABI SDValue peekThroughInsertVectorElt(SDValue V, const APInt &DemandedElts)
Recursively peek through INSERT_VECTOR_ELT nodes, returning the source vector operand of V,...
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:280
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
LLVM_ABI void checkForCycles(const SelectionDAG *DAG, bool force=false)
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1652
LLVM_READONLY APFloat minimumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimumNumber semantics.
Definition APFloat.h:1787
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI const MDNode * getMemCacheHintMetadata(const Instruction &I, unsigned OperandNo=0)
Return the cache hint metadata node for memory operand OperandNo on I, or nullptr when the instructio...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI SDValue peekThroughTruncates(SDValue V)
Return the non-truncated source operand of V if it exists.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1769
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
constexpr std::underlying_type_t< Enum > to_underlying(Enum E)
Returns underlying integer value of an enum.
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
LLVM_ABI SDValue peekThroughOneUseBitcasts(SDValue V)
Return the non-bitcasted and one-use source operand of V if it exists.
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:227
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
bool includesPoison(UndefPoisonKind Kind)
Returns true if Kind includes the Poison bit.
Definition UndefPoison.h:27
LLVM_ABI bool isOneOrOneSplat(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant 1 integer or a splatted vector of a constant 1 integer (with n...
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Other
Any other memory.
Definition ModRef.h:68
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
bool includesUndef(UndefPoisonKind Kind)
Returns true if Kind includes the Undef bit.
Definition UndefPoison.h:33
LLVM_READONLY APFloat minnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2008 minNum semantics.
Definition APFloat.h:1737
@ Mul
Product of integers.
@ Sub
Subtraction of integers.
@ Fast
Assign the register banks as fast as possible (default).
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
LLVM_ABI bool isNullConstantOrUndef(SDValue V)
Returns true if V is a constant integer zero or an UNDEF node.
IntPtrTy
Definition InstrProf.h:82
LLVM_ABI bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM, bool ReturnsFirstArg=false)
Test if the given instruction is in a position to be optimized with a tail-call.
Definition Analysis.cpp:539
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI ConstantSDNode * isConstOrConstSplat(SDValue N, bool AllowUndefs=false, bool AllowTruncation=false)
Returns the SDNode if it is a constant splat BuildVector or constant int.
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1901
constexpr unsigned BitWidth
LLVM_ABI bool funcReturnsFirstArgOfCall(const CallInst &CI)
Returns true if the parent of CI returns CI's first argument after calling CI.
Definition Analysis.cpp:719
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isZeroOrZeroSplat(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
constexpr auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
Definition Sequence.h:341
LLVM_ABI bool isOneConstant(SDValue V)
Returns true if V is a constant integer one.
UndefPoisonKind
Enumeration to track whether we are interested in Undef, Poison, or both.
Definition UndefPoison.h:20
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1963
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
LLVM_ABI bool isNullFPConstant(SDValue V)
Returns true if V is an FP constant with a value of positive zero.
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
Definition MathExtras.h:567
unsigned Log2(Align A)
Returns the log2 of the alignment.
Definition Alignment.h:197
LLVM_ABI bool isZeroOrZeroSplatFP(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant (+/-)0.0 floating-point value or a splatted vector thereof (wi...
bool equal(L &&LRange, R &&RRange)
Wrapper function around std::equal to detect if pair-wise elements between two ranges are the same.
Definition STLExtras.h:2162
LLVM_ABI void computeKnownBitsFromRangeMetadata(const MDNode &Ranges, KnownBits &Known)
Compute known bits from the range metadata.
LLVM_READONLY APFloat minimum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimum semantics.
Definition APFloat.h:1774
LLVM_READONLY APFloat maximumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximumNumber semantics.
Definition APFloat.h:1814
LLVM_ABI bool isOnesOrOnesSplat(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant 1 integer or a splatted vector of a constant 1 integer (with n...
LLVM_ABI bool isAllOnesConstant(SDValue V)
Returns true if V is an integer constant with all bits set.
constexpr uint64_t NextPowerOf2(uint64_t A)
Returns the next power of two (in 64-bits) that is strictly greater than A.
Definition MathExtras.h:368
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
#define N
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:774
MDNode * TBAAStruct
The tag for type-based alias analysis (tbaa struct).
Definition Metadata.h:794
MDNode * TBAA
The tag for type-based alias analysis.
Definition Metadata.h:791
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77
Represents offset+length into a ConstantDataArray.
uint64_t Length
Length of the slice.
uint64_t Offset
Slice starts at this Offset.
void move(uint64_t Delta)
Moves the Offset and adjusts Length accordingly.
const ConstantDataArray * Array
ConstantDataArray pointer.
Extended Value Type.
Definition ValueTypes.h:35
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition ValueTypes.h:418
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition ValueTypes.h:145
intptr_t getRawBits() const
Definition ValueTypes.h:543
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition ValueTypes.h:70
EVT changeTypeToInteger() const
Return the type converted to an equivalently sized integer or vector with integer element type.
Definition ValueTypes.h:129
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:307
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:323
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:155
ElementCount getVectorElementCount() const
Definition ValueTypes.h:373
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:396
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:382
uint64_t getScalarSizeInBits() const
Definition ValueTypes.h:408
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:339
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:61
bool isFixedLengthVector() const
Definition ValueTypes.h:199
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:176
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:346
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
Definition ValueTypes.h:315
bool bitsEq(EVT VT) const
Return true if this has the same number of bits as VT.
Definition ValueTypes.h:279
LLVM_ABI Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition ValueTypes.h:187
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:351
bool isExtended() const
Test if the given EVT is extended (as opposed to being simple).
Definition ValueTypes.h:150
LLVM_ABI const fltSemantics & getFltSemantics() const
Returns an APFloat semantics tag appropriate for the value type.
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:359
bool bitsLE(EVT VT) const
Return true if this has no more bits than VT.
Definition ValueTypes.h:331
EVT getHalfNumVectorElementsVT(LLVMContext &Context) const
Definition ValueTypes.h:484
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:160
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition KnownBits.h:315
static LLVM_ABI KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from zero-extended multiply-hi.
static LLVM_ABI KnownBits smax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smax(LHS, RHS).
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition KnownBits.h:106
bool isZero() const
Returns true if value is all zero.
Definition KnownBits.h:78
static LLVM_ABI KnownBits usub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.usub.sat(LHS, RHS)
static LLVM_ABI KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
static LLVM_ABI KnownBits urem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for urem(LHS, RHS).
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:288
static LLVM_ABI std::optional< bool > ne(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_NE result.
KnownBits trunc(unsigned BitWidth) const
Return known bits for a truncation of the value we're tracking.
Definition KnownBits.h:165
KnownBits byteSwap() const
Definition KnownBits.h:559
static LLVM_ABI KnownBits fshl(const KnownBits &LHS, const KnownBits &RHS, const APInt &Amt)
Compute known bits for fshl(LHS, RHS, Amt).
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:303
void setAllZero()
Make all bits known to be zero and discard any previous information.
Definition KnownBits.h:84
KnownBits reverseBits() const
Definition KnownBits.h:563
KnownBits concat(const KnownBits &Lo) const
Concatenate the bits from Lo onto the bottom of *this.
Definition KnownBits.h:247
unsigned getBitWidth() const
Get the bit width of this value.
Definition KnownBits.h:44
static LLVM_ABI KnownBits umax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umax(LHS, RHS).
KnownBits zext(unsigned BitWidth) const
Return known bits for a zero extension of the value we're tracking.
Definition KnownBits.h:176
void resetAll()
Resets the known state of all bits.
Definition KnownBits.h:72
static KnownBits add(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false, bool SelfAdd=false)
Compute knownbits resulting from addition of LHS and RHS.
Definition KnownBits.h:361
static LLVM_ABI KnownBits lshr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for lshr(LHS, RHS).
bool isNonZero() const
Returns true if this value is known to be non-zero.
Definition KnownBits.h:109
static LLVM_ABI KnownBits abdu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for abdu(LHS, RHS).
KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const
Return a subset of the known bits from [bitPosition,bitPosition+numBits).
Definition KnownBits.h:239
static LLVM_ABI KnownBits pdep(const KnownBits &Val, const KnownBits &Mask)
Compute known bits for pdep(Val, Mask).
static LLVM_ABI KnownBits avgFloorU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorU.
KnownBits sext(unsigned BitWidth) const
Return known bits for a sign extension of the value we're tracking.
Definition KnownBits.h:184
static LLVM_ABI KnownBits computeForSubBorrow(const KnownBits &LHS, KnownBits RHS, const KnownBits &Borrow)
Compute known bits results from subtracting RHS from LHS with 1-bit Borrow.
KnownBits zextOrTrunc(unsigned BitWidth) const
Return known bits for a zero extension or truncation of the value we're tracking.
Definition KnownBits.h:200
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:146
static LLVM_ABI KnownBits fshr(const KnownBits &LHS, const KnownBits &RHS, const APInt &Amt)
Compute known bits for fshr(LHS, RHS, Amt).
static LLVM_ABI KnownBits abds(KnownBits LHS, KnownBits RHS)
Compute known bits for abds(LHS, RHS).
static LLVM_ABI KnownBits smin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smin(LHS, RHS).
static LLVM_ABI KnownBits mulhs(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from sign-extended multiply-hi.
static LLVM_ABI KnownBits srem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for srem(LHS, RHS).
static LLVM_ABI KnownBits udiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for udiv(LHS, RHS).
bool isStrictlyPositive() const
Returns true if this value is known to be positive.
Definition KnownBits.h:112
static LLVM_ABI KnownBits sdiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for sdiv(LHS, RHS).
static LLVM_ABI KnownBits avgFloorS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorS.
static bool haveNoCommonBitsSet(const KnownBits &LHS, const KnownBits &RHS)
Return true if LHS and RHS have no common bits set.
Definition KnownBits.h:340
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:103
static LLVM_ABI KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry)
Compute known bits resulting from adding LHS, RHS and a 1-bit Carry.
Definition KnownBits.cpp:54
static KnownBits sub(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false)
Compute knownbits resulting from subtraction of LHS and RHS.
Definition KnownBits.h:376
unsigned countMaxLeadingZeros() const
Returns the maximum number of leading zero bits possible.
Definition KnownBits.h:294
static LLVM_ABI KnownBits avgCeilU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilU.
static LLVM_ABI KnownBits mul(const KnownBits &LHS, const KnownBits &RHS, bool NoUndefSelfMultiply=false)
Compute known bits resulting from multiplying LHS and RHS.
KnownBits anyext(unsigned BitWidth) const
Return known bits for an "any" extension of the value we're tracking, where we don't know anything ab...
Definition KnownBits.h:171
static LLVM_ABI KnownBits clmul(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for clmul(LHS, RHS).
LLVM_ABI KnownBits abs(bool IntMinIsPoison=false) const
Compute known bits for the absolute value.
static LLVM_ABI KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW=false, bool NSW=false, bool ShAmtNonZero=false)
Compute known bits for shl(LHS, RHS).
static LLVM_ABI KnownBits umin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umin(LHS, RHS).
static LLVM_ABI KnownBits pext(const KnownBits &Val, const KnownBits &Mask)
Compute known bits for pext(Val, Mask).
static LLVM_ABI KnownBits avgCeilS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilS.
bool isUnknown() const
KnownFPClass intersectWith(const KnownFPClass &RHS) const
static LLVM_ABI KnownFPClass bitcast(const fltSemantics &FltSemantics, const KnownBits &Bits)
Report known values for a bitcast into a float with provided semantics.
LLVM IR metadata carried by a MachineMemOperand.
This class contains a discriminated union of information about pointers in memory operands,...
LLVM_ABI bool isDereferenceable(unsigned Size, LLVMContext &C, const DataLayout &DL) const
Return true if memory region [V, V+Offset+Size) is known to be dereferenceable.
LLVM_ABI unsigned getAddrSpace() const
Return the LLVM IR address space number that this pointer points into.
PointerUnion< const Value *, const PseudoSourceValue * > V
This is the IR pointer value for the access, or it is null if unknown.
MachinePointerInfo getWithOffset(int64_t O) const
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.
Definition Alignment.h:130
static MemOp Set(uint64_t Size, bool DstAlignCanChange, Align DstAlign, bool IsZeroMemset, bool IsVolatile)
static MemOp Copy(uint64_t Size, bool DstAlignCanChange, Align DstAlign, Align SrcAlign, bool IsVolatile, bool MemcpyStrSrc=false)
static MemOp Move(uint64_t Size, bool DstAlignCanChange, Align DstAlign, Align SrcAlign, bool IsVolatile)
static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl)
Get the libcall routine name for the specified libcall implementation.
These are IR-level optimization flags that may be propagated to SDNodes.
static LLVM_ABI bool isEqual(const KeyTy &Key, const SDNode &N)
The key SelectionDAG uniques SDNodes by.
void AddPointer(const void *P)
SmallVector< SDValue, 0 > OpStorage
Backs Ops when the key is built from a node; empty otherwise.
void AddInteger(T I)
const EVT * VTs
ArrayRef< SDValue > Ops
FoldingSetNodeID Tail
SDNodeKey(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops)
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
unsigned int NumVTs
Clients of various APIs that cause global effects on the DAG can optionally implement this interface.
virtual void NodeDeleted(SDNode *N, SDNode *E)
The node N that was deleted and, if E is not null, an equivalent node E that replaced it.
virtual void NodeInserted(SDNode *N)
The node N that was inserted.
virtual void NodeUpdated(SDNode *N)
The node N that was updated.
This structure contains all information that is necessary for lowering calls.
CallLoweringInfo & setLibCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList)
CallLoweringInfo & setDiscardResult(bool Value=true)
CallLoweringInfo & setDebugLoc(const SDLoc &dl)
CallLoweringInfo & setTailCall(bool Value=true)
CallLoweringInfo & setChain(SDValue InChain)