LLVM 23.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"
51#include "llvm/IR/Constant.h"
52#include "llvm/IR/Constants.h"
53#include "llvm/IR/DataLayout.h"
55#include "llvm/IR/DebugLoc.h"
57#include "llvm/IR/Function.h"
58#include "llvm/IR/GlobalValue.h"
59#include "llvm/IR/Metadata.h"
60#include "llvm/IR/Type.h"
64#include "llvm/Support/Debug.h"
73#include <algorithm>
74#include <cassert>
75#include <cstdint>
76#include <cstdlib>
77#include <limits>
78#include <optional>
79#include <string>
80#include <utility>
81#include <vector>
82
83using namespace llvm;
84using namespace llvm::SDPatternMatch;
85
86/// makeVTList - Return an instance of the SDVTList struct initialized with the
87/// specified members.
88static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs) {
89 SDVTList Res = {VTs, NumVTs};
90 return Res;
91}
92
93// Default null implementations of the callbacks.
97
98void SelectionDAG::DAGNodeDeletedListener::anchor() {}
99void SelectionDAG::DAGNodeInsertedListener::anchor() {}
100
101#define DEBUG_TYPE "selectiondag"
102
103static cl::opt<bool> EnableMemCpyDAGOpt("enable-memcpy-dag-opt",
104 cl::Hidden, cl::init(true),
105 cl::desc("Gang up loads and stores generated by inlining of memcpy"));
106
107static cl::opt<int> MaxLdStGlue("ldstmemcpy-glue-max",
108 cl::desc("Number limit for gluing ld/st of memcpy."),
109 cl::Hidden, cl::init(0));
110
112 MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192),
113 cl::desc("DAG combiner limit number of steps when searching DAG "
114 "for predecessor nodes"));
115
117 LLVM_DEBUG(dbgs() << Msg; V.getNode()->dump(G););
118}
119
121
122//===----------------------------------------------------------------------===//
123// ConstantFPSDNode Class
124//===----------------------------------------------------------------------===//
125
126/// isExactlyValue - We don't rely on operator== working on double values, as
127/// it returns true for things that are clearly not equal, like -0.0 and 0.0.
128/// As such, this method can be used to do an exact bit-for-bit comparison of
129/// two floating point values.
131 return getValueAPF().bitwiseIsEqual(V);
132}
133
135 const APFloat& Val) {
136 assert(VT.isFloatingPoint() && "Can only convert between FP types");
137
138 // convert modifies in place, so make a copy.
139 APFloat Val2 = APFloat(Val);
140 bool losesInfo;
142 &losesInfo);
143 return !losesInfo;
144}
145
146//===----------------------------------------------------------------------===//
147// ISD Namespace
148//===----------------------------------------------------------------------===//
149
150bool ISD::isConstantSplatVector(const SDNode *N, APInt &SplatVal) {
151 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
152 if (auto OptAPInt = N->getOperand(0)->bitcastToAPInt()) {
153 unsigned EltSize =
154 N->getValueType(0).getVectorElementType().getSizeInBits();
155 SplatVal = OptAPInt->trunc(EltSize);
156 return true;
157 }
158 }
159
160 auto *BV = dyn_cast<BuildVectorSDNode>(N);
161 if (!BV)
162 return false;
163
164 APInt SplatUndef;
165 unsigned SplatBitSize;
166 bool HasUndefs;
167 unsigned EltSize = N->getValueType(0).getVectorElementType().getSizeInBits();
168 // Endianness does not matter here. We are checking for a splat given the
169 // element size of the vector, and if we find such a splat for little endian
170 // layout, then that should be valid also for big endian (as the full vector
171 // size is known to be a multiple of the element size).
172 const bool IsBigEndian = false;
173 return BV->isConstantSplat(SplatVal, SplatUndef, SplatBitSize, HasUndefs,
174 EltSize, IsBigEndian) &&
175 EltSize == SplatBitSize;
176}
177
178// FIXME: AllOnes and AllZeros duplicate a lot of code. Could these be
179// specializations of the more general isConstantSplatVector()?
180
181bool ISD::isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly) {
182 // Look through a bit convert.
183 while (N->getOpcode() == ISD::BITCAST)
184 N = N->getOperand(0).getNode();
185
186 if (!BuildVectorOnly && N->getOpcode() == ISD::SPLAT_VECTOR) {
187 APInt SplatVal;
188 return isConstantSplatVector(N, SplatVal) && SplatVal.isAllOnes();
189 }
190
191 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
192
193 unsigned i = 0, e = N->getNumOperands();
194
195 // Skip over all of the undef values.
196 while (i != e && N->getOperand(i).isUndef())
197 ++i;
198
199 // Do not accept an all-undef vector.
200 if (i == e) return false;
201
202 // Do not accept build_vectors that aren't all constants or which have non-~0
203 // elements. We have to be a bit careful here, as the type of the constant
204 // may not be the same as the type of the vector elements due to type
205 // legalization (the elements are promoted to a legal type for the target and
206 // a vector of a type may be legal when the base element type is not).
207 // We only want to check enough bits to cover the vector elements, because
208 // we care if the resultant vector is all ones, not whether the individual
209 // constants are.
210 SDValue NotZero = N->getOperand(i);
211 if (auto OptAPInt = NotZero->bitcastToAPInt()) {
212 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
213 if (OptAPInt->countr_one() < EltSize)
214 return false;
215 } else
216 return false;
217
218 // Okay, we have at least one ~0 value, check to see if the rest match or are
219 // undefs. Even with the above element type twiddling, this should be OK, as
220 // the same type legalization should have applied to all the elements.
221 for (++i; i != e; ++i)
222 if (N->getOperand(i) != NotZero && !N->getOperand(i).isUndef())
223 return false;
224 return true;
225}
226
227bool ISD::isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly) {
228 // Look through a bit convert.
229 while (N->getOpcode() == ISD::BITCAST)
230 N = N->getOperand(0).getNode();
231
232 if (!BuildVectorOnly && N->getOpcode() == ISD::SPLAT_VECTOR) {
233 APInt SplatVal;
234 return isConstantSplatVector(N, SplatVal) && SplatVal.isZero();
235 }
236
237 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
238
239 bool IsAllUndef = true;
240 for (const SDValue &Op : N->op_values()) {
241 if (Op.isUndef())
242 continue;
243 IsAllUndef = false;
244 // Do not accept build_vectors that aren't all constants or which have non-0
245 // elements. We have to be a bit careful here, as the type of the constant
246 // may not be the same as the type of the vector elements due to type
247 // legalization (the elements are promoted to a legal type for the target
248 // and a vector of a type may be legal when the base element type is not).
249 // We only want to check enough bits to cover the vector elements, because
250 // we care if the resultant vector is all zeros, not whether the individual
251 // constants are.
252 if (auto OptAPInt = Op->bitcastToAPInt()) {
253 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
254 if (OptAPInt->countr_zero() < EltSize)
255 return false;
256 } else
257 return false;
258 }
259
260 // Do not accept an all-undef vector.
261 if (IsAllUndef)
262 return false;
263 return true;
264}
265
267 return isConstantSplatVectorAllOnes(N, /*BuildVectorOnly*/ true);
268}
269
271 return isConstantSplatVectorAllZeros(N, /*BuildVectorOnly*/ true);
272}
273
275 if (N->getOpcode() != ISD::BUILD_VECTOR)
276 return false;
277
278 for (const SDValue &Op : N->op_values()) {
279 if (Op.isUndef())
280 continue;
282 return false;
283 }
284 return true;
285}
286
288 if (N->getOpcode() != ISD::BUILD_VECTOR)
289 return false;
290
291 for (const SDValue &Op : N->op_values()) {
292 if (Op.isUndef())
293 continue;
295 return false;
296 }
297 return true;
298}
299
300bool ISD::isVectorShrinkable(const SDNode *N, unsigned NewEltSize,
301 bool Signed) {
302 assert(N->getValueType(0).isVector() && "Expected a vector!");
303
304 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
305 if (EltSize <= NewEltSize)
306 return false;
307
308 if (N->getOpcode() == ISD::ZERO_EXTEND) {
309 return (N->getOperand(0).getValueType().getScalarSizeInBits() <=
310 NewEltSize) &&
311 !Signed;
312 }
313 if (N->getOpcode() == ISD::SIGN_EXTEND) {
314 return (N->getOperand(0).getValueType().getScalarSizeInBits() <=
315 NewEltSize) &&
316 Signed;
317 }
318 if (N->getOpcode() != ISD::BUILD_VECTOR)
319 return false;
320
321 for (const SDValue &Op : N->op_values()) {
322 if (Op.isUndef())
323 continue;
325 return false;
326
327 APInt C = Op->getAsAPIntVal().trunc(EltSize);
328 if (Signed && C.trunc(NewEltSize).sext(EltSize) != C)
329 return false;
330 if (!Signed && C.trunc(NewEltSize).zext(EltSize) != C)
331 return false;
332 }
333
334 return true;
335}
336
338 // Return false if the node has no operands.
339 // This is "logically inconsistent" with the definition of "all" but
340 // is probably the desired behavior.
341 if (N->getNumOperands() == 0)
342 return false;
343 return all_of(N->op_values(), [](SDValue Op) { return Op.isUndef(); });
344}
345
347 return N->getOpcode() == ISD::FREEZE && N->getOperand(0).isUndef();
348}
349
350template <typename ConstNodeType>
352 std::function<bool(ConstNodeType *)> Match,
353 bool AllowUndefs, bool AllowTruncation) {
354 // FIXME: Add support for scalar UNDEF cases?
355 if (auto *C = dyn_cast<ConstNodeType>(Op))
356 return Match(C);
357
358 // FIXME: Add support for vector UNDEF cases?
359 if (ISD::BUILD_VECTOR != Op.getOpcode() &&
360 ISD::SPLAT_VECTOR != Op.getOpcode())
361 return false;
362
363 EVT SVT = Op.getValueType().getScalarType();
364 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
365 if (AllowUndefs && Op.getOperand(i).isUndef()) {
366 if (!Match(nullptr))
367 return false;
368 continue;
369 }
370
371 auto *Cst = dyn_cast<ConstNodeType>(Op.getOperand(i));
372 if (!Cst || (!AllowTruncation && Cst->getValueType(0) != SVT) ||
373 !Match(Cst))
374 return false;
375 }
376 return true;
377}
378// Build used template types.
380 SDValue, std::function<bool(ConstantSDNode *)>, bool, bool);
382 SDValue, std::function<bool(ConstantFPSDNode *)>, bool, bool);
383
385 SDValue LHS, SDValue RHS,
386 std::function<bool(ConstantSDNode *, ConstantSDNode *)> Match,
387 bool AllowUndefs, bool AllowTypeMismatch) {
388 if (!AllowTypeMismatch && LHS.getValueType() != RHS.getValueType())
389 return false;
390
391 // TODO: Add support for scalar UNDEF cases?
392 if (auto *LHSCst = dyn_cast<ConstantSDNode>(LHS))
393 if (auto *RHSCst = dyn_cast<ConstantSDNode>(RHS))
394 return Match(LHSCst, RHSCst);
395
396 // TODO: Add support for vector UNDEF cases?
397 if (LHS.getOpcode() != RHS.getOpcode() ||
398 (LHS.getOpcode() != ISD::BUILD_VECTOR &&
399 LHS.getOpcode() != ISD::SPLAT_VECTOR))
400 return false;
401
402 EVT SVT = LHS.getValueType().getScalarType();
403 for (unsigned i = 0, e = LHS.getNumOperands(); i != e; ++i) {
404 SDValue LHSOp = LHS.getOperand(i);
405 SDValue RHSOp = RHS.getOperand(i);
406 bool LHSUndef = AllowUndefs && LHSOp.isUndef();
407 bool RHSUndef = AllowUndefs && RHSOp.isUndef();
408 auto *LHSCst = dyn_cast<ConstantSDNode>(LHSOp);
409 auto *RHSCst = dyn_cast<ConstantSDNode>(RHSOp);
410 if ((!LHSCst && !LHSUndef) || (!RHSCst && !RHSUndef))
411 return false;
412 if (!AllowTypeMismatch && (LHSOp.getValueType() != SVT ||
413 LHSOp.getValueType() != RHSOp.getValueType()))
414 return false;
415 if (!Match(LHSCst, RHSCst))
416 return false;
417 }
418 return true;
419}
420
422 switch (MinMaxOpc) {
423 default:
424 llvm_unreachable("unrecognized opcode");
425 case ISD::UMIN:
426 return ISD::UMAX;
427 case ISD::UMAX:
428 return ISD::UMIN;
429 case ISD::SMIN:
430 return ISD::SMAX;
431 case ISD::SMAX:
432 return ISD::SMIN;
433 }
434}
435
437 switch (MinMaxOpc) {
438 default:
439 llvm_unreachable("unrecognized min/max opcode");
440 case ISD::SMIN:
441 return ISD::UMIN;
442 case ISD::SMAX:
443 return ISD::UMAX;
444 case ISD::UMIN:
445 return ISD::SMIN;
446 case ISD::UMAX:
447 return ISD::SMAX;
448 }
449}
450
452 switch (VecReduceOpcode) {
453 default:
454 llvm_unreachable("Expected VECREDUCE opcode");
457 case ISD::VP_REDUCE_FADD:
458 case ISD::VP_REDUCE_SEQ_FADD:
459 return ISD::FADD;
462 case ISD::VP_REDUCE_FMUL:
463 case ISD::VP_REDUCE_SEQ_FMUL:
464 return ISD::FMUL;
466 case ISD::VP_REDUCE_ADD:
467 return ISD::ADD;
469 case ISD::VP_REDUCE_MUL:
470 return ISD::MUL;
472 case ISD::VP_REDUCE_AND:
473 return ISD::AND;
475 case ISD::VP_REDUCE_OR:
476 return ISD::OR;
478 case ISD::VP_REDUCE_XOR:
479 return ISD::XOR;
481 case ISD::VP_REDUCE_SMAX:
482 return ISD::SMAX;
484 case ISD::VP_REDUCE_SMIN:
485 return ISD::SMIN;
487 case ISD::VP_REDUCE_UMAX:
488 return ISD::UMAX;
490 case ISD::VP_REDUCE_UMIN:
491 return ISD::UMIN;
493 case ISD::VP_REDUCE_FMAX:
494 return ISD::FMAXNUM;
496 case ISD::VP_REDUCE_FMIN:
497 return ISD::FMINNUM;
499 case ISD::VP_REDUCE_FMAXIMUM:
500 return ISD::FMAXIMUM;
502 case ISD::VP_REDUCE_FMINIMUM:
503 return ISD::FMINIMUM;
504 }
505}
506
507bool ISD::isVPOpcode(unsigned Opcode) {
508 switch (Opcode) {
509 default:
510 return false;
511#define BEGIN_REGISTER_VP_SDNODE(VPSD, ...) \
512 case ISD::VPSD: \
513 return true;
514#include "llvm/IR/VPIntrinsics.def"
515 }
516}
517
518bool ISD::isVPBinaryOp(unsigned Opcode) {
519 switch (Opcode) {
520 default:
521 break;
522#define BEGIN_REGISTER_VP_SDNODE(VPSD, ...) case ISD::VPSD:
523#define VP_PROPERTY_BINARYOP return true;
524#define END_REGISTER_VP_SDNODE(VPSD) break;
525#include "llvm/IR/VPIntrinsics.def"
526 }
527 return false;
528}
529
530bool ISD::isVPReduction(unsigned Opcode) {
531 switch (Opcode) {
532 default:
533 return false;
534 case ISD::VP_REDUCE_ADD:
535 case ISD::VP_REDUCE_MUL:
536 case ISD::VP_REDUCE_AND:
537 case ISD::VP_REDUCE_OR:
538 case ISD::VP_REDUCE_XOR:
539 case ISD::VP_REDUCE_SMAX:
540 case ISD::VP_REDUCE_SMIN:
541 case ISD::VP_REDUCE_UMAX:
542 case ISD::VP_REDUCE_UMIN:
543 case ISD::VP_REDUCE_FMAX:
544 case ISD::VP_REDUCE_FMIN:
545 case ISD::VP_REDUCE_FMAXIMUM:
546 case ISD::VP_REDUCE_FMINIMUM:
547 case ISD::VP_REDUCE_FADD:
548 case ISD::VP_REDUCE_FMUL:
549 case ISD::VP_REDUCE_SEQ_FADD:
550 case ISD::VP_REDUCE_SEQ_FMUL:
551 return true;
552 }
553}
554
555/// The operand position of the vector mask.
556std::optional<unsigned> ISD::getVPMaskIdx(unsigned Opcode) {
557 switch (Opcode) {
558 default:
559 return std::nullopt;
560#define BEGIN_REGISTER_VP_SDNODE(VPSD, LEGALPOS, TDNAME, MASKPOS, ...) \
561 case ISD::VPSD: \
562 return MASKPOS;
563#include "llvm/IR/VPIntrinsics.def"
564 }
565}
566
567/// The operand position of the explicit vector length parameter.
568std::optional<unsigned> ISD::getVPExplicitVectorLengthIdx(unsigned Opcode) {
569 switch (Opcode) {
570 default:
571 return std::nullopt;
572#define BEGIN_REGISTER_VP_SDNODE(VPSD, LEGALPOS, TDNAME, MASKPOS, EVLPOS) \
573 case ISD::VPSD: \
574 return EVLPOS;
575#include "llvm/IR/VPIntrinsics.def"
576 }
577}
578
579std::optional<unsigned> ISD::getBaseOpcodeForVP(unsigned VPOpcode,
580 bool hasFPExcept) {
581 // FIXME: Return strict opcodes in case of fp exceptions.
582 switch (VPOpcode) {
583 default:
584 return std::nullopt;
585#define BEGIN_REGISTER_VP_SDNODE(VPOPC, ...) case ISD::VPOPC:
586#define VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) return ISD::SDOPC;
587#define END_REGISTER_VP_SDNODE(VPOPC) break;
588#include "llvm/IR/VPIntrinsics.def"
589 }
590 return std::nullopt;
591}
592
593std::optional<unsigned> ISD::getVPForBaseOpcode(unsigned Opcode) {
594 switch (Opcode) {
595 default:
596 return std::nullopt;
597#define BEGIN_REGISTER_VP_SDNODE(VPOPC, ...) break;
598#define VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) case ISD::SDOPC:
599#define END_REGISTER_VP_SDNODE(VPOPC) return ISD::VPOPC;
600#include "llvm/IR/VPIntrinsics.def"
601 }
602}
603
605 switch (ExtType) {
606 case ISD::EXTLOAD:
607 return IsFP ? ISD::FP_EXTEND : ISD::ANY_EXTEND;
608 case ISD::SEXTLOAD:
609 return ISD::SIGN_EXTEND;
610 case ISD::ZEXTLOAD:
611 return ISD::ZERO_EXTEND;
612 default:
613 break;
614 }
615
616 llvm_unreachable("Invalid LoadExtType");
617}
618
620 // To perform this operation, we just need to swap the L and G bits of the
621 // operation.
622 unsigned OldL = (Operation >> 2) & 1;
623 unsigned OldG = (Operation >> 1) & 1;
624 return ISD::CondCode((Operation & ~6) | // Keep the N, U, E bits
625 (OldL << 1) | // New G bit
626 (OldG << 2)); // New L bit.
627}
628
630 unsigned Operation = Op;
631 if (isIntegerLike)
632 Operation ^= 7; // Flip L, G, E bits, but not U.
633 else
634 Operation ^= 15; // Flip all of the condition bits.
635
637 Operation &= ~8; // Don't let N and U bits get set.
638
639 return ISD::CondCode(Operation);
640}
641
645
647 bool isIntegerLike) {
648 return getSetCCInverseImpl(Op, isIntegerLike);
649}
650
651/// For an integer comparison, return 1 if the comparison is a signed operation
652/// and 2 if the result is an unsigned comparison. Return zero if the operation
653/// does not depend on the sign of the input (setne and seteq).
654static int isSignedOp(ISD::CondCode Opcode) {
655 switch (Opcode) {
656 default: llvm_unreachable("Illegal integer setcc operation!");
657 case ISD::SETEQ:
658 case ISD::SETNE: return 0;
659 case ISD::SETLT:
660 case ISD::SETLE:
661 case ISD::SETGT:
662 case ISD::SETGE: return 1;
663 case ISD::SETULT:
664 case ISD::SETULE:
665 case ISD::SETUGT:
666 case ISD::SETUGE: return 2;
667 }
668}
669
671 EVT Type) {
672 bool IsInteger = Type.isInteger();
673 if (IsInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
674 // Cannot fold a signed integer setcc with an unsigned integer setcc.
675 return ISD::SETCC_INVALID;
676
677 unsigned Op = Op1 | Op2; // Combine all of the condition bits.
678
679 // If the N and U bits get set, then the resultant comparison DOES suddenly
680 // care about orderedness, and it is true when ordered.
681 if (Op > ISD::SETTRUE2)
682 Op &= ~16; // Clear the U bit if the N bit is set.
683
684 // Canonicalize illegal integer setcc's.
685 if (IsInteger && Op == ISD::SETUNE) // e.g. SETUGT | SETULT
686 Op = ISD::SETNE;
687
688 return ISD::CondCode(Op);
689}
690
692 EVT Type) {
693 bool IsInteger = Type.isInteger();
694 if (IsInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
695 // Cannot fold a signed setcc with an unsigned setcc.
696 return ISD::SETCC_INVALID;
697
698 // Combine all of the condition bits.
699 ISD::CondCode Result = ISD::CondCode(Op1 & Op2);
700
701 // Canonicalize illegal integer setcc's.
702 if (IsInteger) {
703 switch (Result) {
704 default: break;
705 case ISD::SETUO : Result = ISD::SETFALSE; break; // SETUGT & SETULT
706 case ISD::SETOEQ: // SETEQ & SETU[LG]E
707 case ISD::SETUEQ: Result = ISD::SETEQ ; break; // SETUGE & SETULE
708 case ISD::SETOLT: Result = ISD::SETULT ; break; // SETULT & SETNE
709 case ISD::SETOGT: Result = ISD::SETUGT ; break; // SETUGT & SETNE
710 }
711 }
712
713 return Result;
714}
715
716//===----------------------------------------------------------------------===//
717// SDNode Profile Support
718//===----------------------------------------------------------------------===//
719
720/// AddNodeIDOpcode - Add the node opcode to the NodeID data.
721static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC) {
722 ID.AddInteger(OpC);
723}
724
725/// AddNodeIDValueTypes - Value type lists are intern'd so we can represent them
726/// solely with their pointer.
728 ID.AddPointer(VTList.VTs);
729}
730
731/// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
734 for (const auto &Op : Ops) {
735 ID.AddPointer(Op.getNode());
736 ID.AddInteger(Op.getResNo());
737 }
738}
739
740/// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
743 for (const auto &Op : Ops) {
744 ID.AddPointer(Op.getNode());
745 ID.AddInteger(Op.getResNo());
746 }
747}
748
749static void AddNodeIDNode(FoldingSetNodeID &ID, unsigned OpC,
750 SDVTList VTList, ArrayRef<SDValue> OpList) {
751 AddNodeIDOpcode(ID, OpC);
752 AddNodeIDValueTypes(ID, VTList);
753 AddNodeIDOperands(ID, OpList);
754}
755
756/// If this is an SDNode with special info, add this info to the NodeID data.
758 switch (N->getOpcode()) {
761 case ISD::MCSymbol:
762 llvm_unreachable("Should only be used on nodes with operands");
763 default: break; // Normal nodes don't need extra info.
765 case ISD::Constant: {
767 ID.AddPointer(C->getConstantIntValue());
768 ID.AddBoolean(C->isOpaque());
769 break;
770 }
772 case ISD::ConstantFP:
773 ID.AddPointer(cast<ConstantFPSDNode>(N)->getConstantFPValue());
774 break;
780 ID.AddPointer(GA->getGlobal());
781 ID.AddInteger(GA->getOffset());
782 ID.AddInteger(GA->getTargetFlags());
783 break;
784 }
785 case ISD::BasicBlock:
787 break;
788 case ISD::Register:
789 ID.AddInteger(cast<RegisterSDNode>(N)->getReg().id());
790 break;
792 ID.AddPointer(cast<RegisterMaskSDNode>(N)->getRegMask());
793 break;
794 case ISD::SRCVALUE:
795 ID.AddPointer(cast<SrcValueSDNode>(N)->getValue());
796 break;
797 case ISD::FrameIndex:
799 ID.AddInteger(cast<FrameIndexSDNode>(N)->getIndex());
800 break;
802 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getGuid());
803 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getIndex());
804 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getAttributes());
805 break;
806 case ISD::JumpTable:
808 ID.AddInteger(cast<JumpTableSDNode>(N)->getIndex());
809 ID.AddInteger(cast<JumpTableSDNode>(N)->getTargetFlags());
810 break;
814 ID.AddInteger(CP->getAlign().value());
815 ID.AddInteger(CP->getOffset());
818 else
819 ID.AddPointer(CP->getConstVal());
820 ID.AddInteger(CP->getTargetFlags());
821 break;
822 }
823 case ISD::TargetIndex: {
825 ID.AddInteger(TI->getIndex());
826 ID.AddInteger(TI->getOffset());
827 ID.AddInteger(TI->getTargetFlags());
828 break;
829 }
830 case ISD::LOAD: {
831 const LoadSDNode *LD = cast<LoadSDNode>(N);
832 ID.AddInteger(LD->getMemoryVT().getRawBits());
833 ID.AddInteger(LD->getRawSubclassData());
834 ID.AddInteger(LD->getPointerInfo().getAddrSpace());
835 ID.AddInteger(LD->getMemOperand()->getFlags());
836 break;
837 }
838 case ISD::STORE: {
839 const StoreSDNode *ST = cast<StoreSDNode>(N);
840 ID.AddInteger(ST->getMemoryVT().getRawBits());
841 ID.AddInteger(ST->getRawSubclassData());
842 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
843 ID.AddInteger(ST->getMemOperand()->getFlags());
844 break;
845 }
846 case ISD::VP_LOAD: {
847 const VPLoadSDNode *ELD = cast<VPLoadSDNode>(N);
848 ID.AddInteger(ELD->getMemoryVT().getRawBits());
849 ID.AddInteger(ELD->getRawSubclassData());
850 ID.AddInteger(ELD->getPointerInfo().getAddrSpace());
851 ID.AddInteger(ELD->getMemOperand()->getFlags());
852 break;
853 }
854 case ISD::VP_LOAD_FF: {
855 const auto *LD = cast<VPLoadFFSDNode>(N);
856 ID.AddInteger(LD->getMemoryVT().getRawBits());
857 ID.AddInteger(LD->getRawSubclassData());
858 ID.AddInteger(LD->getPointerInfo().getAddrSpace());
859 ID.AddInteger(LD->getMemOperand()->getFlags());
860 break;
861 }
862 case ISD::VP_STORE: {
863 const VPStoreSDNode *EST = cast<VPStoreSDNode>(N);
864 ID.AddInteger(EST->getMemoryVT().getRawBits());
865 ID.AddInteger(EST->getRawSubclassData());
866 ID.AddInteger(EST->getPointerInfo().getAddrSpace());
867 ID.AddInteger(EST->getMemOperand()->getFlags());
868 break;
869 }
870 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD: {
872 ID.AddInteger(SLD->getMemoryVT().getRawBits());
873 ID.AddInteger(SLD->getRawSubclassData());
874 ID.AddInteger(SLD->getPointerInfo().getAddrSpace());
875 break;
876 }
877 case ISD::EXPERIMENTAL_VP_STRIDED_STORE: {
879 ID.AddInteger(SST->getMemoryVT().getRawBits());
880 ID.AddInteger(SST->getRawSubclassData());
881 ID.AddInteger(SST->getPointerInfo().getAddrSpace());
882 break;
883 }
884 case ISD::VP_GATHER: {
886 ID.AddInteger(EG->getMemoryVT().getRawBits());
887 ID.AddInteger(EG->getRawSubclassData());
888 ID.AddInteger(EG->getPointerInfo().getAddrSpace());
889 ID.AddInteger(EG->getMemOperand()->getFlags());
890 break;
891 }
892 case ISD::VP_SCATTER: {
894 ID.AddInteger(ES->getMemoryVT().getRawBits());
895 ID.AddInteger(ES->getRawSubclassData());
896 ID.AddInteger(ES->getPointerInfo().getAddrSpace());
897 ID.AddInteger(ES->getMemOperand()->getFlags());
898 break;
899 }
900 case ISD::MLOAD: {
902 ID.AddInteger(MLD->getMemoryVT().getRawBits());
903 ID.AddInteger(MLD->getRawSubclassData());
904 ID.AddInteger(MLD->getPointerInfo().getAddrSpace());
905 ID.AddInteger(MLD->getMemOperand()->getFlags());
906 break;
907 }
908 case ISD::MSTORE: {
910 ID.AddInteger(MST->getMemoryVT().getRawBits());
911 ID.AddInteger(MST->getRawSubclassData());
912 ID.AddInteger(MST->getPointerInfo().getAddrSpace());
913 ID.AddInteger(MST->getMemOperand()->getFlags());
914 break;
915 }
916 case ISD::MGATHER: {
918 ID.AddInteger(MG->getMemoryVT().getRawBits());
919 ID.AddInteger(MG->getRawSubclassData());
920 ID.AddInteger(MG->getPointerInfo().getAddrSpace());
921 ID.AddInteger(MG->getMemOperand()->getFlags());
922 break;
923 }
924 case ISD::MSCATTER: {
926 ID.AddInteger(MS->getMemoryVT().getRawBits());
927 ID.AddInteger(MS->getRawSubclassData());
928 ID.AddInteger(MS->getPointerInfo().getAddrSpace());
929 ID.AddInteger(MS->getMemOperand()->getFlags());
930 break;
931 }
934 case ISD::ATOMIC_SWAP:
946 case ISD::ATOMIC_LOAD:
947 case ISD::ATOMIC_STORE: {
948 const AtomicSDNode *AT = cast<AtomicSDNode>(N);
949 ID.AddInteger(AT->getMemoryVT().getRawBits());
950 ID.AddInteger(AT->getRawSubclassData());
951 ID.AddInteger(AT->getPointerInfo().getAddrSpace());
952 ID.AddInteger(AT->getMemOperand()->getFlags());
953 break;
954 }
955 case ISD::VECTOR_SHUFFLE: {
956 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(N)->getMask();
957 for (int M : Mask)
958 ID.AddInteger(M);
959 break;
960 }
961 case ISD::ADDRSPACECAST: {
963 ID.AddInteger(ASC->getSrcAddressSpace());
964 ID.AddInteger(ASC->getDestAddressSpace());
965 break;
966 }
968 case ISD::BlockAddress: {
970 ID.AddPointer(BA->getBlockAddress());
971 ID.AddInteger(BA->getOffset());
972 ID.AddInteger(BA->getTargetFlags());
973 break;
974 }
975 case ISD::AssertAlign:
976 ID.AddInteger(cast<AssertAlignSDNode>(N)->getAlign().value());
977 break;
978 case ISD::PREFETCH:
981 // Handled by MemIntrinsicSDNode check after the switch.
982 break;
984 ID.AddPointer(cast<MDNodeSDNode>(N)->getMD());
985 break;
986 } // end switch (N->getOpcode())
987
988 // MemIntrinsic nodes could also have subclass data, address spaces, and flags
989 // to check.
990 if (auto *MN = dyn_cast<MemIntrinsicSDNode>(N)) {
991 ID.AddInteger(MN->getRawSubclassData());
992 ID.AddInteger(MN->getMemoryVT().getRawBits());
993 for (const MachineMemOperand *MMO : MN->memoperands()) {
994 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
995 ID.AddInteger(MMO->getFlags());
996 }
997 }
998}
999
1000/// AddNodeIDNode - Generic routine for adding a nodes info to the NodeID
1001/// data.
1003 AddNodeIDOpcode(ID, N->getOpcode());
1004 // Add the return value info.
1005 AddNodeIDValueTypes(ID, N->getVTList());
1006 // Add the operand info.
1007 AddNodeIDOperands(ID, N->ops());
1008
1009 // Handle SDNode leafs with special info.
1011}
1012
1013//===----------------------------------------------------------------------===//
1014// SelectionDAG Class
1015//===----------------------------------------------------------------------===//
1016
1017/// doNotCSE - Return true if CSE should not be performed for this node.
1018static bool doNotCSE(SDNode *N) {
1019 if (N->getValueType(0) == MVT::Glue)
1020 return true; // Never CSE anything that produces a glue result.
1021
1022 switch (N->getOpcode()) {
1023 default: break;
1024 case ISD::HANDLENODE:
1025 case ISD::EH_LABEL:
1026 return true; // Never CSE these nodes.
1027 }
1028
1029 // Check that remaining values produced are not flags.
1030 for (unsigned i = 1, e = N->getNumValues(); i != e; ++i)
1031 if (N->getValueType(i) == MVT::Glue)
1032 return true; // Never CSE anything that produces a glue result.
1033
1034 return false;
1035}
1036
1037/// RemoveDeadNodes - This method deletes all unreachable nodes in the
1038/// SelectionDAG.
1040 // Create a dummy node (which is not added to allnodes), that adds a reference
1041 // to the root node, preventing it from being deleted.
1042 HandleSDNode Dummy(getRoot());
1043
1044 SmallVector<SDNode*, 128> DeadNodes;
1045
1046 // Add all obviously-dead nodes to the DeadNodes worklist.
1047 for (SDNode &Node : allnodes())
1048 if (Node.use_empty())
1049 DeadNodes.push_back(&Node);
1050
1051 RemoveDeadNodes(DeadNodes);
1052
1053 // If the root changed (e.g. it was a dead load, update the root).
1054 setRoot(Dummy.getValue());
1055}
1056
1057/// RemoveDeadNodes - This method deletes the unreachable nodes in the
1058/// given list, and any nodes that become unreachable as a result.
1060
1061 // Process the worklist, deleting the nodes and adding their uses to the
1062 // worklist.
1063 while (!DeadNodes.empty()) {
1064 SDNode *N = DeadNodes.pop_back_val();
1065 // Skip to next node if we've already managed to delete the node. This could
1066 // happen if replacing a node causes a node previously added to the node to
1067 // be deleted.
1068 if (N->getOpcode() == ISD::DELETED_NODE)
1069 continue;
1070
1071 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1072 DUL->NodeDeleted(N, nullptr);
1073
1074 // Take the node out of the appropriate CSE map.
1075 RemoveNodeFromCSEMaps(N);
1076
1077 // Next, brutally remove the operand list. This is safe to do, as there are
1078 // no cycles in the graph.
1079 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
1080 SDUse &Use = *I++;
1081 SDNode *Operand = Use.getNode();
1082 Use.set(SDValue());
1083
1084 // Now that we removed this operand, see if there are no uses of it left.
1085 if (Operand->use_empty())
1086 DeadNodes.push_back(Operand);
1087 }
1088
1089 DeallocateNode(N);
1090 }
1091}
1092
1094 SmallVector<SDNode*, 16> DeadNodes(1, N);
1095
1096 // Create a dummy node that adds a reference to the root node, preventing
1097 // it from being deleted. (This matters if the root is an operand of the
1098 // dead node.)
1099 HandleSDNode Dummy(getRoot());
1100
1101 RemoveDeadNodes(DeadNodes);
1102}
1103
1105 // First take this out of the appropriate CSE map.
1106 RemoveNodeFromCSEMaps(N);
1107
1108 // Finally, remove uses due to operands of this node, remove from the
1109 // AllNodes list, and delete the node.
1110 DeleteNodeNotInCSEMaps(N);
1111}
1112
1113void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *N) {
1114 assert(N->getIterator() != AllNodes.begin() &&
1115 "Cannot delete the entry node!");
1116 assert(N->use_empty() && "Cannot delete a node that is not dead!");
1117
1118 // Drop all of the operands and decrement used node's use counts.
1119 N->DropOperands();
1120
1121 DeallocateNode(N);
1122}
1123
1124void SDDbgInfo::add(SDDbgValue *V, bool isParameter) {
1125 assert(!(V->isVariadic() && isParameter));
1126 if (isParameter)
1127 ByvalParmDbgValues.push_back(V);
1128 else
1129 DbgValues.push_back(V);
1130 for (const SDNode *Node : V->getSDNodes())
1131 if (Node)
1132 DbgValMap[Node].push_back(V);
1133}
1134
1136 DbgValMapType::iterator I = DbgValMap.find(Node);
1137 if (I == DbgValMap.end())
1138 return;
1139 for (auto &Val: I->second)
1140 Val->setIsInvalidated();
1141 DbgValMap.erase(I);
1142}
1143
1144void SelectionDAG::DeallocateNode(SDNode *N) {
1145 // If we have operands, deallocate them.
1147
1148 NodeAllocator.Deallocate(AllNodes.remove(N));
1149
1150 // Set the opcode to DELETED_NODE to help catch bugs when node
1151 // memory is reallocated.
1152 // FIXME: There are places in SDag that have grown a dependency on the opcode
1153 // value in the released node.
1154 __asan_unpoison_memory_region(&N->NodeType, sizeof(N->NodeType));
1155 N->NodeType = ISD::DELETED_NODE;
1156
1157 // If any of the SDDbgValue nodes refer to this SDNode, invalidate
1158 // them and forget about that node.
1159 DbgInfo->erase(N);
1160
1161 // Invalidate extra info.
1162 SDEI.erase(N);
1163}
1164
1165#ifndef NDEBUG
1166/// VerifySDNode - Check the given SDNode. Aborts if it is invalid.
1167void SelectionDAG::verifyNode(SDNode *N) const {
1168 switch (N->getOpcode()) {
1169 default:
1170 if (N->isTargetOpcode())
1172 break;
1173 case ISD::BUILD_PAIR: {
1174 EVT VT = N->getValueType(0);
1175 assert(N->getNumValues() == 1 && "Too many results!");
1176 assert(!VT.isVector() && (VT.isInteger() || VT.isFloatingPoint()) &&
1177 "Wrong return type!");
1178 assert(N->getNumOperands() == 2 && "Wrong number of operands!");
1179 assert(N->getOperand(0).getValueType() == N->getOperand(1).getValueType() &&
1180 "Mismatched operand types!");
1181 assert(N->getOperand(0).getValueType().isInteger() == VT.isInteger() &&
1182 "Wrong operand type!");
1183 assert(VT.getSizeInBits() == 2 * N->getOperand(0).getValueSizeInBits() &&
1184 "Wrong return type size");
1185 break;
1186 }
1187 case ISD::BUILD_VECTOR: {
1188 assert(N->getNumValues() == 1 && "Too many results!");
1189 assert(N->getValueType(0).isVector() && "Wrong return type!");
1190 assert(N->getNumOperands() == N->getValueType(0).getVectorNumElements() &&
1191 "Wrong number of operands!");
1192 EVT EltVT = N->getValueType(0).getVectorElementType();
1193 for (const SDUse &Op : N->ops()) {
1194 assert((Op.getValueType() == EltVT ||
1195 (EltVT.isInteger() && Op.getValueType().isInteger() &&
1196 EltVT.bitsLE(Op.getValueType()))) &&
1197 "Wrong operand type!");
1198 assert(Op.getValueType() == N->getOperand(0).getValueType() &&
1199 "Operands must all have the same type");
1200 }
1201 break;
1202 }
1203 case ISD::SADDO:
1204 case ISD::UADDO:
1205 case ISD::SSUBO:
1206 case ISD::USUBO:
1207 assert(N->getNumValues() == 2 && "Wrong number of results!");
1208 assert(N->getVTList().NumVTs == 2 && N->getNumOperands() == 2 &&
1209 "Invalid add/sub overflow op!");
1210 assert(N->getVTList().VTs[0].isInteger() &&
1211 N->getVTList().VTs[1].isInteger() &&
1212 N->getOperand(0).getValueType() == N->getOperand(1).getValueType() &&
1213 N->getOperand(0).getValueType() == N->getVTList().VTs[0] &&
1214 "Binary operator types must match!");
1215 break;
1216 }
1217}
1218#endif // NDEBUG
1219
1220/// Insert a newly allocated node into the DAG.
1221///
1222/// Handles insertion into the all nodes list and CSE map, as well as
1223/// verification and other common operations when a new node is allocated.
1224void SelectionDAG::InsertNode(SDNode *N) {
1225 AllNodes.push_back(N);
1226#ifndef NDEBUG
1227 N->PersistentId = NextPersistentId++;
1228 verifyNode(N);
1229#endif
1230 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1231 DUL->NodeInserted(N);
1232}
1233
1234/// RemoveNodeFromCSEMaps - Take the specified node out of the CSE map that
1235/// correspond to it. This is useful when we're about to delete or repurpose
1236/// the node. We don't want future request for structurally identical nodes
1237/// to return N anymore.
1238bool SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
1239 bool Erased = false;
1240 switch (N->getOpcode()) {
1241 case ISD::HANDLENODE: return false; // noop.
1242 case ISD::CONDCODE:
1243 assert(CondCodeNodes[cast<CondCodeSDNode>(N)->get()] &&
1244 "Cond code doesn't exist!");
1245 Erased = CondCodeNodes[cast<CondCodeSDNode>(N)->get()] != nullptr;
1246 CondCodeNodes[cast<CondCodeSDNode>(N)->get()] = nullptr;
1247 break;
1249 Erased = ExternalSymbols.erase(cast<ExternalSymbolSDNode>(N)->getSymbol());
1250 break;
1252 ExternalSymbolSDNode *ESN = cast<ExternalSymbolSDNode>(N);
1253 Erased = TargetExternalSymbols.erase(std::pair<std::string, unsigned>(
1254 ESN->getSymbol(), ESN->getTargetFlags()));
1255 break;
1256 }
1257 case ISD::MCSymbol: {
1258 auto *MCSN = cast<MCSymbolSDNode>(N);
1259 Erased = MCSymbols.erase(MCSN->getMCSymbol());
1260 break;
1261 }
1262 case ISD::VALUETYPE: {
1263 EVT VT = cast<VTSDNode>(N)->getVT();
1264 if (VT.isExtended()) {
1265 Erased = ExtendedValueTypeNodes.erase(VT);
1266 } else {
1267 Erased = ValueTypeNodes[VT.getSimpleVT().SimpleTy] != nullptr;
1268 ValueTypeNodes[VT.getSimpleVT().SimpleTy] = nullptr;
1269 }
1270 break;
1271 }
1272 default:
1273 // Remove it from the CSE Map.
1274 assert(N->getOpcode() != ISD::DELETED_NODE && "DELETED_NODE in CSEMap!");
1275 assert(N->getOpcode() != ISD::EntryToken && "EntryToken in CSEMap!");
1276 Erased = CSEMap.RemoveNode(N);
1277 break;
1278 }
1279#ifndef NDEBUG
1280 // Verify that the node was actually in one of the CSE maps, unless it has a
1281 // glue result (which cannot be CSE'd) or is one of the special cases that are
1282 // not subject to CSE.
1283 if (!Erased && N->getValueType(N->getNumValues()-1) != MVT::Glue &&
1284 !N->isMachineOpcode() && !doNotCSE(N)) {
1285 N->dump(this);
1286 dbgs() << "\n";
1287 llvm_unreachable("Node is not in map!");
1288 }
1289#endif
1290 return Erased;
1291}
1292
1293/// AddModifiedNodeToCSEMaps - The specified node has been removed from the CSE
1294/// maps and modified in place. Add it back to the CSE maps, unless an identical
1295/// node already exists, in which case transfer all its users to the existing
1296/// node. This transfer can potentially trigger recursive merging.
1297void
1298SelectionDAG::AddModifiedNodeToCSEMaps(SDNode *N) {
1299 // For node types that aren't CSE'd, just act as if no identical node
1300 // already exists.
1301 if (!doNotCSE(N)) {
1302 SDNode *Existing = CSEMap.GetOrInsertNode(N);
1303 if (Existing != N) {
1304 // If there was already an existing matching node, use ReplaceAllUsesWith
1305 // to replace the dead one with the existing one. This can cause
1306 // recursive merging of other unrelated nodes down the line.
1307 Existing->intersectFlagsWith(N->getFlags());
1308 if (auto *MemNode = dyn_cast<MemSDNode>(Existing))
1309 MemNode->refineRanges(cast<MemSDNode>(N)->memoperands());
1310 ReplaceAllUsesWith(N, Existing);
1311
1312 // N is now dead. Inform the listeners and delete it.
1313 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1314 DUL->NodeDeleted(N, Existing);
1315 DeleteNodeNotInCSEMaps(N);
1316 return;
1317 }
1318 }
1319
1320 // If the node doesn't already exist, we updated it. Inform listeners.
1321 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1322 DUL->NodeUpdated(N);
1323}
1324
1325/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1326/// were replaced with those specified. If this node is never memoized,
1327/// return null, otherwise return a pointer to the slot it would take. If a
1328/// node already exists with these operands, the slot will be non-null.
1329SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, SDValue Op,
1330 void *&InsertPos) {
1331 if (doNotCSE(N))
1332 return nullptr;
1333
1334 SDValue Ops[] = { Op };
1335 FoldingSetNodeID ID;
1336 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1338 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1339 if (Node)
1340 Node->intersectFlagsWith(N->getFlags());
1341 return Node;
1342}
1343
1344/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1345/// were replaced with those specified. If this node is never memoized,
1346/// return null, otherwise return a pointer to the slot it would take. If a
1347/// node already exists with these operands, the slot will be non-null.
1348SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N,
1349 SDValue Op1, SDValue Op2,
1350 void *&InsertPos) {
1351 if (doNotCSE(N))
1352 return nullptr;
1353
1354 SDValue Ops[] = { Op1, Op2 };
1355 FoldingSetNodeID ID;
1356 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1358 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1359 if (Node)
1360 Node->intersectFlagsWith(N->getFlags());
1361 return Node;
1362}
1363
1364/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1365/// were replaced with those specified. If this node is never memoized,
1366/// return null, otherwise return a pointer to the slot it would take. If a
1367/// node already exists with these operands, the slot will be non-null.
1368SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, ArrayRef<SDValue> Ops,
1369 void *&InsertPos) {
1370 if (doNotCSE(N))
1371 return nullptr;
1372
1373 FoldingSetNodeID ID;
1374 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1376 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1377 if (Node)
1378 Node->intersectFlagsWith(N->getFlags());
1379 return Node;
1380}
1381
1383 Type *Ty = VT == MVT::iPTR ? PointerType::get(*getContext(), 0)
1384 : VT.getTypeForEVT(*getContext());
1385
1386 return getDataLayout().getABITypeAlign(Ty);
1387}
1388
1389// EntryNode could meaningfully have debug info if we can find it...
1391 : TM(tm), OptLevel(OL), EntryNode(ISD::EntryToken, 0, DebugLoc(),
1392 getVTList(MVT::Other, MVT::Glue)),
1393 Root(getEntryNode()) {
1394 InsertNode(&EntryNode);
1395 DbgInfo = new SDDbgInfo();
1396}
1397
1399 OptimizationRemarkEmitter &NewORE, Pass *PassPtr,
1400 const TargetLibraryInfo *LibraryInfo,
1401 const LibcallLoweringInfo *LibcallsInfo,
1402 UniformityInfo *NewUA, ProfileSummaryInfo *PSIin,
1404 FunctionVarLocs const *VarLocs) {
1405 MF = &NewMF;
1406 SDAGISelPass = PassPtr;
1407 ORE = &NewORE;
1410 LibInfo = LibraryInfo;
1411 Libcalls = LibcallsInfo;
1412 Context = &MF->getFunction().getContext();
1413 UA = NewUA;
1414 PSI = PSIin;
1415 BFI = BFIin;
1416 MMI = &MMIin;
1417 FnVarLocs = VarLocs;
1418}
1419
1421 assert(!UpdateListeners && "Dangling registered DAGUpdateListeners");
1422 allnodes_clear();
1423 OperandRecycler.clear(OperandAllocator);
1424 delete DbgInfo;
1425}
1426
1428 return llvm::shouldOptimizeForSize(FLI->MBB->getBasicBlock(), PSI, BFI);
1429}
1430
1431void SelectionDAG::allnodes_clear() {
1432 assert(&*AllNodes.begin() == &EntryNode);
1433 AllNodes.remove(AllNodes.begin());
1434 while (!AllNodes.empty())
1435 DeallocateNode(&AllNodes.front());
1436#ifndef NDEBUG
1437 NextPersistentId = 0;
1438#endif
1439}
1440
1441SDNode *SelectionDAG::FindNodeOrInsertPos(const FoldingSetNodeID &ID,
1442 void *&InsertPos) {
1443 SDNode *N = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
1444 if (N) {
1445 switch (N->getOpcode()) {
1446 default: break;
1447 case ISD::Constant:
1448 case ISD::ConstantFP:
1449 llvm_unreachable("Querying for Constant and ConstantFP nodes requires "
1450 "debug location. Use another overload.");
1451 }
1452 }
1453 return N;
1454}
1455
1456SDNode *SelectionDAG::FindNodeOrInsertPos(const FoldingSetNodeID &ID,
1457 const SDLoc &DL, void *&InsertPos) {
1458 SDNode *N = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
1459 if (N) {
1460 switch (N->getOpcode()) {
1461 case ISD::Constant:
1462 case ISD::ConstantFP:
1463 // Erase debug location from the node if the node is used at several
1464 // different places. Do not propagate one location to all uses as it
1465 // will cause a worse single stepping debugging experience.
1466 if (N->getDebugLoc() != DL.getDebugLoc())
1467 N->setDebugLoc(DebugLoc());
1468 break;
1469 default:
1470 // When the node's point of use is located earlier in the instruction
1471 // sequence than its prior point of use, update its debug info to the
1472 // earlier location.
1473 if (DL.getIROrder() && DL.getIROrder() < N->getIROrder())
1474 N->setDebugLoc(DL.getDebugLoc());
1475 break;
1476 }
1477 }
1478 return N;
1479}
1480
1482 allnodes_clear();
1483 OperandRecycler.clear(OperandAllocator);
1484 OperandAllocator.Reset();
1485 CSEMap.clear();
1486
1487 ExtendedValueTypeNodes.clear();
1488 ExternalSymbols.clear();
1489 TargetExternalSymbols.clear();
1490 MCSymbols.clear();
1491 SDEI.clear();
1492 llvm::fill(CondCodeNodes, nullptr);
1493 llvm::fill(ValueTypeNodes, nullptr);
1494
1495 EntryNode.UseList = nullptr;
1496 InsertNode(&EntryNode);
1497 Root = getEntryNode();
1498 DbgInfo->clear();
1499}
1500
1502 return VT.bitsGT(Op.getValueType())
1503 ? getNode(ISD::FP_EXTEND, DL, VT, Op)
1504 : getNode(ISD::FP_ROUND, DL, VT, Op,
1505 getIntPtrConstant(0, DL, /*isTarget=*/true));
1506}
1507
1508std::pair<SDValue, SDValue>
1510 const SDLoc &DL, EVT VT) {
1511 assert(!VT.bitsEq(Op.getValueType()) &&
1512 "Strict no-op FP extend/round not allowed.");
1513 SDValue Res =
1514 VT.bitsGT(Op.getValueType())
1515 ? getNode(ISD::STRICT_FP_EXTEND, DL, {VT, MVT::Other}, {Chain, Op})
1516 : getNode(ISD::STRICT_FP_ROUND, DL, {VT, MVT::Other},
1517 {Chain, Op, getIntPtrConstant(0, DL, /*isTarget=*/true)});
1518
1519 return std::pair<SDValue, SDValue>(Res, SDValue(Res.getNode(), 1));
1520}
1521
1523 return VT.bitsGT(Op.getValueType()) ?
1524 getNode(ISD::ANY_EXTEND, DL, VT, Op) :
1525 getNode(ISD::TRUNCATE, DL, VT, Op);
1526}
1527
1529 return VT.bitsGT(Op.getValueType()) ?
1530 getNode(ISD::SIGN_EXTEND, DL, VT, Op) :
1531 getNode(ISD::TRUNCATE, DL, VT, Op);
1532}
1533
1535 return VT.bitsGT(Op.getValueType()) ?
1536 getNode(ISD::ZERO_EXTEND, DL, VT, Op) :
1537 getNode(ISD::TRUNCATE, DL, VT, Op);
1538}
1539
1541 EVT VT) {
1542 assert(!VT.isVector());
1543 auto Type = Op.getValueType();
1544 SDValue DestOp;
1545 if (Type == VT)
1546 return Op;
1547 auto Size = Op.getValueSizeInBits();
1548 DestOp = getBitcast(EVT::getIntegerVT(*Context, Size), Op);
1549 if (DestOp.getValueType() == VT)
1550 return DestOp;
1551
1552 return getAnyExtOrTrunc(DestOp, DL, VT);
1553}
1554
1556 EVT VT) {
1557 assert(!VT.isVector());
1558 auto Type = Op.getValueType();
1559 SDValue DestOp;
1560 if (Type == VT)
1561 return Op;
1562 auto Size = Op.getValueSizeInBits();
1563 DestOp = getBitcast(MVT::getIntegerVT(Size), Op);
1564 if (DestOp.getValueType() == VT)
1565 return DestOp;
1566
1567 return getSExtOrTrunc(DestOp, DL, VT);
1568}
1569
1571 EVT VT) {
1572 assert(!VT.isVector());
1573 auto Type = Op.getValueType();
1574 SDValue DestOp;
1575 if (Type == VT)
1576 return Op;
1577 auto Size = Op.getValueSizeInBits();
1578 DestOp = getBitcast(MVT::getIntegerVT(Size), Op);
1579 if (DestOp.getValueType() == VT)
1580 return DestOp;
1581
1582 return getZExtOrTrunc(DestOp, DL, VT);
1583}
1584
1586 EVT OpVT) {
1587 if (VT.bitsLE(Op.getValueType()))
1588 return getNode(ISD::TRUNCATE, SL, VT, Op);
1589
1590 TargetLowering::BooleanContent BType = TLI->getBooleanContents(OpVT);
1591 return getNode(TLI->getExtendForContent(BType), SL, VT, Op);
1592}
1593
1595 EVT OpVT = Op.getValueType();
1596 assert(VT.isInteger() && OpVT.isInteger() &&
1597 "Cannot getZeroExtendInReg FP types");
1598 assert(VT.isVector() == OpVT.isVector() &&
1599 "getZeroExtendInReg type should be vector iff the operand "
1600 "type is vector!");
1601 assert((!VT.isVector() ||
1603 "Vector element counts must match in getZeroExtendInReg");
1604 assert(VT.getScalarType().bitsLE(OpVT.getScalarType()) && "Not extending!");
1605 if (OpVT == VT)
1606 return Op;
1607 // TODO: Use computeKnownBits instead of AssertZext.
1608 if (Op.getOpcode() == ISD::AssertZext && cast<VTSDNode>(Op.getOperand(1))
1609 ->getVT()
1610 .getScalarType()
1611 .bitsLE(VT.getScalarType()))
1612 return Op;
1614 VT.getScalarSizeInBits());
1615 return getNode(ISD::AND, DL, OpVT, Op, getConstant(Imm, DL, OpVT));
1616}
1617
1619 SDValue EVL, const SDLoc &DL,
1620 EVT VT) {
1621 EVT OpVT = Op.getValueType();
1622 assert(VT.isInteger() && OpVT.isInteger() &&
1623 "Cannot getVPZeroExtendInReg FP types");
1624 assert(VT.isVector() && OpVT.isVector() &&
1625 "getVPZeroExtendInReg type and operand type should be vector!");
1627 "Vector element counts must match in getZeroExtendInReg");
1628 assert(VT.getScalarType().bitsLE(OpVT.getScalarType()) && "Not extending!");
1629 if (OpVT == VT)
1630 return Op;
1632 VT.getScalarSizeInBits());
1633 return getNode(ISD::VP_AND, DL, OpVT, Op, getConstant(Imm, DL, OpVT), Mask,
1634 EVL);
1635}
1636
1638 // Only unsigned pointer semantics are supported right now. In the future this
1639 // might delegate to TLI to check pointer signedness.
1640 return getZExtOrTrunc(Op, DL, VT);
1641}
1642
1644 // Only unsigned pointer semantics are supported right now. In the future this
1645 // might delegate to TLI to check pointer signedness.
1646 return getZeroExtendInReg(Op, DL, VT);
1647}
1648
1650 return getNode(ISD::SUB, DL, VT, getConstant(0, DL, VT), Val);
1651}
1652
1653/// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
1655 return getNode(ISD::XOR, DL, VT, Val, getAllOnesConstant(DL, VT));
1656}
1657
1659 SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
1660 return getNode(ISD::XOR, DL, VT, Val, TrueValue);
1661}
1662
1664 SDValue Mask, SDValue EVL, EVT VT) {
1665 SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
1666 return getNode(ISD::VP_XOR, DL, VT, Val, TrueValue, Mask, EVL);
1667}
1668
1670 SDValue Mask, SDValue EVL) {
1671 return getVPZExtOrTrunc(DL, VT, Op, Mask, EVL);
1672}
1673
1675 SDValue Mask, SDValue EVL) {
1676 if (VT.bitsGT(Op.getValueType()))
1677 return getNode(ISD::VP_ZERO_EXTEND, DL, VT, Op, Mask, EVL);
1678 if (VT.bitsLT(Op.getValueType()))
1679 return getNode(ISD::VP_TRUNCATE, DL, VT, Op, Mask, EVL);
1680 return Op;
1681}
1682
1684 EVT OpVT) {
1685 if (!V)
1686 return getConstant(0, DL, VT);
1687
1688 switch (TLI->getBooleanContents(OpVT)) {
1691 return getConstant(1, DL, VT);
1693 return getAllOnesConstant(DL, VT);
1694 }
1695 llvm_unreachable("Unexpected boolean content enum!");
1696}
1697
1699 bool isT, bool isO) {
1700 return getConstant(APInt(VT.getScalarSizeInBits(), Val, /*isSigned=*/false),
1701 DL, VT, isT, isO);
1702}
1703
1705 bool isT, bool isO) {
1706 return getConstant(*ConstantInt::get(*Context, Val), DL, VT, isT, isO);
1707}
1708
1710 EVT VT, bool isT, bool isO) {
1711 assert(VT.isInteger() && "Cannot create FP integer constant!");
1712
1713 EVT EltVT = VT.getScalarType();
1714 const ConstantInt *Elt = &Val;
1715
1716 // Vector splats are explicit within the DAG, with ConstantSDNode holding the
1717 // to-be-splatted scalar ConstantInt.
1718 if (isa<VectorType>(Elt->getType()))
1719 Elt = ConstantInt::get(*getContext(), Elt->getValue());
1720
1721 // In some cases the vector type is legal but the element type is illegal and
1722 // needs to be promoted, for example v8i8 on ARM. In this case, promote the
1723 // inserted value (the type does not need to match the vector element type).
1724 // Any extra bits introduced will be truncated away.
1725 if (VT.isVector() && TLI->getTypeAction(*getContext(), EltVT) ==
1727 EltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1728 APInt NewVal;
1729 if (TLI->isSExtCheaperThanZExt(VT.getScalarType(), EltVT))
1730 NewVal = Elt->getValue().sextOrTrunc(EltVT.getSizeInBits());
1731 else
1732 NewVal = Elt->getValue().zextOrTrunc(EltVT.getSizeInBits());
1733 Elt = ConstantInt::get(*getContext(), NewVal);
1734 }
1735 // In other cases the element type is illegal and needs to be expanded, for
1736 // example v2i64 on MIPS32. In this case, find the nearest legal type, split
1737 // the value into n parts and use a vector type with n-times the elements.
1738 // Then bitcast to the type requested.
1739 // Legalizing constants too early makes the DAGCombiner's job harder so we
1740 // only legalize if the DAG tells us we must produce legal types.
1741 else if (NewNodesMustHaveLegalTypes && VT.isVector() &&
1742 TLI->getTypeAction(*getContext(), EltVT) ==
1744 const APInt &NewVal = Elt->getValue();
1745 EVT ViaEltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1746 unsigned ViaEltSizeInBits = ViaEltVT.getSizeInBits();
1747
1748 // For scalable vectors, try to use a SPLAT_VECTOR_PARTS node.
1749 if (VT.isScalableVector() ||
1750 TLI->isOperationLegal(ISD::SPLAT_VECTOR, VT)) {
1751 assert(EltVT.getSizeInBits() % ViaEltSizeInBits == 0 &&
1752 "Can only handle an even split!");
1753 unsigned Parts = EltVT.getSizeInBits() / ViaEltSizeInBits;
1754
1755 SmallVector<SDValue, 2> ScalarParts;
1756 for (unsigned i = 0; i != Parts; ++i)
1757 ScalarParts.push_back(getConstant(
1758 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1759 ViaEltVT, isT, isO));
1760
1761 return getNode(ISD::SPLAT_VECTOR_PARTS, DL, VT, ScalarParts);
1762 }
1763
1764 unsigned ViaVecNumElts = VT.getSizeInBits() / ViaEltSizeInBits;
1765 EVT ViaVecVT = EVT::getVectorVT(*getContext(), ViaEltVT, ViaVecNumElts);
1766
1767 // Check the temporary vector is the correct size. If this fails then
1768 // getTypeToTransformTo() probably returned a type whose size (in bits)
1769 // isn't a power-of-2 factor of the requested type size.
1770 assert(ViaVecVT.getSizeInBits() == VT.getSizeInBits());
1771
1772 SmallVector<SDValue, 2> EltParts;
1773 for (unsigned i = 0; i < ViaVecNumElts / VT.getVectorNumElements(); ++i)
1774 EltParts.push_back(getConstant(
1775 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1776 ViaEltVT, isT, isO));
1777
1778 // EltParts is currently in little endian order. If we actually want
1779 // big-endian order then reverse it now.
1780 if (getDataLayout().isBigEndian())
1781 std::reverse(EltParts.begin(), EltParts.end());
1782
1783 // The elements must be reversed when the element order is different
1784 // to the endianness of the elements (because the BITCAST is itself a
1785 // vector shuffle in this situation). However, we do not need any code to
1786 // perform this reversal because getConstant() is producing a vector
1787 // splat.
1788 // This situation occurs in MIPS MSA.
1789
1791 for (unsigned i = 0, e = VT.getVectorNumElements(); i != e; ++i)
1792 llvm::append_range(Ops, EltParts);
1793
1794 SDValue V =
1795 getNode(ISD::BITCAST, DL, VT, getBuildVector(ViaVecVT, DL, Ops));
1796 return V;
1797 }
1798
1799 assert(Elt->getBitWidth() == EltVT.getSizeInBits() &&
1800 "APInt size does not match type size!");
1801 unsigned Opc = isT ? ISD::TargetConstant : ISD::Constant;
1802 SDVTList VTs = getVTList(EltVT);
1804 AddNodeIDNode(ID, Opc, VTs, {});
1805 ID.AddPointer(Elt);
1806 ID.AddBoolean(isO);
1807 void *IP = nullptr;
1808 SDNode *N = nullptr;
1809 if ((N = FindNodeOrInsertPos(ID, DL, IP)))
1810 if (!VT.isVector())
1811 return SDValue(N, 0);
1812
1813 if (!N) {
1814 N = newSDNode<ConstantSDNode>(isT, isO, Elt, VTs);
1815 CSEMap.InsertNode(N, IP);
1816 InsertNode(N);
1817 NewSDValueDbgMsg(SDValue(N, 0), "Creating constant: ", this);
1818 }
1819
1820 SDValue Result(N, 0);
1821 if (VT.isVector())
1822 Result = getSplat(VT, DL, Result);
1823 return Result;
1824}
1825
1827 bool isT, bool isO) {
1828 unsigned Size = VT.getScalarSizeInBits();
1829 return getConstant(APInt(Size, Val, /*isSigned=*/true), DL, VT, isT, isO);
1830}
1831
1833 bool IsOpaque) {
1835 IsTarget, IsOpaque);
1836}
1837
1839 bool isTarget) {
1840 return getConstant(Val, DL, TLI->getPointerTy(getDataLayout()), isTarget);
1841}
1842
1844 const SDLoc &DL) {
1845 assert(VT.isInteger() && "Shift amount is not an integer type!");
1846 EVT ShiftVT = TLI->getShiftAmountTy(VT, getDataLayout());
1847 return getConstant(Val, DL, ShiftVT);
1848}
1849
1851 const SDLoc &DL) {
1852 assert(Val.ult(VT.getScalarSizeInBits()) && "Out of range shift");
1853 return getShiftAmountConstant(Val.getZExtValue(), VT, DL);
1854}
1855
1857 bool isTarget) {
1858 return getConstant(Val, DL, TLI->getVectorIdxTy(getDataLayout()), isTarget);
1859}
1860
1862 bool isTarget) {
1863 return getConstantFP(*ConstantFP::get(*getContext(), V), DL, VT, isTarget);
1864}
1865
1867 EVT VT, bool isTarget) {
1868 assert(VT.isFloatingPoint() && "Cannot create integer FP constant!");
1869
1870 EVT EltVT = VT.getScalarType();
1871 const ConstantFP *Elt = &V;
1872
1873 // Vector splats are explicit within the DAG, with ConstantFPSDNode holding
1874 // the to-be-splatted scalar ConstantFP.
1875 if (isa<VectorType>(Elt->getType()))
1876 Elt = ConstantFP::get(*getContext(), Elt->getValue());
1877
1878 // Do the map lookup using the actual bit pattern for the floating point
1879 // value, so that we don't have problems with 0.0 comparing equal to -0.0, and
1880 // we don't have issues with SNANs.
1881 unsigned Opc = isTarget ? ISD::TargetConstantFP : ISD::ConstantFP;
1882 SDVTList VTs = getVTList(EltVT);
1884 AddNodeIDNode(ID, Opc, VTs, {});
1885 ID.AddPointer(Elt);
1886 void *IP = nullptr;
1887 SDNode *N = nullptr;
1888 if ((N = FindNodeOrInsertPos(ID, DL, IP)))
1889 if (!VT.isVector())
1890 return SDValue(N, 0);
1891
1892 if (!N) {
1893 N = newSDNode<ConstantFPSDNode>(isTarget, Elt, VTs);
1894 CSEMap.InsertNode(N, IP);
1895 InsertNode(N);
1896 }
1897
1898 SDValue Result(N, 0);
1899 if (VT.isVector())
1900 Result = getSplat(VT, DL, Result);
1901 NewSDValueDbgMsg(Result, "Creating fp constant: ", this);
1902 return Result;
1903}
1904
1906 bool isTarget) {
1907 EVT EltVT = VT.getScalarType();
1908 if (EltVT == MVT::f32)
1909 return getConstantFP(APFloat((float)Val), DL, VT, isTarget);
1910 if (EltVT == MVT::f64)
1911 return getConstantFP(APFloat(Val), DL, VT, isTarget);
1912 if (EltVT == MVT::f80 || EltVT == MVT::f128 || EltVT == MVT::ppcf128 ||
1913 EltVT == MVT::f16 || EltVT == MVT::bf16) {
1914 bool Ignored;
1915 APFloat APF = APFloat(Val);
1917 &Ignored);
1918 return getConstantFP(APF, DL, VT, isTarget);
1919 }
1920 llvm_unreachable("Unsupported type in getConstantFP");
1921}
1922
1924 EVT VT, int64_t Offset, bool isTargetGA,
1925 unsigned TargetFlags) {
1926 assert((TargetFlags == 0 || isTargetGA) &&
1927 "Cannot set target flags on target-independent globals");
1928
1929 // Truncate (with sign-extension) the offset value to the pointer size.
1931 if (BitWidth < 64)
1933
1934 unsigned Opc;
1935 if (GV->isThreadLocal())
1937 else
1939
1940 SDVTList VTs = getVTList(VT);
1942 AddNodeIDNode(ID, Opc, VTs, {});
1943 ID.AddPointer(GV);
1944 ID.AddInteger(Offset);
1945 ID.AddInteger(TargetFlags);
1946 void *IP = nullptr;
1947 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
1948 return SDValue(E, 0);
1949
1950 auto *N = newSDNode<GlobalAddressSDNode>(
1951 Opc, DL.getIROrder(), DL.getDebugLoc(), GV, VTs, Offset, TargetFlags);
1952 CSEMap.InsertNode(N, IP);
1953 InsertNode(N);
1954 return SDValue(N, 0);
1955}
1956
1958 SDVTList VTs = getVTList(MVT::Untyped);
1961 ID.AddPointer(GV);
1962 void *IP = nullptr;
1963 if (SDNode *E = FindNodeOrInsertPos(ID, SDLoc(), IP))
1964 return SDValue(E, 0);
1965
1966 auto *N = newSDNode<DeactivationSymbolSDNode>(GV, VTs);
1967 CSEMap.InsertNode(N, IP);
1968 InsertNode(N);
1969 return SDValue(N, 0);
1970}
1971
1972SDValue SelectionDAG::getFrameIndex(int FI, EVT VT, bool isTarget) {
1973 unsigned Opc = isTarget ? ISD::TargetFrameIndex : ISD::FrameIndex;
1974 SDVTList VTs = getVTList(VT);
1976 AddNodeIDNode(ID, Opc, VTs, {});
1977 ID.AddInteger(FI);
1978 void *IP = nullptr;
1979 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
1980 return SDValue(E, 0);
1981
1982 auto *N = newSDNode<FrameIndexSDNode>(FI, VTs, isTarget);
1983 CSEMap.InsertNode(N, IP);
1984 InsertNode(N);
1985 return SDValue(N, 0);
1986}
1987
1988SDValue SelectionDAG::getJumpTable(int JTI, EVT VT, bool isTarget,
1989 unsigned TargetFlags) {
1990 assert((TargetFlags == 0 || isTarget) &&
1991 "Cannot set target flags on target-independent jump tables");
1992 unsigned Opc = isTarget ? ISD::TargetJumpTable : ISD::JumpTable;
1993 SDVTList VTs = getVTList(VT);
1995 AddNodeIDNode(ID, Opc, VTs, {});
1996 ID.AddInteger(JTI);
1997 ID.AddInteger(TargetFlags);
1998 void *IP = nullptr;
1999 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2000 return SDValue(E, 0);
2001
2002 auto *N = newSDNode<JumpTableSDNode>(JTI, VTs, isTarget, TargetFlags);
2003 CSEMap.InsertNode(N, IP);
2004 InsertNode(N);
2005 return SDValue(N, 0);
2006}
2007
2009 const SDLoc &DL) {
2011 return getNode(ISD::JUMP_TABLE_DEBUG_INFO, DL, MVT::Other, Chain,
2012 getTargetConstant(static_cast<uint64_t>(JTI), DL, PTy, true));
2013}
2014
2016 MaybeAlign Alignment, int Offset,
2017 bool isTarget, unsigned TargetFlags) {
2018 assert((TargetFlags == 0 || isTarget) &&
2019 "Cannot set target flags on target-independent globals");
2020 if (!Alignment)
2021 Alignment = shouldOptForSize()
2022 ? getDataLayout().getABITypeAlign(C->getType())
2023 : getDataLayout().getPrefTypeAlign(C->getType());
2024 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
2025 SDVTList VTs = getVTList(VT);
2027 AddNodeIDNode(ID, Opc, VTs, {});
2028 ID.AddInteger(Alignment->value());
2029 ID.AddInteger(Offset);
2030 ID.AddPointer(C);
2031 ID.AddInteger(TargetFlags);
2032 void *IP = nullptr;
2033 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2034 return SDValue(E, 0);
2035
2036 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
2037 TargetFlags);
2038 CSEMap.InsertNode(N, IP);
2039 InsertNode(N);
2040 SDValue V = SDValue(N, 0);
2041 NewSDValueDbgMsg(V, "Creating new constant pool: ", this);
2042 return V;
2043}
2044
2046 MaybeAlign Alignment, int Offset,
2047 bool isTarget, unsigned TargetFlags) {
2048 assert((TargetFlags == 0 || isTarget) &&
2049 "Cannot set target flags on target-independent globals");
2050 if (!Alignment)
2051 Alignment = getDataLayout().getPrefTypeAlign(C->getType());
2052 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
2053 SDVTList VTs = getVTList(VT);
2055 AddNodeIDNode(ID, Opc, VTs, {});
2056 ID.AddInteger(Alignment->value());
2057 ID.AddInteger(Offset);
2058 C->addSelectionDAGCSEId(ID);
2059 ID.AddInteger(TargetFlags);
2060 void *IP = nullptr;
2061 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2062 return SDValue(E, 0);
2063
2064 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
2065 TargetFlags);
2066 CSEMap.InsertNode(N, IP);
2067 InsertNode(N);
2068 return SDValue(N, 0);
2069}
2070
2073 AddNodeIDNode(ID, ISD::BasicBlock, getVTList(MVT::Other), {});
2074 ID.AddPointer(MBB);
2075 void *IP = nullptr;
2076 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2077 return SDValue(E, 0);
2078
2079 auto *N = newSDNode<BasicBlockSDNode>(MBB);
2080 CSEMap.InsertNode(N, IP);
2081 InsertNode(N);
2082 return SDValue(N, 0);
2083}
2084
2086 if (VT.isSimple() && (unsigned)VT.getSimpleVT().SimpleTy >=
2087 ValueTypeNodes.size())
2088 ValueTypeNodes.resize(VT.getSimpleVT().SimpleTy+1);
2089
2090 SDNode *&N = VT.isExtended() ?
2091 ExtendedValueTypeNodes[VT] : ValueTypeNodes[VT.getSimpleVT().SimpleTy];
2092
2093 if (N) return SDValue(N, 0);
2094 N = newSDNode<VTSDNode>(VT);
2095 InsertNode(N);
2096 return SDValue(N, 0);
2097}
2098
2100 SDNode *&N = ExternalSymbols[Sym];
2101 if (N) return SDValue(N, 0);
2102 N = newSDNode<ExternalSymbolSDNode>(false, Sym, 0, getVTList(VT));
2103 InsertNode(N);
2104 return SDValue(N, 0);
2105}
2106
2107SDValue SelectionDAG::getExternalSymbol(RTLIB::LibcallImpl Libcall, EVT VT) {
2109 return getExternalSymbol(SymName.data(), VT);
2110}
2111
2113 SDNode *&N = MCSymbols[Sym];
2114 if (N)
2115 return SDValue(N, 0);
2116 N = newSDNode<MCSymbolSDNode>(Sym, getVTList(VT));
2117 InsertNode(N);
2118 return SDValue(N, 0);
2119}
2120
2122 unsigned TargetFlags) {
2123 SDNode *&N =
2124 TargetExternalSymbols[std::pair<std::string, unsigned>(Sym, TargetFlags)];
2125 if (N) return SDValue(N, 0);
2126 N = newSDNode<ExternalSymbolSDNode>(true, Sym, TargetFlags, getVTList(VT));
2127 InsertNode(N);
2128 return SDValue(N, 0);
2129}
2130
2132 EVT VT, unsigned TargetFlags) {
2134 return getTargetExternalSymbol(SymName.data(), VT, TargetFlags);
2135}
2136
2138 if ((unsigned)Cond >= CondCodeNodes.size())
2139 CondCodeNodes.resize(Cond+1);
2140
2141 if (!CondCodeNodes[Cond]) {
2142 auto *N = newSDNode<CondCodeSDNode>(Cond);
2143 CondCodeNodes[Cond] = N;
2144 InsertNode(N);
2145 }
2146
2147 return SDValue(CondCodeNodes[Cond], 0);
2148}
2149
2151 assert(MulImm.getBitWidth() == VT.getSizeInBits() &&
2152 "APInt size does not match type size!");
2153
2154 if (MulImm == 0)
2155 return getConstant(0, DL, VT);
2156
2157 const MachineFunction &MF = getMachineFunction();
2158 const Function &F = MF.getFunction();
2159 ConstantRange CR = getVScaleRange(&F, 64);
2160 if (const APInt *C = CR.getSingleElement())
2161 return getConstant(MulImm * C->getZExtValue(), DL, VT);
2162
2163 return getNode(ISD::VSCALE, DL, VT, getConstant(MulImm, DL, VT));
2164}
2165
2166/// \returns a value of type \p VT that represents the runtime value of \p
2167/// Quantity, i.e. scaled by vscale if it's scalable, or a fixed constant
2168/// otherwise. Quantity should be a FixedOrScalableQuantity, i.e. ElementCount
2169/// or TypeSize.
2170template <typename Ty>
2172 EVT VT, Ty Quantity) {
2173 if (Quantity.isScalable())
2174 return DAG.getVScale(
2175 DL, VT, APInt(VT.getSizeInBits(), Quantity.getKnownMinValue()));
2176
2177 return DAG.getConstant(Quantity.getKnownMinValue(), DL, VT);
2178}
2179
2181 ElementCount EC) {
2182 return getFixedOrScalableQuantity(*this, DL, VT, EC);
2183}
2184
2186 return getFixedOrScalableQuantity(*this, DL, VT, TS);
2187}
2188
2190 ElementCount EC) {
2191 EVT IdxVT = TLI->getVectorIdxTy(getDataLayout());
2192 EVT MaskVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), DataVT);
2193 return getNode(ISD::GET_ACTIVE_LANE_MASK, DL, MaskVT,
2194 getConstant(0, DL, IdxVT), getElementCount(DL, IdxVT, EC));
2195}
2196
2198 APInt One(ResVT.getScalarSizeInBits(), 1);
2199 return getStepVector(DL, ResVT, One);
2200}
2201
2203 const APInt &StepVal) {
2204 assert(ResVT.getScalarSizeInBits() == StepVal.getBitWidth());
2205 if (ResVT.isScalableVector())
2206 return getNode(
2207 ISD::STEP_VECTOR, DL, ResVT,
2208 getTargetConstant(StepVal, DL, ResVT.getVectorElementType()));
2209
2210 SmallVector<SDValue, 16> OpsStepConstants;
2211 for (uint64_t i = 0; i < ResVT.getVectorNumElements(); i++)
2212 OpsStepConstants.push_back(
2213 getConstant(StepVal * i, DL, ResVT.getVectorElementType()));
2214 return getBuildVector(ResVT, DL, OpsStepConstants);
2215}
2216
2217/// Swaps the values of N1 and N2. Swaps all indices in the shuffle mask M that
2218/// point at N1 to point at N2 and indices that point at N2 to point at N1.
2223
2225 SDValue N2, ArrayRef<int> Mask) {
2226 assert(VT.getVectorNumElements() == Mask.size() &&
2227 "Must have the same number of vector elements as mask elements!");
2228 assert(VT == N1.getValueType() && VT == N2.getValueType() &&
2229 "Invalid VECTOR_SHUFFLE");
2230
2231 // Canonicalize shuffle undef, undef -> undef
2232 if (N1.isUndef() && N2.isUndef())
2233 return getUNDEF(VT);
2234
2235 // Validate that all indices in Mask are within the range of the elements
2236 // input to the shuffle.
2237 int NElts = Mask.size();
2238 assert(llvm::all_of(Mask,
2239 [&](int M) { return M < (NElts * 2) && M >= -1; }) &&
2240 "Index out of range");
2241
2242 // Copy the mask so we can do any needed cleanup.
2243 SmallVector<int, 8> MaskVec(Mask);
2244
2245 // Canonicalize shuffle v, v -> v, undef
2246 if (N1 == N2) {
2247 N2 = getUNDEF(VT);
2248 for (int i = 0; i != NElts; ++i)
2249 if (MaskVec[i] >= NElts) MaskVec[i] -= NElts;
2250 }
2251
2252 // Canonicalize shuffle undef, v -> v, undef. Commute the shuffle mask.
2253 if (N1.isUndef())
2254 commuteShuffle(N1, N2, MaskVec);
2255
2256 if (TLI->hasVectorBlend()) {
2257 // If shuffling a splat, try to blend the splat instead. We do this here so
2258 // that even when this arises during lowering we don't have to re-handle it.
2259 auto BlendSplat = [&](BuildVectorSDNode *BV, int Offset) {
2260 BitVector UndefElements;
2261 SDValue Splat = BV->getSplatValue(&UndefElements);
2262 if (!Splat)
2263 return;
2264
2265 for (int i = 0; i < NElts; ++i) {
2266 if (MaskVec[i] < Offset || MaskVec[i] >= (Offset + NElts))
2267 continue;
2268
2269 // If this input comes from undef, mark it as such.
2270 if (UndefElements[MaskVec[i] - Offset]) {
2271 MaskVec[i] = -1;
2272 continue;
2273 }
2274
2275 // If we can blend a non-undef lane, use that instead.
2276 if (!UndefElements[i])
2277 MaskVec[i] = i + Offset;
2278 }
2279 };
2280 if (auto *N1BV = dyn_cast<BuildVectorSDNode>(N1))
2281 BlendSplat(N1BV, 0);
2282 if (auto *N2BV = dyn_cast<BuildVectorSDNode>(N2))
2283 BlendSplat(N2BV, NElts);
2284 }
2285
2286 // Canonicalize all index into lhs, -> shuffle lhs, undef
2287 // Canonicalize all index into rhs, -> shuffle rhs, undef
2288 bool AllLHS = true, AllRHS = true;
2289 bool N2Undef = N2.isUndef();
2290 for (int i = 0; i != NElts; ++i) {
2291 if (MaskVec[i] >= NElts) {
2292 if (N2Undef)
2293 MaskVec[i] = -1;
2294 else
2295 AllLHS = false;
2296 } else if (MaskVec[i] >= 0) {
2297 AllRHS = false;
2298 }
2299 }
2300 if (AllLHS && AllRHS)
2301 return getUNDEF(VT);
2302 if (AllLHS && !N2Undef)
2303 N2 = getUNDEF(VT);
2304 if (AllRHS) {
2305 N1 = getUNDEF(VT);
2306 commuteShuffle(N1, N2, MaskVec);
2307 }
2308 // Reset our undef status after accounting for the mask.
2309 N2Undef = N2.isUndef();
2310 // Re-check whether both sides ended up undef.
2311 if (N1.isUndef() && N2Undef)
2312 return getUNDEF(VT);
2313
2314 // If Identity shuffle return that node.
2315 bool Identity = true, AllSame = true;
2316 for (int i = 0; i != NElts; ++i) {
2317 if (MaskVec[i] >= 0 && MaskVec[i] != i) Identity = false;
2318 if (MaskVec[i] != MaskVec[0]) AllSame = false;
2319 }
2320 if (Identity && NElts)
2321 return N1;
2322
2323 // Shuffling a constant splat doesn't change the result.
2324 if (N2Undef) {
2325 SDValue V = N1;
2326
2327 // Look through any bitcasts. We check that these don't change the number
2328 // (and size) of elements and just changes their types.
2329 while (V.getOpcode() == ISD::BITCAST)
2330 V = V->getOperand(0);
2331
2332 // A splat should always show up as a build vector node.
2333 if (auto *BV = dyn_cast<BuildVectorSDNode>(V)) {
2334 BitVector UndefElements;
2335 SDValue Splat = BV->getSplatValue(&UndefElements);
2336 // If this is a splat of an undef, shuffling it is also undef.
2337 if (Splat && Splat.isUndef())
2338 return getUNDEF(VT);
2339
2340 bool SameNumElts =
2341 V.getValueType().getVectorNumElements() == VT.getVectorNumElements();
2342
2343 // We only have a splat which can skip shuffles if there is a splatted
2344 // value and no undef lanes rearranged by the shuffle.
2345 if (Splat && UndefElements.none()) {
2346 // Splat of <x, x, ..., x>, return <x, x, ..., x>, provided that the
2347 // number of elements match or the value splatted is a zero constant.
2348 if (SameNumElts || isNullConstant(Splat))
2349 return N1;
2350 }
2351
2352 // If the shuffle itself creates a splat, build the vector directly.
2353 if (AllSame && SameNumElts) {
2354 EVT BuildVT = BV->getValueType(0);
2355 const SDValue &Splatted = BV->getOperand(MaskVec[0]);
2356 SDValue NewBV = getSplatBuildVector(BuildVT, dl, Splatted);
2357
2358 // We may have jumped through bitcasts, so the type of the
2359 // BUILD_VECTOR may not match the type of the shuffle.
2360 if (BuildVT != VT)
2361 NewBV = getNode(ISD::BITCAST, dl, VT, NewBV);
2362 return NewBV;
2363 }
2364 }
2365 }
2366
2367 SDVTList VTs = getVTList(VT);
2369 SDValue Ops[2] = { N1, N2 };
2371 for (int i = 0; i != NElts; ++i)
2372 ID.AddInteger(MaskVec[i]);
2373
2374 void* IP = nullptr;
2375 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
2376 return SDValue(E, 0);
2377
2378 // Allocate the mask array for the node out of the BumpPtrAllocator, since
2379 // SDNode doesn't have access to it. This memory will be "leaked" when
2380 // the node is deallocated, but recovered when the NodeAllocator is released.
2381 int *MaskAlloc = OperandAllocator.Allocate<int>(NElts);
2382 llvm::copy(MaskVec, MaskAlloc);
2383
2384 auto *N = newSDNode<ShuffleVectorSDNode>(VTs, dl.getIROrder(),
2385 dl.getDebugLoc(), MaskAlloc);
2386 createOperands(N, Ops);
2387
2388 CSEMap.InsertNode(N, IP);
2389 InsertNode(N);
2390 SDValue V = SDValue(N, 0);
2391 NewSDValueDbgMsg(V, "Creating new node: ", this);
2392 return V;
2393}
2394
2396 EVT VT = SV.getValueType(0);
2397 SmallVector<int, 8> MaskVec(SV.getMask());
2399
2400 SDValue Op0 = SV.getOperand(0);
2401 SDValue Op1 = SV.getOperand(1);
2402 return getVectorShuffle(VT, SDLoc(&SV), Op1, Op0, MaskVec);
2403}
2404
2406 SDVTList VTs = getVTList(VT);
2408 AddNodeIDNode(ID, ISD::Register, VTs, {});
2409 ID.AddInteger(Reg.id());
2410 void *IP = nullptr;
2411 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2412 return SDValue(E, 0);
2413
2414 auto *N = newSDNode<RegisterSDNode>(Reg, VTs);
2415 N->SDNodeBits.IsDivergent = TLI->isSDNodeSourceOfDivergence(N, FLI, UA);
2416 CSEMap.InsertNode(N, IP);
2417 InsertNode(N);
2418 return SDValue(N, 0);
2419}
2420
2423 AddNodeIDNode(ID, ISD::RegisterMask, getVTList(MVT::Untyped), {});
2424 ID.AddPointer(RegMask);
2425 void *IP = nullptr;
2426 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2427 return SDValue(E, 0);
2428
2429 auto *N = newSDNode<RegisterMaskSDNode>(RegMask);
2430 CSEMap.InsertNode(N, IP);
2431 InsertNode(N);
2432 return SDValue(N, 0);
2433}
2434
2436 MCSymbol *Label) {
2437 return getLabelNode(ISD::EH_LABEL, dl, Root, Label);
2438}
2439
2440SDValue SelectionDAG::getLabelNode(unsigned Opcode, const SDLoc &dl,
2441 SDValue Root, MCSymbol *Label) {
2443 SDValue Ops[] = { Root };
2444 AddNodeIDNode(ID, Opcode, getVTList(MVT::Other), Ops);
2445 ID.AddPointer(Label);
2446 void *IP = nullptr;
2447 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2448 return SDValue(E, 0);
2449
2450 auto *N =
2451 newSDNode<LabelSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), Label);
2452 createOperands(N, Ops);
2453
2454 CSEMap.InsertNode(N, IP);
2455 InsertNode(N);
2456 return SDValue(N, 0);
2457}
2458
2460 int64_t Offset, bool isTarget,
2461 unsigned TargetFlags) {
2462 unsigned Opc = isTarget ? ISD::TargetBlockAddress : ISD::BlockAddress;
2463 SDVTList VTs = getVTList(VT);
2464
2466 AddNodeIDNode(ID, Opc, VTs, {});
2467 ID.AddPointer(BA);
2468 ID.AddInteger(Offset);
2469 ID.AddInteger(TargetFlags);
2470 void *IP = nullptr;
2471 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2472 return SDValue(E, 0);
2473
2474 auto *N = newSDNode<BlockAddressSDNode>(Opc, VTs, BA, Offset, TargetFlags);
2475 CSEMap.InsertNode(N, IP);
2476 InsertNode(N);
2477 return SDValue(N, 0);
2478}
2479
2482 AddNodeIDNode(ID, ISD::SRCVALUE, getVTList(MVT::Other), {});
2483 ID.AddPointer(V);
2484
2485 void *IP = nullptr;
2486 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2487 return SDValue(E, 0);
2488
2489 auto *N = newSDNode<SrcValueSDNode>(V);
2490 CSEMap.InsertNode(N, IP);
2491 InsertNode(N);
2492 return SDValue(N, 0);
2493}
2494
2497 AddNodeIDNode(ID, ISD::MDNODE_SDNODE, getVTList(MVT::Other), {});
2498 ID.AddPointer(MD);
2499
2500 void *IP = nullptr;
2501 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2502 return SDValue(E, 0);
2503
2504 auto *N = newSDNode<MDNodeSDNode>(MD);
2505 CSEMap.InsertNode(N, IP);
2506 InsertNode(N);
2507 return SDValue(N, 0);
2508}
2509
2511 if (VT == V.getValueType())
2512 return V;
2513
2514 return getNode(ISD::BITCAST, SDLoc(V), VT, V);
2515}
2516
2518 unsigned SrcAS, unsigned DestAS) {
2519 SDVTList VTs = getVTList(VT);
2520 SDValue Ops[] = {Ptr};
2523 ID.AddInteger(SrcAS);
2524 ID.AddInteger(DestAS);
2525
2526 void *IP = nullptr;
2527 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
2528 return SDValue(E, 0);
2529
2530 auto *N = newSDNode<AddrSpaceCastSDNode>(dl.getIROrder(), dl.getDebugLoc(),
2531 VTs, SrcAS, DestAS);
2532 createOperands(N, Ops);
2533
2534 CSEMap.InsertNode(N, IP);
2535 InsertNode(N);
2536 return SDValue(N, 0);
2537}
2538
2540 return getNode(ISD::FREEZE, SDLoc(V), V.getValueType(), V);
2541}
2542
2544 bool PoisonOnly) {
2545 if (isGuaranteedNotToBeUndefOrPoison(V, DemandedElts, PoisonOnly))
2546 return V;
2547 return getFreeze(V);
2548}
2549
2550/// getShiftAmountOperand - Return the specified value casted to
2551/// the target's desired shift amount type.
2553 EVT OpTy = Op.getValueType();
2554 EVT ShTy = TLI->getShiftAmountTy(LHSTy, getDataLayout());
2555 if (OpTy == ShTy || OpTy.isVector()) return Op;
2556
2557 return getZExtOrTrunc(Op, SDLoc(Op), ShTy);
2558}
2559
2561 SDLoc dl(Node);
2563 const Value *V = cast<SrcValueSDNode>(Node->getOperand(2))->getValue();
2564 EVT VT = Node->getValueType(0);
2565 SDValue Tmp1 = Node->getOperand(0);
2566 SDValue Tmp2 = Node->getOperand(1);
2567 const MaybeAlign MA(Node->getConstantOperandVal(3));
2568
2569 SDValue VAListLoad = getLoad(TLI.getPointerTy(getDataLayout()), dl, Tmp1,
2570 Tmp2, MachinePointerInfo(V));
2571 SDValue VAList = VAListLoad;
2572
2573 if (MA && *MA > TLI.getMinStackArgumentAlignment()) {
2574 VAList = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2575 getConstant(MA->value() - 1, dl, VAList.getValueType()));
2576
2577 VAList = getNode(
2578 ISD::AND, dl, VAList.getValueType(), VAList,
2579 getSignedConstant(-(int64_t)MA->value(), dl, VAList.getValueType()));
2580 }
2581
2582 // Increment the pointer, VAList, to the next vaarg
2583 Tmp1 = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2584 getConstant(getDataLayout().getTypeAllocSize(
2585 VT.getTypeForEVT(*getContext())),
2586 dl, VAList.getValueType()));
2587 // Store the incremented VAList to the legalized pointer
2588 Tmp1 =
2589 getStore(VAListLoad.getValue(1), dl, Tmp1, Tmp2, MachinePointerInfo(V));
2590 // Load the actual argument out of the pointer VAList
2591 return getLoad(VT, dl, Tmp1, VAList, MachinePointerInfo());
2592}
2593
2595 SDLoc dl(Node);
2597 // This defaults to loading a pointer from the input and storing it to the
2598 // output, returning the chain.
2599 const Value *VD = cast<SrcValueSDNode>(Node->getOperand(3))->getValue();
2600 const Value *VS = cast<SrcValueSDNode>(Node->getOperand(4))->getValue();
2601 SDValue Tmp1 =
2602 getLoad(TLI.getPointerTy(getDataLayout()), dl, Node->getOperand(0),
2603 Node->getOperand(2), MachinePointerInfo(VS));
2604 return getStore(Tmp1.getValue(1), dl, Tmp1, Node->getOperand(1),
2605 MachinePointerInfo(VD));
2606}
2607
2609 const DataLayout &DL = getDataLayout();
2610 Type *Ty = VT.getTypeForEVT(*getContext());
2611 Align RedAlign = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2612
2613 if (TLI->isTypeLegal(VT) || !VT.isVector())
2614 return RedAlign;
2615
2616 const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
2617 const Align StackAlign = TFI->getStackAlign();
2618
2619 // See if we can choose a smaller ABI alignment in cases where it's an
2620 // illegal vector type that will get broken down.
2621 if (RedAlign > StackAlign) {
2622 EVT IntermediateVT;
2623 MVT RegisterVT;
2624 unsigned NumIntermediates;
2625 TLI->getVectorTypeBreakdown(*getContext(), VT, IntermediateVT,
2626 NumIntermediates, RegisterVT);
2627 Ty = IntermediateVT.getTypeForEVT(*getContext());
2628 Align RedAlign2 = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2629 if (RedAlign2 < RedAlign)
2630 RedAlign = RedAlign2;
2631
2632 if (!getMachineFunction().getFrameInfo().isStackRealignable())
2633 // If the stack is not realignable, the alignment should be limited to the
2634 // StackAlignment
2635 RedAlign = std::min(RedAlign, StackAlign);
2636 }
2637
2638 return RedAlign;
2639}
2640
2642 MachineFrameInfo &MFI = MF->getFrameInfo();
2643 const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
2644 int StackID = 0;
2645 if (Bytes.isScalable())
2646 StackID = TFI->getStackIDForScalableVectors();
2647 // The stack id gives an indication of whether the object is scalable or
2648 // not, so it's safe to pass in the minimum size here.
2649 int FrameIdx = MFI.CreateStackObject(Bytes.getKnownMinValue(), Alignment,
2650 false, nullptr, StackID);
2651 return getFrameIndex(FrameIdx, TLI->getFrameIndexTy(getDataLayout()));
2652}
2653
2655 Type *Ty = VT.getTypeForEVT(*getContext());
2656 Align StackAlign =
2657 std::max(getDataLayout().getPrefTypeAlign(Ty), Align(minAlign));
2658 return CreateStackTemporary(VT.getStoreSize(), StackAlign);
2659}
2660
2662 TypeSize VT1Size = VT1.getStoreSize();
2663 TypeSize VT2Size = VT2.getStoreSize();
2664 assert(VT1Size.isScalable() == VT2Size.isScalable() &&
2665 "Don't know how to choose the maximum size when creating a stack "
2666 "temporary");
2667 TypeSize Bytes = VT1Size.getKnownMinValue() > VT2Size.getKnownMinValue()
2668 ? VT1Size
2669 : VT2Size;
2670
2671 Type *Ty1 = VT1.getTypeForEVT(*getContext());
2672 Type *Ty2 = VT2.getTypeForEVT(*getContext());
2673 const DataLayout &DL = getDataLayout();
2674 Align Align = std::max(DL.getPrefTypeAlign(Ty1), DL.getPrefTypeAlign(Ty2));
2675 return CreateStackTemporary(Bytes, Align);
2676}
2677
2679 ISD::CondCode Cond, const SDLoc &dl,
2680 SDNodeFlags Flags) {
2681 EVT OpVT = N1.getValueType();
2682
2683 auto GetUndefBooleanConstant = [&]() {
2684 if (VT.getScalarType() == MVT::i1 ||
2685 TLI->getBooleanContents(OpVT) ==
2687 return getUNDEF(VT);
2688 // ZeroOrOne / ZeroOrNegative require specific values for the high bits,
2689 // so we cannot use getUNDEF(). Return zero instead.
2690 return getConstant(0, dl, VT);
2691 };
2692
2693 // These setcc operations always fold.
2694 switch (Cond) {
2695 default: break;
2696 case ISD::SETFALSE:
2697 case ISD::SETFALSE2: return getBoolConstant(false, dl, VT, OpVT);
2698 case ISD::SETTRUE:
2699 case ISD::SETTRUE2: return getBoolConstant(true, dl, VT, OpVT);
2700
2701 case ISD::SETOEQ:
2702 case ISD::SETOGT:
2703 case ISD::SETOGE:
2704 case ISD::SETOLT:
2705 case ISD::SETOLE:
2706 case ISD::SETONE:
2707 case ISD::SETO:
2708 case ISD::SETUO:
2709 case ISD::SETUEQ:
2710 case ISD::SETUNE:
2711 assert(!OpVT.isInteger() && "Illegal setcc for integer!");
2712 break;
2713 }
2714
2715 if (OpVT.isInteger()) {
2716 // For EQ and NE, we can always pick a value for the undef to make the
2717 // predicate pass or fail, so we can return undef.
2718 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2719 // icmp eq/ne X, undef -> undef.
2720 if ((N1.isUndef() || N2.isUndef()) &&
2721 (Cond == ISD::SETEQ || Cond == ISD::SETNE))
2722 return GetUndefBooleanConstant();
2723
2724 // If both operands are undef, we can return undef for int comparison.
2725 // icmp undef, undef -> undef.
2726 if (N1.isUndef() && N2.isUndef())
2727 return GetUndefBooleanConstant();
2728
2729 // icmp X, X -> true/false
2730 // icmp X, undef -> true/false because undef could be X.
2731 if (N1.isUndef() || N2.isUndef() || N1 == N2)
2732 return getBoolConstant(ISD::isTrueWhenEqual(Cond), dl, VT, OpVT);
2733 }
2734
2736 const APInt &C2 = N2C->getAPIntValue();
2738 const APInt &C1 = N1C->getAPIntValue();
2739
2741 dl, VT, OpVT);
2742 }
2743 }
2744
2745 auto *N1CFP = dyn_cast<ConstantFPSDNode>(N1);
2746 auto *N2CFP = dyn_cast<ConstantFPSDNode>(N2);
2747
2748 if (N1CFP && N2CFP) {
2749 APFloat::cmpResult R = N1CFP->getValueAPF().compare(N2CFP->getValueAPF());
2750 switch (Cond) {
2751 default: break;
2752 case ISD::SETEQ: if (R==APFloat::cmpUnordered)
2753 return GetUndefBooleanConstant();
2754 [[fallthrough]];
2755 case ISD::SETOEQ: return getBoolConstant(R==APFloat::cmpEqual, dl, VT,
2756 OpVT);
2757 case ISD::SETNE: if (R==APFloat::cmpUnordered)
2758 return GetUndefBooleanConstant();
2759 [[fallthrough]];
2761 R==APFloat::cmpLessThan, dl, VT,
2762 OpVT);
2763 case ISD::SETLT: if (R==APFloat::cmpUnordered)
2764 return GetUndefBooleanConstant();
2765 [[fallthrough]];
2766 case ISD::SETOLT: return getBoolConstant(R==APFloat::cmpLessThan, dl, VT,
2767 OpVT);
2768 case ISD::SETGT: if (R==APFloat::cmpUnordered)
2769 return GetUndefBooleanConstant();
2770 [[fallthrough]];
2772 VT, OpVT);
2773 case ISD::SETLE: if (R==APFloat::cmpUnordered)
2774 return GetUndefBooleanConstant();
2775 [[fallthrough]];
2777 R==APFloat::cmpEqual, dl, VT,
2778 OpVT);
2779 case ISD::SETGE: if (R==APFloat::cmpUnordered)
2780 return GetUndefBooleanConstant();
2781 [[fallthrough]];
2783 R==APFloat::cmpEqual, dl, VT, OpVT);
2784 case ISD::SETO: return getBoolConstant(R!=APFloat::cmpUnordered, dl, VT,
2785 OpVT);
2786 case ISD::SETUO: return getBoolConstant(R==APFloat::cmpUnordered, dl, VT,
2787 OpVT);
2789 R==APFloat::cmpEqual, dl, VT,
2790 OpVT);
2791 case ISD::SETUNE: return getBoolConstant(R!=APFloat::cmpEqual, dl, VT,
2792 OpVT);
2794 R==APFloat::cmpLessThan, dl, VT,
2795 OpVT);
2797 R==APFloat::cmpUnordered, dl, VT,
2798 OpVT);
2800 VT, OpVT);
2801 case ISD::SETUGE: return getBoolConstant(R!=APFloat::cmpLessThan, dl, VT,
2802 OpVT);
2803 }
2804 } else if (N1CFP && OpVT.isSimple() && !N2.isUndef()) {
2805 // Ensure that the constant occurs on the RHS.
2807 if (!TLI->isCondCodeLegal(SwappedCond, OpVT.getSimpleVT()))
2808 return SDValue();
2809 return getSetCC(dl, VT, N2, N1, SwappedCond, /*Chian=*/{},
2810 /*IsSignaling=*/false, Flags);
2811 } else if ((N2CFP && N2CFP->getValueAPF().isNaN()) ||
2812 (OpVT.isFloatingPoint() && (N1.isUndef() || N2.isUndef()))) {
2813 // If an operand is known to be a nan (or undef that could be a nan), we can
2814 // fold it.
2815 // Choosing NaN for the undef will always make unordered comparison succeed
2816 // and ordered comparison fails.
2817 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2818 switch (ISD::getUnorderedFlavor(Cond)) {
2819 default:
2820 llvm_unreachable("Unknown flavor!");
2821 case 0: // Known false.
2822 return getBoolConstant(false, dl, VT, OpVT);
2823 case 1: // Known true.
2824 return getBoolConstant(true, dl, VT, OpVT);
2825 case 2: // Undefined.
2826 return GetUndefBooleanConstant();
2827 }
2828 }
2829
2830 // Could not fold it.
2831 return SDValue();
2832}
2833
2834/// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We
2835/// use this predicate to simplify operations downstream.
2837 unsigned BitWidth = Op.getScalarValueSizeInBits();
2839}
2840
2841// TODO: Should have argument to specify if sign bit of nan is ignorable.
2843 if (Depth >= MaxRecursionDepth)
2844 return false; // Limit search depth.
2845
2846 unsigned Opc = Op.getOpcode();
2847 switch (Opc) {
2848 case ISD::FABS:
2849 return true;
2850 case ISD::AssertNoFPClass: {
2851 FPClassTest NoFPClass =
2852 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
2853
2854 const FPClassTest TestMask = fcNan | fcNegative;
2855 return (NoFPClass & TestMask) == TestMask;
2856 }
2857 case ISD::ARITH_FENCE:
2858 return SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2859 case ISD::FEXP:
2860 case ISD::FEXP2:
2861 case ISD::FEXP10:
2862 return Op->getFlags().hasNoNaNs();
2863 case ISD::FMINNUM:
2864 case ISD::FMINNUM_IEEE:
2865 case ISD::FMINIMUM:
2866 case ISD::FMINIMUMNUM:
2867 return SignBitIsZeroFP(Op.getOperand(1), Depth + 1) &&
2868 SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2869 case ISD::FMAXNUM:
2870 case ISD::FMAXNUM_IEEE:
2871 case ISD::FMAXIMUM:
2872 case ISD::FMAXIMUMNUM:
2873 // TODO: If we can ignore the sign bit of nans, only one side being known 0
2874 // is sufficient.
2875 return SignBitIsZeroFP(Op.getOperand(1), Depth + 1) &&
2876 SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2877 default:
2878 return false;
2879 }
2880
2881 llvm_unreachable("covered opcode switch");
2882}
2883
2884/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero. We use
2885/// this predicate to simplify operations downstream. Mask is known to be zero
2886/// for bits that V cannot have.
2888 unsigned Depth) const {
2889 return Mask.isSubsetOf(computeKnownBits(V, Depth).Zero);
2890}
2891
2892/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero in
2893/// DemandedElts. We use this predicate to simplify operations downstream.
2894/// Mask is known to be zero for bits that V cannot have.
2896 const APInt &DemandedElts,
2897 unsigned Depth) const {
2898 return Mask.isSubsetOf(computeKnownBits(V, DemandedElts, Depth).Zero);
2899}
2900
2901/// MaskedVectorIsZero - Return true if 'Op' is known to be zero in
2902/// DemandedElts. We use this predicate to simplify operations downstream.
2904 unsigned Depth /* = 0 */) const {
2905 return computeKnownBits(V, DemandedElts, Depth).isZero();
2906}
2907
2908/// MaskedValueIsAllOnes - Return true if '(Op & Mask) == Mask'.
2910 unsigned Depth) const {
2911 return Mask.isSubsetOf(computeKnownBits(V, Depth).One);
2912}
2913
2915 const APInt &DemandedElts,
2916 unsigned Depth) const {
2917 EVT VT = Op.getValueType();
2918 assert(VT.isVector() && !VT.isScalableVector() && "Only for fixed vectors!");
2919
2920 unsigned NumElts = VT.getVectorNumElements();
2921 assert(DemandedElts.getBitWidth() == NumElts && "Unexpected demanded mask.");
2922
2923 APInt KnownZeroElements = APInt::getZero(NumElts);
2924 for (unsigned EltIdx = 0; EltIdx != NumElts; ++EltIdx) {
2925 if (!DemandedElts[EltIdx])
2926 continue; // Don't query elements that are not demanded.
2927 APInt Mask = APInt::getOneBitSet(NumElts, EltIdx);
2928 if (MaskedVectorIsZero(Op, Mask, Depth))
2929 KnownZeroElements.setBit(EltIdx);
2930 }
2931 return KnownZeroElements;
2932}
2933
2934/// isSplatValue - Return true if the vector V has the same value
2935/// across all DemandedElts. For scalable vectors, we don't know the
2936/// number of lanes at compile time. Instead, we use a 1 bit APInt
2937/// to represent a conservative value for all lanes; that is, that
2938/// one bit value is implicitly splatted across all lanes.
2939bool SelectionDAG::isSplatValue(SDValue V, const APInt &DemandedElts,
2940 APInt &UndefElts, unsigned Depth) const {
2941 unsigned Opcode = V.getOpcode();
2942 EVT VT = V.getValueType();
2943 assert(VT.isVector() && "Vector type expected");
2944 assert((!VT.isScalableVector() || DemandedElts.getBitWidth() == 1) &&
2945 "scalable demanded bits are ignored");
2946
2947 if (!DemandedElts)
2948 return false; // No demanded elts, better to assume we don't know anything.
2949
2950 if (Depth >= MaxRecursionDepth)
2951 return false; // Limit search depth.
2952
2953 // Deal with some common cases here that work for both fixed and scalable
2954 // vector types.
2955 switch (Opcode) {
2956 case ISD::SPLAT_VECTOR:
2957 UndefElts = V.getOperand(0).isUndef()
2958 ? APInt::getAllOnes(DemandedElts.getBitWidth())
2959 : APInt(DemandedElts.getBitWidth(), 0);
2960 return true;
2961 case ISD::ADD:
2962 case ISD::SUB:
2963 case ISD::AND:
2964 case ISD::XOR:
2965 case ISD::OR: {
2966 APInt UndefLHS, UndefRHS;
2967 SDValue LHS = V.getOperand(0);
2968 SDValue RHS = V.getOperand(1);
2969 // Only recognize splats with the same demanded undef elements for both
2970 // operands, otherwise we might fail to handle binop-specific undef
2971 // handling.
2972 // e.g. (and undef, 0) -> 0 etc.
2973 if (isSplatValue(LHS, DemandedElts, UndefLHS, Depth + 1) &&
2974 isSplatValue(RHS, DemandedElts, UndefRHS, Depth + 1) &&
2975 (DemandedElts & UndefLHS) == (DemandedElts & UndefRHS)) {
2976 UndefElts = UndefLHS | UndefRHS;
2977 return true;
2978 }
2979 return false;
2980 }
2981 case ISD::ABS:
2982 case ISD::TRUNCATE:
2983 case ISD::SIGN_EXTEND:
2984 case ISD::ZERO_EXTEND:
2985 return isSplatValue(V.getOperand(0), DemandedElts, UndefElts, Depth + 1);
2986 default:
2987 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
2988 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
2989 return TLI->isSplatValueForTargetNode(V, DemandedElts, UndefElts, *this,
2990 Depth);
2991 break;
2992 }
2993
2994 // We don't support other cases than those above for scalable vectors at
2995 // the moment.
2996 if (VT.isScalableVector())
2997 return false;
2998
2999 unsigned NumElts = VT.getVectorNumElements();
3000 assert(NumElts == DemandedElts.getBitWidth() && "Vector size mismatch");
3001 UndefElts = APInt::getZero(NumElts);
3002
3003 switch (Opcode) {
3004 case ISD::BUILD_VECTOR: {
3005 SDValue Scl;
3006 for (unsigned i = 0; i != NumElts; ++i) {
3007 SDValue Op = V.getOperand(i);
3008 if (Op.isUndef()) {
3009 UndefElts.setBit(i);
3010 continue;
3011 }
3012 if (!DemandedElts[i])
3013 continue;
3014 if (Scl && Scl != Op)
3015 return false;
3016 Scl = Op;
3017 }
3018 return true;
3019 }
3020 case ISD::VECTOR_SHUFFLE: {
3021 // Check if this is a shuffle node doing a splat or a shuffle of a splat.
3022 APInt DemandedLHS = APInt::getZero(NumElts);
3023 APInt DemandedRHS = APInt::getZero(NumElts);
3024 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(V)->getMask();
3025 for (int i = 0; i != (int)NumElts; ++i) {
3026 int M = Mask[i];
3027 if (M < 0) {
3028 UndefElts.setBit(i);
3029 continue;
3030 }
3031 if (!DemandedElts[i])
3032 continue;
3033 if (M < (int)NumElts)
3034 DemandedLHS.setBit(M);
3035 else
3036 DemandedRHS.setBit(M - NumElts);
3037 }
3038
3039 // If we aren't demanding either op, assume there's no splat.
3040 // If we are demanding both ops, assume there's no splat.
3041 if ((DemandedLHS.isZero() && DemandedRHS.isZero()) ||
3042 (!DemandedLHS.isZero() && !DemandedRHS.isZero()))
3043 return false;
3044
3045 // See if the demanded elts of the source op is a splat or we only demand
3046 // one element, which should always be a splat.
3047 // TODO: Handle source ops splats with undefs.
3048 auto CheckSplatSrc = [&](SDValue Src, const APInt &SrcElts) {
3049 APInt SrcUndefs;
3050 return (SrcElts.popcount() == 1) ||
3051 (isSplatValue(Src, SrcElts, SrcUndefs, Depth + 1) &&
3052 (SrcElts & SrcUndefs).isZero());
3053 };
3054 if (!DemandedLHS.isZero())
3055 return CheckSplatSrc(V.getOperand(0), DemandedLHS);
3056 return CheckSplatSrc(V.getOperand(1), DemandedRHS);
3057 }
3059 // Offset the demanded elts by the subvector index.
3060 SDValue Src = V.getOperand(0);
3061 // We don't support scalable vectors at the moment.
3062 if (Src.getValueType().isScalableVector())
3063 return false;
3064 uint64_t Idx = V.getConstantOperandVal(1);
3065 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3066 APInt UndefSrcElts;
3067 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3068 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3069 UndefElts = UndefSrcElts.extractBits(NumElts, Idx);
3070 return true;
3071 }
3072 break;
3073 }
3077 // Widen the demanded elts by the src element count.
3078 SDValue Src = V.getOperand(0);
3079 // We don't support scalable vectors at the moment.
3080 if (Src.getValueType().isScalableVector())
3081 return false;
3082 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3083 APInt UndefSrcElts;
3084 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts);
3085 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3086 UndefElts = UndefSrcElts.trunc(NumElts);
3087 return true;
3088 }
3089 break;
3090 }
3091 case ISD::BITCAST: {
3092 SDValue Src = V.getOperand(0);
3093 EVT SrcVT = Src.getValueType();
3094 unsigned SrcBitWidth = SrcVT.getScalarSizeInBits();
3095 unsigned BitWidth = VT.getScalarSizeInBits();
3096
3097 // Ignore bitcasts from unsupported types.
3098 // TODO: Add fp support?
3099 if (!SrcVT.isVector() || !SrcVT.isInteger() || !VT.isInteger())
3100 break;
3101
3102 // Bitcast 'small element' vector to 'large element' vector.
3103 if ((BitWidth % SrcBitWidth) == 0) {
3104 // See if each sub element is a splat.
3105 unsigned Scale = BitWidth / SrcBitWidth;
3106 unsigned NumSrcElts = SrcVT.getVectorNumElements();
3107 APInt ScaledDemandedElts =
3108 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
3109 for (unsigned I = 0; I != Scale; ++I) {
3110 APInt SubUndefElts;
3111 APInt SubDemandedElt = APInt::getOneBitSet(Scale, I);
3112 APInt SubDemandedElts = APInt::getSplat(NumSrcElts, SubDemandedElt);
3113 SubDemandedElts &= ScaledDemandedElts;
3114 if (!isSplatValue(Src, SubDemandedElts, SubUndefElts, Depth + 1))
3115 return false;
3116 // TODO: Add support for merging sub undef elements.
3117 if (!SubUndefElts.isZero())
3118 return false;
3119 }
3120 return true;
3121 }
3122 break;
3123 }
3124 }
3125
3126 return false;
3127}
3128
3129/// Helper wrapper to main isSplatValue function.
3130bool SelectionDAG::isSplatValue(SDValue V, bool AllowUndefs) const {
3131 EVT VT = V.getValueType();
3132 assert(VT.isVector() && "Vector type expected");
3133
3134 APInt UndefElts;
3135 // Since the number of lanes in a scalable vector is unknown at compile time,
3136 // we track one bit which is implicitly broadcast to all lanes. This means
3137 // that all lanes in a scalable vector are considered demanded.
3138 APInt DemandedElts
3140 return isSplatValue(V, DemandedElts, UndefElts) &&
3141 (AllowUndefs || !UndefElts);
3142}
3143
3146
3147 EVT VT = V.getValueType();
3148 unsigned Opcode = V.getOpcode();
3149 switch (Opcode) {
3150 default: {
3151 APInt UndefElts;
3152 // Since the number of lanes in a scalable vector is unknown at compile time,
3153 // we track one bit which is implicitly broadcast to all lanes. This means
3154 // that all lanes in a scalable vector are considered demanded.
3155 APInt DemandedElts
3157
3158 if (isSplatValue(V, DemandedElts, UndefElts)) {
3159 if (VT.isScalableVector()) {
3160 // DemandedElts and UndefElts are ignored for scalable vectors, since
3161 // the only supported cases are SPLAT_VECTOR nodes.
3162 SplatIdx = 0;
3163 } else {
3164 // Handle case where all demanded elements are UNDEF.
3165 if (DemandedElts.isSubsetOf(UndefElts)) {
3166 SplatIdx = 0;
3167 return getUNDEF(VT);
3168 }
3169 SplatIdx = (UndefElts & DemandedElts).countr_one();
3170 }
3171 return V;
3172 }
3173 break;
3174 }
3175 case ISD::SPLAT_VECTOR:
3176 SplatIdx = 0;
3177 return V;
3178 case ISD::VECTOR_SHUFFLE: {
3179 assert(!VT.isScalableVector());
3180 // Check if this is a shuffle node doing a splat.
3181 // TODO - remove this and rely purely on SelectionDAG::isSplatValue,
3182 // getTargetVShiftNode currently struggles without the splat source.
3183 auto *SVN = cast<ShuffleVectorSDNode>(V);
3184 if (!SVN->isSplat())
3185 break;
3186 int Idx = SVN->getSplatIndex();
3187 int NumElts = V.getValueType().getVectorNumElements();
3188 SplatIdx = Idx % NumElts;
3189 return V.getOperand(Idx / NumElts);
3190 }
3191 }
3192
3193 return SDValue();
3194}
3195
3197 int SplatIdx;
3198 if (SDValue SrcVector = getSplatSourceVector(V, SplatIdx)) {
3199 EVT SVT = SrcVector.getValueType().getScalarType();
3200 EVT LegalSVT = SVT;
3201 if (LegalTypes && !TLI->isTypeLegal(SVT)) {
3202 if (!SVT.isInteger())
3203 return SDValue();
3204 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
3205 if (LegalSVT.bitsLT(SVT))
3206 return SDValue();
3207 }
3208 return getExtractVectorElt(SDLoc(V), LegalSVT, SrcVector, SplatIdx);
3209 }
3210 return SDValue();
3211}
3212
3213std::optional<ConstantRange>
3215 unsigned Depth) const {
3216 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3217 V.getOpcode() == ISD::SRA) &&
3218 "Unknown shift node");
3219 // Shifting more than the bitwidth is not valid.
3220 unsigned BitWidth = V.getScalarValueSizeInBits();
3221
3222 if (auto *Cst = dyn_cast<ConstantSDNode>(V.getOperand(1))) {
3223 const APInt &ShAmt = Cst->getAPIntValue();
3224 if (ShAmt.uge(BitWidth))
3225 return std::nullopt;
3226 return ConstantRange(ShAmt);
3227 }
3228
3229 if (auto *BV = dyn_cast<BuildVectorSDNode>(V.getOperand(1))) {
3230 const APInt *MinAmt = nullptr, *MaxAmt = nullptr;
3231 for (unsigned i = 0, e = BV->getNumOperands(); i != e; ++i) {
3232 if (!DemandedElts[i])
3233 continue;
3234 auto *SA = dyn_cast<ConstantSDNode>(BV->getOperand(i));
3235 if (!SA) {
3236 MinAmt = MaxAmt = nullptr;
3237 break;
3238 }
3239 const APInt &ShAmt = SA->getAPIntValue();
3240 if (ShAmt.uge(BitWidth))
3241 return std::nullopt;
3242 if (!MinAmt || MinAmt->ugt(ShAmt))
3243 MinAmt = &ShAmt;
3244 if (!MaxAmt || MaxAmt->ult(ShAmt))
3245 MaxAmt = &ShAmt;
3246 }
3247 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
3248 "Failed to find matching min/max shift amounts");
3249 if (MinAmt && MaxAmt)
3250 return ConstantRange(*MinAmt, *MaxAmt + 1);
3251 }
3252
3253 // Use computeKnownBits to find a hidden constant/knownbits (usually type
3254 // legalized). e.g. Hidden behind multiple bitcasts/build_vector/casts etc.
3255 KnownBits KnownAmt = computeKnownBits(V.getOperand(1), DemandedElts, Depth);
3256 if (KnownAmt.getMaxValue().ult(BitWidth))
3257 return ConstantRange::fromKnownBits(KnownAmt, /*IsSigned=*/false);
3258
3259 return std::nullopt;
3260}
3261
3262std::optional<unsigned>
3264 unsigned Depth) const {
3265 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3266 V.getOpcode() == ISD::SRA) &&
3267 "Unknown shift node");
3268 if (std::optional<ConstantRange> AmtRange =
3269 getValidShiftAmountRange(V, DemandedElts, Depth))
3270 if (const APInt *ShAmt = AmtRange->getSingleElement())
3271 return ShAmt->getZExtValue();
3272 return std::nullopt;
3273}
3274
3275std::optional<unsigned>
3277 EVT VT = V.getValueType();
3278 APInt DemandedElts = VT.isFixedLengthVector()
3280 : APInt(1, 1);
3281 return getValidShiftAmount(V, DemandedElts, Depth);
3282}
3283
3284std::optional<unsigned>
3286 unsigned Depth) const {
3287 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3288 V.getOpcode() == ISD::SRA) &&
3289 "Unknown shift node");
3290 if (std::optional<ConstantRange> AmtRange =
3291 getValidShiftAmountRange(V, DemandedElts, Depth))
3292 return AmtRange->getUnsignedMin().getZExtValue();
3293 return std::nullopt;
3294}
3295
3296std::optional<unsigned>
3298 EVT VT = V.getValueType();
3299 APInt DemandedElts = VT.isFixedLengthVector()
3301 : APInt(1, 1);
3302 return getValidMinimumShiftAmount(V, DemandedElts, Depth);
3303}
3304
3305std::optional<unsigned>
3307 unsigned Depth) const {
3308 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3309 V.getOpcode() == ISD::SRA) &&
3310 "Unknown shift node");
3311 if (std::optional<ConstantRange> AmtRange =
3312 getValidShiftAmountRange(V, DemandedElts, Depth))
3313 return AmtRange->getUnsignedMax().getZExtValue();
3314 return std::nullopt;
3315}
3316
3317std::optional<unsigned>
3319 EVT VT = V.getValueType();
3320 APInt DemandedElts = VT.isFixedLengthVector()
3322 : APInt(1, 1);
3323 return getValidMaximumShiftAmount(V, DemandedElts, Depth);
3324}
3325
3326/// Determine which bits of Op are known to be either zero or one and return
3327/// them in Known. For vectors, the known bits are those that are shared by
3328/// every vector element.
3330 EVT VT = Op.getValueType();
3331
3332 // Since the number of lanes in a scalable vector is unknown at compile time,
3333 // we track one bit which is implicitly broadcast to all lanes. This means
3334 // that all lanes in a scalable vector are considered demanded.
3335 APInt DemandedElts = VT.isFixedLengthVector()
3337 : APInt(1, 1);
3338 return computeKnownBits(Op, DemandedElts, Depth);
3339}
3340
3341/// Determine which bits of Op are known to be either zero or one and return
3342/// them in Known. The DemandedElts argument allows us to only collect the known
3343/// bits that are shared by the requested vector elements.
3345 unsigned Depth) const {
3346 unsigned BitWidth = Op.getScalarValueSizeInBits();
3347
3348 KnownBits Known(BitWidth); // Don't know anything.
3349
3350 if (auto OptAPInt = Op->bitcastToAPInt()) {
3351 // We know all of the bits for a constant!
3352 return KnownBits::makeConstant(*std::move(OptAPInt));
3353 }
3354
3355 if (Depth >= MaxRecursionDepth)
3356 return Known; // Limit search depth.
3357
3358 KnownBits Known2;
3359 unsigned NumElts = DemandedElts.getBitWidth();
3360 assert((!Op.getValueType().isScalableVector() || NumElts == 1) &&
3361 "DemandedElts for scalable vectors must be 1 to represent all lanes");
3362 assert((!Op.getValueType().isFixedLengthVector() ||
3363 NumElts == Op.getValueType().getVectorNumElements()) &&
3364 "Unexpected vector size");
3365
3366 if (!DemandedElts)
3367 return Known; // No demanded elts, better to assume we don't know anything.
3368
3369 unsigned Opcode = Op.getOpcode();
3370 switch (Opcode) {
3371 case ISD::MERGE_VALUES:
3372 return computeKnownBits(Op.getOperand(Op.getResNo()), DemandedElts,
3373 Depth + 1);
3374 case ISD::SPLAT_VECTOR: {
3375 SDValue SrcOp = Op.getOperand(0);
3376 assert(SrcOp.getValueSizeInBits() >= BitWidth &&
3377 "Expected SPLAT_VECTOR implicit truncation");
3378 // Implicitly truncate the bits to match the official semantics of
3379 // SPLAT_VECTOR.
3380 Known = computeKnownBits(SrcOp, Depth + 1).trunc(BitWidth);
3381 break;
3382 }
3384 unsigned ScalarSize = Op.getOperand(0).getScalarValueSizeInBits();
3385 assert(ScalarSize * Op.getNumOperands() == BitWidth &&
3386 "Expected SPLAT_VECTOR_PARTS scalars to cover element width");
3387 for (auto [I, SrcOp] : enumerate(Op->ops())) {
3388 Known.insertBits(computeKnownBits(SrcOp, Depth + 1), ScalarSize * I);
3389 }
3390 break;
3391 }
3392 case ISD::STEP_VECTOR: {
3393 const APInt &Step = Op.getConstantOperandAPInt(0);
3394
3395 if (Step.isPowerOf2())
3396 Known.Zero.setLowBits(Step.logBase2());
3397
3399
3400 if (!isUIntN(BitWidth, Op.getValueType().getVectorMinNumElements()))
3401 break;
3402 const APInt MinNumElts =
3403 APInt(BitWidth, Op.getValueType().getVectorMinNumElements());
3404
3405 bool Overflow;
3406 const APInt MaxNumElts = getVScaleRange(&F, BitWidth)
3408 .umul_ov(MinNumElts, Overflow);
3409 if (Overflow)
3410 break;
3411
3412 const APInt MaxValue = (MaxNumElts - 1).umul_ov(Step, Overflow);
3413 if (Overflow)
3414 break;
3415
3416 Known.Zero.setHighBits(MaxValue.countl_zero());
3417 break;
3418 }
3419 case ISD::BUILD_VECTOR:
3420 assert(!Op.getValueType().isScalableVector());
3421 // Collect the known bits that are shared by every demanded vector element.
3422 Known.setAllConflict();
3423 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
3424 if (!DemandedElts[i])
3425 continue;
3426
3427 SDValue SrcOp = Op.getOperand(i);
3428 Known2 = computeKnownBits(SrcOp, Depth + 1);
3429
3430 // BUILD_VECTOR can implicitly truncate sources, we must handle this.
3431 if (SrcOp.getValueSizeInBits() != BitWidth) {
3432 assert(SrcOp.getValueSizeInBits() > BitWidth &&
3433 "Expected BUILD_VECTOR implicit truncation");
3434 Known2 = Known2.trunc(BitWidth);
3435 }
3436
3437 // Known bits are the values that are shared by every demanded element.
3438 Known = Known.intersectWith(Known2);
3439
3440 // If we don't know any bits, early out.
3441 if (Known.isUnknown())
3442 break;
3443 }
3444 break;
3445 case ISD::VECTOR_COMPRESS: {
3446 SDValue Vec = Op.getOperand(0);
3447 SDValue PassThru = Op.getOperand(2);
3448 Known = computeKnownBits(PassThru, DemandedElts, Depth + 1);
3449 // If we don't know any bits, early out.
3450 if (Known.isUnknown())
3451 break;
3452 Known2 = computeKnownBits(Vec, Depth + 1);
3453 Known = Known.intersectWith(Known2);
3454 break;
3455 }
3456 case ISD::VECTOR_SHUFFLE: {
3457 assert(!Op.getValueType().isScalableVector());
3458 // Collect the known bits that are shared by every vector element referenced
3459 // by the shuffle.
3460 APInt DemandedLHS, DemandedRHS;
3462 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
3463 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
3464 DemandedLHS, DemandedRHS))
3465 break;
3466
3467 // Known bits are the values that are shared by every demanded element.
3468 Known.setAllConflict();
3469 if (!!DemandedLHS) {
3470 SDValue LHS = Op.getOperand(0);
3471 Known2 = computeKnownBits(LHS, DemandedLHS, Depth + 1);
3472 Known = Known.intersectWith(Known2);
3473 }
3474 // If we don't know any bits, early out.
3475 if (Known.isUnknown())
3476 break;
3477 if (!!DemandedRHS) {
3478 SDValue RHS = Op.getOperand(1);
3479 Known2 = computeKnownBits(RHS, DemandedRHS, Depth + 1);
3480 Known = Known.intersectWith(Known2);
3481 }
3482 break;
3483 }
3484 case ISD::VSCALE: {
3486 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
3487 Known = getVScaleRange(&F, BitWidth).multiply(Multiplier).toKnownBits();
3488 break;
3489 }
3490 case ISD::CONCAT_VECTORS: {
3491 if (Op.getValueType().isScalableVector())
3492 break;
3493 // Split DemandedElts and test each of the demanded subvectors.
3494 Known.setAllConflict();
3495 EVT SubVectorVT = Op.getOperand(0).getValueType();
3496 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
3497 unsigned NumSubVectors = Op.getNumOperands();
3498 for (unsigned i = 0; i != NumSubVectors; ++i) {
3499 APInt DemandedSub =
3500 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
3501 if (!!DemandedSub) {
3502 SDValue Sub = Op.getOperand(i);
3503 Known2 = computeKnownBits(Sub, DemandedSub, Depth + 1);
3504 Known = Known.intersectWith(Known2);
3505 }
3506 // If we don't know any bits, early out.
3507 if (Known.isUnknown())
3508 break;
3509 }
3510 break;
3511 }
3512 case ISD::INSERT_SUBVECTOR: {
3513 if (Op.getValueType().isScalableVector())
3514 break;
3515 // Demand any elements from the subvector and the remainder from the src its
3516 // inserted into.
3517 SDValue Src = Op.getOperand(0);
3518 SDValue Sub = Op.getOperand(1);
3519 uint64_t Idx = Op.getConstantOperandVal(2);
3520 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
3521 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
3522 APInt DemandedSrcElts = DemandedElts;
3523 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
3524
3525 Known.setAllConflict();
3526 if (!!DemandedSubElts) {
3527 Known = computeKnownBits(Sub, DemandedSubElts, Depth + 1);
3528 if (Known.isUnknown())
3529 break; // early-out.
3530 }
3531 if (!!DemandedSrcElts) {
3532 Known2 = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3533 Known = Known.intersectWith(Known2);
3534 }
3535 break;
3536 }
3538 // Offset the demanded elts by the subvector index.
3539 SDValue Src = Op.getOperand(0);
3540
3541 APInt DemandedSrcElts;
3542 if (Src.getValueType().isScalableVector())
3543 DemandedSrcElts = APInt(1, 1); // <=> 'demand all elements'
3544 else {
3545 uint64_t Idx = Op.getConstantOperandVal(1);
3546 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3547 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3548 }
3549 Known = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3550 break;
3551 }
3552 case ISD::SCALAR_TO_VECTOR: {
3553 if (Op.getValueType().isScalableVector())
3554 break;
3555 // We know about scalar_to_vector as much as we know about it source,
3556 // which becomes the first element of otherwise unknown vector.
3557 if (DemandedElts != 1)
3558 break;
3559
3560 SDValue N0 = Op.getOperand(0);
3561 Known = computeKnownBits(N0, Depth + 1);
3562 if (N0.getValueSizeInBits() != BitWidth)
3563 Known = Known.trunc(BitWidth);
3564
3565 break;
3566 }
3567 case ISD::BITCAST: {
3568 if (Op.getValueType().isScalableVector())
3569 break;
3570
3571 SDValue N0 = Op.getOperand(0);
3572 EVT SubVT = N0.getValueType();
3573 unsigned SubBitWidth = SubVT.getScalarSizeInBits();
3574
3575 // Ignore bitcasts from unsupported types.
3576 if (!(SubVT.isInteger() || SubVT.isFloatingPoint()))
3577 break;
3578
3579 // Fast handling of 'identity' bitcasts.
3580 if (BitWidth == SubBitWidth) {
3581 Known = computeKnownBits(N0, DemandedElts, Depth + 1);
3582 break;
3583 }
3584
3585 bool IsLE = getDataLayout().isLittleEndian();
3586
3587 // Bitcast 'small element' vector to 'large element' scalar/vector.
3588 if ((BitWidth % SubBitWidth) == 0) {
3589 assert(N0.getValueType().isVector() && "Expected bitcast from vector");
3590
3591 // Collect known bits for the (larger) output by collecting the known
3592 // bits from each set of sub elements and shift these into place.
3593 // We need to separately call computeKnownBits for each set of
3594 // sub elements as the knownbits for each is likely to be different.
3595 unsigned SubScale = BitWidth / SubBitWidth;
3596 APInt SubDemandedElts(NumElts * SubScale, 0);
3597 for (unsigned i = 0; i != NumElts; ++i)
3598 if (DemandedElts[i])
3599 SubDemandedElts.setBit(i * SubScale);
3600
3601 for (unsigned i = 0; i != SubScale; ++i) {
3602 Known2 = computeKnownBits(N0, SubDemandedElts.shl(i),
3603 Depth + 1);
3604 unsigned Shifts = IsLE ? i : SubScale - 1 - i;
3605 Known.insertBits(Known2, SubBitWidth * Shifts);
3606 }
3607 }
3608
3609 // Bitcast 'large element' scalar/vector to 'small element' vector.
3610 if ((SubBitWidth % BitWidth) == 0) {
3611 assert(Op.getValueType().isVector() && "Expected bitcast to vector");
3612
3613 // Collect known bits for the (smaller) output by collecting the known
3614 // bits from the overlapping larger input elements and extracting the
3615 // sub sections we actually care about.
3616 unsigned SubScale = SubBitWidth / BitWidth;
3617 APInt SubDemandedElts =
3618 APIntOps::ScaleBitMask(DemandedElts, NumElts / SubScale);
3619 Known2 = computeKnownBits(N0, SubDemandedElts, Depth + 1);
3620
3621 Known.setAllConflict();
3622 for (unsigned i = 0; i != NumElts; ++i)
3623 if (DemandedElts[i]) {
3624 unsigned Shifts = IsLE ? i : NumElts - 1 - i;
3625 unsigned Offset = (Shifts % SubScale) * BitWidth;
3626 Known = Known.intersectWith(Known2.extractBits(BitWidth, Offset));
3627 // If we don't know any bits, early out.
3628 if (Known.isUnknown())
3629 break;
3630 }
3631 }
3632 break;
3633 }
3634 case ISD::AND:
3635 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3636 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3637
3638 Known &= Known2;
3639 break;
3640 case ISD::OR:
3641 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3642 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3643
3644 Known |= Known2;
3645 break;
3646 case ISD::XOR:
3647 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3648 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3649
3650 Known ^= Known2;
3651 break;
3652 case ISD::MUL: {
3653 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3654 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3655 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3656 // TODO: SelfMultiply can be poison, but not undef.
3657 if (SelfMultiply)
3658 SelfMultiply &= isGuaranteedNotToBeUndefOrPoison(
3659 Op.getOperand(0), DemandedElts, false, Depth + 1);
3660 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3661
3662 // If the multiplication is known not to overflow, the product of a number
3663 // with itself is non-negative. Only do this if we didn't already computed
3664 // the opposite value for the sign bit.
3665 if (Op->getFlags().hasNoSignedWrap() &&
3666 Op.getOperand(0) == Op.getOperand(1) &&
3667 !Known.isNegative())
3668 Known.makeNonNegative();
3669 break;
3670 }
3671 case ISD::MULHU: {
3672 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3673 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3674 Known = KnownBits::mulhu(Known, Known2);
3675 break;
3676 }
3677 case ISD::MULHS: {
3678 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3679 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3680 Known = KnownBits::mulhs(Known, Known2);
3681 break;
3682 }
3683 case ISD::ABDU: {
3684 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3685 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3686 Known = KnownBits::abdu(Known, Known2);
3687 break;
3688 }
3689 case ISD::ABDS: {
3690 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3691 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3692 Known = KnownBits::abds(Known, Known2);
3693 unsigned SignBits1 =
3694 ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
3695 if (SignBits1 == 1)
3696 break;
3697 unsigned SignBits0 =
3698 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
3699 Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
3700 break;
3701 }
3702 case ISD::UMUL_LOHI: {
3703 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3704 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3705 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3706 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3707 if (Op.getResNo() == 0)
3708 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3709 else
3710 Known = KnownBits::mulhu(Known, Known2);
3711 break;
3712 }
3713 case ISD::SMUL_LOHI: {
3714 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3715 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3716 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3717 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3718 if (Op.getResNo() == 0)
3719 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3720 else
3721 Known = KnownBits::mulhs(Known, Known2);
3722 break;
3723 }
3724 case ISD::AVGFLOORU: {
3725 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3726 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3727 Known = KnownBits::avgFloorU(Known, Known2);
3728 break;
3729 }
3730 case ISD::AVGCEILU: {
3731 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3732 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3733 Known = KnownBits::avgCeilU(Known, Known2);
3734 break;
3735 }
3736 case ISD::AVGFLOORS: {
3737 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3738 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3739 Known = KnownBits::avgFloorS(Known, Known2);
3740 break;
3741 }
3742 case ISD::AVGCEILS: {
3743 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3744 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3745 Known = KnownBits::avgCeilS(Known, Known2);
3746 break;
3747 }
3748 case ISD::SELECT:
3749 case ISD::VSELECT:
3750 Known = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3751 // If we don't know any bits, early out.
3752 if (Known.isUnknown())
3753 break;
3754 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth+1);
3755
3756 // Only known if known in both the LHS and RHS.
3757 Known = Known.intersectWith(Known2);
3758 break;
3759 case ISD::SELECT_CC:
3760 Known = computeKnownBits(Op.getOperand(3), DemandedElts, Depth+1);
3761 // If we don't know any bits, early out.
3762 if (Known.isUnknown())
3763 break;
3764 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3765
3766 // Only known if known in both the LHS and RHS.
3767 Known = Known.intersectWith(Known2);
3768 break;
3769 case ISD::SMULO:
3770 case ISD::UMULO:
3771 if (Op.getResNo() != 1)
3772 break;
3773 // The boolean result conforms to getBooleanContents.
3774 // If we know the result of a setcc has the top bits zero, use this info.
3775 // We know that we have an integer-based boolean since these operations
3776 // are only available for integer.
3777 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
3779 BitWidth > 1)
3780 Known.Zero.setBitsFrom(1);
3781 break;
3782 case ISD::SETCC:
3783 case ISD::SETCCCARRY:
3784 case ISD::STRICT_FSETCC:
3785 case ISD::STRICT_FSETCCS: {
3786 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
3787 // If we know the result of a setcc has the top bits zero, use this info.
3788 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
3790 BitWidth > 1)
3791 Known.Zero.setBitsFrom(1);
3792 break;
3793 }
3794 case ISD::SHL: {
3795 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3796 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3797
3798 bool NUW = Op->getFlags().hasNoUnsignedWrap();
3799 bool NSW = Op->getFlags().hasNoSignedWrap();
3800
3801 bool ShAmtNonZero = Known2.isNonZero();
3802
3803 Known = KnownBits::shl(Known, Known2, NUW, NSW, ShAmtNonZero);
3804
3805 // Minimum shift low bits are known zero.
3806 if (std::optional<unsigned> ShMinAmt =
3807 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
3808 Known.Zero.setLowBits(*ShMinAmt);
3809 break;
3810 }
3811 case ISD::SRL:
3812 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3813 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3814 Known = KnownBits::lshr(Known, Known2, /*ShAmtNonZero=*/false,
3815 Op->getFlags().hasExact());
3816
3817 // Minimum shift high bits are known zero.
3818 if (std::optional<unsigned> ShMinAmt =
3819 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
3820 Known.Zero.setHighBits(*ShMinAmt);
3821 break;
3822 case ISD::SRA:
3823 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3824 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3825 Known = KnownBits::ashr(Known, Known2, /*ShAmtNonZero=*/false,
3826 Op->getFlags().hasExact());
3827 break;
3828 case ISD::ROTL:
3829 case ISD::ROTR:
3830 if (ConstantSDNode *C =
3831 isConstOrConstSplat(Op.getOperand(1), DemandedElts)) {
3832 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3833
3834 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3835
3836 // Canonicalize to ROTR.
3837 if (Opcode == ISD::ROTL && Amt != 0)
3838 Amt = BitWidth - Amt;
3839
3840 Known.Zero = Known.Zero.rotr(Amt);
3841 Known.One = Known.One.rotr(Amt);
3842 }
3843 break;
3844 case ISD::FSHL:
3845 case ISD::FSHR:
3846 if (ConstantSDNode *C = isConstOrConstSplat(Op.getOperand(2), DemandedElts)) {
3847 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3848
3849 // For fshl, 0-shift returns the 1st arg.
3850 // For fshr, 0-shift returns the 2nd arg.
3851 if (Amt == 0) {
3852 Known = computeKnownBits(Op.getOperand(Opcode == ISD::FSHL ? 0 : 1),
3853 DemandedElts, Depth + 1);
3854 break;
3855 }
3856
3857 // fshl: (X << (Z % BW)) | (Y >> (BW - (Z % BW)))
3858 // fshr: (X << (BW - (Z % BW))) | (Y >> (Z % BW))
3859 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3860 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3861 if (Opcode == ISD::FSHL) {
3862 Known <<= Amt;
3863 Known2 >>= BitWidth - Amt;
3864 } else {
3865 Known <<= BitWidth - Amt;
3866 Known2 >>= Amt;
3867 }
3868 Known = Known.unionWith(Known2);
3869 }
3870 break;
3871 case ISD::SHL_PARTS:
3872 case ISD::SRA_PARTS:
3873 case ISD::SRL_PARTS: {
3874 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3875
3876 // Collect lo/hi source values and concatenate.
3877 unsigned LoBits = Op.getOperand(0).getScalarValueSizeInBits();
3878 unsigned HiBits = Op.getOperand(1).getScalarValueSizeInBits();
3879 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3880 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3881 Known = Known2.concat(Known);
3882
3883 // Collect shift amount.
3884 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
3885
3886 if (Opcode == ISD::SHL_PARTS)
3887 Known = KnownBits::shl(Known, Known2);
3888 else if (Opcode == ISD::SRA_PARTS)
3889 Known = KnownBits::ashr(Known, Known2);
3890 else // if (Opcode == ISD::SRL_PARTS)
3891 Known = KnownBits::lshr(Known, Known2);
3892
3893 // TODO: Minimum shift low/high bits are known zero.
3894
3895 if (Op.getResNo() == 0)
3896 Known = Known.extractBits(LoBits, 0);
3897 else
3898 Known = Known.extractBits(HiBits, LoBits);
3899 break;
3900 }
3902 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3903 EVT EVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
3904 Known = Known.sextInReg(EVT.getScalarSizeInBits());
3905 break;
3906 }
3907 case ISD::CTTZ:
3908 case ISD::CTTZ_ZERO_UNDEF: {
3909 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3910 // If we have a known 1, its position is our upper bound.
3911 unsigned PossibleTZ = Known2.countMaxTrailingZeros();
3912 unsigned LowBits = llvm::bit_width(PossibleTZ);
3913 Known.Zero.setBitsFrom(LowBits);
3914 break;
3915 }
3916 case ISD::CTLZ:
3917 case ISD::CTLZ_ZERO_UNDEF: {
3918 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3919 // If we have a known 1, its position is our upper bound.
3920 unsigned PossibleLZ = Known2.countMaxLeadingZeros();
3921 unsigned LowBits = llvm::bit_width(PossibleLZ);
3922 Known.Zero.setBitsFrom(LowBits);
3923 break;
3924 }
3925 case ISD::CTLS: {
3926 unsigned MinRedundantSignBits =
3927 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1;
3928 ConstantRange Range(APInt(BitWidth, MinRedundantSignBits),
3930 Known = Range.toKnownBits();
3931 break;
3932 }
3933 case ISD::CTPOP: {
3934 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3935 // If we know some of the bits are zero, they can't be one.
3936 unsigned PossibleOnes = Known2.countMaxPopulation();
3937 Known.Zero.setBitsFrom(llvm::bit_width(PossibleOnes));
3938 break;
3939 }
3940 case ISD::PARITY: {
3941 // Parity returns 0 everywhere but the LSB.
3942 Known.Zero.setBitsFrom(1);
3943 break;
3944 }
3945 case ISD::CLMUL: {
3946 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3947 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3948 Known = KnownBits::clmul(Known, Known2);
3949 break;
3950 }
3951 case ISD::MGATHER:
3952 case ISD::MLOAD: {
3953 ISD::LoadExtType ETy =
3954 (Opcode == ISD::MGATHER)
3955 ? cast<MaskedGatherSDNode>(Op)->getExtensionType()
3956 : cast<MaskedLoadSDNode>(Op)->getExtensionType();
3957 if (ETy == ISD::ZEXTLOAD) {
3958 EVT MemVT = cast<MemSDNode>(Op)->getMemoryVT();
3959 KnownBits Known0(MemVT.getScalarSizeInBits());
3960 return Known0.zext(BitWidth);
3961 }
3962 break;
3963 }
3964 case ISD::LOAD: {
3966 const Constant *Cst = TLI->getTargetConstantFromLoad(LD);
3967 if (ISD::isNON_EXTLoad(LD) && Cst) {
3968 // Determine any common known bits from the loaded constant pool value.
3969 Type *CstTy = Cst->getType();
3970 if ((NumElts * BitWidth) == CstTy->getPrimitiveSizeInBits() &&
3971 !Op.getValueType().isScalableVector()) {
3972 // If its a vector splat, then we can (quickly) reuse the scalar path.
3973 // NOTE: We assume all elements match and none are UNDEF.
3974 if (CstTy->isVectorTy()) {
3975 if (const Constant *Splat = Cst->getSplatValue()) {
3976 Cst = Splat;
3977 CstTy = Cst->getType();
3978 }
3979 }
3980 // TODO - do we need to handle different bitwidths?
3981 if (CstTy->isVectorTy() && BitWidth == CstTy->getScalarSizeInBits()) {
3982 // Iterate across all vector elements finding common known bits.
3983 Known.setAllConflict();
3984 for (unsigned i = 0; i != NumElts; ++i) {
3985 if (!DemandedElts[i])
3986 continue;
3987 if (Constant *Elt = Cst->getAggregateElement(i)) {
3988 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
3989 const APInt &Value = CInt->getValue();
3990 Known.One &= Value;
3991 Known.Zero &= ~Value;
3992 continue;
3993 }
3994 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
3995 APInt Value = CFP->getValueAPF().bitcastToAPInt();
3996 Known.One &= Value;
3997 Known.Zero &= ~Value;
3998 continue;
3999 }
4000 }
4001 Known.One.clearAllBits();
4002 Known.Zero.clearAllBits();
4003 break;
4004 }
4005 } else if (BitWidth == CstTy->getPrimitiveSizeInBits()) {
4006 if (auto *CInt = dyn_cast<ConstantInt>(Cst)) {
4007 Known = KnownBits::makeConstant(CInt->getValue());
4008 } else if (auto *CFP = dyn_cast<ConstantFP>(Cst)) {
4009 Known =
4010 KnownBits::makeConstant(CFP->getValueAPF().bitcastToAPInt());
4011 }
4012 }
4013 }
4014 } else if (Op.getResNo() == 0) {
4015 unsigned ScalarMemorySize = LD->getMemoryVT().getScalarSizeInBits();
4016 KnownBits KnownScalarMemory(ScalarMemorySize);
4017 if (const MDNode *MD = LD->getRanges())
4018 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4019
4020 // Extend the Known bits from memory to the size of the scalar result.
4021 if (ISD::isZEXTLoad(Op.getNode()))
4022 Known = KnownScalarMemory.zext(BitWidth);
4023 else if (ISD::isSEXTLoad(Op.getNode()))
4024 Known = KnownScalarMemory.sext(BitWidth);
4025 else if (ISD::isEXTLoad(Op.getNode()))
4026 Known = KnownScalarMemory.anyext(BitWidth);
4027 else
4028 Known = KnownScalarMemory;
4029 assert(Known.getBitWidth() == BitWidth);
4030 return Known;
4031 }
4032 break;
4033 }
4035 if (Op.getValueType().isScalableVector())
4036 break;
4037 EVT InVT = Op.getOperand(0).getValueType();
4038 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4039 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4040 Known = Known.zext(BitWidth);
4041 break;
4042 }
4043 case ISD::ZERO_EXTEND: {
4044 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4045 Known = Known.zext(BitWidth);
4046 break;
4047 }
4049 if (Op.getValueType().isScalableVector())
4050 break;
4051 EVT InVT = Op.getOperand(0).getValueType();
4052 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4053 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4054 // If the sign bit is known to be zero or one, then sext will extend
4055 // it to the top bits, else it will just zext.
4056 Known = Known.sext(BitWidth);
4057 break;
4058 }
4059 case ISD::SIGN_EXTEND: {
4060 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4061 // If the sign bit is known to be zero or one, then sext will extend
4062 // it to the top bits, else it will just zext.
4063 Known = Known.sext(BitWidth);
4064 break;
4065 }
4067 if (Op.getValueType().isScalableVector())
4068 break;
4069 EVT InVT = Op.getOperand(0).getValueType();
4070 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4071 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4072 Known = Known.anyext(BitWidth);
4073 break;
4074 }
4075 case ISD::ANY_EXTEND: {
4076 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4077 Known = Known.anyext(BitWidth);
4078 break;
4079 }
4080 case ISD::TRUNCATE: {
4081 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4082 Known = Known.trunc(BitWidth);
4083 break;
4084 }
4085 case ISD::TRUNCATE_SSAT_S: {
4086 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4087 Known = Known.truncSSat(BitWidth);
4088 break;
4089 }
4090 case ISD::TRUNCATE_SSAT_U: {
4091 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4092 Known = Known.truncSSatU(BitWidth);
4093 break;
4094 }
4095 case ISD::TRUNCATE_USAT_U: {
4096 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4097 Known = Known.truncUSat(BitWidth);
4098 break;
4099 }
4100 case ISD::AssertZext: {
4101 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4103 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4104 Known.Zero |= (~InMask);
4105 Known.One &= (~Known.Zero);
4106 break;
4107 }
4108 case ISD::AssertAlign: {
4109 unsigned LogOfAlign = Log2(cast<AssertAlignSDNode>(Op)->getAlign());
4110 assert(LogOfAlign != 0);
4111
4112 // TODO: Should use maximum with source
4113 // If a node is guaranteed to be aligned, set low zero bits accordingly as
4114 // well as clearing one bits.
4115 Known.Zero.setLowBits(LogOfAlign);
4116 Known.One.clearLowBits(LogOfAlign);
4117 break;
4118 }
4119 case ISD::AssertNoFPClass: {
4120 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4121
4122 FPClassTest NoFPClass =
4123 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
4124 const FPClassTest NegativeTestMask = fcNan | fcNegative;
4125 if ((NoFPClass & NegativeTestMask) == NegativeTestMask) {
4126 // Cannot be negative.
4127 Known.makeNonNegative();
4128 }
4129
4130 const FPClassTest PositiveTestMask = fcNan | fcPositive;
4131 if ((NoFPClass & PositiveTestMask) == PositiveTestMask) {
4132 // Cannot be positive.
4133 Known.makeNegative();
4134 }
4135
4136 break;
4137 }
4138 case ISD::FGETSIGN:
4139 // All bits are zero except the low bit.
4140 Known.Zero.setBitsFrom(1);
4141 break;
4142 case ISD::ADD:
4143 case ISD::SUB: {
4144 SDNodeFlags Flags = Op.getNode()->getFlags();
4145 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4146 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4148 Op.getOpcode() == ISD::ADD, Flags.hasNoSignedWrap(),
4149 Flags.hasNoUnsignedWrap(), Known, Known2);
4150 break;
4151 }
4152 case ISD::USUBO:
4153 case ISD::SSUBO:
4154 case ISD::USUBO_CARRY:
4155 case ISD::SSUBO_CARRY:
4156 if (Op.getResNo() == 1) {
4157 // If we know the result of a setcc has the top bits zero, use this info.
4158 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4160 BitWidth > 1)
4161 Known.Zero.setBitsFrom(1);
4162 break;
4163 }
4164 [[fallthrough]];
4165 case ISD::SUBC: {
4166 assert(Op.getResNo() == 0 &&
4167 "We only compute knownbits for the difference here.");
4168
4169 // With USUBO_CARRY and SSUBO_CARRY a borrow bit may be added in.
4170 KnownBits Borrow(1);
4171 if (Opcode == ISD::USUBO_CARRY || Opcode == ISD::SSUBO_CARRY) {
4172 Borrow = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4173 // Borrow has bit width 1
4174 Borrow = Borrow.trunc(1);
4175 } else {
4176 Borrow.setAllZero();
4177 }
4178
4179 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4180 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4181 Known = KnownBits::computeForSubBorrow(Known, Known2, Borrow);
4182 break;
4183 }
4184 case ISD::UADDO:
4185 case ISD::SADDO:
4186 case ISD::UADDO_CARRY:
4187 case ISD::SADDO_CARRY:
4188 if (Op.getResNo() == 1) {
4189 // If we know the result of a setcc has the top bits zero, use this info.
4190 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4192 BitWidth > 1)
4193 Known.Zero.setBitsFrom(1);
4194 break;
4195 }
4196 [[fallthrough]];
4197 case ISD::ADDC:
4198 case ISD::ADDE: {
4199 assert(Op.getResNo() == 0 && "We only compute knownbits for the sum here.");
4200
4201 // With ADDE and UADDO_CARRY, a carry bit may be added in.
4202 KnownBits Carry(1);
4203 if (Opcode == ISD::ADDE)
4204 // Can't track carry from glue, set carry to unknown.
4205 Carry.resetAll();
4206 else if (Opcode == ISD::UADDO_CARRY || Opcode == ISD::SADDO_CARRY) {
4207 Carry = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4208 // Carry has bit width 1
4209 Carry = Carry.trunc(1);
4210 } else {
4211 Carry.setAllZero();
4212 }
4213
4214 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4215 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4216 Known = KnownBits::computeForAddCarry(Known, Known2, Carry);
4217 break;
4218 }
4219 case ISD::UDIV: {
4220 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4221 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4222 Known = KnownBits::udiv(Known, Known2, Op->getFlags().hasExact());
4223 break;
4224 }
4225 case ISD::SDIV: {
4226 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4227 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4228 Known = KnownBits::sdiv(Known, Known2, Op->getFlags().hasExact());
4229 break;
4230 }
4231 case ISD::SREM: {
4232 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4233 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4234 Known = KnownBits::srem(Known, Known2);
4235 break;
4236 }
4237 case ISD::UREM: {
4238 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4239 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4240 Known = KnownBits::urem(Known, Known2);
4241 break;
4242 }
4243 case ISD::EXTRACT_ELEMENT: {
4244 Known = computeKnownBits(Op.getOperand(0), Depth+1);
4245 const unsigned Index = Op.getConstantOperandVal(1);
4246 const unsigned EltBitWidth = Op.getValueSizeInBits();
4247
4248 // Remove low part of known bits mask
4249 Known.Zero = Known.Zero.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
4250 Known.One = Known.One.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
4251
4252 // Remove high part of known bit mask
4253 Known = Known.trunc(EltBitWidth);
4254 break;
4255 }
4257 SDValue InVec = Op.getOperand(0);
4258 SDValue EltNo = Op.getOperand(1);
4259 EVT VecVT = InVec.getValueType();
4260 // computeKnownBits not yet implemented for scalable vectors.
4261 if (VecVT.isScalableVector())
4262 break;
4263 const unsigned EltBitWidth = VecVT.getScalarSizeInBits();
4264 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4265
4266 // If BitWidth > EltBitWidth the value is anyext:ed. So we do not know
4267 // anything about the extended bits.
4268 if (BitWidth > EltBitWidth)
4269 Known = Known.trunc(EltBitWidth);
4270
4271 // If we know the element index, just demand that vector element, else for
4272 // an unknown element index, ignore DemandedElts and demand them all.
4273 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
4274 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4275 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
4276 DemandedSrcElts =
4277 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
4278
4279 Known = computeKnownBits(InVec, DemandedSrcElts, Depth + 1);
4280 if (BitWidth > EltBitWidth)
4281 Known = Known.anyext(BitWidth);
4282 break;
4283 }
4285 if (Op.getValueType().isScalableVector())
4286 break;
4287
4288 // If we know the element index, split the demand between the
4289 // source vector and the inserted element, otherwise assume we need
4290 // the original demanded vector elements and the value.
4291 SDValue InVec = Op.getOperand(0);
4292 SDValue InVal = Op.getOperand(1);
4293 SDValue EltNo = Op.getOperand(2);
4294 bool DemandedVal = true;
4295 APInt DemandedVecElts = DemandedElts;
4296 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
4297 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
4298 unsigned EltIdx = CEltNo->getZExtValue();
4299 DemandedVal = !!DemandedElts[EltIdx];
4300 DemandedVecElts.clearBit(EltIdx);
4301 }
4302 Known.setAllConflict();
4303 if (DemandedVal) {
4304 Known2 = computeKnownBits(InVal, Depth + 1);
4305 Known = Known.intersectWith(Known2.zextOrTrunc(BitWidth));
4306 }
4307 if (!!DemandedVecElts) {
4308 Known2 = computeKnownBits(InVec, DemandedVecElts, Depth + 1);
4309 Known = Known.intersectWith(Known2);
4310 }
4311 break;
4312 }
4313 case ISD::BITREVERSE: {
4314 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4315 Known = Known2.reverseBits();
4316 break;
4317 }
4318 case ISD::BSWAP: {
4319 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4320 Known = Known2.byteSwap();
4321 break;
4322 }
4323 case ISD::ABS: {
4324 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4325 Known = Known2.abs();
4326 Known.Zero.setHighBits(
4327 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1);
4328 break;
4329 }
4330 case ISD::USUBSAT: {
4331 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4332 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4333 Known = KnownBits::usub_sat(Known, Known2);
4334 break;
4335 }
4336 case ISD::UMIN: {
4337 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4338 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4339 Known = KnownBits::umin(Known, Known2);
4340 break;
4341 }
4342 case ISD::UMAX: {
4343 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4344 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4345 Known = KnownBits::umax(Known, Known2);
4346 break;
4347 }
4348 case ISD::SMIN:
4349 case ISD::SMAX: {
4350 // If we have a clamp pattern, we know that the number of sign bits will be
4351 // the minimum of the clamp min/max range.
4352 bool IsMax = (Opcode == ISD::SMAX);
4353 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
4354 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
4355 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
4356 CstHigh =
4357 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
4358 if (CstLow && CstHigh) {
4359 if (!IsMax)
4360 std::swap(CstLow, CstHigh);
4361
4362 const APInt &ValueLow = CstLow->getAPIntValue();
4363 const APInt &ValueHigh = CstHigh->getAPIntValue();
4364 if (ValueLow.sle(ValueHigh)) {
4365 unsigned LowSignBits = ValueLow.getNumSignBits();
4366 unsigned HighSignBits = ValueHigh.getNumSignBits();
4367 unsigned MinSignBits = std::min(LowSignBits, HighSignBits);
4368 if (ValueLow.isNegative() && ValueHigh.isNegative()) {
4369 Known.One.setHighBits(MinSignBits);
4370 break;
4371 }
4372 if (ValueLow.isNonNegative() && ValueHigh.isNonNegative()) {
4373 Known.Zero.setHighBits(MinSignBits);
4374 break;
4375 }
4376 }
4377 }
4378
4379 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4380 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4381 if (IsMax)
4382 Known = KnownBits::smax(Known, Known2);
4383 else
4384 Known = KnownBits::smin(Known, Known2);
4385
4386 // For SMAX, if CstLow is non-negative we know the result will be
4387 // non-negative and thus all sign bits are 0.
4388 // TODO: There's an equivalent of this for smin with negative constant for
4389 // known ones.
4390 if (IsMax && CstLow) {
4391 const APInt &ValueLow = CstLow->getAPIntValue();
4392 if (ValueLow.isNonNegative()) {
4393 unsigned SignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4394 Known.Zero.setHighBits(std::min(SignBits, ValueLow.getNumSignBits()));
4395 }
4396 }
4397
4398 break;
4399 }
4400 case ISD::UINT_TO_FP: {
4401 Known.makeNonNegative();
4402 break;
4403 }
4404 case ISD::SINT_TO_FP: {
4405 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4406 if (Known2.isNonNegative())
4407 Known.makeNonNegative();
4408 else if (Known2.isNegative())
4409 Known.makeNegative();
4410 break;
4411 }
4412 case ISD::FP_TO_UINT_SAT: {
4413 // FP_TO_UINT_SAT produces an unsigned value that fits in the saturating VT.
4414 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4416 break;
4417 }
4418 case ISD::ATOMIC_LOAD: {
4419 // If we are looking at the loaded value.
4420 if (Op.getResNo() == 0) {
4421 auto *AT = cast<AtomicSDNode>(Op);
4422 unsigned ScalarMemorySize = AT->getMemoryVT().getScalarSizeInBits();
4423 KnownBits KnownScalarMemory(ScalarMemorySize);
4424 if (const MDNode *MD = AT->getRanges())
4425 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4426
4427 switch (AT->getExtensionType()) {
4428 case ISD::ZEXTLOAD:
4429 Known = KnownScalarMemory.zext(BitWidth);
4430 break;
4431 case ISD::SEXTLOAD:
4432 Known = KnownScalarMemory.sext(BitWidth);
4433 break;
4434 case ISD::EXTLOAD:
4435 switch (TLI->getExtendForAtomicOps()) {
4436 case ISD::ZERO_EXTEND:
4437 Known = KnownScalarMemory.zext(BitWidth);
4438 break;
4439 case ISD::SIGN_EXTEND:
4440 Known = KnownScalarMemory.sext(BitWidth);
4441 break;
4442 default:
4443 Known = KnownScalarMemory.anyext(BitWidth);
4444 break;
4445 }
4446 break;
4447 case ISD::NON_EXTLOAD:
4448 Known = KnownScalarMemory;
4449 break;
4450 }
4451 assert(Known.getBitWidth() == BitWidth);
4452 }
4453 break;
4454 }
4456 if (Op.getResNo() == 1) {
4457 // The boolean result conforms to getBooleanContents.
4458 // If we know the result of a setcc has the top bits zero, use this info.
4459 // We know that we have an integer-based boolean since these operations
4460 // are only available for integer.
4461 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
4463 BitWidth > 1)
4464 Known.Zero.setBitsFrom(1);
4465 break;
4466 }
4467 [[fallthrough]];
4469 case ISD::ATOMIC_SWAP:
4480 case ISD::ATOMIC_LOAD_UMAX: {
4481 // If we are looking at the loaded value.
4482 if (Op.getResNo() == 0) {
4483 auto *AT = cast<AtomicSDNode>(Op);
4484 unsigned MemBits = AT->getMemoryVT().getScalarSizeInBits();
4485
4486 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
4487 Known.Zero.setBitsFrom(MemBits);
4488 }
4489 break;
4490 }
4491 case ISD::FrameIndex:
4493 TLI->computeKnownBitsForFrameIndex(cast<FrameIndexSDNode>(Op)->getIndex(),
4494 Known, getMachineFunction());
4495 break;
4496
4497 default:
4498 if (Opcode < ISD::BUILTIN_OP_END)
4499 break;
4500 [[fallthrough]];
4504 // TODO: Probably okay to remove after audit; here to reduce change size
4505 // in initial enablement patch for scalable vectors
4506 if (Op.getValueType().isScalableVector())
4507 break;
4508
4509 // Allow the target to implement this method for its nodes.
4510 TLI->computeKnownBitsForTargetNode(Op, Known, DemandedElts, *this, Depth);
4511 break;
4512 }
4513
4514 return Known;
4515}
4516
4517/// Convert ConstantRange OverflowResult into SelectionDAG::OverflowKind.
4530
4533 // X + 0 never overflow
4534 if (isNullConstant(N1))
4535 return OFK_Never;
4536
4537 // If both operands each have at least two sign bits, the addition
4538 // cannot overflow.
4539 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4540 return OFK_Never;
4541
4542 // TODO: Add ConstantRange::signedAddMayOverflow handling.
4543 return OFK_Sometime;
4544}
4545
4548 // X + 0 never overflow
4549 if (isNullConstant(N1))
4550 return OFK_Never;
4551
4552 // mulhi + 1 never overflow
4553 KnownBits N1Known = computeKnownBits(N1);
4554 if (N0.getOpcode() == ISD::UMUL_LOHI && N0.getResNo() == 1 &&
4555 N1Known.getMaxValue().ult(2))
4556 return OFK_Never;
4557
4558 KnownBits N0Known = computeKnownBits(N0);
4559 if (N1.getOpcode() == ISD::UMUL_LOHI && N1.getResNo() == 1 &&
4560 N0Known.getMaxValue().ult(2))
4561 return OFK_Never;
4562
4563 // Fallback to ConstantRange::unsignedAddMayOverflow handling.
4564 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4565 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4566 return mapOverflowResult(N0Range.unsignedAddMayOverflow(N1Range));
4567}
4568
4571 // X - 0 never overflow
4572 if (isNullConstant(N1))
4573 return OFK_Never;
4574
4575 // If both operands each have at least two sign bits, the subtraction
4576 // cannot overflow.
4577 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4578 return OFK_Never;
4579
4580 KnownBits N0Known = computeKnownBits(N0);
4581 KnownBits N1Known = computeKnownBits(N1);
4582 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, true);
4583 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, true);
4584 return mapOverflowResult(N0Range.signedSubMayOverflow(N1Range));
4585}
4586
4589 // X - 0 never overflow
4590 if (isNullConstant(N1))
4591 return OFK_Never;
4592
4593 KnownBits N0Known = computeKnownBits(N0);
4594 KnownBits N1Known = computeKnownBits(N1);
4595 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4596 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4597 return mapOverflowResult(N0Range.unsignedSubMayOverflow(N1Range));
4598}
4599
4602 // X * 0 and X * 1 never overflow.
4603 if (isNullConstant(N1) || isOneConstant(N1))
4604 return OFK_Never;
4605
4606 KnownBits N0Known = computeKnownBits(N0);
4607 KnownBits N1Known = computeKnownBits(N1);
4608 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4609 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4610 return mapOverflowResult(N0Range.unsignedMulMayOverflow(N1Range));
4611}
4612
4615 // X * 0 and X * 1 never overflow.
4616 if (isNullConstant(N1) || isOneConstant(N1))
4617 return OFK_Never;
4618
4619 // Get the size of the result.
4620 unsigned BitWidth = N0.getScalarValueSizeInBits();
4621
4622 // Sum of the sign bits.
4623 unsigned SignBits = ComputeNumSignBits(N0) + ComputeNumSignBits(N1);
4624
4625 // If we have enough sign bits, then there's no overflow.
4626 if (SignBits > BitWidth + 1)
4627 return OFK_Never;
4628
4629 if (SignBits == BitWidth + 1) {
4630 // The overflow occurs when the true multiplication of the
4631 // the operands is the minimum negative number.
4632 KnownBits N0Known = computeKnownBits(N0);
4633 KnownBits N1Known = computeKnownBits(N1);
4634 // If one of the operands is non-negative, then there's no
4635 // overflow.
4636 if (N0Known.isNonNegative() || N1Known.isNonNegative())
4637 return OFK_Never;
4638 }
4639
4640 return OFK_Sometime;
4641}
4642
4644 unsigned Depth) const {
4645 EVT VT = Val.getValueType();
4646
4647 // Since the number of lanes in a scalable vector is unknown at compile time,
4648 // we track one bit which is implicitly broadcast to all lanes. This means
4649 // that all lanes in a scalable vector are considered demanded.
4650 APInt DemandedElts = VT.isFixedLengthVector()
4652 : APInt(1, 1);
4653
4654 return isKnownToBeAPowerOfTwo(Val, DemandedElts, OrZero, Depth);
4655}
4656
4658 const APInt &DemandedElts,
4659 bool OrZero, unsigned Depth) const {
4660 if (Depth >= MaxRecursionDepth)
4661 return false; // Limit search depth.
4662
4663 EVT OpVT = Val.getValueType();
4664 unsigned BitWidth = OpVT.getScalarSizeInBits();
4665 [[maybe_unused]] unsigned NumElts = DemandedElts.getBitWidth();
4666 assert((!OpVT.isScalableVector() || NumElts == 1) &&
4667 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4668 assert(
4669 (!OpVT.isFixedLengthVector() || NumElts == OpVT.getVectorNumElements()) &&
4670 "Unexpected vector size");
4671
4672 auto IsPowerOfTwoOrZero = [BitWidth, OrZero](const ConstantSDNode *C) {
4673 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
4674 return (OrZero && V.isZero()) || V.isPowerOf2();
4675 };
4676
4677 // Is the constant a known power of 2 or zero?
4678 if (ISD::matchUnaryPredicate(Val, IsPowerOfTwoOrZero))
4679 return true;
4680
4681 switch (Val.getOpcode()) {
4682 case ISD::BUILD_VECTOR:
4683 // Are all operands of a build vector constant powers of two or zero?
4684 if (all_of(enumerate(Val->ops()), [&](auto P) {
4685 auto *C = dyn_cast<ConstantSDNode>(P.value());
4686 return !DemandedElts[P.index()] || (C && IsPowerOfTwoOrZero(C));
4687 }))
4688 return true;
4689 break;
4690
4691 case ISD::SPLAT_VECTOR:
4692 // Is the operand of a splat vector a constant power of two?
4693 if (auto *C = dyn_cast<ConstantSDNode>(Val->getOperand(0)))
4694 if (IsPowerOfTwoOrZero(C))
4695 return true;
4696 break;
4697
4698 case ISD::AND: {
4699 // Looking for `x & -x` pattern:
4700 // If x == 0:
4701 // x & -x -> 0
4702 // If x != 0:
4703 // x & -x -> non-zero pow2
4704 // so if we find the pattern return whether we know `x` is non-zero.
4705 SDValue X;
4706 if (sd_match(Val, m_And(m_Value(X), m_Neg(m_Deferred(X)))))
4707 return OrZero || isKnownNeverZero(X, DemandedElts, Depth);
4708 break;
4709 }
4710
4711 case ISD::SHL: {
4712 // A left-shift of a constant one will have exactly one bit set because
4713 // shifting the bit off the end is undefined.
4714 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4715 if (C && C->getAPIntValue() == 1)
4716 return true;
4717 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4718 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4719 Depth + 1);
4720 }
4721
4722 case ISD::SRL: {
4723 // A logical right-shift of a constant sign-bit will have exactly
4724 // one bit set.
4725 auto *C = isConstOrConstSplat(Val.getOperand(0));
4726 if (C && C->getAPIntValue().isSignMask())
4727 return true;
4728 return isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4729 Depth + 1) &&
4730 isKnownNeverZero(Val, Depth);
4731 }
4732
4733 case ISD::ROTL:
4734 case ISD::ROTR:
4735 return isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4736 Depth + 1);
4737
4738 case ISD::SMIN:
4739 case ISD::SMAX:
4740 case ISD::UMIN:
4741 case ISD::UMAX:
4742 return isKnownToBeAPowerOfTwo(Val.getOperand(1), /*OrZero=*/false,
4743 Depth + 1) &&
4744 isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4745 Depth + 1);
4746
4747 case ISD::SELECT:
4748 case ISD::VSELECT:
4749 return isKnownToBeAPowerOfTwo(Val.getOperand(2), DemandedElts, OrZero,
4750 Depth + 1) &&
4751 isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4752 Depth + 1);
4753
4754 case ISD::ZERO_EXTEND:
4755 return isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4756 Depth + 1);
4757
4758 case ISD::VSCALE:
4759 // vscale(power-of-two) is a power-of-two
4760 return isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4761 Depth + 1);
4762 }
4763
4764 // More could be done here, though the above checks are enough
4765 // to handle some common cases.
4766 return false;
4767}
4768
4770 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Val, true))
4771 return C1->getValueAPF().getExactLog2Abs() >= 0;
4772
4773 if (Val.getOpcode() == ISD::UINT_TO_FP || Val.getOpcode() == ISD::SINT_TO_FP)
4774 return isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth + 1);
4775
4776 return false;
4777}
4778
4780 EVT VT = Op.getValueType();
4781
4782 // Since the number of lanes in a scalable vector is unknown at compile time,
4783 // we track one bit which is implicitly broadcast to all lanes. This means
4784 // that all lanes in a scalable vector are considered demanded.
4785 APInt DemandedElts = VT.isFixedLengthVector()
4787 : APInt(1, 1);
4788 return ComputeNumSignBits(Op, DemandedElts, Depth);
4789}
4790
4791unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
4792 unsigned Depth) const {
4793 EVT VT = Op.getValueType();
4794 assert((VT.isInteger() || VT.isFloatingPoint()) && "Invalid VT!");
4795 unsigned VTBits = VT.getScalarSizeInBits();
4796 unsigned NumElts = DemandedElts.getBitWidth();
4797 unsigned Tmp, Tmp2;
4798 unsigned FirstAnswer = 1;
4799
4800 assert((!VT.isScalableVector() || NumElts == 1) &&
4801 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4802
4803 if (auto *C = dyn_cast<ConstantSDNode>(Op)) {
4804 const APInt &Val = C->getAPIntValue();
4805 return Val.getNumSignBits();
4806 }
4807
4808 if (Depth >= MaxRecursionDepth)
4809 return 1; // Limit search depth.
4810
4811 if (!DemandedElts)
4812 return 1; // No demanded elts, better to assume we don't know anything.
4813
4814 unsigned Opcode = Op.getOpcode();
4815 switch (Opcode) {
4816 default: break;
4817 case ISD::AssertSext:
4818 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4819 return VTBits-Tmp+1;
4820 case ISD::AssertZext:
4821 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4822 return VTBits-Tmp;
4823 case ISD::FREEZE:
4824 if (isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
4825 /*PoisonOnly=*/false))
4826 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4827 break;
4828 case ISD::MERGE_VALUES:
4829 return ComputeNumSignBits(Op.getOperand(Op.getResNo()), DemandedElts,
4830 Depth + 1);
4831 case ISD::SPLAT_VECTOR: {
4832 // Check if the sign bits of source go down as far as the truncated value.
4833 unsigned NumSrcBits = Op.getOperand(0).getValueSizeInBits();
4834 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4835 if (NumSrcSignBits > (NumSrcBits - VTBits))
4836 return NumSrcSignBits - (NumSrcBits - VTBits);
4837 break;
4838 }
4839 case ISD::BUILD_VECTOR:
4840 assert(!VT.isScalableVector());
4841 Tmp = VTBits;
4842 for (unsigned i = 0, e = Op.getNumOperands(); (i < e) && (Tmp > 1); ++i) {
4843 if (!DemandedElts[i])
4844 continue;
4845
4846 SDValue SrcOp = Op.getOperand(i);
4847 // BUILD_VECTOR can implicitly truncate sources, we handle this specially
4848 // for constant nodes to ensure we only look at the sign bits.
4850 APInt T = C->getAPIntValue().trunc(VTBits);
4851 Tmp2 = T.getNumSignBits();
4852 } else {
4853 Tmp2 = ComputeNumSignBits(SrcOp, Depth + 1);
4854
4855 if (SrcOp.getValueSizeInBits() != VTBits) {
4856 assert(SrcOp.getValueSizeInBits() > VTBits &&
4857 "Expected BUILD_VECTOR implicit truncation");
4858 unsigned ExtraBits = SrcOp.getValueSizeInBits() - VTBits;
4859 Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1);
4860 }
4861 }
4862 Tmp = std::min(Tmp, Tmp2);
4863 }
4864 return Tmp;
4865
4866 case ISD::VECTOR_COMPRESS: {
4867 SDValue Vec = Op.getOperand(0);
4868 SDValue PassThru = Op.getOperand(2);
4869 Tmp = ComputeNumSignBits(PassThru, DemandedElts, Depth + 1);
4870 if (Tmp == 1)
4871 return 1;
4872 Tmp2 = ComputeNumSignBits(Vec, Depth + 1);
4873 Tmp = std::min(Tmp, Tmp2);
4874 return Tmp;
4875 }
4876
4877 case ISD::VECTOR_SHUFFLE: {
4878 // Collect the minimum number of sign bits that are shared by every vector
4879 // element referenced by the shuffle.
4880 APInt DemandedLHS, DemandedRHS;
4882 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
4883 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
4884 DemandedLHS, DemandedRHS))
4885 return 1;
4886
4887 Tmp = std::numeric_limits<unsigned>::max();
4888 if (!!DemandedLHS)
4889 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedLHS, Depth + 1);
4890 if (!!DemandedRHS) {
4891 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedRHS, Depth + 1);
4892 Tmp = std::min(Tmp, Tmp2);
4893 }
4894 // If we don't know anything, early out and try computeKnownBits fall-back.
4895 if (Tmp == 1)
4896 break;
4897 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
4898 return Tmp;
4899 }
4900
4901 case ISD::BITCAST: {
4902 if (VT.isScalableVector())
4903 break;
4904 SDValue N0 = Op.getOperand(0);
4905 EVT SrcVT = N0.getValueType();
4906 unsigned SrcBits = SrcVT.getScalarSizeInBits();
4907
4908 // Ignore bitcasts from unsupported types..
4909 if (!(SrcVT.isInteger() || SrcVT.isFloatingPoint()))
4910 break;
4911
4912 // Fast handling of 'identity' bitcasts.
4913 if (VTBits == SrcBits)
4914 return ComputeNumSignBits(N0, DemandedElts, Depth + 1);
4915
4916 bool IsLE = getDataLayout().isLittleEndian();
4917
4918 // Bitcast 'large element' scalar/vector to 'small element' vector.
4919 if ((SrcBits % VTBits) == 0) {
4920 assert(VT.isVector() && "Expected bitcast to vector");
4921
4922 unsigned Scale = SrcBits / VTBits;
4923 APInt SrcDemandedElts =
4924 APIntOps::ScaleBitMask(DemandedElts, NumElts / Scale);
4925
4926 // Fast case - sign splat can be simply split across the small elements.
4927 Tmp = ComputeNumSignBits(N0, SrcDemandedElts, Depth + 1);
4928 if (Tmp == SrcBits)
4929 return VTBits;
4930
4931 // Slow case - determine how far the sign extends into each sub-element.
4932 Tmp2 = VTBits;
4933 for (unsigned i = 0; i != NumElts; ++i)
4934 if (DemandedElts[i]) {
4935 unsigned SubOffset = i % Scale;
4936 SubOffset = (IsLE ? ((Scale - 1) - SubOffset) : SubOffset);
4937 SubOffset = SubOffset * VTBits;
4938 if (Tmp <= SubOffset)
4939 return 1;
4940 Tmp2 = std::min(Tmp2, Tmp - SubOffset);
4941 }
4942 return Tmp2;
4943 }
4944 break;
4945 }
4946
4948 // FP_TO_SINT_SAT produces a signed value that fits in the saturating VT.
4949 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
4950 return VTBits - Tmp + 1;
4951 case ISD::SIGN_EXTEND:
4952 Tmp = VTBits - Op.getOperand(0).getScalarValueSizeInBits();
4953 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1) + Tmp;
4955 // Max of the input and what this extends.
4956 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
4957 Tmp = VTBits-Tmp+1;
4958 Tmp2 = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
4959 return std::max(Tmp, Tmp2);
4961 if (VT.isScalableVector())
4962 break;
4963 SDValue Src = Op.getOperand(0);
4964 EVT SrcVT = Src.getValueType();
4965 APInt DemandedSrcElts = DemandedElts.zext(SrcVT.getVectorNumElements());
4966 Tmp = VTBits - SrcVT.getScalarSizeInBits();
4967 return ComputeNumSignBits(Src, DemandedSrcElts, Depth+1) + Tmp;
4968 }
4969 case ISD::SRA:
4970 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4971 // SRA X, C -> adds C sign bits.
4972 if (std::optional<unsigned> ShAmt =
4973 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
4974 Tmp = std::min(Tmp + *ShAmt, VTBits);
4975 return Tmp;
4976 case ISD::SHL:
4977 if (std::optional<ConstantRange> ShAmtRange =
4978 getValidShiftAmountRange(Op, DemandedElts, Depth + 1)) {
4979 unsigned MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
4980 unsigned MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
4981 // Try to look through ZERO/SIGN/ANY_EXTEND. If all extended bits are
4982 // shifted out, then we can compute the number of sign bits for the
4983 // operand being extended. A future improvement could be to pass along the
4984 // "shifted left by" information in the recursive calls to
4985 // ComputeKnownSignBits. Allowing us to handle this more generically.
4986 if (ISD::isExtOpcode(Op.getOperand(0).getOpcode())) {
4987 SDValue Ext = Op.getOperand(0);
4988 EVT ExtVT = Ext.getValueType();
4989 SDValue Extendee = Ext.getOperand(0);
4990 EVT ExtendeeVT = Extendee.getValueType();
4991 unsigned SizeDifference =
4992 ExtVT.getScalarSizeInBits() - ExtendeeVT.getScalarSizeInBits();
4993 if (SizeDifference <= MinShAmt) {
4994 Tmp = SizeDifference +
4995 ComputeNumSignBits(Extendee, DemandedElts, Depth + 1);
4996 if (MaxShAmt < Tmp)
4997 return Tmp - MaxShAmt;
4998 }
4999 }
5000 // shl destroys sign bits, ensure it doesn't shift out all sign bits.
5001 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5002 if (MaxShAmt < Tmp)
5003 return Tmp - MaxShAmt;
5004 }
5005 break;
5006 case ISD::AND:
5007 case ISD::OR:
5008 case ISD::XOR: // NOT is handled here.
5009 // Logical binary ops preserve the number of sign bits at the worst.
5010 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5011 if (Tmp != 1) {
5012 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5013 FirstAnswer = std::min(Tmp, Tmp2);
5014 // We computed what we know about the sign bits as our first
5015 // answer. Now proceed to the generic code that uses
5016 // computeKnownBits, and pick whichever answer is better.
5017 }
5018 break;
5019
5020 case ISD::SELECT:
5021 case ISD::VSELECT:
5022 Tmp = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5023 if (Tmp == 1) return 1; // Early out.
5024 Tmp2 = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5025 return std::min(Tmp, Tmp2);
5026 case ISD::SELECT_CC:
5027 Tmp = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5028 if (Tmp == 1) return 1; // Early out.
5029 Tmp2 = ComputeNumSignBits(Op.getOperand(3), DemandedElts, Depth+1);
5030 return std::min(Tmp, Tmp2);
5031
5032 case ISD::SMIN:
5033 case ISD::SMAX: {
5034 // If we have a clamp pattern, we know that the number of sign bits will be
5035 // the minimum of the clamp min/max range.
5036 bool IsMax = (Opcode == ISD::SMAX);
5037 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
5038 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
5039 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
5040 CstHigh =
5041 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
5042 if (CstLow && CstHigh) {
5043 if (!IsMax)
5044 std::swap(CstLow, CstHigh);
5045 if (CstLow->getAPIntValue().sle(CstHigh->getAPIntValue())) {
5046 Tmp = CstLow->getAPIntValue().getNumSignBits();
5047 Tmp2 = CstHigh->getAPIntValue().getNumSignBits();
5048 return std::min(Tmp, Tmp2);
5049 }
5050 }
5051
5052 // Fallback - just get the minimum number of sign bits of the operands.
5053 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5054 if (Tmp == 1)
5055 return 1; // Early out.
5056 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5057 return std::min(Tmp, Tmp2);
5058 }
5059 case ISD::UMIN:
5060 case ISD::UMAX:
5061 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5062 if (Tmp == 1)
5063 return 1; // Early out.
5064 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5065 return std::min(Tmp, Tmp2);
5066 case ISD::SSUBO_CARRY:
5067 case ISD::USUBO_CARRY:
5068 // sub_carry(x,x,c) -> 0/-1 (sext carry)
5069 if (Op.getResNo() == 0 && Op.getOperand(0) == Op.getOperand(1))
5070 return VTBits;
5071 [[fallthrough]];
5072 case ISD::SADDO:
5073 case ISD::UADDO:
5074 case ISD::SADDO_CARRY:
5075 case ISD::UADDO_CARRY:
5076 case ISD::SSUBO:
5077 case ISD::USUBO:
5078 case ISD::SMULO:
5079 case ISD::UMULO:
5080 if (Op.getResNo() != 1)
5081 break;
5082 // The boolean result conforms to getBooleanContents. Fall through.
5083 // If setcc returns 0/-1, all bits are sign bits.
5084 // We know that we have an integer-based boolean since these operations
5085 // are only available for integer.
5086 if (TLI->getBooleanContents(VT.isVector(), false) ==
5088 return VTBits;
5089 break;
5090 case ISD::SETCC:
5091 case ISD::SETCCCARRY:
5092 case ISD::STRICT_FSETCC:
5093 case ISD::STRICT_FSETCCS: {
5094 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
5095 // If setcc returns 0/-1, all bits are sign bits.
5096 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
5098 return VTBits;
5099 break;
5100 }
5101 case ISD::ROTL:
5102 case ISD::ROTR:
5103 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5104
5105 // If we're rotating an 0/-1 value, then it stays an 0/-1 value.
5106 if (Tmp == VTBits)
5107 return VTBits;
5108
5109 if (ConstantSDNode *C =
5110 isConstOrConstSplat(Op.getOperand(1), DemandedElts)) {
5111 unsigned RotAmt = C->getAPIntValue().urem(VTBits);
5112
5113 // Handle rotate right by N like a rotate left by 32-N.
5114 if (Opcode == ISD::ROTR)
5115 RotAmt = (VTBits - RotAmt) % VTBits;
5116
5117 // If we aren't rotating out all of the known-in sign bits, return the
5118 // number that are left. This handles rotl(sext(x), 1) for example.
5119 if (Tmp > (RotAmt + 1)) return (Tmp - RotAmt);
5120 }
5121 break;
5122 case ISD::ADD:
5123 case ISD::ADDC:
5124 // TODO: Move Operand 1 check before Operand 0 check
5125 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5126 if (Tmp == 1) return 1; // Early out.
5127
5128 // Special case decrementing a value (ADD X, -1):
5129 if (ConstantSDNode *CRHS =
5130 isConstOrConstSplat(Op.getOperand(1), DemandedElts))
5131 if (CRHS->isAllOnes()) {
5132 KnownBits Known =
5133 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
5134
5135 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5136 // sign bits set.
5137 if ((Known.Zero | 1).isAllOnes())
5138 return VTBits;
5139
5140 // If we are subtracting one from a positive number, there is no carry
5141 // out of the result.
5142 if (Known.isNonNegative())
5143 return Tmp;
5144 }
5145
5146 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5147 if (Tmp2 == 1) return 1; // Early out.
5148
5149 // Add can have at most one carry bit. Thus we know that the output
5150 // is, at worst, one more bit than the inputs.
5151 return std::min(Tmp, Tmp2) - 1;
5152 case ISD::SUB:
5153 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5154 if (Tmp2 == 1) return 1; // Early out.
5155
5156 // Handle NEG.
5157 if (ConstantSDNode *CLHS =
5158 isConstOrConstSplat(Op.getOperand(0), DemandedElts))
5159 if (CLHS->isZero()) {
5160 KnownBits Known =
5161 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
5162 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5163 // sign bits set.
5164 if ((Known.Zero | 1).isAllOnes())
5165 return VTBits;
5166
5167 // If the input is known to be positive (the sign bit is known clear),
5168 // the output of the NEG has the same number of sign bits as the input.
5169 if (Known.isNonNegative())
5170 return Tmp2;
5171
5172 // Otherwise, we treat this like a SUB.
5173 }
5174
5175 // Sub can have at most one carry bit. Thus we know that the output
5176 // is, at worst, one more bit than the inputs.
5177 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5178 if (Tmp == 1) return 1; // Early out.
5179 return std::min(Tmp, Tmp2) - 1;
5180 case ISD::MUL: {
5181 // The output of the Mul can be at most twice the valid bits in the inputs.
5182 unsigned SignBitsOp0 = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5183 if (SignBitsOp0 == 1)
5184 break;
5185 unsigned SignBitsOp1 = ComputeNumSignBits(Op.getOperand(1), Depth + 1);
5186 if (SignBitsOp1 == 1)
5187 break;
5188 unsigned OutValidBits =
5189 (VTBits - SignBitsOp0 + 1) + (VTBits - SignBitsOp1 + 1);
5190 return OutValidBits > VTBits ? 1 : VTBits - OutValidBits + 1;
5191 }
5192 case ISD::AVGCEILS:
5193 case ISD::AVGFLOORS:
5194 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5195 if (Tmp == 1)
5196 return 1; // Early out.
5197 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5198 return std::min(Tmp, Tmp2);
5199 case ISD::SREM:
5200 // The sign bit is the LHS's sign bit, except when the result of the
5201 // remainder is zero. The magnitude of the result should be less than or
5202 // equal to the magnitude of the LHS. Therefore, the result should have
5203 // at least as many sign bits as the left hand side.
5204 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5205 case ISD::TRUNCATE: {
5206 // Check if the sign bits of source go down as far as the truncated value.
5207 unsigned NumSrcBits = Op.getOperand(0).getScalarValueSizeInBits();
5208 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5209 if (NumSrcSignBits > (NumSrcBits - VTBits))
5210 return NumSrcSignBits - (NumSrcBits - VTBits);
5211 break;
5212 }
5213 case ISD::EXTRACT_ELEMENT: {
5214 if (VT.isScalableVector())
5215 break;
5216 const int KnownSign = ComputeNumSignBits(Op.getOperand(0), Depth+1);
5217 const int BitWidth = Op.getValueSizeInBits();
5218 const int Items = Op.getOperand(0).getValueSizeInBits() / BitWidth;
5219
5220 // Get reverse index (starting from 1), Op1 value indexes elements from
5221 // little end. Sign starts at big end.
5222 const int rIndex = Items - 1 - Op.getConstantOperandVal(1);
5223
5224 // If the sign portion ends in our element the subtraction gives correct
5225 // result. Otherwise it gives either negative or > bitwidth result
5226 return std::clamp(KnownSign - rIndex * BitWidth, 1, BitWidth);
5227 }
5229 if (VT.isScalableVector())
5230 break;
5231 // If we know the element index, split the demand between the
5232 // source vector and the inserted element, otherwise assume we need
5233 // the original demanded vector elements and the value.
5234 SDValue InVec = Op.getOperand(0);
5235 SDValue InVal = Op.getOperand(1);
5236 SDValue EltNo = Op.getOperand(2);
5237 bool DemandedVal = true;
5238 APInt DemandedVecElts = DemandedElts;
5239 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
5240 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
5241 unsigned EltIdx = CEltNo->getZExtValue();
5242 DemandedVal = !!DemandedElts[EltIdx];
5243 DemandedVecElts.clearBit(EltIdx);
5244 }
5245 Tmp = std::numeric_limits<unsigned>::max();
5246 if (DemandedVal) {
5247 // TODO - handle implicit truncation of inserted elements.
5248 if (InVal.getScalarValueSizeInBits() != VTBits)
5249 break;
5250 Tmp2 = ComputeNumSignBits(InVal, Depth + 1);
5251 Tmp = std::min(Tmp, Tmp2);
5252 }
5253 if (!!DemandedVecElts) {
5254 Tmp2 = ComputeNumSignBits(InVec, DemandedVecElts, Depth + 1);
5255 Tmp = std::min(Tmp, Tmp2);
5256 }
5257 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5258 return Tmp;
5259 }
5261 SDValue InVec = Op.getOperand(0);
5262 SDValue EltNo = Op.getOperand(1);
5263 EVT VecVT = InVec.getValueType();
5264 // ComputeNumSignBits not yet implemented for scalable vectors.
5265 if (VecVT.isScalableVector())
5266 break;
5267 const unsigned BitWidth = Op.getValueSizeInBits();
5268 const unsigned EltBitWidth = Op.getOperand(0).getScalarValueSizeInBits();
5269 const unsigned NumSrcElts = VecVT.getVectorNumElements();
5270
5271 // If BitWidth > EltBitWidth the value is anyext:ed, and we do not know
5272 // anything about sign bits. But if the sizes match we can derive knowledge
5273 // about sign bits from the vector operand.
5274 if (BitWidth != EltBitWidth)
5275 break;
5276
5277 // If we know the element index, just demand that vector element, else for
5278 // an unknown element index, ignore DemandedElts and demand them all.
5279 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
5280 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
5281 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
5282 DemandedSrcElts =
5283 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
5284
5285 return ComputeNumSignBits(InVec, DemandedSrcElts, Depth + 1);
5286 }
5288 // Offset the demanded elts by the subvector index.
5289 SDValue Src = Op.getOperand(0);
5290
5291 APInt DemandedSrcElts;
5292 if (Src.getValueType().isScalableVector())
5293 DemandedSrcElts = APInt(1, 1);
5294 else {
5295 uint64_t Idx = Op.getConstantOperandVal(1);
5296 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5297 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5298 }
5299 return ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5300 }
5301 case ISD::CONCAT_VECTORS: {
5302 if (VT.isScalableVector())
5303 break;
5304 // Determine the minimum number of sign bits across all demanded
5305 // elts of the input vectors. Early out if the result is already 1.
5306 Tmp = std::numeric_limits<unsigned>::max();
5307 EVT SubVectorVT = Op.getOperand(0).getValueType();
5308 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
5309 unsigned NumSubVectors = Op.getNumOperands();
5310 for (unsigned i = 0; (i < NumSubVectors) && (Tmp > 1); ++i) {
5311 APInt DemandedSub =
5312 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
5313 if (!DemandedSub)
5314 continue;
5315 Tmp2 = ComputeNumSignBits(Op.getOperand(i), DemandedSub, Depth + 1);
5316 Tmp = std::min(Tmp, Tmp2);
5317 }
5318 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5319 return Tmp;
5320 }
5321 case ISD::INSERT_SUBVECTOR: {
5322 if (VT.isScalableVector())
5323 break;
5324 // Demand any elements from the subvector and the remainder from the src its
5325 // inserted into.
5326 SDValue Src = Op.getOperand(0);
5327 SDValue Sub = Op.getOperand(1);
5328 uint64_t Idx = Op.getConstantOperandVal(2);
5329 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5330 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5331 APInt DemandedSrcElts = DemandedElts;
5332 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5333
5334 Tmp = std::numeric_limits<unsigned>::max();
5335 if (!!DemandedSubElts) {
5336 Tmp = ComputeNumSignBits(Sub, DemandedSubElts, Depth + 1);
5337 if (Tmp == 1)
5338 return 1; // early-out
5339 }
5340 if (!!DemandedSrcElts) {
5341 Tmp2 = ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5342 Tmp = std::min(Tmp, Tmp2);
5343 }
5344 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5345 return Tmp;
5346 }
5347 case ISD::LOAD: {
5348 // If we are looking at the loaded value of the SDNode.
5349 if (Op.getResNo() != 0)
5350 break;
5351
5353 if (const MDNode *Ranges = LD->getRanges()) {
5354 if (DemandedElts != 1)
5355 break;
5356
5358 if (VTBits > CR.getBitWidth()) {
5359 switch (LD->getExtensionType()) {
5360 case ISD::SEXTLOAD:
5361 CR = CR.signExtend(VTBits);
5362 break;
5363 case ISD::ZEXTLOAD:
5364 CR = CR.zeroExtend(VTBits);
5365 break;
5366 default:
5367 break;
5368 }
5369 }
5370
5371 if (VTBits != CR.getBitWidth())
5372 break;
5373 return std::min(CR.getSignedMin().getNumSignBits(),
5375 }
5376
5377 unsigned ExtType = LD->getExtensionType();
5378 switch (ExtType) {
5379 default:
5380 break;
5381 case ISD::SEXTLOAD: // e.g. i16->i32 = '17' bits known.
5382 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5383 return VTBits - Tmp + 1;
5384 case ISD::ZEXTLOAD: // e.g. i16->i32 = '16' bits known.
5385 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5386 return VTBits - Tmp;
5387 case ISD::NON_EXTLOAD:
5388 if (const Constant *Cst = TLI->getTargetConstantFromLoad(LD)) {
5389 // We only need to handle vectors - computeKnownBits should handle
5390 // scalar cases.
5391 Type *CstTy = Cst->getType();
5392 if (CstTy->isVectorTy() && !VT.isScalableVector() &&
5393 (NumElts * VTBits) == CstTy->getPrimitiveSizeInBits() &&
5394 VTBits == CstTy->getScalarSizeInBits()) {
5395 Tmp = VTBits;
5396 for (unsigned i = 0; i != NumElts; ++i) {
5397 if (!DemandedElts[i])
5398 continue;
5399 if (Constant *Elt = Cst->getAggregateElement(i)) {
5400 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
5401 const APInt &Value = CInt->getValue();
5402 Tmp = std::min(Tmp, Value.getNumSignBits());
5403 continue;
5404 }
5405 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
5406 APInt Value = CFP->getValueAPF().bitcastToAPInt();
5407 Tmp = std::min(Tmp, Value.getNumSignBits());
5408 continue;
5409 }
5410 }
5411 // Unknown type. Conservatively assume no bits match sign bit.
5412 return 1;
5413 }
5414 return Tmp;
5415 }
5416 }
5417 break;
5418 }
5419
5420 break;
5421 }
5424 case ISD::ATOMIC_SWAP:
5436 case ISD::ATOMIC_LOAD: {
5437 auto *AT = cast<AtomicSDNode>(Op);
5438 // If we are looking at the loaded value.
5439 if (Op.getResNo() == 0) {
5440 Tmp = AT->getMemoryVT().getScalarSizeInBits();
5441 if (Tmp == VTBits)
5442 return 1; // early-out
5443
5444 // For atomic_load, prefer to use the extension type.
5445 if (Op->getOpcode() == ISD::ATOMIC_LOAD) {
5446 switch (AT->getExtensionType()) {
5447 default:
5448 break;
5449 case ISD::SEXTLOAD:
5450 return VTBits - Tmp + 1;
5451 case ISD::ZEXTLOAD:
5452 return VTBits - Tmp;
5453 }
5454 }
5455
5456 if (TLI->getExtendForAtomicOps() == ISD::SIGN_EXTEND)
5457 return VTBits - Tmp + 1;
5458 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
5459 return VTBits - Tmp;
5460 }
5461 break;
5462 }
5463 }
5464
5465 // Allow the target to implement this method for its nodes.
5466 if (Opcode >= ISD::BUILTIN_OP_END ||
5467 Opcode == ISD::INTRINSIC_WO_CHAIN ||
5468 Opcode == ISD::INTRINSIC_W_CHAIN ||
5469 Opcode == ISD::INTRINSIC_VOID) {
5470 // TODO: This can probably be removed once target code is audited. This
5471 // is here purely to reduce patch size and review complexity.
5472 if (!VT.isScalableVector()) {
5473 unsigned NumBits =
5474 TLI->ComputeNumSignBitsForTargetNode(Op, DemandedElts, *this, Depth);
5475 if (NumBits > 1)
5476 FirstAnswer = std::max(FirstAnswer, NumBits);
5477 }
5478 }
5479
5480 // Finally, if we can prove that the top bits of the result are 0's or 1's,
5481 // use this information.
5482 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
5483 return std::max(FirstAnswer, Known.countMinSignBits());
5484}
5485
5487 unsigned Depth) const {
5488 unsigned SignBits = ComputeNumSignBits(Op, Depth);
5489 return Op.getScalarValueSizeInBits() - SignBits + 1;
5490}
5491
5493 const APInt &DemandedElts,
5494 unsigned Depth) const {
5495 unsigned SignBits = ComputeNumSignBits(Op, DemandedElts, Depth);
5496 return Op.getScalarValueSizeInBits() - SignBits + 1;
5497}
5498
5500 unsigned Depth) const {
5501 // Early out for FREEZE.
5502 if (Op.getOpcode() == ISD::FREEZE)
5503 return true;
5504
5505 EVT VT = Op.getValueType();
5506 APInt DemandedElts = VT.isFixedLengthVector()
5508 : APInt(1, 1);
5509 return isGuaranteedNotToBeUndefOrPoison(Op, DemandedElts, PoisonOnly, Depth);
5510}
5511
5513 const APInt &DemandedElts,
5514 bool PoisonOnly,
5515 unsigned Depth) const {
5516 unsigned Opcode = Op.getOpcode();
5517
5518 // Early out for FREEZE.
5519 if (Opcode == ISD::FREEZE)
5520 return true;
5521
5522 if (Depth >= MaxRecursionDepth)
5523 return false; // Limit search depth.
5524
5525 if (isIntOrFPConstant(Op))
5526 return true;
5527
5528 switch (Opcode) {
5529 case ISD::CONDCODE:
5530 case ISD::VALUETYPE:
5531 case ISD::FrameIndex:
5533 case ISD::CopyFromReg:
5534 return true;
5535
5536 case ISD::POISON:
5537 return false;
5538
5539 case ISD::UNDEF:
5540 return PoisonOnly;
5541
5542 case ISD::BUILD_VECTOR:
5543 // NOTE: BUILD_VECTOR has implicit truncation of wider scalar elements -
5544 // this shouldn't affect the result.
5545 for (unsigned i = 0, e = Op.getNumOperands(); i < e; ++i) {
5546 if (!DemandedElts[i])
5547 continue;
5549 Depth + 1))
5550 return false;
5551 }
5552 return true;
5553
5555 SDValue Src = Op.getOperand(0);
5556 if (Src.getValueType().isScalableVector())
5557 break;
5558 uint64_t Idx = Op.getConstantOperandVal(1);
5559 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5560 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5561 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, PoisonOnly,
5562 Depth + 1);
5563 }
5564
5565 case ISD::INSERT_SUBVECTOR: {
5566 if (Op.getValueType().isScalableVector())
5567 break;
5568 SDValue Src = Op.getOperand(0);
5569 SDValue Sub = Op.getOperand(1);
5570 uint64_t Idx = Op.getConstantOperandVal(2);
5571 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5572 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5573 APInt DemandedSrcElts = DemandedElts;
5574 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5575
5576 if (!!DemandedSubElts && !isGuaranteedNotToBeUndefOrPoison(
5577 Sub, DemandedSubElts, PoisonOnly, Depth + 1))
5578 return false;
5579 if (!!DemandedSrcElts && !isGuaranteedNotToBeUndefOrPoison(
5580 Src, DemandedSrcElts, PoisonOnly, Depth + 1))
5581 return false;
5582 return true;
5583 }
5584
5586 SDValue Src = Op.getOperand(0);
5587 auto *IndexC = dyn_cast<ConstantSDNode>(Op.getOperand(1));
5588 EVT SrcVT = Src.getValueType();
5589 if (SrcVT.isFixedLengthVector() && IndexC &&
5590 IndexC->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
5591 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
5592 IndexC->getZExtValue());
5593 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, PoisonOnly,
5594 Depth + 1);
5595 }
5596 break;
5597 }
5598
5600 SDValue InVec = Op.getOperand(0);
5601 SDValue InVal = Op.getOperand(1);
5602 SDValue EltNo = Op.getOperand(2);
5603 EVT VT = InVec.getValueType();
5604 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
5605 if (IndexC && VT.isFixedLengthVector() &&
5606 IndexC->getAPIntValue().ult(VT.getVectorNumElements())) {
5607 if (DemandedElts[IndexC->getZExtValue()] &&
5609 return false;
5610 APInt InVecDemandedElts = DemandedElts;
5611 InVecDemandedElts.clearBit(IndexC->getZExtValue());
5612 if (!!InVecDemandedElts &&
5614 peekThroughInsertVectorElt(InVec, InVecDemandedElts),
5615 InVecDemandedElts, PoisonOnly, Depth + 1))
5616 return false;
5617 return true;
5618 }
5619 break;
5620 }
5621
5623 // Check upper (known undef) elements.
5624 if (DemandedElts.ugt(1) && !PoisonOnly)
5625 return false;
5626 // Check element zero.
5627 if (DemandedElts[0] && !isGuaranteedNotToBeUndefOrPoison(
5628 Op.getOperand(0), PoisonOnly, Depth + 1))
5629 return false;
5630 return true;
5631
5632 case ISD::SPLAT_VECTOR:
5633 return isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), PoisonOnly,
5634 Depth + 1);
5635
5636 case ISD::VECTOR_SHUFFLE: {
5637 APInt DemandedLHS, DemandedRHS;
5638 auto *SVN = cast<ShuffleVectorSDNode>(Op);
5639 if (!getShuffleDemandedElts(DemandedElts.getBitWidth(), SVN->getMask(),
5640 DemandedElts, DemandedLHS, DemandedRHS,
5641 /*AllowUndefElts=*/false))
5642 return false;
5643 if (!DemandedLHS.isZero() &&
5644 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedLHS,
5645 PoisonOnly, Depth + 1))
5646 return false;
5647 if (!DemandedRHS.isZero() &&
5648 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(1), DemandedRHS,
5649 PoisonOnly, Depth + 1))
5650 return false;
5651 return true;
5652 }
5653
5654 case ISD::SHL:
5655 case ISD::SRL:
5656 case ISD::SRA:
5657 // Shift amount operand is checked by canCreateUndefOrPoison. So it is
5658 // enough to check operand 0 if Op can't create undef/poison.
5659 return !canCreateUndefOrPoison(Op, DemandedElts, PoisonOnly,
5660 /*ConsiderFlags*/ true, Depth) &&
5661 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
5662 PoisonOnly, Depth + 1);
5663
5664 case ISD::BSWAP:
5665 case ISD::CTPOP:
5666 case ISD::BITREVERSE:
5667 case ISD::AND:
5668 case ISD::OR:
5669 case ISD::XOR:
5670 case ISD::ADD:
5671 case ISD::SUB:
5672 case ISD::MUL:
5673 case ISD::SADDSAT:
5674 case ISD::UADDSAT:
5675 case ISD::SSUBSAT:
5676 case ISD::USUBSAT:
5677 case ISD::SSHLSAT:
5678 case ISD::USHLSAT:
5679 case ISD::SMIN:
5680 case ISD::SMAX:
5681 case ISD::UMIN:
5682 case ISD::UMAX:
5683 case ISD::ZERO_EXTEND:
5684 case ISD::SIGN_EXTEND:
5685 case ISD::ANY_EXTEND:
5686 case ISD::TRUNCATE:
5687 case ISD::VSELECT: {
5688 // If Op can't create undef/poison and none of its operands are undef/poison
5689 // then Op is never undef/poison. A difference from the more common check
5690 // below, outside the switch, is that we handle elementwise operations for
5691 // which the DemandedElts mask is valid for all operands here.
5692 return !canCreateUndefOrPoison(Op, DemandedElts, PoisonOnly,
5693 /*ConsiderFlags*/ true, Depth) &&
5694 all_of(Op->ops(), [&](SDValue V) {
5695 return isGuaranteedNotToBeUndefOrPoison(V, DemandedElts,
5696 PoisonOnly, Depth + 1);
5697 });
5698 }
5699
5700 // TODO: Search for noundef attributes from library functions.
5701
5702 // TODO: Pointers dereferenced by ISD::LOAD/STORE ops are noundef.
5703
5704 default:
5705 // Allow the target to implement this method for its nodes.
5706 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
5707 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
5708 return TLI->isGuaranteedNotToBeUndefOrPoisonForTargetNode(
5709 Op, DemandedElts, *this, PoisonOnly, Depth);
5710 break;
5711 }
5712
5713 // If Op can't create undef/poison and none of its operands are undef/poison
5714 // then Op is never undef/poison.
5715 // NOTE: TargetNodes can handle this in themselves in
5716 // isGuaranteedNotToBeUndefOrPoisonForTargetNode or let
5717 // TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode handle it.
5718 return !canCreateUndefOrPoison(Op, PoisonOnly, /*ConsiderFlags*/ true,
5719 Depth) &&
5720 all_of(Op->ops(), [&](SDValue V) {
5721 return isGuaranteedNotToBeUndefOrPoison(V, PoisonOnly, Depth + 1);
5722 });
5723}
5724
5726 bool ConsiderFlags,
5727 unsigned Depth) const {
5728 EVT VT = Op.getValueType();
5729 APInt DemandedElts = VT.isFixedLengthVector()
5731 : APInt(1, 1);
5732 return canCreateUndefOrPoison(Op, DemandedElts, PoisonOnly, ConsiderFlags,
5733 Depth);
5734}
5735
5737 bool PoisonOnly, bool ConsiderFlags,
5738 unsigned Depth) const {
5739 if (ConsiderFlags && Op->hasPoisonGeneratingFlags())
5740 return true;
5741
5742 unsigned Opcode = Op.getOpcode();
5743 switch (Opcode) {
5744 case ISD::AssertSext:
5745 case ISD::AssertZext:
5746 case ISD::AssertAlign:
5748 // Assertion nodes can create poison if the assertion fails.
5749 return true;
5750
5751 case ISD::FREEZE:
5755 case ISD::SADDSAT:
5756 case ISD::UADDSAT:
5757 case ISD::SSUBSAT:
5758 case ISD::USUBSAT:
5759 case ISD::MULHU:
5760 case ISD::MULHS:
5761 case ISD::AVGFLOORS:
5762 case ISD::AVGFLOORU:
5763 case ISD::AVGCEILS:
5764 case ISD::AVGCEILU:
5765 case ISD::ABDU:
5766 case ISD::ABDS:
5767 case ISD::SMIN:
5768 case ISD::SMAX:
5769 case ISD::SCMP:
5770 case ISD::UMIN:
5771 case ISD::UMAX:
5772 case ISD::UCMP:
5773 case ISD::AND:
5774 case ISD::XOR:
5775 case ISD::ROTL:
5776 case ISD::ROTR:
5777 case ISD::FSHL:
5778 case ISD::FSHR:
5779 case ISD::BSWAP:
5780 case ISD::CTTZ:
5781 case ISD::CTLZ:
5782 case ISD::CTLS:
5783 case ISD::CTPOP:
5784 case ISD::BITREVERSE:
5785 case ISD::PARITY:
5786 case ISD::SIGN_EXTEND:
5787 case ISD::TRUNCATE:
5791 case ISD::BITCAST:
5792 case ISD::BUILD_VECTOR:
5793 case ISD::BUILD_PAIR:
5794 case ISD::SPLAT_VECTOR:
5795 case ISD::FABS:
5796 return false;
5797
5798 case ISD::ABS:
5799 // ISD::ABS defines abs(INT_MIN) -> INT_MIN and never generates poison.
5800 // Different to Intrinsic::abs.
5801 return false;
5802
5803 case ISD::ADDC:
5804 case ISD::SUBC:
5805 case ISD::ADDE:
5806 case ISD::SUBE:
5807 case ISD::SADDO:
5808 case ISD::SSUBO:
5809 case ISD::SMULO:
5810 case ISD::SADDO_CARRY:
5811 case ISD::SSUBO_CARRY:
5812 case ISD::UADDO:
5813 case ISD::USUBO:
5814 case ISD::UMULO:
5815 case ISD::UADDO_CARRY:
5816 case ISD::USUBO_CARRY:
5817 // No poison on result or overflow flags.
5818 return false;
5819
5820 case ISD::SELECT_CC:
5821 case ISD::SETCC: {
5822 // Integer setcc cannot create undef or poison.
5823 if (Op.getOperand(0).getValueType().isInteger())
5824 return false;
5825
5826 // FP compares are more complicated. They can create poison for nan/infinity
5827 // based on options and flags. The options and flags also cause special
5828 // nonan condition codes to be used. Those condition codes may be preserved
5829 // even if the nonan flag is dropped somewhere.
5830 unsigned CCOp = Opcode == ISD::SETCC ? 2 : 4;
5831 ISD::CondCode CCCode = cast<CondCodeSDNode>(Op.getOperand(CCOp))->get();
5832 return (unsigned)CCCode & 0x10U;
5833 }
5834
5835 case ISD::OR:
5836 case ISD::ZERO_EXTEND:
5837 case ISD::SELECT:
5838 case ISD::VSELECT:
5839 case ISD::ADD:
5840 case ISD::SUB:
5841 case ISD::MUL:
5842 case ISD::FNEG:
5843 case ISD::FADD:
5844 case ISD::FSUB:
5845 case ISD::FMUL:
5846 case ISD::FDIV:
5847 case ISD::FREM:
5848 case ISD::FCOPYSIGN:
5849 case ISD::FMA:
5850 case ISD::FMAD:
5851 case ISD::FMULADD:
5852 case ISD::FP_EXTEND:
5858 // No poison except from flags (which is handled above)
5859 return false;
5860
5861 case ISD::SHL:
5862 case ISD::SRL:
5863 case ISD::SRA:
5864 // If the max shift amount isn't in range, then the shift can
5865 // create poison.
5866 return !getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1);
5867
5870 // If the amount is zero then the result will be poison.
5871 // TODO: Add isKnownNeverZero DemandedElts handling.
5872 return !isKnownNeverZero(Op.getOperand(0), Depth + 1);
5873
5875 // Check if we demand any upper (undef) elements.
5876 return !PoisonOnly && DemandedElts.ugt(1);
5877
5880 // Ensure that the element index is in bounds.
5881 EVT VecVT = Op.getOperand(0).getValueType();
5882 SDValue Idx = Op.getOperand(Opcode == ISD::INSERT_VECTOR_ELT ? 2 : 1);
5883 KnownBits KnownIdx = computeKnownBits(Idx, Depth + 1);
5884 return KnownIdx.getMaxValue().uge(VecVT.getVectorMinNumElements());
5885 }
5886
5887 case ISD::VECTOR_SHUFFLE: {
5888 // Check for any demanded shuffle element that is undef.
5889 auto *SVN = cast<ShuffleVectorSDNode>(Op);
5890 for (auto [Idx, Elt] : enumerate(SVN->getMask()))
5891 if (Elt < 0 && DemandedElts[Idx])
5892 return true;
5893 return false;
5894 }
5895
5897 return false;
5898
5899 default:
5900 // Allow the target to implement this method for its nodes.
5901 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
5902 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
5903 return TLI->canCreateUndefOrPoisonForTargetNode(
5904 Op, DemandedElts, *this, PoisonOnly, ConsiderFlags, Depth);
5905 break;
5906 }
5907
5908 // Be conservative and return true.
5909 return true;
5910}
5911
5912bool SelectionDAG::isADDLike(SDValue Op, bool NoWrap) const {
5913 unsigned Opcode = Op.getOpcode();
5914 if (Opcode == ISD::OR)
5915 return Op->getFlags().hasDisjoint() ||
5916 haveNoCommonBitsSet(Op.getOperand(0), Op.getOperand(1));
5917 if (Opcode == ISD::XOR)
5918 return !NoWrap && isMinSignedConstant(Op.getOperand(1));
5919 return false;
5920}
5921
5923 return Op.getNumOperands() == 2 && isa<ConstantSDNode>(Op.getOperand(1)) &&
5924 (Op.isAnyAdd() || isADDLike(Op));
5925}
5926
5928 unsigned Depth) const {
5929 EVT VT = Op.getValueType();
5930
5931 // Since the number of lanes in a scalable vector is unknown at compile time,
5932 // we track one bit which is implicitly broadcast to all lanes. This means
5933 // that all lanes in a scalable vector are considered demanded.
5934 APInt DemandedElts = VT.isFixedLengthVector()
5936 : APInt(1, 1);
5937
5938 return isKnownNeverNaN(Op, DemandedElts, SNaN, Depth);
5939}
5940
5942 bool SNaN, unsigned Depth) const {
5943 assert(!DemandedElts.isZero() && "No demanded elements");
5944
5945 // If we're told that NaNs won't happen, assume they won't.
5946 if (getTarget().Options.NoNaNsFPMath || Op->getFlags().hasNoNaNs())
5947 return true;
5948
5949 if (Depth >= MaxRecursionDepth)
5950 return false; // Limit search depth.
5951
5952 // If the value is a constant, we can obviously see if it is a NaN or not.
5954 return !C->getValueAPF().isNaN() ||
5955 (SNaN && !C->getValueAPF().isSignaling());
5956 }
5957
5958 unsigned Opcode = Op.getOpcode();
5959 switch (Opcode) {
5960 case ISD::FADD:
5961 case ISD::FSUB:
5962 case ISD::FMUL:
5963 case ISD::FDIV:
5964 case ISD::FREM:
5965 case ISD::FSIN:
5966 case ISD::FCOS:
5967 case ISD::FTAN:
5968 case ISD::FASIN:
5969 case ISD::FACOS:
5970 case ISD::FATAN:
5971 case ISD::FATAN2:
5972 case ISD::FSINH:
5973 case ISD::FCOSH:
5974 case ISD::FTANH:
5975 case ISD::FMA:
5976 case ISD::FMULADD:
5977 case ISD::FMAD: {
5978 if (SNaN)
5979 return true;
5980 // TODO: Need isKnownNeverInfinity
5981 return false;
5982 }
5983 case ISD::FCANONICALIZE:
5984 case ISD::FEXP:
5985 case ISD::FEXP2:
5986 case ISD::FEXP10:
5987 case ISD::FTRUNC:
5988 case ISD::FFLOOR:
5989 case ISD::FCEIL:
5990 case ISD::FROUND:
5991 case ISD::FROUNDEVEN:
5992 case ISD::LROUND:
5993 case ISD::LLROUND:
5994 case ISD::FRINT:
5995 case ISD::LRINT:
5996 case ISD::LLRINT:
5997 case ISD::FNEARBYINT:
5998 case ISD::FLDEXP: {
5999 if (SNaN)
6000 return true;
6001 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6002 }
6003 case ISD::FABS:
6004 case ISD::FNEG:
6005 case ISD::FCOPYSIGN: {
6006 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6007 }
6008 case ISD::SELECT:
6009 return isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1) &&
6010 isKnownNeverNaN(Op.getOperand(2), DemandedElts, SNaN, Depth + 1);
6011 case ISD::FP_EXTEND:
6012 case ISD::FP_ROUND: {
6013 if (SNaN)
6014 return true;
6015 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6016 }
6017 case ISD::SINT_TO_FP:
6018 case ISD::UINT_TO_FP:
6019 return true;
6020 case ISD::FSQRT: // Need is known positive
6021 case ISD::FLOG:
6022 case ISD::FLOG2:
6023 case ISD::FLOG10:
6024 case ISD::FPOWI:
6025 case ISD::FPOW: {
6026 if (SNaN)
6027 return true;
6028 // TODO: Refine on operand
6029 return false;
6030 }
6031 case ISD::FMINNUM:
6032 case ISD::FMAXNUM:
6033 case ISD::FMINIMUMNUM:
6034 case ISD::FMAXIMUMNUM: {
6035 // Only one needs to be known not-nan, since it will be returned if the
6036 // other ends up being one.
6037 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) ||
6038 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6039 }
6040 case ISD::FMINNUM_IEEE:
6041 case ISD::FMAXNUM_IEEE: {
6042 if (SNaN)
6043 return true;
6044 // This can return a NaN if either operand is an sNaN, or if both operands
6045 // are NaN.
6046 return (isKnownNeverNaN(Op.getOperand(0), DemandedElts, false, Depth + 1) &&
6047 isKnownNeverSNaN(Op.getOperand(1), DemandedElts, Depth + 1)) ||
6048 (isKnownNeverNaN(Op.getOperand(1), DemandedElts, false, Depth + 1) &&
6049 isKnownNeverSNaN(Op.getOperand(0), DemandedElts, Depth + 1));
6050 }
6051 case ISD::FMINIMUM:
6052 case ISD::FMAXIMUM: {
6053 // TODO: Does this quiet or return the origina NaN as-is?
6054 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) &&
6055 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6056 }
6058 SDValue Src = Op.getOperand(0);
6059 auto *Idx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6060 EVT SrcVT = Src.getValueType();
6061 if (SrcVT.isFixedLengthVector() && Idx &&
6062 Idx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6063 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
6064 Idx->getZExtValue());
6065 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6066 }
6067 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6068 }
6070 SDValue Src = Op.getOperand(0);
6071 if (Src.getValueType().isFixedLengthVector()) {
6072 unsigned Idx = Op.getConstantOperandVal(1);
6073 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
6074 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
6075 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6076 }
6077 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6078 }
6079 case ISD::INSERT_SUBVECTOR: {
6080 SDValue BaseVector = Op.getOperand(0);
6081 SDValue SubVector = Op.getOperand(1);
6082 EVT BaseVectorVT = BaseVector.getValueType();
6083 if (BaseVectorVT.isFixedLengthVector()) {
6084 unsigned Idx = Op.getConstantOperandVal(2);
6085 unsigned NumBaseElts = BaseVectorVT.getVectorNumElements();
6086 unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
6087
6088 // Clear/Extract the bits at the position where the subvector will be
6089 // inserted.
6090 APInt DemandedMask =
6091 APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
6092 APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
6093 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
6094
6095 bool NeverNaN = true;
6096 if (!DemandedSrcElts.isZero())
6097 NeverNaN &=
6098 isKnownNeverNaN(BaseVector, DemandedSrcElts, SNaN, Depth + 1);
6099 if (NeverNaN && !DemandedSubElts.isZero())
6100 NeverNaN &=
6101 isKnownNeverNaN(SubVector, DemandedSubElts, SNaN, Depth + 1);
6102 return NeverNaN;
6103 }
6104 return isKnownNeverNaN(BaseVector, SNaN, Depth + 1) &&
6105 isKnownNeverNaN(SubVector, SNaN, Depth + 1);
6106 }
6107 case ISD::BUILD_VECTOR: {
6108 unsigned NumElts = Op.getNumOperands();
6109 for (unsigned I = 0; I != NumElts; ++I)
6110 if (DemandedElts[I] &&
6111 !isKnownNeverNaN(Op.getOperand(I), SNaN, Depth + 1))
6112 return false;
6113 return true;
6114 }
6115 case ISD::SPLAT_VECTOR:
6116 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
6117 case ISD::AssertNoFPClass: {
6118 FPClassTest NoFPClass =
6119 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
6120 if ((NoFPClass & fcNan) == fcNan)
6121 return true;
6122 if (SNaN && (NoFPClass & fcSNan) == fcSNan)
6123 return true;
6124 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6125 }
6126 default:
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->isKnownNeverNaNForTargetNode(Op, DemandedElts, *this, SNaN,
6130 Depth);
6131 }
6132
6133 return false;
6134 }
6135}
6136
6138 assert(Op.getValueType().isFloatingPoint() &&
6139 "Floating point type expected");
6140
6141 // If the value is a constant, we can obviously see if it is a zero or not.
6143 Op, [](ConstantFPSDNode *C) { return !C->isZero(); });
6144}
6145
6147 EVT VT = Op.getValueType();
6148
6149 // Since the number of lanes in a scalable vector is unknown at compile time,
6150 // we track one bit which is implicitly broadcast to all lanes. This means
6151 // that all lanes in a scalable vector are considered demanded.
6152 APInt DemandedElts = VT.isFixedLengthVector()
6154 : APInt(1, 1);
6155
6156 return isKnownNeverZero(Op, DemandedElts, Depth);
6157}
6158
6160 unsigned Depth) const {
6161 if (Depth >= MaxRecursionDepth)
6162 return false; // Limit search depth.
6163
6164 EVT OpVT = Op.getValueType();
6165 unsigned BitWidth = OpVT.getScalarSizeInBits();
6166
6167 assert(!Op.getValueType().isFloatingPoint() &&
6168 "Floating point types unsupported - use isKnownNeverZeroFloat");
6169
6170 // If the value is a constant, we can obviously see if it is a zero or not.
6171 auto IsNeverZero = [BitWidth](const ConstantSDNode *C) {
6172 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
6173 return !V.isZero();
6174 };
6175
6176 if (ISD::matchUnaryPredicate(Op, IsNeverZero))
6177 return true;
6178
6179 // TODO: Recognize more cases here. Most of the cases are also incomplete to
6180 // some degree.
6181 switch (Op.getOpcode()) {
6182 default:
6183 break;
6184
6185 case ISD::BUILD_VECTOR:
6186 // Are all operands of a build vector constant non-zero?
6187 if (all_of(enumerate(Op->ops()), [&](auto P) {
6188 auto *C = dyn_cast<ConstantSDNode>(P.value());
6189 return !DemandedElts[P.index()] || (C && IsNeverZero(C));
6190 }))
6191 return true;
6192 break;
6193
6194 case ISD::SPLAT_VECTOR:
6195 // Is the operand of a splat vector a constant non-zero?
6196 if (auto *C = dyn_cast<ConstantSDNode>(Op->getOperand(0)))
6197 if (IsNeverZero(C))
6198 return true;
6199 break;
6200
6201 case ISD::OR:
6202 return isKnownNeverZero(Op.getOperand(1), Depth + 1) ||
6203 isKnownNeverZero(Op.getOperand(0), Depth + 1);
6204
6205 case ISD::VSELECT:
6206 case ISD::SELECT:
6207 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6208 isKnownNeverZero(Op.getOperand(2), DemandedElts, Depth + 1);
6209
6210 case ISD::SHL: {
6211 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6212 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
6213 KnownBits ValKnown = computeKnownBits(Op.getOperand(0), Depth + 1);
6214 // 1 << X is never zero.
6215 if (ValKnown.One[0])
6216 return true;
6217 // If max shift cnt of known ones is non-zero, result is non-zero.
6218 APInt MaxCnt = computeKnownBits(Op.getOperand(1), Depth + 1).getMaxValue();
6219 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6220 !ValKnown.One.shl(MaxCnt).isZero())
6221 return true;
6222 break;
6223 }
6224 case ISD::UADDSAT:
6225 case ISD::UMAX:
6226 return isKnownNeverZero(Op.getOperand(1), Depth + 1) ||
6227 isKnownNeverZero(Op.getOperand(0), Depth + 1);
6228
6229 // For smin/smax: If either operand is known negative/positive
6230 // respectively we don't need the other to be known at all.
6231 case ISD::SMAX: {
6232 KnownBits Op1 = computeKnownBits(Op.getOperand(1), Depth + 1);
6233 if (Op1.isStrictlyPositive())
6234 return true;
6235
6236 KnownBits Op0 = computeKnownBits(Op.getOperand(0), Depth + 1);
6237 if (Op0.isStrictlyPositive())
6238 return true;
6239
6240 if (Op1.isNonZero() && Op0.isNonZero())
6241 return true;
6242
6243 return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
6244 isKnownNeverZero(Op.getOperand(0), Depth + 1);
6245 }
6246 case ISD::SMIN: {
6247 KnownBits Op1 = computeKnownBits(Op.getOperand(1), Depth + 1);
6248 if (Op1.isNegative())
6249 return true;
6250
6251 KnownBits Op0 = computeKnownBits(Op.getOperand(0), Depth + 1);
6252 if (Op0.isNegative())
6253 return true;
6254
6255 if (Op1.isNonZero() && Op0.isNonZero())
6256 return true;
6257
6258 return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
6259 isKnownNeverZero(Op.getOperand(0), Depth + 1);
6260 }
6261 case ISD::UMIN:
6262 return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
6263 isKnownNeverZero(Op.getOperand(0), Depth + 1);
6264
6265 case ISD::ROTL:
6266 case ISD::ROTR:
6267 case ISD::BITREVERSE:
6268 case ISD::BSWAP:
6269 case ISD::CTPOP:
6270 case ISD::ABS:
6271 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
6272
6273 case ISD::SRA:
6274 case ISD::SRL: {
6275 if (Op->getFlags().hasExact())
6276 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
6277 KnownBits ValKnown = computeKnownBits(Op.getOperand(0), Depth + 1);
6278 if (ValKnown.isNegative())
6279 return true;
6280 // If max shift cnt of known ones is non-zero, result is non-zero.
6281 APInt MaxCnt = computeKnownBits(Op.getOperand(1), Depth + 1).getMaxValue();
6282 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6283 !ValKnown.One.lshr(MaxCnt).isZero())
6284 return true;
6285 break;
6286 }
6287 case ISD::UDIV:
6288 case ISD::SDIV:
6289 // div exact can only produce a zero if the dividend is zero.
6290 // TODO: For udiv this is also true if Op1 u<= Op0
6291 if (Op->getFlags().hasExact())
6292 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
6293 break;
6294
6295 case ISD::ADD:
6296 if (Op->getFlags().hasNoUnsignedWrap())
6297 if (isKnownNeverZero(Op.getOperand(1), Depth + 1) ||
6298 isKnownNeverZero(Op.getOperand(0), Depth + 1))
6299 return true;
6300 // TODO: There are a lot more cases we can prove for add.
6301 break;
6302
6303 case ISD::SUB: {
6304 if (isNullConstant(Op.getOperand(0)))
6305 return isKnownNeverZero(Op.getOperand(1), Depth + 1);
6306
6307 std::optional<bool> ne =
6308 KnownBits::ne(computeKnownBits(Op.getOperand(0), Depth + 1),
6309 computeKnownBits(Op.getOperand(1), Depth + 1));
6310 return ne && *ne;
6311 }
6312
6313 case ISD::MUL:
6314 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6315 if (isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
6316 isKnownNeverZero(Op.getOperand(0), Depth + 1))
6317 return true;
6318 break;
6319
6320 case ISD::ZERO_EXTEND:
6321 case ISD::SIGN_EXTEND:
6322 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
6323 case ISD::VSCALE: {
6325 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
6326 ConstantRange CR =
6327 getVScaleRange(&F, Op.getScalarValueSizeInBits()).multiply(Multiplier);
6328 if (!CR.contains(APInt(CR.getBitWidth(), 0)))
6329 return true;
6330 break;
6331 }
6332 }
6333
6335}
6336
6338 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Op, true))
6339 return !C1->isNegative();
6340
6341 switch (Op.getOpcode()) {
6342 case ISD::FABS:
6343 case ISD::FEXP:
6344 case ISD::FEXP2:
6345 case ISD::FEXP10:
6346 return true;
6347 default:
6348 return false;
6349 }
6350
6351 llvm_unreachable("covered opcode switch");
6352}
6353
6355 assert(Use.getValueType().isFloatingPoint());
6356 const SDNode *User = Use.getUser();
6357 if (User->getFlags().hasNoSignedZeros())
6358 return true;
6359
6360 unsigned OperandNo = Use.getOperandNo();
6361 // Check if this use is insensitive to the sign of zero
6362 switch (User->getOpcode()) {
6363 case ISD::SETCC:
6364 // Comparisons: IEEE-754 specifies +0.0 == -0.0.
6365 case ISD::FABS:
6366 // fabs always produces +0.0.
6367 return true;
6368 case ISD::FCOPYSIGN:
6369 // copysign overwrites the sign bit of the first operand.
6370 return OperandNo == 0;
6371 case ISD::FADD:
6372 case ISD::FSUB: {
6373 // Arithmetic with non-zero constants fixes the uncertainty around the
6374 // sign bit.
6375 SDValue Other = User->getOperand(1 - OperandNo);
6377 }
6378 case ISD::FP_TO_SINT:
6379 case ISD::FP_TO_UINT:
6380 // fp-to-int conversions normalize signed zeros.
6381 return true;
6382 default:
6383 return false;
6384 }
6385}
6386
6388 if (Op->getFlags().hasNoSignedZeros())
6389 return true;
6390 // FIXME: Limit the amount of checked uses to not introduce a compile-time
6391 // regression. Ideally, this should be implemented as a demanded-bits
6392 // optimization that stems from the users.
6393 if (Op->use_size() > 2)
6394 return false;
6395 return all_of(Op->uses(),
6396 [&](const SDUse &Use) { return canIgnoreSignBitOfZero(Use); });
6397}
6398
6400 // Check the obvious case.
6401 if (A == B) return true;
6402
6403 // For negative and positive zero.
6406 if (CA->isZero() && CB->isZero()) return true;
6407
6408 // Otherwise they may not be equal.
6409 return false;
6410}
6411
6412// Only bits set in Mask must be negated, other bits may be arbitrary.
6414 if (isBitwiseNot(V, AllowUndefs))
6415 return V.getOperand(0);
6416
6417 // Handle any_extend (not (truncate X)) pattern, where Mask only sets
6418 // bits in the non-extended part.
6419 ConstantSDNode *MaskC = isConstOrConstSplat(Mask);
6420 if (!MaskC || V.getOpcode() != ISD::ANY_EXTEND)
6421 return SDValue();
6422 SDValue ExtArg = V.getOperand(0);
6423 if (ExtArg.getScalarValueSizeInBits() >=
6424 MaskC->getAPIntValue().getActiveBits() &&
6425 isBitwiseNot(ExtArg, AllowUndefs) &&
6426 ExtArg.getOperand(0).getOpcode() == ISD::TRUNCATE &&
6427 ExtArg.getOperand(0).getOperand(0).getValueType() == V.getValueType())
6428 return ExtArg.getOperand(0).getOperand(0);
6429 return SDValue();
6430}
6431
6433 // Match masked merge pattern (X & ~M) op (Y & M)
6434 // Including degenerate case (X & ~M) op M
6435 auto MatchNoCommonBitsPattern = [&](SDValue Not, SDValue Mask,
6436 SDValue Other) {
6437 if (SDValue NotOperand =
6438 getBitwiseNotOperand(Not, Mask, /* AllowUndefs */ true)) {
6439 if (NotOperand->getOpcode() == ISD::ZERO_EXTEND ||
6440 NotOperand->getOpcode() == ISD::TRUNCATE)
6441 NotOperand = NotOperand->getOperand(0);
6442
6443 if (Other == NotOperand)
6444 return true;
6445 if (Other->getOpcode() == ISD::AND)
6446 return NotOperand == Other->getOperand(0) ||
6447 NotOperand == Other->getOperand(1);
6448 }
6449 return false;
6450 };
6451
6452 if (A->getOpcode() == ISD::ZERO_EXTEND || A->getOpcode() == ISD::TRUNCATE)
6453 A = A->getOperand(0);
6454
6455 if (B->getOpcode() == ISD::ZERO_EXTEND || B->getOpcode() == ISD::TRUNCATE)
6456 B = B->getOperand(0);
6457
6458 if (A->getOpcode() == ISD::AND)
6459 return MatchNoCommonBitsPattern(A->getOperand(0), A->getOperand(1), B) ||
6460 MatchNoCommonBitsPattern(A->getOperand(1), A->getOperand(0), B);
6461 return false;
6462}
6463
6464// FIXME: unify with llvm::haveNoCommonBitsSet.
6466 assert(A.getValueType() == B.getValueType() &&
6467 "Values must have the same type");
6470 return true;
6473}
6474
6475static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step,
6476 SelectionDAG &DAG) {
6477 if (cast<ConstantSDNode>(Step)->isZero())
6478 return DAG.getConstant(0, DL, VT);
6479
6480 return SDValue();
6481}
6482
6485 SelectionDAG &DAG) {
6486 int NumOps = Ops.size();
6487 assert(NumOps != 0 && "Can't build an empty vector!");
6488 assert(!VT.isScalableVector() &&
6489 "BUILD_VECTOR cannot be used with scalable types");
6490 assert(VT.getVectorNumElements() == (unsigned)NumOps &&
6491 "Incorrect element count in BUILD_VECTOR!");
6492
6493 // BUILD_VECTOR of UNDEFs is UNDEF.
6494 if (llvm::all_of(Ops, [](SDValue Op) { return Op.isUndef(); }))
6495 return DAG.getUNDEF(VT);
6496
6497 // BUILD_VECTOR of seq extract/insert from the same vector + type is Identity.
6498 SDValue IdentitySrc;
6499 bool IsIdentity = true;
6500 for (int i = 0; i != NumOps; ++i) {
6502 Ops[i].getOperand(0).getValueType() != VT ||
6503 (IdentitySrc && Ops[i].getOperand(0) != IdentitySrc) ||
6504 !isa<ConstantSDNode>(Ops[i].getOperand(1)) ||
6505 Ops[i].getConstantOperandAPInt(1) != i) {
6506 IsIdentity = false;
6507 break;
6508 }
6509 IdentitySrc = Ops[i].getOperand(0);
6510 }
6511 if (IsIdentity)
6512 return IdentitySrc;
6513
6514 return SDValue();
6515}
6516
6517/// Try to simplify vector concatenation to an input value, undef, or build
6518/// vector.
6521 SelectionDAG &DAG) {
6522 assert(!Ops.empty() && "Can't concatenate an empty list of vectors!");
6524 [Ops](SDValue Op) {
6525 return Ops[0].getValueType() == Op.getValueType();
6526 }) &&
6527 "Concatenation of vectors with inconsistent value types!");
6528 assert((Ops[0].getValueType().getVectorElementCount() * Ops.size()) ==
6529 VT.getVectorElementCount() &&
6530 "Incorrect element count in vector concatenation!");
6531
6532 if (Ops.size() == 1)
6533 return Ops[0];
6534
6535 // Concat of UNDEFs is UNDEF.
6536 if (llvm::all_of(Ops, [](SDValue Op) { return Op.isUndef(); }))
6537 return DAG.getUNDEF(VT);
6538
6539 // Scan the operands and look for extract operations from a single source
6540 // that correspond to insertion at the same location via this concatenation:
6541 // concat (extract X, 0*subvec_elts), (extract X, 1*subvec_elts), ...
6542 SDValue IdentitySrc;
6543 bool IsIdentity = true;
6544 for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
6545 SDValue Op = Ops[i];
6546 unsigned IdentityIndex = i * Op.getValueType().getVectorMinNumElements();
6547 if (Op.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
6548 Op.getOperand(0).getValueType() != VT ||
6549 (IdentitySrc && Op.getOperand(0) != IdentitySrc) ||
6550 Op.getConstantOperandVal(1) != IdentityIndex) {
6551 IsIdentity = false;
6552 break;
6553 }
6554 assert((!IdentitySrc || IdentitySrc == Op.getOperand(0)) &&
6555 "Unexpected identity source vector for concat of extracts");
6556 IdentitySrc = Op.getOperand(0);
6557 }
6558 if (IsIdentity) {
6559 assert(IdentitySrc && "Failed to set source vector of extracts");
6560 return IdentitySrc;
6561 }
6562
6563 // The code below this point is only designed to work for fixed width
6564 // vectors, so we bail out for now.
6565 if (VT.isScalableVector())
6566 return SDValue();
6567
6568 // A CONCAT_VECTOR of scalar sources, such as UNDEF, BUILD_VECTOR and
6569 // single-element INSERT_VECTOR_ELT operands can be simplified to one big
6570 // BUILD_VECTOR.
6571 // FIXME: Add support for SCALAR_TO_VECTOR as well.
6572 EVT SVT = VT.getScalarType();
6574 for (SDValue Op : Ops) {
6575 EVT OpVT = Op.getValueType();
6576 if (Op.isUndef())
6577 Elts.append(OpVT.getVectorNumElements(), DAG.getUNDEF(SVT));
6578 else if (Op.getOpcode() == ISD::BUILD_VECTOR)
6579 Elts.append(Op->op_begin(), Op->op_end());
6580 else if (Op.getOpcode() == ISD::INSERT_VECTOR_ELT &&
6581 OpVT.getVectorNumElements() == 1 &&
6582 isNullConstant(Op.getOperand(2)))
6583 Elts.push_back(Op.getOperand(1));
6584 else
6585 return SDValue();
6586 }
6587
6588 // BUILD_VECTOR requires all inputs to be of the same type, find the
6589 // maximum type and extend them all.
6590 for (SDValue Op : Elts)
6591 SVT = (SVT.bitsLT(Op.getValueType()) ? Op.getValueType() : SVT);
6592
6593 if (SVT.bitsGT(VT.getScalarType())) {
6594 for (SDValue &Op : Elts) {
6595 if (Op.isUndef())
6596 Op = DAG.getUNDEF(SVT);
6597 else
6598 Op = DAG.getTargetLoweringInfo().isZExtFree(Op.getValueType(), SVT)
6599 ? DAG.getZExtOrTrunc(Op, DL, SVT)
6600 : DAG.getSExtOrTrunc(Op, DL, SVT);
6601 }
6602 }
6603
6604 SDValue V = DAG.getBuildVector(VT, DL, Elts);
6605 NewSDValueDbgMsg(V, "New node fold concat vectors: ", &DAG);
6606 return V;
6607}
6608
6609/// Gets or creates the specified node.
6610SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT) {
6611 SDVTList VTs = getVTList(VT);
6613 AddNodeIDNode(ID, Opcode, VTs, {});
6614 void *IP = nullptr;
6615 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
6616 return SDValue(E, 0);
6617
6618 auto *N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6619 CSEMap.InsertNode(N, IP);
6620
6621 InsertNode(N);
6622 SDValue V = SDValue(N, 0);
6623 NewSDValueDbgMsg(V, "Creating new node: ", this);
6624 return V;
6625}
6626
6627SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
6628 SDValue N1) {
6629 SDNodeFlags Flags;
6630 if (Inserter)
6631 Flags = Inserter->getFlags();
6632 return getNode(Opcode, DL, VT, N1, Flags);
6633}
6634
6635SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
6636 SDValue N1, const SDNodeFlags Flags) {
6637 assert(N1.getOpcode() != ISD::DELETED_NODE && "Operand is DELETED_NODE!");
6638
6639 // Constant fold unary operations with a vector integer or float operand.
6640 switch (Opcode) {
6641 default:
6642 // FIXME: Entirely reasonable to perform folding of other unary
6643 // operations here as the need arises.
6644 break;
6645 case ISD::FNEG:
6646 case ISD::FABS:
6647 case ISD::FCEIL:
6648 case ISD::FTRUNC:
6649 case ISD::FFLOOR:
6650 case ISD::FP_EXTEND:
6651 case ISD::FP_TO_SINT:
6652 case ISD::FP_TO_UINT:
6653 case ISD::FP_TO_FP16:
6654 case ISD::FP_TO_BF16:
6655 case ISD::TRUNCATE:
6656 case ISD::ANY_EXTEND:
6657 case ISD::ZERO_EXTEND:
6658 case ISD::SIGN_EXTEND:
6659 case ISD::UINT_TO_FP:
6660 case ISD::SINT_TO_FP:
6661 case ISD::FP16_TO_FP:
6662 case ISD::BF16_TO_FP:
6663 case ISD::BITCAST:
6664 case ISD::ABS:
6665 case ISD::BITREVERSE:
6666 case ISD::BSWAP:
6667 case ISD::CTLZ:
6669 case ISD::CTTZ:
6671 case ISD::CTPOP:
6672 case ISD::CTLS:
6673 case ISD::STEP_VECTOR: {
6674 SDValue Ops = {N1};
6675 if (SDValue Fold = FoldConstantArithmetic(Opcode, DL, VT, Ops))
6676 return Fold;
6677 }
6678 }
6679
6680 unsigned OpOpcode = N1.getNode()->getOpcode();
6681 switch (Opcode) {
6682 case ISD::STEP_VECTOR:
6683 assert(VT.isScalableVector() &&
6684 "STEP_VECTOR can only be used with scalable types");
6685 assert(OpOpcode == ISD::TargetConstant &&
6686 VT.getVectorElementType() == N1.getValueType() &&
6687 "Unexpected step operand");
6688 break;
6689 case ISD::FREEZE:
6690 assert(VT == N1.getValueType() && "Unexpected VT!");
6691 if (isGuaranteedNotToBeUndefOrPoison(N1, /*PoisonOnly=*/false))
6692 return N1;
6693 break;
6694 case ISD::TokenFactor:
6695 case ISD::MERGE_VALUES:
6697 return N1; // Factor, merge or concat of one node? No need.
6698 case ISD::BUILD_VECTOR: {
6699 // Attempt to simplify BUILD_VECTOR.
6700 SDValue Ops[] = {N1};
6701 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
6702 return V;
6703 break;
6704 }
6705 case ISD::FP_ROUND: llvm_unreachable("Invalid method to make FP_ROUND node");
6706 case ISD::FP_EXTEND:
6708 "Invalid FP cast!");
6709 if (N1.getValueType() == VT) return N1; // noop conversion.
6710 assert((!VT.isVector() || VT.getVectorElementCount() ==
6712 "Vector element count mismatch!");
6713 assert(N1.getValueType().bitsLT(VT) && "Invalid fpext node, dst < src!");
6714 if (N1.isUndef())
6715 return getUNDEF(VT);
6716 break;
6717 case ISD::FP_TO_SINT:
6718 case ISD::FP_TO_UINT:
6719 if (N1.isUndef())
6720 return getUNDEF(VT);
6721 break;
6722 case ISD::SINT_TO_FP:
6723 case ISD::UINT_TO_FP:
6724 // [us]itofp(undef) = 0, because the result value is bounded.
6725 if (N1.isUndef())
6726 return getConstantFP(0.0, DL, VT);
6727 break;
6728 case ISD::SIGN_EXTEND:
6729 assert(VT.isInteger() && N1.getValueType().isInteger() &&
6730 "Invalid SIGN_EXTEND!");
6731 assert(VT.isVector() == N1.getValueType().isVector() &&
6732 "SIGN_EXTEND result type type should be vector iff the operand "
6733 "type is vector!");
6734 if (N1.getValueType() == VT) return N1; // noop extension
6735 assert((!VT.isVector() || VT.getVectorElementCount() ==
6737 "Vector element count mismatch!");
6738 assert(N1.getValueType().bitsLT(VT) && "Invalid sext node, dst < src!");
6739 if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND) {
6740 SDNodeFlags Flags;
6741 if (OpOpcode == ISD::ZERO_EXTEND)
6742 Flags.setNonNeg(N1->getFlags().hasNonNeg());
6743 SDValue NewVal = getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
6744 transferDbgValues(N1, NewVal);
6745 return NewVal;
6746 }
6747
6748 if (OpOpcode == ISD::POISON)
6749 return getPOISON(VT);
6750
6751 if (N1.isUndef())
6752 // sext(undef) = 0, because the top bits will all be the same.
6753 return getConstant(0, DL, VT);
6754
6755 // Skip unnecessary sext_inreg pattern:
6756 // (sext (trunc x)) -> x iff the upper bits are all signbits.
6757 if (OpOpcode == ISD::TRUNCATE) {
6758 SDValue OpOp = N1.getOperand(0);
6759 if (OpOp.getValueType() == VT) {
6760 unsigned NumSignExtBits =
6762 if (ComputeNumSignBits(OpOp) > NumSignExtBits) {
6763 transferDbgValues(N1, OpOp);
6764 return OpOp;
6765 }
6766 }
6767 }
6768 break;
6769 case ISD::ZERO_EXTEND:
6770 assert(VT.isInteger() && N1.getValueType().isInteger() &&
6771 "Invalid ZERO_EXTEND!");
6772 assert(VT.isVector() == N1.getValueType().isVector() &&
6773 "ZERO_EXTEND result type type should be vector iff the operand "
6774 "type is vector!");
6775 if (N1.getValueType() == VT) return N1; // noop extension
6776 assert((!VT.isVector() || VT.getVectorElementCount() ==
6778 "Vector element count mismatch!");
6779 assert(N1.getValueType().bitsLT(VT) && "Invalid zext node, dst < src!");
6780 if (OpOpcode == ISD::ZERO_EXTEND) { // (zext (zext x)) -> (zext x)
6781 SDNodeFlags Flags;
6782 Flags.setNonNeg(N1->getFlags().hasNonNeg());
6783 SDValue NewVal =
6784 getNode(ISD::ZERO_EXTEND, DL, VT, N1.getOperand(0), Flags);
6785 transferDbgValues(N1, NewVal);
6786 return NewVal;
6787 }
6788
6789 if (OpOpcode == ISD::POISON)
6790 return getPOISON(VT);
6791
6792 if (N1.isUndef())
6793 // zext(undef) = 0, because the top bits will be zero.
6794 return getConstant(0, DL, VT);
6795
6796 // Skip unnecessary zext_inreg pattern:
6797 // (zext (trunc x)) -> x iff the upper bits are known zero.
6798 // TODO: Remove (zext (trunc (and x, c))) exception which some targets
6799 // use to recognise zext_inreg patterns.
6800 if (OpOpcode == ISD::TRUNCATE) {
6801 SDValue OpOp = N1.getOperand(0);
6802 if (OpOp.getValueType() == VT) {
6803 if (OpOp.getOpcode() != ISD::AND) {
6806 if (MaskedValueIsZero(OpOp, HiBits)) {
6807 transferDbgValues(N1, OpOp);
6808 return OpOp;
6809 }
6810 }
6811 }
6812 }
6813 break;
6814 case ISD::ANY_EXTEND:
6815 assert(VT.isInteger() && N1.getValueType().isInteger() &&
6816 "Invalid ANY_EXTEND!");
6817 assert(VT.isVector() == N1.getValueType().isVector() &&
6818 "ANY_EXTEND result type type should be vector iff the operand "
6819 "type is vector!");
6820 if (N1.getValueType() == VT) return N1; // noop extension
6821 assert((!VT.isVector() || VT.getVectorElementCount() ==
6823 "Vector element count mismatch!");
6824 assert(N1.getValueType().bitsLT(VT) && "Invalid anyext node, dst < src!");
6825
6826 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
6827 OpOpcode == ISD::ANY_EXTEND) {
6828 SDNodeFlags Flags;
6829 if (OpOpcode == ISD::ZERO_EXTEND)
6830 Flags.setNonNeg(N1->getFlags().hasNonNeg());
6831 // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x)
6832 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
6833 }
6834 if (N1.isUndef())
6835 return getUNDEF(VT);
6836
6837 // (ext (trunc x)) -> x
6838 if (OpOpcode == ISD::TRUNCATE) {
6839 SDValue OpOp = N1.getOperand(0);
6840 if (OpOp.getValueType() == VT) {
6841 transferDbgValues(N1, OpOp);
6842 return OpOp;
6843 }
6844 }
6845 break;
6846 case ISD::TRUNCATE:
6847 assert(VT.isInteger() && N1.getValueType().isInteger() &&
6848 "Invalid TRUNCATE!");
6849 assert(VT.isVector() == N1.getValueType().isVector() &&
6850 "TRUNCATE result type type should be vector iff the operand "
6851 "type is vector!");
6852 if (N1.getValueType() == VT) return N1; // noop truncate
6853 assert((!VT.isVector() || VT.getVectorElementCount() ==
6855 "Vector element count mismatch!");
6856 assert(N1.getValueType().bitsGT(VT) && "Invalid truncate node, src < dst!");
6857 if (OpOpcode == ISD::TRUNCATE)
6858 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
6859 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
6860 OpOpcode == ISD::ANY_EXTEND) {
6861 // If the source is smaller than the dest, we still need an extend.
6863 VT.getScalarType())) {
6864 SDNodeFlags Flags;
6865 if (OpOpcode == ISD::ZERO_EXTEND)
6866 Flags.setNonNeg(N1->getFlags().hasNonNeg());
6867 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
6868 }
6869 if (N1.getOperand(0).getValueType().bitsGT(VT))
6870 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
6871 return N1.getOperand(0);
6872 }
6873 if (N1.isUndef())
6874 return getUNDEF(VT);
6875 if (OpOpcode == ISD::VSCALE && !NewNodesMustHaveLegalTypes)
6876 return getVScale(DL, VT,
6878 break;
6882 assert(VT.isVector() && "This DAG node is restricted to vector types.");
6883 assert(N1.getValueType().bitsLE(VT) &&
6884 "The input must be the same size or smaller than the result.");
6887 "The destination vector type must have fewer lanes than the input.");
6888 break;
6889 case ISD::ABS:
6890 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid ABS!");
6891 if (N1.isUndef())
6892 return getConstant(0, DL, VT);
6893 break;
6894 case ISD::BSWAP:
6895 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BSWAP!");
6896 assert((VT.getScalarSizeInBits() % 16 == 0) &&
6897 "BSWAP types must be a multiple of 16 bits!");
6898 if (N1.isUndef())
6899 return getUNDEF(VT);
6900 // bswap(bswap(X)) -> X.
6901 if (OpOpcode == ISD::BSWAP)
6902 return N1.getOperand(0);
6903 break;
6904 case ISD::BITREVERSE:
6905 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BITREVERSE!");
6906 if (N1.isUndef())
6907 return getUNDEF(VT);
6908 break;
6909 case ISD::BITCAST:
6911 "Cannot BITCAST between types of different sizes!");
6912 if (VT == N1.getValueType()) return N1; // noop conversion.
6913 if (OpOpcode == ISD::BITCAST) // bitconv(bitconv(x)) -> bitconv(x)
6914 return getNode(ISD::BITCAST, DL, VT, N1.getOperand(0));
6915 if (N1.isUndef())
6916 return getUNDEF(VT);
6917 break;
6919 assert(VT.isVector() && !N1.getValueType().isVector() &&
6920 (VT.getVectorElementType() == N1.getValueType() ||
6922 N1.getValueType().isInteger() &&
6924 "Illegal SCALAR_TO_VECTOR node!");
6925 if (N1.isUndef())
6926 return getUNDEF(VT);
6927 // scalar_to_vector(extract_vector_elt V, 0) -> V, top bits are undefined.
6928 if (OpOpcode == ISD::EXTRACT_VECTOR_ELT &&
6930 N1.getConstantOperandVal(1) == 0 &&
6931 N1.getOperand(0).getValueType() == VT)
6932 return N1.getOperand(0);
6933 break;
6934 case ISD::FNEG:
6935 // Negation of an unknown bag of bits is still completely undefined.
6936 if (N1.isUndef())
6937 return getUNDEF(VT);
6938
6939 if (OpOpcode == ISD::FNEG) // --X -> X
6940 return N1.getOperand(0);
6941 break;
6942 case ISD::FABS:
6943 if (OpOpcode == ISD::FNEG) // abs(-X) -> abs(X)
6944 return getNode(ISD::FABS, DL, VT, N1.getOperand(0));
6945 break;
6946 case ISD::VSCALE:
6947 assert(VT == N1.getValueType() && "Unexpected VT!");
6948 break;
6949 case ISD::CTPOP:
6950 if (N1.getValueType().getScalarType() == MVT::i1)
6951 return N1;
6952 break;
6953 case ISD::CTLZ:
6954 case ISD::CTTZ:
6955 if (N1.getValueType().getScalarType() == MVT::i1)
6956 return getNOT(DL, N1, N1.getValueType());
6957 break;
6958 case ISD::CTLS:
6959 if (N1.getValueType().getScalarType() == MVT::i1)
6960 return getConstant(0, DL, VT);
6961 break;
6962 case ISD::VECREDUCE_ADD:
6963 if (N1.getValueType().getScalarType() == MVT::i1)
6964 return getNode(ISD::VECREDUCE_XOR, DL, VT, N1);
6965 break;
6968 if (N1.getValueType().getScalarType() == MVT::i1)
6969 return getNode(ISD::VECREDUCE_OR, DL, VT, N1);
6970 break;
6973 if (N1.getValueType().getScalarType() == MVT::i1)
6974 return getNode(ISD::VECREDUCE_AND, DL, VT, N1);
6975 break;
6976 case ISD::SPLAT_VECTOR:
6977 assert(VT.isVector() && "Wrong return type!");
6978 // FIXME: Hexagon uses i32 scalar for a floating point zero vector so allow
6979 // that for now.
6981 (VT.isFloatingPoint() && N1.getValueType() == MVT::i32) ||
6983 N1.getValueType().isInteger() &&
6985 "Wrong operand type!");
6986 break;
6987 }
6988
6989 SDNode *N;
6990 SDVTList VTs = getVTList(VT);
6991 SDValue Ops[] = {N1};
6992 if (VT != MVT::Glue) { // Don't CSE glue producing nodes
6994 AddNodeIDNode(ID, Opcode, VTs, Ops);
6995 void *IP = nullptr;
6996 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
6997 E->intersectFlagsWith(Flags);
6998 return SDValue(E, 0);
6999 }
7000
7001 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7002 N->setFlags(Flags);
7003 createOperands(N, Ops);
7004 CSEMap.InsertNode(N, IP);
7005 } else {
7006 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7007 createOperands(N, Ops);
7008 }
7009
7010 InsertNode(N);
7011 SDValue V = SDValue(N, 0);
7012 NewSDValueDbgMsg(V, "Creating new node: ", this);
7013 return V;
7014}
7015
7016static std::optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
7017 const APInt &C2) {
7018 switch (Opcode) {
7019 case ISD::ADD: return C1 + C2;
7020 case ISD::SUB: return C1 - C2;
7021 case ISD::MUL: return C1 * C2;
7022 case ISD::AND: return C1 & C2;
7023 case ISD::OR: return C1 | C2;
7024 case ISD::XOR: return C1 ^ C2;
7025 case ISD::SHL: return C1 << C2;
7026 case ISD::SRL: return C1.lshr(C2);
7027 case ISD::SRA: return C1.ashr(C2);
7028 case ISD::ROTL: return C1.rotl(C2);
7029 case ISD::ROTR: return C1.rotr(C2);
7030 case ISD::SMIN: return C1.sle(C2) ? C1 : C2;
7031 case ISD::SMAX: return C1.sge(C2) ? C1 : C2;
7032 case ISD::UMIN: return C1.ule(C2) ? C1 : C2;
7033 case ISD::UMAX: return C1.uge(C2) ? C1 : C2;
7034 case ISD::SADDSAT: return C1.sadd_sat(C2);
7035 case ISD::UADDSAT: return C1.uadd_sat(C2);
7036 case ISD::SSUBSAT: return C1.ssub_sat(C2);
7037 case ISD::USUBSAT: return C1.usub_sat(C2);
7038 case ISD::SSHLSAT: return C1.sshl_sat(C2);
7039 case ISD::USHLSAT: return C1.ushl_sat(C2);
7040 case ISD::UDIV:
7041 if (!C2.getBoolValue())
7042 break;
7043 return C1.udiv(C2);
7044 case ISD::UREM:
7045 if (!C2.getBoolValue())
7046 break;
7047 return C1.urem(C2);
7048 case ISD::SDIV:
7049 if (!C2.getBoolValue())
7050 break;
7051 return C1.sdiv(C2);
7052 case ISD::SREM:
7053 if (!C2.getBoolValue())
7054 break;
7055 return C1.srem(C2);
7056 case ISD::AVGFLOORS:
7057 return APIntOps::avgFloorS(C1, C2);
7058 case ISD::AVGFLOORU:
7059 return APIntOps::avgFloorU(C1, C2);
7060 case ISD::AVGCEILS:
7061 return APIntOps::avgCeilS(C1, C2);
7062 case ISD::AVGCEILU:
7063 return APIntOps::avgCeilU(C1, C2);
7064 case ISD::ABDS:
7065 return APIntOps::abds(C1, C2);
7066 case ISD::ABDU:
7067 return APIntOps::abdu(C1, C2);
7068 case ISD::MULHS:
7069 return APIntOps::mulhs(C1, C2);
7070 case ISD::MULHU:
7071 return APIntOps::mulhu(C1, C2);
7072 case ISD::CLMUL:
7073 return APIntOps::clmul(C1, C2);
7074 case ISD::CLMULR:
7075 return APIntOps::clmulr(C1, C2);
7076 case ISD::CLMULH:
7077 return APIntOps::clmulh(C1, C2);
7078 }
7079 return std::nullopt;
7080}
7081// Handle constant folding with UNDEF.
7082// TODO: Handle more cases.
7083static std::optional<APInt> FoldValueWithUndef(unsigned Opcode, const APInt &C1,
7084 bool IsUndef1, const APInt &C2,
7085 bool IsUndef2) {
7086 if (!(IsUndef1 || IsUndef2))
7087 return FoldValue(Opcode, C1, C2);
7088
7089 // Fold and(x, undef) -> 0
7090 // Fold mul(x, undef) -> 0
7091 if (Opcode == ISD::AND || Opcode == ISD::MUL)
7092 return APInt::getZero(C1.getBitWidth());
7093
7094 return std::nullopt;
7095}
7096
7098 const GlobalAddressSDNode *GA,
7099 const SDNode *N2) {
7100 if (GA->getOpcode() != ISD::GlobalAddress)
7101 return SDValue();
7102 if (!TLI->isOffsetFoldingLegal(GA))
7103 return SDValue();
7104 auto *C2 = dyn_cast<ConstantSDNode>(N2);
7105 if (!C2)
7106 return SDValue();
7107 int64_t Offset = C2->getSExtValue();
7108 switch (Opcode) {
7109 case ISD::ADD:
7110 case ISD::PTRADD:
7111 break;
7112 case ISD::SUB: Offset = -uint64_t(Offset); break;
7113 default: return SDValue();
7114 }
7115 return getGlobalAddress(GA->getGlobal(), SDLoc(C2), VT,
7116 GA->getOffset() + uint64_t(Offset));
7117}
7118
7120 switch (Opcode) {
7121 case ISD::SDIV:
7122 case ISD::UDIV:
7123 case ISD::SREM:
7124 case ISD::UREM: {
7125 // If a divisor is zero/undef or any element of a divisor vector is
7126 // zero/undef, the whole op is undef.
7127 assert(Ops.size() == 2 && "Div/rem should have 2 operands");
7128 SDValue Divisor = Ops[1];
7129 if (Divisor.isUndef() || isNullConstant(Divisor))
7130 return true;
7131
7132 return ISD::isBuildVectorOfConstantSDNodes(Divisor.getNode()) &&
7133 llvm::any_of(Divisor->op_values(),
7134 [](SDValue V) { return V.isUndef() ||
7135 isNullConstant(V); });
7136 // TODO: Handle signed overflow.
7137 }
7138 // TODO: Handle oversized shifts.
7139 default:
7140 return false;
7141 }
7142}
7143
7146 SDNodeFlags Flags) {
7147 // If the opcode is a target-specific ISD node, there's nothing we can
7148 // do here and the operand rules may not line up with the below, so
7149 // bail early.
7150 // We can't create a scalar CONCAT_VECTORS so skip it. It will break
7151 // for concats involving SPLAT_VECTOR. Concats of BUILD_VECTORS are handled by
7152 // foldCONCAT_VECTORS in getNode before this is called.
7153 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::CONCAT_VECTORS)
7154 return SDValue();
7155
7156 unsigned NumOps = Ops.size();
7157 if (NumOps == 0)
7158 return SDValue();
7159
7160 if (isUndef(Opcode, Ops))
7161 return getUNDEF(VT);
7162
7163 // Handle unary special cases.
7164 if (NumOps == 1) {
7165 SDValue N1 = Ops[0];
7166
7167 // Constant fold unary operations with an integer constant operand. Even
7168 // opaque constant will be folded, because the folding of unary operations
7169 // doesn't create new constants with different values. Nevertheless, the
7170 // opaque flag is preserved during folding to prevent future folding with
7171 // other constants.
7172 if (auto *C = dyn_cast<ConstantSDNode>(N1)) {
7173 const APInt &Val = C->getAPIntValue();
7174 switch (Opcode) {
7175 case ISD::SIGN_EXTEND:
7176 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7177 C->isTargetOpcode(), C->isOpaque());
7178 case ISD::TRUNCATE:
7179 if (C->isOpaque())
7180 break;
7181 [[fallthrough]];
7182 case ISD::ZERO_EXTEND:
7183 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7184 C->isTargetOpcode(), C->isOpaque());
7185 case ISD::ANY_EXTEND:
7186 // Some targets like RISCV prefer to sign extend some types.
7187 if (TLI->isSExtCheaperThanZExt(N1.getValueType(), VT))
7188 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7189 C->isTargetOpcode(), C->isOpaque());
7190 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7191 C->isTargetOpcode(), C->isOpaque());
7192 case ISD::ABS:
7193 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7194 C->isOpaque());
7195 case ISD::BITREVERSE:
7196 return getConstant(Val.reverseBits(), DL, VT, C->isTargetOpcode(),
7197 C->isOpaque());
7198 case ISD::BSWAP:
7199 return getConstant(Val.byteSwap(), DL, VT, C->isTargetOpcode(),
7200 C->isOpaque());
7201 case ISD::CTPOP:
7202 return getConstant(Val.popcount(), DL, VT, C->isTargetOpcode(),
7203 C->isOpaque());
7204 case ISD::CTLZ:
7206 return getConstant(Val.countl_zero(), DL, VT, C->isTargetOpcode(),
7207 C->isOpaque());
7208 case ISD::CTTZ:
7210 return getConstant(Val.countr_zero(), DL, VT, C->isTargetOpcode(),
7211 C->isOpaque());
7212 case ISD::CTLS:
7213 // CTLS returns the number of extra sign bits so subtract one.
7214 return getConstant(Val.getNumSignBits() - 1, DL, VT,
7215 C->isTargetOpcode(), C->isOpaque());
7216 case ISD::UINT_TO_FP:
7217 case ISD::SINT_TO_FP: {
7219 (void)FPV.convertFromAPInt(Val, Opcode == ISD::SINT_TO_FP,
7221 return getConstantFP(FPV, DL, VT);
7222 }
7223 case ISD::FP16_TO_FP:
7224 case ISD::BF16_TO_FP: {
7225 bool Ignored;
7226 APFloat FPV(Opcode == ISD::FP16_TO_FP ? APFloat::IEEEhalf()
7227 : APFloat::BFloat(),
7228 (Val.getBitWidth() == 16) ? Val : Val.trunc(16));
7229
7230 // This can return overflow, underflow, or inexact; we don't care.
7231 // FIXME need to be more flexible about rounding mode.
7233 &Ignored);
7234 return getConstantFP(FPV, DL, VT);
7235 }
7236 case ISD::STEP_VECTOR:
7237 if (SDValue V = FoldSTEP_VECTOR(DL, VT, N1, *this))
7238 return V;
7239 break;
7240 case ISD::BITCAST:
7241 if (VT == MVT::f16 && C->getValueType(0) == MVT::i16)
7242 return getConstantFP(APFloat(APFloat::IEEEhalf(), Val), DL, VT);
7243 if (VT == MVT::f32 && C->getValueType(0) == MVT::i32)
7244 return getConstantFP(APFloat(APFloat::IEEEsingle(), Val), DL, VT);
7245 if (VT == MVT::f64 && C->getValueType(0) == MVT::i64)
7246 return getConstantFP(APFloat(APFloat::IEEEdouble(), Val), DL, VT);
7247 if (VT == MVT::f128 && C->getValueType(0) == MVT::i128)
7248 return getConstantFP(APFloat(APFloat::IEEEquad(), Val), DL, VT);
7249 break;
7250 }
7251 }
7252
7253 // Constant fold unary operations with a floating point constant operand.
7254 if (auto *C = dyn_cast<ConstantFPSDNode>(N1)) {
7255 APFloat V = C->getValueAPF(); // make copy
7256 switch (Opcode) {
7257 case ISD::FNEG:
7258 V.changeSign();
7259 return getConstantFP(V, DL, VT);
7260 case ISD::FABS:
7261 V.clearSign();
7262 return getConstantFP(V, DL, VT);
7263 case ISD::FCEIL: {
7264 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardPositive);
7266 return getConstantFP(V, DL, VT);
7267 return SDValue();
7268 }
7269 case ISD::FTRUNC: {
7270 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardZero);
7272 return getConstantFP(V, DL, VT);
7273 return SDValue();
7274 }
7275 case ISD::FFLOOR: {
7276 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardNegative);
7278 return getConstantFP(V, DL, VT);
7279 return SDValue();
7280 }
7281 case ISD::FP_EXTEND: {
7282 bool ignored;
7283 // This can return overflow, underflow, or inexact; we don't care.
7284 // FIXME need to be more flexible about rounding mode.
7285 (void)V.convert(VT.getFltSemantics(), APFloat::rmNearestTiesToEven,
7286 &ignored);
7287 return getConstantFP(V, DL, VT);
7288 }
7289 case ISD::FP_TO_SINT:
7290 case ISD::FP_TO_UINT: {
7291 bool ignored;
7292 APSInt IntVal(VT.getSizeInBits(), Opcode == ISD::FP_TO_UINT);
7293 // FIXME need to be more flexible about rounding mode.
7295 V.convertToInteger(IntVal, APFloat::rmTowardZero, &ignored);
7296 if (s == APFloat::opInvalidOp) // inexact is OK, in fact usual
7297 break;
7298 return getConstant(IntVal, DL, VT);
7299 }
7300 case ISD::FP_TO_FP16:
7301 case ISD::FP_TO_BF16: {
7302 bool Ignored;
7303 // This can return overflow, underflow, or inexact; we don't care.
7304 // FIXME need to be more flexible about rounding mode.
7305 (void)V.convert(Opcode == ISD::FP_TO_FP16 ? APFloat::IEEEhalf()
7306 : APFloat::BFloat(),
7308 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7309 }
7310 case ISD::BITCAST:
7311 if (VT == MVT::i16 && C->getValueType(0) == MVT::f16)
7312 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7313 VT);
7314 if (VT == MVT::i16 && C->getValueType(0) == MVT::bf16)
7315 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7316 VT);
7317 if (VT == MVT::i32 && C->getValueType(0) == MVT::f32)
7318 return getConstant((uint32_t)V.bitcastToAPInt().getZExtValue(), DL,
7319 VT);
7320 if (VT == MVT::i64 && C->getValueType(0) == MVT::f64)
7321 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7322 break;
7323 }
7324 }
7325
7326 // Early-out if we failed to constant fold a bitcast.
7327 if (Opcode == ISD::BITCAST)
7328 return SDValue();
7329 }
7330
7331 // Handle binops special cases.
7332 if (NumOps == 2) {
7333 if (SDValue CFP = foldConstantFPMath(Opcode, DL, VT, Ops))
7334 return CFP;
7335
7336 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7337 if (auto *C2 = dyn_cast<ConstantSDNode>(Ops[1])) {
7338 if (C1->isOpaque() || C2->isOpaque())
7339 return SDValue();
7340
7341 std::optional<APInt> FoldAttempt =
7342 FoldValue(Opcode, C1->getAPIntValue(), C2->getAPIntValue());
7343 if (!FoldAttempt)
7344 return SDValue();
7345
7346 SDValue Folded = getConstant(*FoldAttempt, DL, VT);
7347 assert((!Folded || !VT.isVector()) &&
7348 "Can't fold vectors ops with scalar operands");
7349 return Folded;
7350 }
7351 }
7352
7353 // fold (add Sym, c) -> Sym+c
7355 return FoldSymbolOffset(Opcode, VT, GA, Ops[1].getNode());
7356 if (TLI->isCommutativeBinOp(Opcode))
7358 return FoldSymbolOffset(Opcode, VT, GA, Ops[0].getNode());
7359
7360 // fold (sext_in_reg c1) -> c2
7361 if (Opcode == ISD::SIGN_EXTEND_INREG) {
7362 EVT EVT = cast<VTSDNode>(Ops[1])->getVT();
7363
7364 auto SignExtendInReg = [&](APInt Val, llvm::EVT ConstantVT) {
7365 unsigned FromBits = EVT.getScalarSizeInBits();
7366 Val <<= Val.getBitWidth() - FromBits;
7367 Val.ashrInPlace(Val.getBitWidth() - FromBits);
7368 return getConstant(Val, DL, ConstantVT);
7369 };
7370
7371 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7372 const APInt &Val = C1->getAPIntValue();
7373 return SignExtendInReg(Val, VT);
7374 }
7375
7377 SmallVector<SDValue, 8> ScalarOps;
7378 llvm::EVT OpVT = Ops[0].getOperand(0).getValueType();
7379 for (int I = 0, E = VT.getVectorNumElements(); I != E; ++I) {
7380 SDValue Op = Ops[0].getOperand(I);
7381 if (Op.isUndef()) {
7382 ScalarOps.push_back(getUNDEF(OpVT));
7383 continue;
7384 }
7385 const APInt &Val = cast<ConstantSDNode>(Op)->getAPIntValue();
7386 ScalarOps.push_back(SignExtendInReg(Val, OpVT));
7387 }
7388 return getBuildVector(VT, DL, ScalarOps);
7389 }
7390
7391 if (Ops[0].getOpcode() == ISD::SPLAT_VECTOR &&
7392 isa<ConstantSDNode>(Ops[0].getOperand(0)))
7393 return getNode(ISD::SPLAT_VECTOR, DL, VT,
7394 SignExtendInReg(Ops[0].getConstantOperandAPInt(0),
7395 Ops[0].getOperand(0).getValueType()));
7396 }
7397 }
7398
7399 // Handle fshl/fshr special cases.
7400 if (Opcode == ISD::FSHL || Opcode == ISD::FSHR) {
7401 auto *C1 = dyn_cast<ConstantSDNode>(Ops[0]);
7402 auto *C2 = dyn_cast<ConstantSDNode>(Ops[1]);
7403 auto *C3 = dyn_cast<ConstantSDNode>(Ops[2]);
7404
7405 if (C1 && C2 && C3) {
7406 if (C1->isOpaque() || C2->isOpaque() || C3->isOpaque())
7407 return SDValue();
7408 const APInt &V1 = C1->getAPIntValue(), &V2 = C2->getAPIntValue(),
7409 &V3 = C3->getAPIntValue();
7410
7411 APInt FoldedVal = Opcode == ISD::FSHL ? APIntOps::fshl(V1, V2, V3)
7412 : APIntOps::fshr(V1, V2, V3);
7413 return getConstant(FoldedVal, DL, VT);
7414 }
7415 }
7416
7417 // Handle fma/fmad special cases.
7418 if (Opcode == ISD::FMA || Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7419 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
7420 assert(Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
7421 Ops[2].getValueType() == VT && "FMA types must match!");
7425 if (C1 && C2 && C3) {
7426 APFloat V1 = C1->getValueAPF();
7427 const APFloat &V2 = C2->getValueAPF();
7428 const APFloat &V3 = C3->getValueAPF();
7429 if (Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7432 } else
7434 return getConstantFP(V1, DL, VT);
7435 }
7436 }
7437
7438 // This is for vector folding only from here on.
7439 if (!VT.isVector())
7440 return SDValue();
7441
7442 ElementCount NumElts = VT.getVectorElementCount();
7443
7444 // See if we can fold through any bitcasted integer ops.
7445 if (NumOps == 2 && VT.isFixedLengthVector() && VT.isInteger() &&
7446 Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
7447 (Ops[0].getOpcode() == ISD::BITCAST ||
7448 Ops[1].getOpcode() == ISD::BITCAST)) {
7451 auto *BV1 = dyn_cast<BuildVectorSDNode>(N1);
7452 auto *BV2 = dyn_cast<BuildVectorSDNode>(N2);
7453 if (BV1 && BV2 && N1.getValueType().isInteger() &&
7454 N2.getValueType().isInteger()) {
7455 bool IsLE = getDataLayout().isLittleEndian();
7456 unsigned EltBits = VT.getScalarSizeInBits();
7457 SmallVector<APInt> RawBits1, RawBits2;
7458 BitVector UndefElts1, UndefElts2;
7459 if (BV1->getConstantRawBits(IsLE, EltBits, RawBits1, UndefElts1) &&
7460 BV2->getConstantRawBits(IsLE, EltBits, RawBits2, UndefElts2)) {
7461 SmallVector<APInt> RawBits;
7462 for (unsigned I = 0, E = NumElts.getFixedValue(); I != E; ++I) {
7463 std::optional<APInt> Fold = FoldValueWithUndef(
7464 Opcode, RawBits1[I], UndefElts1[I], RawBits2[I], UndefElts2[I]);
7465 if (!Fold)
7466 break;
7467 RawBits.push_back(*Fold);
7468 }
7469 if (RawBits.size() == NumElts.getFixedValue()) {
7470 // We have constant folded, but we might need to cast this again back
7471 // to the original (possibly legalized) type.
7472 EVT BVVT, BVEltVT;
7473 if (N1.getValueType() == VT) {
7474 BVVT = N1.getValueType();
7475 BVEltVT = BV1->getOperand(0).getValueType();
7476 } else {
7477 BVVT = N2.getValueType();
7478 BVEltVT = BV2->getOperand(0).getValueType();
7479 }
7480 unsigned BVEltBits = BVEltVT.getSizeInBits();
7481 SmallVector<APInt> DstBits;
7482 BitVector DstUndefs;
7484 DstBits, RawBits, DstUndefs,
7485 BitVector(RawBits.size(), false));
7486 SmallVector<SDValue> Ops(DstBits.size(), getUNDEF(BVEltVT));
7487 for (unsigned I = 0, E = DstBits.size(); I != E; ++I) {
7488 if (DstUndefs[I])
7489 continue;
7490 Ops[I] = getConstant(DstBits[I].sext(BVEltBits), DL, BVEltVT);
7491 }
7492 return getBitcast(VT, getBuildVector(BVVT, DL, Ops));
7493 }
7494 }
7495 }
7496 }
7497
7498 // Fold (mul step_vector(C0), C1) to (step_vector(C0 * C1)).
7499 // (shl step_vector(C0), C1) -> (step_vector(C0 << C1))
7500 if ((Opcode == ISD::MUL || Opcode == ISD::SHL) &&
7501 Ops[0].getOpcode() == ISD::STEP_VECTOR) {
7502 APInt RHSVal;
7503 if (ISD::isConstantSplatVector(Ops[1].getNode(), RHSVal)) {
7504 APInt NewStep = Opcode == ISD::MUL
7505 ? Ops[0].getConstantOperandAPInt(0) * RHSVal
7506 : Ops[0].getConstantOperandAPInt(0) << RHSVal;
7507 return getStepVector(DL, VT, NewStep);
7508 }
7509 }
7510
7511 auto IsScalarOrSameVectorSize = [NumElts](const SDValue &Op) {
7512 return !Op.getValueType().isVector() ||
7513 Op.getValueType().getVectorElementCount() == NumElts;
7514 };
7515
7516 auto IsBuildVectorSplatVectorOrUndef = [](const SDValue &Op) {
7517 return Op.isUndef() || Op.getOpcode() == ISD::CONDCODE ||
7518 Op.getOpcode() == ISD::BUILD_VECTOR ||
7519 Op.getOpcode() == ISD::SPLAT_VECTOR;
7520 };
7521
7522 // All operands must be vector types with the same number of elements as
7523 // the result type and must be either UNDEF or a build/splat vector
7524 // or UNDEF scalars.
7525 if (!llvm::all_of(Ops, IsBuildVectorSplatVectorOrUndef) ||
7526 !llvm::all_of(Ops, IsScalarOrSameVectorSize))
7527 return SDValue();
7528
7529 // If we are comparing vectors, then the result needs to be a i1 boolean that
7530 // is then extended back to the legal result type depending on how booleans
7531 // are represented.
7532 EVT SVT = (Opcode == ISD::SETCC ? MVT::i1 : VT.getScalarType());
7533 ISD::NodeType ExtendCode =
7534 (Opcode == ISD::SETCC && SVT != VT.getScalarType())
7535 ? TargetLowering::getExtendForContent(TLI->getBooleanContents(VT))
7537
7538 // Find legal integer scalar type for constant promotion and
7539 // ensure that its scalar size is at least as large as source.
7540 EVT LegalSVT = VT.getScalarType();
7541 if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
7542 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
7543 if (LegalSVT.bitsLT(VT.getScalarType()))
7544 return SDValue();
7545 }
7546
7547 // For scalable vector types we know we're dealing with SPLAT_VECTORs. We
7548 // only have one operand to check. For fixed-length vector types we may have
7549 // a combination of BUILD_VECTOR and SPLAT_VECTOR.
7550 unsigned NumVectorElts = NumElts.isScalable() ? 1 : NumElts.getFixedValue();
7551
7552 // Constant fold each scalar lane separately.
7553 SmallVector<SDValue, 4> ScalarResults;
7554 for (unsigned I = 0; I != NumVectorElts; I++) {
7555 SmallVector<SDValue, 4> ScalarOps;
7556 for (SDValue Op : Ops) {
7557 EVT InSVT = Op.getValueType().getScalarType();
7558 if (Op.getOpcode() != ISD::BUILD_VECTOR &&
7559 Op.getOpcode() != ISD::SPLAT_VECTOR) {
7560 if (Op.isUndef())
7561 ScalarOps.push_back(getUNDEF(InSVT));
7562 else
7563 ScalarOps.push_back(Op);
7564 continue;
7565 }
7566
7567 SDValue ScalarOp =
7568 Op.getOperand(Op.getOpcode() == ISD::SPLAT_VECTOR ? 0 : I);
7569 EVT ScalarVT = ScalarOp.getValueType();
7570
7571 // Build vector (integer) scalar operands may need implicit
7572 // truncation - do this before constant folding.
7573 if (ScalarVT.isInteger() && ScalarVT.bitsGT(InSVT)) {
7574 // Don't create illegally-typed nodes unless they're constants or undef
7575 // - if we fail to constant fold we can't guarantee the (dead) nodes
7576 // we're creating will be cleaned up before being visited for
7577 // legalization.
7578 if (NewNodesMustHaveLegalTypes && !ScalarOp.isUndef() &&
7579 !isa<ConstantSDNode>(ScalarOp) &&
7580 TLI->getTypeAction(*getContext(), InSVT) !=
7582 return SDValue();
7583 ScalarOp = getNode(ISD::TRUNCATE, DL, InSVT, ScalarOp);
7584 }
7585
7586 ScalarOps.push_back(ScalarOp);
7587 }
7588
7589 // Constant fold the scalar operands.
7590 SDValue ScalarResult = getNode(Opcode, DL, SVT, ScalarOps, Flags);
7591
7592 // Scalar folding only succeeded if the result is a constant or UNDEF.
7593 if (!ScalarResult.isUndef() && ScalarResult.getOpcode() != ISD::Constant &&
7594 ScalarResult.getOpcode() != ISD::ConstantFP)
7595 return SDValue();
7596
7597 // Legalize the (integer) scalar constant if necessary. We only do
7598 // this once we know the folding succeeded, since otherwise we would
7599 // get a node with illegal type which has a user.
7600 if (LegalSVT != SVT)
7601 ScalarResult = getNode(ExtendCode, DL, LegalSVT, ScalarResult);
7602
7603 ScalarResults.push_back(ScalarResult);
7604 }
7605
7606 SDValue V = NumElts.isScalable() ? getSplatVector(VT, DL, ScalarResults[0])
7607 : getBuildVector(VT, DL, ScalarResults);
7608 NewSDValueDbgMsg(V, "New node fold constant vector: ", this);
7609 return V;
7610}
7611
7614 // TODO: Add support for unary/ternary fp opcodes.
7615 if (Ops.size() != 2)
7616 return SDValue();
7617
7618 // TODO: We don't do any constant folding for strict FP opcodes here, but we
7619 // should. That will require dealing with a potentially non-default
7620 // rounding mode, checking the "opStatus" return value from the APFloat
7621 // math calculations, and possibly other variations.
7622 SDValue N1 = Ops[0];
7623 SDValue N2 = Ops[1];
7624 ConstantFPSDNode *N1CFP = isConstOrConstSplatFP(N1, /*AllowUndefs*/ false);
7625 ConstantFPSDNode *N2CFP = isConstOrConstSplatFP(N2, /*AllowUndefs*/ false);
7626 if (N1CFP && N2CFP) {
7627 APFloat C1 = N1CFP->getValueAPF(); // make copy
7628 const APFloat &C2 = N2CFP->getValueAPF();
7629 switch (Opcode) {
7630 case ISD::FADD:
7632 return getConstantFP(C1, DL, VT);
7633 case ISD::FSUB:
7635 return getConstantFP(C1, DL, VT);
7636 case ISD::FMUL:
7638 return getConstantFP(C1, DL, VT);
7639 case ISD::FDIV:
7641 return getConstantFP(C1, DL, VT);
7642 case ISD::FREM:
7643 C1.mod(C2);
7644 return getConstantFP(C1, DL, VT);
7645 case ISD::FCOPYSIGN:
7646 C1.copySign(C2);
7647 return getConstantFP(C1, DL, VT);
7648 case ISD::FMINNUM:
7649 if (C1.isSignaling() || C2.isSignaling())
7650 return SDValue();
7651 return getConstantFP(minnum(C1, C2), DL, VT);
7652 case ISD::FMAXNUM:
7653 if (C1.isSignaling() || C2.isSignaling())
7654 return SDValue();
7655 return getConstantFP(maxnum(C1, C2), DL, VT);
7656 case ISD::FMINIMUM:
7657 return getConstantFP(minimum(C1, C2), DL, VT);
7658 case ISD::FMAXIMUM:
7659 return getConstantFP(maximum(C1, C2), DL, VT);
7660 case ISD::FMINIMUMNUM:
7661 return getConstantFP(minimumnum(C1, C2), DL, VT);
7662 case ISD::FMAXIMUMNUM:
7663 return getConstantFP(maximumnum(C1, C2), DL, VT);
7664 default: break;
7665 }
7666 }
7667 if (N1CFP && Opcode == ISD::FP_ROUND) {
7668 APFloat C1 = N1CFP->getValueAPF(); // make copy
7669 bool Unused;
7670 // This can return overflow, underflow, or inexact; we don't care.
7671 // FIXME need to be more flexible about rounding mode.
7673 &Unused);
7674 return getConstantFP(C1, DL, VT);
7675 }
7676
7677 switch (Opcode) {
7678 case ISD::FSUB:
7679 // -0.0 - undef --> undef (consistent with "fneg undef")
7680 if (ConstantFPSDNode *N1C = isConstOrConstSplatFP(N1, /*AllowUndefs*/ true))
7681 if (N1C && N1C->getValueAPF().isNegZero() && N2.isUndef())
7682 return getUNDEF(VT);
7683 [[fallthrough]];
7684
7685 case ISD::FADD:
7686 case ISD::FMUL:
7687 case ISD::FDIV:
7688 case ISD::FREM:
7689 // If both operands are undef, the result is undef. If 1 operand is undef,
7690 // the result is NaN. This should match the behavior of the IR optimizer.
7691 if (N1.isUndef() && N2.isUndef())
7692 return getUNDEF(VT);
7693 if (N1.isUndef() || N2.isUndef())
7695 }
7696 return SDValue();
7697}
7698
7700 const SDLoc &DL, EVT DstEltVT) {
7701 EVT SrcEltVT = BV->getValueType(0).getVectorElementType();
7702
7703 // If this is already the right type, we're done.
7704 if (SrcEltVT == DstEltVT)
7705 return SDValue(BV, 0);
7706
7707 unsigned SrcBitSize = SrcEltVT.getSizeInBits();
7708 unsigned DstBitSize = DstEltVT.getSizeInBits();
7709
7710 // If this is a conversion of N elements of one type to N elements of another
7711 // type, convert each element. This handles FP<->INT cases.
7712 if (SrcBitSize == DstBitSize) {
7714 for (SDValue Op : BV->op_values()) {
7715 // If the vector element type is not legal, the BUILD_VECTOR operands
7716 // are promoted and implicitly truncated. Make that explicit here.
7717 if (Op.getValueType() != SrcEltVT)
7718 Op = getNode(ISD::TRUNCATE, DL, SrcEltVT, Op);
7719 Ops.push_back(getBitcast(DstEltVT, Op));
7720 }
7721 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT,
7723 return getBuildVector(VT, DL, Ops);
7724 }
7725
7726 // Otherwise, we're growing or shrinking the elements. To avoid having to
7727 // handle annoying details of growing/shrinking FP values, we convert them to
7728 // int first.
7729 if (SrcEltVT.isFloatingPoint()) {
7730 // Convert the input float vector to a int vector where the elements are the
7731 // same sizes.
7732 EVT IntEltVT = EVT::getIntegerVT(*getContext(), SrcEltVT.getSizeInBits());
7733 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
7735 DstEltVT);
7736 return SDValue();
7737 }
7738
7739 // Now we know the input is an integer vector. If the output is a FP type,
7740 // convert to integer first, then to FP of the right size.
7741 if (DstEltVT.isFloatingPoint()) {
7742 EVT IntEltVT = EVT::getIntegerVT(*getContext(), DstEltVT.getSizeInBits());
7743 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
7745 DstEltVT);
7746 return SDValue();
7747 }
7748
7749 // Okay, we know the src/dst types are both integers of differing types.
7750 assert(SrcEltVT.isInteger() && DstEltVT.isInteger());
7751
7752 // Extract the constant raw bit data.
7753 BitVector UndefElements;
7754 SmallVector<APInt> RawBits;
7755 bool IsLE = getDataLayout().isLittleEndian();
7756 if (!BV->getConstantRawBits(IsLE, DstBitSize, RawBits, UndefElements))
7757 return SDValue();
7758
7760 for (unsigned I = 0, E = RawBits.size(); I != E; ++I) {
7761 if (UndefElements[I])
7762 Ops.push_back(getUNDEF(DstEltVT));
7763 else
7764 Ops.push_back(getConstant(RawBits[I], DL, DstEltVT));
7765 }
7766
7767 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT, Ops.size());
7768 return getBuildVector(VT, DL, Ops);
7769}
7770
7772 assert(Val.getValueType().isInteger() && "Invalid AssertAlign!");
7773
7774 // There's no need to assert on a byte-aligned pointer. All pointers are at
7775 // least byte aligned.
7776 if (A == Align(1))
7777 return Val;
7778
7779 SDVTList VTs = getVTList(Val.getValueType());
7781 AddNodeIDNode(ID, ISD::AssertAlign, VTs, {Val});
7782 ID.AddInteger(A.value());
7783
7784 void *IP = nullptr;
7785 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
7786 return SDValue(E, 0);
7787
7788 auto *N =
7789 newSDNode<AssertAlignSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, A);
7790 createOperands(N, {Val});
7791
7792 CSEMap.InsertNode(N, IP);
7793 InsertNode(N);
7794
7795 SDValue V(N, 0);
7796 NewSDValueDbgMsg(V, "Creating new node: ", this);
7797 return V;
7798}
7799
7800SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7801 SDValue N1, SDValue N2) {
7802 SDNodeFlags Flags;
7803 if (Inserter)
7804 Flags = Inserter->getFlags();
7805 return getNode(Opcode, DL, VT, N1, N2, Flags);
7806}
7807
7809 SDValue &N2) const {
7810 if (!TLI->isCommutativeBinOp(Opcode))
7811 return;
7812
7813 // Canonicalize:
7814 // binop(const, nonconst) -> binop(nonconst, const)
7817 bool N1CFP = isConstantFPBuildVectorOrConstantFP(N1);
7818 bool N2CFP = isConstantFPBuildVectorOrConstantFP(N2);
7819 if ((N1C && !N2C) || (N1CFP && !N2CFP))
7820 std::swap(N1, N2);
7821
7822 // Canonicalize:
7823 // binop(splat(x), step_vector) -> binop(step_vector, splat(x))
7824 else if (N1.getOpcode() == ISD::SPLAT_VECTOR &&
7826 std::swap(N1, N2);
7827}
7828
7829SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7830 SDValue N1, SDValue N2, const SDNodeFlags Flags) {
7832 N2.getOpcode() != ISD::DELETED_NODE &&
7833 "Operand is DELETED_NODE!");
7834
7835 canonicalizeCommutativeBinop(Opcode, N1, N2);
7836
7837 auto *N1C = dyn_cast<ConstantSDNode>(N1);
7838 auto *N2C = dyn_cast<ConstantSDNode>(N2);
7839
7840 // Don't allow undefs in vector splats - we might be returning N2 when folding
7841 // to zero etc.
7842 ConstantSDNode *N2CV =
7843 isConstOrConstSplat(N2, /*AllowUndefs*/ false, /*AllowTruncation*/ true);
7844
7845 switch (Opcode) {
7846 default: break;
7847 case ISD::TokenFactor:
7848 assert(VT == MVT::Other && N1.getValueType() == MVT::Other &&
7849 N2.getValueType() == MVT::Other && "Invalid token factor!");
7850 // Fold trivial token factors.
7851 if (N1.getOpcode() == ISD::EntryToken) return N2;
7852 if (N2.getOpcode() == ISD::EntryToken) return N1;
7853 if (N1 == N2) return N1;
7854 break;
7855 case ISD::BUILD_VECTOR: {
7856 // Attempt to simplify BUILD_VECTOR.
7857 SDValue Ops[] = {N1, N2};
7858 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
7859 return V;
7860 break;
7861 }
7862 case ISD::CONCAT_VECTORS: {
7863 SDValue Ops[] = {N1, N2};
7864 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
7865 return V;
7866 break;
7867 }
7868 case ISD::AND:
7869 assert(VT.isInteger() && "This operator does not apply to FP types!");
7870 assert(N1.getValueType() == N2.getValueType() &&
7871 N1.getValueType() == VT && "Binary operator types must match!");
7872 // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's
7873 // worth handling here.
7874 if (N2CV && N2CV->isZero())
7875 return N2;
7876 if (N2CV && N2CV->isAllOnes()) // X & -1 -> X
7877 return N1;
7878 break;
7879 case ISD::OR:
7880 case ISD::XOR:
7881 case ISD::ADD:
7882 case ISD::PTRADD:
7883 case ISD::SUB:
7884 assert(VT.isInteger() && "This operator does not apply to FP types!");
7885 assert(N1.getValueType() == N2.getValueType() &&
7886 N1.getValueType() == VT && "Binary operator types must match!");
7887 // The equal operand types requirement is unnecessarily strong for PTRADD.
7888 // However, the SelectionDAGBuilder does not generate PTRADDs with different
7889 // operand types, and we'd need to re-implement GEP's non-standard wrapping
7890 // logic everywhere where PTRADDs may be folded or combined to properly
7891 // support them. If/when we introduce pointer types to the SDAG, we will
7892 // need to relax this constraint.
7893
7894 // (X ^|+- 0) -> X. This commonly occurs when legalizing i64 values, so
7895 // it's worth handling here.
7896 if (N2CV && N2CV->isZero())
7897 return N1;
7898 if ((Opcode == ISD::ADD || Opcode == ISD::SUB) &&
7899 VT.getScalarType() == MVT::i1)
7900 return getNode(ISD::XOR, DL, VT, N1, N2);
7901 // Fold (add (vscale * C0), (vscale * C1)) to (vscale * (C0 + C1)).
7902 if (Opcode == ISD::ADD && N1.getOpcode() == ISD::VSCALE &&
7903 N2.getOpcode() == ISD::VSCALE) {
7904 const APInt &C1 = N1->getConstantOperandAPInt(0);
7905 const APInt &C2 = N2->getConstantOperandAPInt(0);
7906 return getVScale(DL, VT, C1 + C2);
7907 }
7908 break;
7909 case ISD::MUL:
7910 assert(VT.isInteger() && "This operator does not apply to FP types!");
7911 assert(N1.getValueType() == N2.getValueType() &&
7912 N1.getValueType() == VT && "Binary operator types must match!");
7913 if (VT.getScalarType() == MVT::i1)
7914 return getNode(ISD::AND, DL, VT, N1, N2);
7915 if (N2CV && N2CV->isZero())
7916 return N2;
7917 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
7918 const APInt &MulImm = N1->getConstantOperandAPInt(0);
7919 const APInt &N2CImm = N2C->getAPIntValue();
7920 return getVScale(DL, VT, MulImm * N2CImm);
7921 }
7922 break;
7923 case ISD::UDIV:
7924 case ISD::UREM:
7925 case ISD::MULHU:
7926 case ISD::MULHS:
7927 case ISD::SDIV:
7928 case ISD::SREM:
7929 case ISD::SADDSAT:
7930 case ISD::SSUBSAT:
7931 case ISD::UADDSAT:
7932 case ISD::USUBSAT:
7933 assert(VT.isInteger() && "This operator does not apply to FP types!");
7934 assert(N1.getValueType() == N2.getValueType() &&
7935 N1.getValueType() == VT && "Binary operator types must match!");
7936 if (VT.getScalarType() == MVT::i1) {
7937 // fold (add_sat x, y) -> (or x, y) for bool types.
7938 if (Opcode == ISD::SADDSAT || Opcode == ISD::UADDSAT)
7939 return getNode(ISD::OR, DL, VT, N1, N2);
7940 // fold (sub_sat x, y) -> (and x, ~y) for bool types.
7941 if (Opcode == ISD::SSUBSAT || Opcode == ISD::USUBSAT)
7942 return getNode(ISD::AND, DL, VT, N1, getNOT(DL, N2, VT));
7943 }
7944 break;
7945 case ISD::SCMP:
7946 case ISD::UCMP:
7947 assert(N1.getValueType() == N2.getValueType() &&
7948 "Types of operands of UCMP/SCMP must match");
7949 assert(N1.getValueType().isVector() == VT.isVector() &&
7950 "Operands and return type of must both be scalars or vectors");
7951 if (VT.isVector())
7954 "Result and operands must have the same number of elements");
7955 break;
7956 case ISD::AVGFLOORS:
7957 case ISD::AVGFLOORU:
7958 case ISD::AVGCEILS:
7959 case ISD::AVGCEILU:
7960 assert(VT.isInteger() && "This operator does not apply to FP types!");
7961 assert(N1.getValueType() == N2.getValueType() &&
7962 N1.getValueType() == VT && "Binary operator types must match!");
7963 break;
7964 case ISD::ABDS:
7965 case ISD::ABDU:
7966 assert(VT.isInteger() && "This operator does not apply to FP types!");
7967 assert(N1.getValueType() == N2.getValueType() &&
7968 N1.getValueType() == VT && "Binary operator types must match!");
7969 if (VT.getScalarType() == MVT::i1)
7970 return getNode(ISD::XOR, DL, VT, N1, N2);
7971 break;
7972 case ISD::SMIN:
7973 case ISD::UMAX:
7974 assert(VT.isInteger() && "This operator does not apply to FP types!");
7975 assert(N1.getValueType() == N2.getValueType() &&
7976 N1.getValueType() == VT && "Binary operator types must match!");
7977 if (VT.getScalarType() == MVT::i1)
7978 return getNode(ISD::OR, DL, VT, N1, N2);
7979 break;
7980 case ISD::SMAX:
7981 case ISD::UMIN:
7982 assert(VT.isInteger() && "This operator does not apply to FP types!");
7983 assert(N1.getValueType() == N2.getValueType() &&
7984 N1.getValueType() == VT && "Binary operator types must match!");
7985 if (VT.getScalarType() == MVT::i1)
7986 return getNode(ISD::AND, DL, VT, N1, N2);
7987 break;
7988 case ISD::FADD:
7989 case ISD::FSUB:
7990 case ISD::FMUL:
7991 case ISD::FDIV:
7992 case ISD::FREM:
7993 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
7994 assert(N1.getValueType() == N2.getValueType() &&
7995 N1.getValueType() == VT && "Binary operator types must match!");
7996 if (SDValue V = simplifyFPBinop(Opcode, N1, N2, Flags))
7997 return V;
7998 break;
7999 case ISD::FCOPYSIGN: // N1 and result must match. N1/N2 need not match.
8000 assert(N1.getValueType() == VT &&
8003 "Invalid FCOPYSIGN!");
8004 break;
8005 case ISD::SHL:
8006 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8007 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8008 const APInt &ShiftImm = N2C->getAPIntValue();
8009 return getVScale(DL, VT, MulImm << ShiftImm);
8010 }
8011 [[fallthrough]];
8012 case ISD::SRA:
8013 case ISD::SRL:
8014 if (SDValue V = simplifyShift(N1, N2))
8015 return V;
8016 [[fallthrough]];
8017 case ISD::ROTL:
8018 case ISD::ROTR:
8019 case ISD::SSHLSAT:
8020 case ISD::USHLSAT:
8021 assert(VT == N1.getValueType() &&
8022 "Shift operators return type must be the same as their first arg");
8023 assert(VT.isInteger() && N2.getValueType().isInteger() &&
8024 "Shifts only work on integers");
8025 assert((!VT.isVector() || VT == N2.getValueType()) &&
8026 "Vector shift amounts must be in the same as their first arg");
8027 // Verify that the shift amount VT is big enough to hold valid shift
8028 // amounts. This catches things like trying to shift an i1024 value by an
8029 // i8, which is easy to fall into in generic code that uses
8030 // TLI.getShiftAmount().
8033 "Invalid use of small shift amount with oversized value!");
8034
8035 // Always fold shifts of i1 values so the code generator doesn't need to
8036 // handle them. Since we know the size of the shift has to be less than the
8037 // size of the value, the shift/rotate count is guaranteed to be zero.
8038 if (VT == MVT::i1)
8039 return N1;
8040 if (N2CV && N2CV->isZero())
8041 return N1;
8042 break;
8043 case ISD::FP_ROUND:
8045 VT.bitsLE(N1.getValueType()) && N2C &&
8046 (N2C->getZExtValue() == 0 || N2C->getZExtValue() == 1) &&
8047 N2.getOpcode() == ISD::TargetConstant && "Invalid FP_ROUND!");
8048 if (N1.getValueType() == VT) return N1; // noop conversion.
8049 break;
8050 case ISD::AssertNoFPClass: {
8052 "AssertNoFPClass is used for a non-floating type");
8053 assert(isa<ConstantSDNode>(N2) && "NoFPClass is not Constant");
8054 FPClassTest NoFPClass = static_cast<FPClassTest>(N2->getAsZExtVal());
8055 assert(llvm::to_underlying(NoFPClass) <=
8057 "FPClassTest value too large");
8058 (void)NoFPClass;
8059 break;
8060 }
8061 case ISD::AssertSext:
8062 case ISD::AssertZext: {
8063 EVT EVT = cast<VTSDNode>(N2)->getVT();
8064 assert(VT == N1.getValueType() && "Not an inreg extend!");
8065 assert(VT.isInteger() && EVT.isInteger() &&
8066 "Cannot *_EXTEND_INREG FP types");
8067 assert(!EVT.isVector() &&
8068 "AssertSExt/AssertZExt type should be the vector element type "
8069 "rather than the vector type!");
8070 assert(EVT.bitsLE(VT.getScalarType()) && "Not extending!");
8071 if (VT.getScalarType() == EVT) return N1; // noop assertion.
8072 break;
8073 }
8075 EVT EVT = cast<VTSDNode>(N2)->getVT();
8076 assert(VT == N1.getValueType() && "Not an inreg extend!");
8077 assert(VT.isInteger() && EVT.isInteger() &&
8078 "Cannot *_EXTEND_INREG FP types");
8079 assert(EVT.isVector() == VT.isVector() &&
8080 "SIGN_EXTEND_INREG type should be vector iff the operand "
8081 "type is vector!");
8082 assert((!EVT.isVector() ||
8084 "Vector element counts must match in SIGN_EXTEND_INREG");
8085 assert(EVT.getScalarType().bitsLE(VT.getScalarType()) && "Not extending!");
8086 if (EVT == VT) return N1; // Not actually extending
8087 break;
8088 }
8090 case ISD::FP_TO_UINT_SAT: {
8091 assert(VT.isInteger() && cast<VTSDNode>(N2)->getVT().isInteger() &&
8092 N1.getValueType().isFloatingPoint() && "Invalid FP_TO_*INT_SAT");
8093 assert(N1.getValueType().isVector() == VT.isVector() &&
8094 "FP_TO_*INT_SAT type should be vector iff the operand type is "
8095 "vector!");
8096 assert((!VT.isVector() || VT.getVectorElementCount() ==
8098 "Vector element counts must match in FP_TO_*INT_SAT");
8099 assert(!cast<VTSDNode>(N2)->getVT().isVector() &&
8100 "Type to saturate to must be a scalar.");
8101 assert(cast<VTSDNode>(N2)->getVT().bitsLE(VT.getScalarType()) &&
8102 "Not extending!");
8103 break;
8104 }
8107 "The result of EXTRACT_VECTOR_ELT must be at least as wide as the \
8108 element type of the vector.");
8109
8110 // Extract from an undefined value or using an undefined index is undefined.
8111 if (N1.isUndef() || N2.isUndef())
8112 return getUNDEF(VT);
8113
8114 // EXTRACT_VECTOR_ELT of out-of-bounds element is an UNDEF for fixed length
8115 // vectors. For scalable vectors we will provide appropriate support for
8116 // dealing with arbitrary indices.
8117 if (N2C && N1.getValueType().isFixedLengthVector() &&
8118 N2C->getAPIntValue().uge(N1.getValueType().getVectorNumElements()))
8119 return getUNDEF(VT);
8120
8121 // EXTRACT_VECTOR_ELT of CONCAT_VECTORS is often formed while lowering is
8122 // expanding copies of large vectors from registers. This only works for
8123 // fixed length vectors, since we need to know the exact number of
8124 // elements.
8125 if (N2C && N1.getOpcode() == ISD::CONCAT_VECTORS &&
8127 unsigned Factor = N1.getOperand(0).getValueType().getVectorNumElements();
8128 return getExtractVectorElt(DL, VT,
8129 N1.getOperand(N2C->getZExtValue() / Factor),
8130 N2C->getZExtValue() % Factor);
8131 }
8132
8133 // EXTRACT_VECTOR_ELT of BUILD_VECTOR or SPLAT_VECTOR is often formed while
8134 // lowering is expanding large vector constants.
8135 if (N2C && (N1.getOpcode() == ISD::BUILD_VECTOR ||
8136 N1.getOpcode() == ISD::SPLAT_VECTOR)) {
8139 "BUILD_VECTOR used for scalable vectors");
8140 unsigned Index =
8141 N1.getOpcode() == ISD::BUILD_VECTOR ? N2C->getZExtValue() : 0;
8142 SDValue Elt = N1.getOperand(Index);
8143
8144 if (VT != Elt.getValueType())
8145 // If the vector element type is not legal, the BUILD_VECTOR operands
8146 // are promoted and implicitly truncated, and the result implicitly
8147 // extended. Make that explicit here.
8148 Elt = getAnyExtOrTrunc(Elt, DL, VT);
8149
8150 return Elt;
8151 }
8152
8153 // EXTRACT_VECTOR_ELT of INSERT_VECTOR_ELT is often formed when vector
8154 // operations are lowered to scalars.
8155 if (N1.getOpcode() == ISD::INSERT_VECTOR_ELT) {
8156 // If the indices are the same, return the inserted element else
8157 // if the indices are known different, extract the element from
8158 // the original vector.
8159 SDValue N1Op2 = N1.getOperand(2);
8161
8162 if (N1Op2C && N2C) {
8163 if (N1Op2C->getZExtValue() == N2C->getZExtValue()) {
8164 if (VT == N1.getOperand(1).getValueType())
8165 return N1.getOperand(1);
8166 if (VT.isFloatingPoint()) {
8168 return getFPExtendOrRound(N1.getOperand(1), DL, VT);
8169 }
8170 return getSExtOrTrunc(N1.getOperand(1), DL, VT);
8171 }
8172 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0), N2);
8173 }
8174 }
8175
8176 // EXTRACT_VECTOR_ELT of v1iX EXTRACT_SUBVECTOR could be formed
8177 // when vector types are scalarized and v1iX is legal.
8178 // vextract (v1iX extract_subvector(vNiX, Idx)) -> vextract(vNiX,Idx).
8179 // Here we are completely ignoring the extract element index (N2),
8180 // which is fine for fixed width vectors, since any index other than 0
8181 // is undefined anyway. However, this cannot be ignored for scalable
8182 // vectors - in theory we could support this, but we don't want to do this
8183 // without a profitability check.
8184 if (N1.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
8186 N1.getValueType().getVectorNumElements() == 1) {
8187 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0),
8188 N1.getOperand(1));
8189 }
8190 break;
8192 assert(N2C && (unsigned)N2C->getZExtValue() < 2 && "Bad EXTRACT_ELEMENT!");
8193 assert(!N1.getValueType().isVector() && !VT.isVector() &&
8194 (N1.getValueType().isInteger() == VT.isInteger()) &&
8195 N1.getValueType() != VT &&
8196 "Wrong types for EXTRACT_ELEMENT!");
8197
8198 // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding
8199 // 64-bit integers into 32-bit parts. Instead of building the extract of
8200 // the BUILD_PAIR, only to have legalize rip it apart, just do it now.
8201 if (N1.getOpcode() == ISD::BUILD_PAIR)
8202 return N1.getOperand(N2C->getZExtValue());
8203
8204 // EXTRACT_ELEMENT of a constant int is also very common.
8205 if (N1C) {
8206 unsigned ElementSize = VT.getSizeInBits();
8207 unsigned Shift = ElementSize * N2C->getZExtValue();
8208 const APInt &Val = N1C->getAPIntValue();
8209 return getConstant(Val.extractBits(ElementSize, Shift), DL, VT);
8210 }
8211 break;
8213 EVT N1VT = N1.getValueType();
8214 assert(VT.isVector() && N1VT.isVector() &&
8215 "Extract subvector VTs must be vectors!");
8217 "Extract subvector VTs must have the same element type!");
8218 assert((VT.isFixedLengthVector() || N1VT.isScalableVector()) &&
8219 "Cannot extract a scalable vector from a fixed length vector!");
8220 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8222 "Extract subvector must be from larger vector to smaller vector!");
8223 assert(N2C && "Extract subvector index must be a constant");
8224 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8225 (VT.getVectorMinNumElements() + N2C->getZExtValue()) <=
8226 N1VT.getVectorMinNumElements()) &&
8227 "Extract subvector overflow!");
8228 assert(N2C->getAPIntValue().getBitWidth() ==
8229 TLI->getVectorIdxWidth(getDataLayout()) &&
8230 "Constant index for EXTRACT_SUBVECTOR has an invalid size");
8231 assert(N2C->getZExtValue() % VT.getVectorMinNumElements() == 0 &&
8232 "Extract index is not a multiple of the output vector length");
8233
8234 // Trivial extraction.
8235 if (VT == N1VT)
8236 return N1;
8237
8238 // EXTRACT_SUBVECTOR of an UNDEF is an UNDEF.
8239 if (N1.isUndef())
8240 return getUNDEF(VT);
8241
8242 // EXTRACT_SUBVECTOR of CONCAT_VECTOR can be simplified if the pieces of
8243 // the concat have the same type as the extract.
8244 if (N1.getOpcode() == ISD::CONCAT_VECTORS &&
8245 VT == N1.getOperand(0).getValueType()) {
8246 unsigned Factor = VT.getVectorMinNumElements();
8247 return N1.getOperand(N2C->getZExtValue() / Factor);
8248 }
8249
8250 // EXTRACT_SUBVECTOR of INSERT_SUBVECTOR is often created
8251 // during shuffle legalization.
8252 if (N1.getOpcode() == ISD::INSERT_SUBVECTOR && N2 == N1.getOperand(2) &&
8253 VT == N1.getOperand(1).getValueType())
8254 return N1.getOperand(1);
8255 break;
8256 }
8257 }
8258
8259 if (N1.getOpcode() == ISD::POISON || N2.getOpcode() == ISD::POISON) {
8260 switch (Opcode) {
8261 case ISD::XOR:
8262 case ISD::ADD:
8263 case ISD::PTRADD:
8264 case ISD::SUB:
8266 case ISD::UDIV:
8267 case ISD::SDIV:
8268 case ISD::UREM:
8269 case ISD::SREM:
8270 case ISD::MUL:
8271 case ISD::AND:
8272 case ISD::SSUBSAT:
8273 case ISD::USUBSAT:
8274 case ISD::UMIN:
8275 case ISD::OR:
8276 case ISD::SADDSAT:
8277 case ISD::UADDSAT:
8278 case ISD::UMAX:
8279 case ISD::SMAX:
8280 case ISD::SMIN:
8281 // fold op(arg1, poison) -> poison, fold op(poison, arg2) -> poison.
8282 return N2.getOpcode() == ISD::POISON ? N2 : N1;
8283 }
8284 }
8285
8286 // Canonicalize an UNDEF to the RHS, even over a constant.
8287 if (N1.getOpcode() == ISD::UNDEF && N2.getOpcode() != ISD::UNDEF) {
8288 if (TLI->isCommutativeBinOp(Opcode)) {
8289 std::swap(N1, N2);
8290 } else {
8291 switch (Opcode) {
8292 case ISD::PTRADD:
8293 case ISD::SUB:
8294 // fold op(undef, non_undef_arg2) -> undef.
8295 return N1;
8297 case ISD::UDIV:
8298 case ISD::SDIV:
8299 case ISD::UREM:
8300 case ISD::SREM:
8301 case ISD::SSUBSAT:
8302 case ISD::USUBSAT:
8303 // fold op(undef, non_undef_arg2) -> 0.
8304 return getConstant(0, DL, VT);
8305 }
8306 }
8307 }
8308
8309 // Fold a bunch of operators when the RHS is undef.
8310 if (N2.getOpcode() == ISD::UNDEF) {
8311 switch (Opcode) {
8312 case ISD::XOR:
8313 if (N1.getOpcode() == ISD::UNDEF)
8314 // Handle undef ^ undef -> 0 special case. This is a common
8315 // idiom (misuse).
8316 return getConstant(0, DL, VT);
8317 [[fallthrough]];
8318 case ISD::ADD:
8319 case ISD::PTRADD:
8320 case ISD::SUB:
8321 // fold op(arg1, undef) -> undef.
8322 return N2;
8323 case ISD::UDIV:
8324 case ISD::SDIV:
8325 case ISD::UREM:
8326 case ISD::SREM:
8327 // fold op(arg1, undef) -> poison.
8328 return getPOISON(VT);
8329 case ISD::MUL:
8330 case ISD::AND:
8331 case ISD::SSUBSAT:
8332 case ISD::USUBSAT:
8333 case ISD::UMIN:
8334 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> 0.
8335 return N1.getOpcode() == ISD::UNDEF ? N2 : getConstant(0, DL, VT);
8336 case ISD::OR:
8337 case ISD::SADDSAT:
8338 case ISD::UADDSAT:
8339 case ISD::UMAX:
8340 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> -1.
8341 return N1.getOpcode() == ISD::UNDEF ? N2 : getAllOnesConstant(DL, VT);
8342 case ISD::SMAX:
8343 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MAX_INT.
8344 return N1.getOpcode() == ISD::UNDEF
8345 ? N2
8346 : getConstant(
8348 VT);
8349 case ISD::SMIN:
8350 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MIN_INT.
8351 return N1.getOpcode() == ISD::UNDEF
8352 ? N2
8353 : getConstant(
8355 VT);
8356 }
8357 }
8358
8359 // Perform trivial constant folding.
8360 if (SDValue SV = FoldConstantArithmetic(Opcode, DL, VT, {N1, N2}, Flags))
8361 return SV;
8362
8363 // Memoize this node if possible.
8364 SDNode *N;
8365 SDVTList VTs = getVTList(VT);
8366 SDValue Ops[] = {N1, N2};
8367 if (VT != MVT::Glue) {
8369 AddNodeIDNode(ID, Opcode, VTs, Ops);
8370 void *IP = nullptr;
8371 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
8372 E->intersectFlagsWith(Flags);
8373 return SDValue(E, 0);
8374 }
8375
8376 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8377 N->setFlags(Flags);
8378 createOperands(N, Ops);
8379 CSEMap.InsertNode(N, IP);
8380 } else {
8381 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8382 createOperands(N, Ops);
8383 }
8384
8385 InsertNode(N);
8386 SDValue V = SDValue(N, 0);
8387 NewSDValueDbgMsg(V, "Creating new node: ", this);
8388 return V;
8389}
8390
8391SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8392 SDValue N1, SDValue N2, SDValue N3) {
8393 SDNodeFlags Flags;
8394 if (Inserter)
8395 Flags = Inserter->getFlags();
8396 return getNode(Opcode, DL, VT, N1, N2, N3, Flags);
8397}
8398
8399SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8400 SDValue N1, SDValue N2, SDValue N3,
8401 const SDNodeFlags Flags) {
8403 N2.getOpcode() != ISD::DELETED_NODE &&
8404 N3.getOpcode() != ISD::DELETED_NODE &&
8405 "Operand is DELETED_NODE!");
8406 // Perform various simplifications.
8407 switch (Opcode) {
8408 case ISD::BUILD_VECTOR: {
8409 // Attempt to simplify BUILD_VECTOR.
8410 SDValue Ops[] = {N1, N2, N3};
8411 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
8412 return V;
8413 break;
8414 }
8415 case ISD::CONCAT_VECTORS: {
8416 SDValue Ops[] = {N1, N2, N3};
8417 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
8418 return V;
8419 break;
8420 }
8421 case ISD::SETCC: {
8422 assert(VT.isInteger() && "SETCC result type must be an integer!");
8423 assert(N1.getValueType() == N2.getValueType() &&
8424 "SETCC operands must have the same type!");
8425 assert(VT.isVector() == N1.getValueType().isVector() &&
8426 "SETCC type should be vector iff the operand type is vector!");
8427 assert((!VT.isVector() || VT.getVectorElementCount() ==
8429 "SETCC vector element counts must match!");
8430 // Use FoldSetCC to simplify SETCC's.
8431 if (SDValue V =
8432 FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get(), DL, Flags))
8433 return V;
8434 break;
8435 }
8436 case ISD::SELECT:
8437 case ISD::VSELECT:
8438 if (SDValue V = simplifySelect(N1, N2, N3))
8439 return V;
8440 break;
8442 llvm_unreachable("should use getVectorShuffle constructor!");
8444 if (isNullConstant(N3))
8445 return N1;
8446 break;
8448 if (isNullConstant(N3))
8449 return N2;
8450 break;
8452 assert(VT.isVector() && VT == N1.getValueType() &&
8453 "INSERT_VECTOR_ELT vector type mismatch");
8455 "INSERT_VECTOR_ELT scalar fp/int mismatch");
8456 assert((!VT.isFloatingPoint() ||
8457 VT.getVectorElementType() == N2.getValueType()) &&
8458 "INSERT_VECTOR_ELT fp scalar type mismatch");
8459 assert((!VT.isInteger() ||
8461 "INSERT_VECTOR_ELT int scalar size mismatch");
8462
8463 auto *N3C = dyn_cast<ConstantSDNode>(N3);
8464 // INSERT_VECTOR_ELT into out-of-bounds element is an UNDEF, except
8465 // for scalable vectors where we will generate appropriate code to
8466 // deal with out-of-bounds cases correctly.
8467 if (N3C && VT.isFixedLengthVector() &&
8468 N3C->getZExtValue() >= VT.getVectorNumElements())
8469 return getUNDEF(VT);
8470
8471 // Undefined index can be assumed out-of-bounds, so that's UNDEF too.
8472 if (N3.isUndef())
8473 return getUNDEF(VT);
8474
8475 // If inserting poison, just use the input vector.
8476 if (N2.getOpcode() == ISD::POISON)
8477 return N1;
8478
8479 // Inserting undef into undef/poison is still undef.
8480 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
8481 return getUNDEF(VT);
8482
8483 // If the inserted element is an UNDEF, just use the input vector.
8484 // But not if skipping the insert could make the result more poisonous.
8485 if (N2.isUndef()) {
8486 if (N3C && VT.isFixedLengthVector()) {
8487 APInt EltMask =
8488 APInt::getOneBitSet(VT.getVectorNumElements(), N3C->getZExtValue());
8489 if (isGuaranteedNotToBePoison(N1, EltMask))
8490 return N1;
8491 } else if (isGuaranteedNotToBePoison(N1))
8492 return N1;
8493 }
8494 break;
8495 }
8496 case ISD::INSERT_SUBVECTOR: {
8497 // If inserting poison, just use the input vector,
8498 if (N2.getOpcode() == ISD::POISON)
8499 return N1;
8500
8501 // Inserting undef into undef/poison is still undef.
8502 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
8503 return getUNDEF(VT);
8504
8505 EVT N2VT = N2.getValueType();
8506 assert(VT == N1.getValueType() &&
8507 "Dest and insert subvector source types must match!");
8508 assert(VT.isVector() && N2VT.isVector() &&
8509 "Insert subvector VTs must be vectors!");
8511 "Insert subvector VTs must have the same element type!");
8512 assert((VT.isScalableVector() || N2VT.isFixedLengthVector()) &&
8513 "Cannot insert a scalable vector into a fixed length vector!");
8514 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
8516 "Insert subvector must be from smaller vector to larger vector!");
8518 "Insert subvector index must be constant");
8519 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
8520 (N2VT.getVectorMinNumElements() + N3->getAsZExtVal()) <=
8522 "Insert subvector overflow!");
8524 TLI->getVectorIdxWidth(getDataLayout()) &&
8525 "Constant index for INSERT_SUBVECTOR has an invalid size");
8526
8527 // Trivial insertion.
8528 if (VT == N2VT)
8529 return N2;
8530
8531 // If this is an insert of an extracted vector into an undef/poison vector,
8532 // we can just use the input to the extract. But not if skipping the
8533 // extract+insert could make the result more poisonous.
8534 if (N1.isUndef() && N2.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
8535 N2.getOperand(1) == N3 && N2.getOperand(0).getValueType() == VT) {
8536 if (N1.getOpcode() == ISD::POISON)
8537 return N2.getOperand(0);
8538 if (VT.isFixedLengthVector() && N2VT.isFixedLengthVector()) {
8539 unsigned LoBit = N3->getAsZExtVal();
8540 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
8541 APInt EltMask =
8542 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
8543 if (isGuaranteedNotToBePoison(N2.getOperand(0), ~EltMask))
8544 return N2.getOperand(0);
8545 } else if (isGuaranteedNotToBePoison(N2.getOperand(0)))
8546 return N2.getOperand(0);
8547 }
8548
8549 // If the inserted subvector is UNDEF, just use the input vector.
8550 // But not if skipping the insert could make the result more poisonous.
8551 if (N2.isUndef()) {
8552 if (VT.isFixedLengthVector()) {
8553 unsigned LoBit = N3->getAsZExtVal();
8554 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
8555 APInt EltMask =
8556 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
8557 if (isGuaranteedNotToBePoison(N1, EltMask))
8558 return N1;
8559 } else if (isGuaranteedNotToBePoison(N1))
8560 return N1;
8561 }
8562 break;
8563 }
8564 case ISD::BITCAST:
8565 // Fold bit_convert nodes from a type to themselves.
8566 if (N1.getValueType() == VT)
8567 return N1;
8568 break;
8569 case ISD::VP_TRUNCATE:
8570 case ISD::VP_SIGN_EXTEND:
8571 case ISD::VP_ZERO_EXTEND:
8572 // Don't create noop casts.
8573 if (N1.getValueType() == VT)
8574 return N1;
8575 break;
8576 case ISD::VECTOR_COMPRESS: {
8577 [[maybe_unused]] EVT VecVT = N1.getValueType();
8578 [[maybe_unused]] EVT MaskVT = N2.getValueType();
8579 [[maybe_unused]] EVT PassthruVT = N3.getValueType();
8580 assert(VT == VecVT && "Vector and result type don't match.");
8581 assert(VecVT.isVector() && MaskVT.isVector() && PassthruVT.isVector() &&
8582 "All inputs must be vectors.");
8583 assert(VecVT == PassthruVT && "Vector and passthru types don't match.");
8585 "Vector and mask must have same number of elements.");
8586
8587 if (N1.isUndef() || N2.isUndef())
8588 return N3;
8589
8590 break;
8591 }
8596 [[maybe_unused]] EVT AccVT = N1.getValueType();
8597 [[maybe_unused]] EVT Input1VT = N2.getValueType();
8598 [[maybe_unused]] EVT Input2VT = N3.getValueType();
8599 assert(Input1VT.isVector() && Input1VT == Input2VT &&
8600 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
8601 "node to have the same type!");
8602 assert(VT.isVector() && VT == AccVT &&
8603 "Expected the first operand of the PARTIAL_REDUCE_MLA node to have "
8604 "the same type as its result!");
8606 AccVT.getVectorElementCount()) &&
8607 "Expected the element count of the second and third operands of the "
8608 "PARTIAL_REDUCE_MLA node to be a positive integer multiple of the "
8609 "element count of the first operand and the result!");
8611 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
8612 "node to have an element type which is the same as or smaller than "
8613 "the element type of the first operand and result!");
8614 break;
8615 }
8616 }
8617
8618 // Perform trivial constant folding for arithmetic operators.
8619 switch (Opcode) {
8620 case ISD::FMA:
8621 case ISD::FMAD:
8622 case ISD::SETCC:
8623 case ISD::FSHL:
8624 case ISD::FSHR:
8625 if (SDValue SV =
8626 FoldConstantArithmetic(Opcode, DL, VT, {N1, N2, N3}, Flags))
8627 return SV;
8628 break;
8629 }
8630
8631 // Memoize node if it doesn't produce a glue result.
8632 SDNode *N;
8633 SDVTList VTs = getVTList(VT);
8634 SDValue Ops[] = {N1, N2, N3};
8635 if (VT != MVT::Glue) {
8637 AddNodeIDNode(ID, Opcode, VTs, Ops);
8638 void *IP = nullptr;
8639 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
8640 E->intersectFlagsWith(Flags);
8641 return SDValue(E, 0);
8642 }
8643
8644 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8645 N->setFlags(Flags);
8646 createOperands(N, Ops);
8647 CSEMap.InsertNode(N, IP);
8648 } else {
8649 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8650 createOperands(N, Ops);
8651 }
8652
8653 InsertNode(N);
8654 SDValue V = SDValue(N, 0);
8655 NewSDValueDbgMsg(V, "Creating new node: ", this);
8656 return V;
8657}
8658
8659SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8660 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
8661 const SDNodeFlags Flags) {
8662 SDValue Ops[] = { N1, N2, N3, N4 };
8663 return getNode(Opcode, DL, VT, Ops, Flags);
8664}
8665
8666SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8667 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
8668 SDNodeFlags Flags;
8669 if (Inserter)
8670 Flags = Inserter->getFlags();
8671 return getNode(Opcode, DL, VT, N1, N2, N3, N4, Flags);
8672}
8673
8674SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8675 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
8676 SDValue N5, const SDNodeFlags Flags) {
8677 SDValue Ops[] = { N1, N2, N3, N4, N5 };
8678 return getNode(Opcode, DL, VT, Ops, Flags);
8679}
8680
8681SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8682 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
8683 SDValue N5) {
8684 SDNodeFlags Flags;
8685 if (Inserter)
8686 Flags = Inserter->getFlags();
8687 return getNode(Opcode, DL, VT, N1, N2, N3, N4, N5, Flags);
8688}
8689
8690/// getStackArgumentTokenFactor - Compute a TokenFactor to force all
8691/// the incoming stack arguments to be loaded from the stack.
8693 SmallVector<SDValue, 8> ArgChains;
8694
8695 // Include the original chain at the beginning of the list. When this is
8696 // used by target LowerCall hooks, this helps legalize find the
8697 // CALLSEQ_BEGIN node.
8698 ArgChains.push_back(Chain);
8699
8700 // Add a chain value for each stack argument.
8701 for (SDNode *U : getEntryNode().getNode()->users())
8702 if (LoadSDNode *L = dyn_cast<LoadSDNode>(U))
8703 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(L->getBasePtr()))
8704 if (FI->getIndex() < 0)
8705 ArgChains.push_back(SDValue(L, 1));
8706
8707 // Build a tokenfactor for all the chains.
8708 return getNode(ISD::TokenFactor, SDLoc(Chain), MVT::Other, ArgChains);
8709}
8710
8711/// getMemsetValue - Vectorized representation of the memset value
8712/// operand.
8714 const SDLoc &dl) {
8715 assert(!Value.isUndef());
8716
8717 unsigned NumBits = VT.getScalarSizeInBits();
8719 assert(C->getAPIntValue().getBitWidth() == 8);
8720 APInt Val = APInt::getSplat(NumBits, C->getAPIntValue());
8721 if (VT.isInteger()) {
8722 bool IsOpaque = VT.getSizeInBits() > 64 ||
8723 !DAG.getTargetLoweringInfo().isLegalStoreImmediate(C->getSExtValue());
8724 return DAG.getConstant(Val, dl, VT, false, IsOpaque);
8725 }
8726 return DAG.getConstantFP(APFloat(VT.getFltSemantics(), Val), dl, VT);
8727 }
8728
8729 assert(Value.getValueType() == MVT::i8 && "memset with non-byte fill value?");
8730 EVT IntVT = VT.getScalarType();
8731 if (!IntVT.isInteger())
8732 IntVT = EVT::getIntegerVT(*DAG.getContext(), IntVT.getSizeInBits());
8733
8734 Value = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, Value);
8735 if (NumBits > 8) {
8736 // Use a multiplication with 0x010101... to extend the input to the
8737 // required length.
8738 APInt Magic = APInt::getSplat(NumBits, APInt(8, 0x01));
8739 Value = DAG.getNode(ISD::MUL, dl, IntVT, Value,
8740 DAG.getConstant(Magic, dl, IntVT));
8741 }
8742
8743 if (VT != Value.getValueType() && !VT.isInteger())
8744 Value = DAG.getBitcast(VT.getScalarType(), Value);
8745 if (VT != Value.getValueType())
8746 Value = DAG.getSplatBuildVector(VT, dl, Value);
8747
8748 return Value;
8749}
8750
8751/// getMemsetStringVal - Similar to getMemsetValue. Except this is only
8752/// used when a memcpy is turned into a memset when the source is a constant
8753/// string ptr.
8755 const TargetLowering &TLI,
8756 const ConstantDataArraySlice &Slice) {
8757 // Handle vector with all elements zero.
8758 if (Slice.Array == nullptr) {
8759 if (VT.isInteger())
8760 return DAG.getConstant(0, dl, VT);
8761 return DAG.getNode(ISD::BITCAST, dl, VT,
8762 DAG.getConstant(0, dl, VT.changeTypeToInteger()));
8763 }
8764
8765 assert(!VT.isVector() && "Can't handle vector type here!");
8766 unsigned NumVTBits = VT.getSizeInBits();
8767 unsigned NumVTBytes = NumVTBits / 8;
8768 unsigned NumBytes = std::min(NumVTBytes, unsigned(Slice.Length));
8769
8770 APInt Val(NumVTBits, 0);
8771 if (DAG.getDataLayout().isLittleEndian()) {
8772 for (unsigned i = 0; i != NumBytes; ++i)
8773 Val |= (uint64_t)(unsigned char)Slice[i] << i*8;
8774 } else {
8775 for (unsigned i = 0; i != NumBytes; ++i)
8776 Val |= (uint64_t)(unsigned char)Slice[i] << (NumVTBytes-i-1)*8;
8777 }
8778
8779 // If the "cost" of materializing the integer immediate is less than the cost
8780 // of a load, then it is cost effective to turn the load into the immediate.
8781 Type *Ty = VT.getTypeForEVT(*DAG.getContext());
8782 if (TLI.shouldConvertConstantLoadToIntImm(Val, Ty))
8783 return DAG.getConstant(Val, dl, VT);
8784 return SDValue();
8785}
8786
8788 const SDLoc &DL,
8789 const SDNodeFlags Flags) {
8790 SDValue Index = getTypeSize(DL, Base.getValueType(), Offset);
8791 return getMemBasePlusOffset(Base, Index, DL, Flags);
8792}
8793
8795 const SDLoc &DL,
8796 const SDNodeFlags Flags) {
8797 assert(Offset.getValueType().isInteger());
8798 EVT BasePtrVT = Ptr.getValueType();
8799 if (TLI->shouldPreservePtrArith(this->getMachineFunction().getFunction(),
8800 BasePtrVT))
8801 return getNode(ISD::PTRADD, DL, BasePtrVT, Ptr, Offset, Flags);
8802 // InBounds only applies to PTRADD, don't set it if we generate ADD.
8803 SDNodeFlags AddFlags = Flags;
8804 AddFlags.setInBounds(false);
8805 return getNode(ISD::ADD, DL, BasePtrVT, Ptr, Offset, AddFlags);
8806}
8807
8808/// Returns true if memcpy source is constant data.
8810 uint64_t SrcDelta = 0;
8811 GlobalAddressSDNode *G = nullptr;
8812 if (Src.getOpcode() == ISD::GlobalAddress)
8814 else if (Src->isAnyAdd() &&
8815 Src.getOperand(0).getOpcode() == ISD::GlobalAddress &&
8816 Src.getOperand(1).getOpcode() == ISD::Constant) {
8817 G = cast<GlobalAddressSDNode>(Src.getOperand(0));
8818 SrcDelta = Src.getConstantOperandVal(1);
8819 }
8820 if (!G)
8821 return false;
8822
8823 return getConstantDataArrayInfo(G->getGlobal(), Slice, 8,
8824 SrcDelta + G->getOffset());
8825}
8826
8828 SelectionDAG &DAG) {
8829 // On Darwin, -Os means optimize for size without hurting performance, so
8830 // only really optimize for size when -Oz (MinSize) is used.
8832 return MF.getFunction().hasMinSize();
8833 return DAG.shouldOptForSize();
8834}
8835
8837 SmallVector<SDValue, 32> &OutChains, unsigned From,
8838 unsigned To, SmallVector<SDValue, 16> &OutLoadChains,
8839 SmallVector<SDValue, 16> &OutStoreChains) {
8840 assert(OutLoadChains.size() && "Missing loads in memcpy inlining");
8841 assert(OutStoreChains.size() && "Missing stores in memcpy inlining");
8842 SmallVector<SDValue, 16> GluedLoadChains;
8843 for (unsigned i = From; i < To; ++i) {
8844 OutChains.push_back(OutLoadChains[i]);
8845 GluedLoadChains.push_back(OutLoadChains[i]);
8846 }
8847
8848 // Chain for all loads.
8849 SDValue LoadToken = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
8850 GluedLoadChains);
8851
8852 for (unsigned i = From; i < To; ++i) {
8853 StoreSDNode *ST = dyn_cast<StoreSDNode>(OutStoreChains[i]);
8854 SDValue NewStore = DAG.getTruncStore(LoadToken, dl, ST->getValue(),
8855 ST->getBasePtr(), ST->getMemoryVT(),
8856 ST->getMemOperand());
8857 OutChains.push_back(NewStore);
8858 }
8859}
8860
8862 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
8863 uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline,
8864 MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo,
8865 const AAMDNodes &AAInfo, BatchAAResults *BatchAA) {
8866 // Turn a memcpy of undef to nop.
8867 // FIXME: We need to honor volatile even is Src is undef.
8868 if (Src.isUndef())
8869 return Chain;
8870
8871 // Expand memcpy to a series of load and store ops if the size operand falls
8872 // below a certain threshold.
8873 // TODO: In the AlwaysInline case, if the size is big then generate a loop
8874 // rather than maybe a humongous number of loads and stores.
8875 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8876 const DataLayout &DL = DAG.getDataLayout();
8877 LLVMContext &C = *DAG.getContext();
8878 std::vector<EVT> MemOps;
8879 bool DstAlignCanChange = false;
8881 MachineFrameInfo &MFI = MF.getFrameInfo();
8882 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
8884 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
8885 DstAlignCanChange = true;
8886 MaybeAlign SrcAlign = DAG.InferPtrAlign(Src);
8887 if (!SrcAlign || Alignment > *SrcAlign)
8888 SrcAlign = Alignment;
8889 assert(SrcAlign && "SrcAlign must be set");
8891 // If marked as volatile, perform a copy even when marked as constant.
8892 bool CopyFromConstant = !isVol && isMemSrcFromConstant(Src, Slice);
8893 bool isZeroConstant = CopyFromConstant && Slice.Array == nullptr;
8894 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemcpy(OptSize);
8895 const MemOp Op = isZeroConstant
8896 ? MemOp::Set(Size, DstAlignCanChange, Alignment,
8897 /*IsZeroMemset*/ true, isVol)
8898 : MemOp::Copy(Size, DstAlignCanChange, Alignment,
8899 *SrcAlign, isVol, CopyFromConstant);
8900 if (!TLI.findOptimalMemOpLowering(
8901 C, MemOps, Limit, Op, DstPtrInfo.getAddrSpace(),
8902 SrcPtrInfo.getAddrSpace(), MF.getFunction().getAttributes(), nullptr))
8903 return SDValue();
8904
8905 if (DstAlignCanChange) {
8906 Type *Ty = MemOps[0].getTypeForEVT(C);
8907 Align NewAlign = DL.getABITypeAlign(Ty);
8908
8909 // Don't promote to an alignment that would require dynamic stack
8910 // realignment which may conflict with optimizations such as tail call
8911 // optimization.
8913 if (!TRI->hasStackRealignment(MF))
8914 if (MaybeAlign StackAlign = DL.getStackAlignment())
8915 NewAlign = std::min(NewAlign, *StackAlign);
8916
8917 if (NewAlign > Alignment) {
8918 // Give the stack frame object a larger alignment if needed.
8919 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
8920 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
8921 Alignment = NewAlign;
8922 }
8923 }
8924
8925 // Prepare AAInfo for loads/stores after lowering this memcpy.
8926 AAMDNodes NewAAInfo = AAInfo;
8927 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
8928
8929 const Value *SrcVal = dyn_cast_if_present<const Value *>(SrcPtrInfo.V);
8930 bool isConstant =
8931 BatchAA && SrcVal &&
8932 BatchAA->pointsToConstantMemory(MemoryLocation(SrcVal, Size, AAInfo));
8933
8934 MachineMemOperand::Flags MMOFlags =
8936 SmallVector<SDValue, 16> OutLoadChains;
8937 SmallVector<SDValue, 16> OutStoreChains;
8938 SmallVector<SDValue, 32> OutChains;
8939 unsigned NumMemOps = MemOps.size();
8940 uint64_t SrcOff = 0, DstOff = 0;
8941 for (unsigned i = 0; i != NumMemOps; ++i) {
8942 EVT VT = MemOps[i];
8943 unsigned VTSize = VT.getSizeInBits() / 8;
8944 SDValue Value, Store;
8945
8946 if (VTSize > Size) {
8947 // Issuing an unaligned load / store pair that overlaps with the previous
8948 // pair. Adjust the offset accordingly.
8949 assert(i == NumMemOps-1 && i != 0);
8950 SrcOff -= VTSize - Size;
8951 DstOff -= VTSize - Size;
8952 }
8953
8954 if (CopyFromConstant &&
8955 (isZeroConstant || (VT.isInteger() && !VT.isVector()))) {
8956 // It's unlikely a store of a vector immediate can be done in a single
8957 // instruction. It would require a load from a constantpool first.
8958 // We only handle zero vectors here.
8959 // FIXME: Handle other cases where store of vector immediate is done in
8960 // a single instruction.
8961 ConstantDataArraySlice SubSlice;
8962 if (SrcOff < Slice.Length) {
8963 SubSlice = Slice;
8964 SubSlice.move(SrcOff);
8965 } else {
8966 // This is an out-of-bounds access and hence UB. Pretend we read zero.
8967 SubSlice.Array = nullptr;
8968 SubSlice.Offset = 0;
8969 SubSlice.Length = VTSize;
8970 }
8971 Value = getMemsetStringVal(VT, dl, DAG, TLI, SubSlice);
8972 if (Value.getNode()) {
8973 Store = DAG.getStore(
8974 Chain, dl, Value,
8975 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
8976 DstPtrInfo.getWithOffset(DstOff), Alignment, MMOFlags, NewAAInfo);
8977 OutChains.push_back(Store);
8978 }
8979 }
8980
8981 if (!Store.getNode()) {
8982 // The type might not be legal for the target. This should only happen
8983 // if the type is smaller than a legal type, as on PPC, so the right
8984 // thing to do is generate a LoadExt/StoreTrunc pair. These simplify
8985 // to Load/Store if NVT==VT.
8986 // FIXME does the case above also need this?
8987 EVT NVT = TLI.getTypeToTransformTo(C, VT);
8988 assert(NVT.bitsGE(VT));
8989
8990 bool isDereferenceable =
8991 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
8992 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
8993 if (isDereferenceable)
8995 if (isConstant)
8996 SrcMMOFlags |= MachineMemOperand::MOInvariant;
8997
8998 Value = DAG.getExtLoad(
8999 ISD::EXTLOAD, dl, NVT, Chain,
9000 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9001 SrcPtrInfo.getWithOffset(SrcOff), VT,
9002 commonAlignment(*SrcAlign, SrcOff), SrcMMOFlags, NewAAInfo);
9003 OutLoadChains.push_back(Value.getValue(1));
9004
9005 Store = DAG.getTruncStore(
9006 Chain, dl, Value,
9007 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9008 DstPtrInfo.getWithOffset(DstOff), VT, Alignment, MMOFlags, NewAAInfo);
9009 OutStoreChains.push_back(Store);
9010 }
9011 SrcOff += VTSize;
9012 DstOff += VTSize;
9013 Size -= VTSize;
9014 }
9015
9016 unsigned GluedLdStLimit = MaxLdStGlue == 0 ?
9018 unsigned NumLdStInMemcpy = OutStoreChains.size();
9019
9020 if (NumLdStInMemcpy) {
9021 // It may be that memcpy might be converted to memset if it's memcpy
9022 // of constants. In such a case, we won't have loads and stores, but
9023 // just stores. In the absence of loads, there is nothing to gang up.
9024 if ((GluedLdStLimit <= 1) || !EnableMemCpyDAGOpt) {
9025 // If target does not care, just leave as it.
9026 for (unsigned i = 0; i < NumLdStInMemcpy; ++i) {
9027 OutChains.push_back(OutLoadChains[i]);
9028 OutChains.push_back(OutStoreChains[i]);
9029 }
9030 } else {
9031 // Ld/St less than/equal limit set by target.
9032 if (NumLdStInMemcpy <= GluedLdStLimit) {
9033 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, 0,
9034 NumLdStInMemcpy, OutLoadChains,
9035 OutStoreChains);
9036 } else {
9037 unsigned NumberLdChain = NumLdStInMemcpy / GluedLdStLimit;
9038 unsigned RemainingLdStInMemcpy = NumLdStInMemcpy % GluedLdStLimit;
9039 unsigned GlueIter = 0;
9040
9041 // Residual ld/st.
9042 if (RemainingLdStInMemcpy) {
9044 DAG, dl, OutChains, NumLdStInMemcpy - RemainingLdStInMemcpy,
9045 NumLdStInMemcpy, OutLoadChains, OutStoreChains);
9046 }
9047
9048 for (unsigned cnt = 0; cnt < NumberLdChain; ++cnt) {
9049 unsigned IndexFrom = NumLdStInMemcpy - RemainingLdStInMemcpy -
9050 GlueIter - GluedLdStLimit;
9051 unsigned IndexTo = NumLdStInMemcpy - RemainingLdStInMemcpy - GlueIter;
9052 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, IndexFrom, IndexTo,
9053 OutLoadChains, OutStoreChains);
9054 GlueIter += GluedLdStLimit;
9055 }
9056 }
9057 }
9058 }
9059 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9060}
9061
9063 SDValue Chain, SDValue Dst, SDValue Src,
9064 uint64_t Size, Align Alignment,
9065 bool isVol, bool AlwaysInline,
9066 MachinePointerInfo DstPtrInfo,
9067 MachinePointerInfo SrcPtrInfo,
9068 const AAMDNodes &AAInfo) {
9069 // Turn a memmove of undef to nop.
9070 // FIXME: We need to honor volatile even is Src is undef.
9071 if (Src.isUndef())
9072 return Chain;
9073
9074 // Expand memmove to a series of load and store ops if the size operand falls
9075 // below a certain threshold.
9076 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9077 const DataLayout &DL = DAG.getDataLayout();
9078 LLVMContext &C = *DAG.getContext();
9079 std::vector<EVT> MemOps;
9080 bool DstAlignCanChange = false;
9082 MachineFrameInfo &MFI = MF.getFrameInfo();
9083 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9085 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9086 DstAlignCanChange = true;
9087 MaybeAlign SrcAlign = DAG.InferPtrAlign(Src);
9088 if (!SrcAlign || Alignment > *SrcAlign)
9089 SrcAlign = Alignment;
9090 assert(SrcAlign && "SrcAlign must be set");
9091 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemmove(OptSize);
9092 if (!TLI.findOptimalMemOpLowering(
9093 C, MemOps, Limit,
9094 MemOp::Copy(Size, DstAlignCanChange, Alignment, *SrcAlign,
9095 /*IsVolatile*/ true),
9096 DstPtrInfo.getAddrSpace(), SrcPtrInfo.getAddrSpace(),
9097 MF.getFunction().getAttributes(), nullptr))
9098 return SDValue();
9099
9100 if (DstAlignCanChange) {
9101 Type *Ty = MemOps[0].getTypeForEVT(C);
9102 Align NewAlign = DL.getABITypeAlign(Ty);
9103
9104 // Don't promote to an alignment that would require dynamic stack
9105 // realignment which may conflict with optimizations such as tail call
9106 // optimization.
9108 if (!TRI->hasStackRealignment(MF))
9109 if (MaybeAlign StackAlign = DL.getStackAlignment())
9110 NewAlign = std::min(NewAlign, *StackAlign);
9111
9112 if (NewAlign > Alignment) {
9113 // Give the stack frame object a larger alignment if needed.
9114 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
9115 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
9116 Alignment = NewAlign;
9117 }
9118 }
9119
9120 // Prepare AAInfo for loads/stores after lowering this memmove.
9121 AAMDNodes NewAAInfo = AAInfo;
9122 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9123
9124 MachineMemOperand::Flags MMOFlags =
9126 uint64_t SrcOff = 0, DstOff = 0;
9127 SmallVector<SDValue, 8> LoadValues;
9128 SmallVector<SDValue, 8> LoadChains;
9129 SmallVector<SDValue, 8> OutChains;
9130 unsigned NumMemOps = MemOps.size();
9131 for (unsigned i = 0; i < NumMemOps; i++) {
9132 EVT VT = MemOps[i];
9133 unsigned VTSize = VT.getSizeInBits() / 8;
9134 SDValue Value;
9135
9136 bool isDereferenceable =
9137 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9138 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9139 if (isDereferenceable)
9141
9142 Value = DAG.getLoad(
9143 VT, dl, Chain,
9144 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9145 SrcPtrInfo.getWithOffset(SrcOff), *SrcAlign, SrcMMOFlags, NewAAInfo);
9146 LoadValues.push_back(Value);
9147 LoadChains.push_back(Value.getValue(1));
9148 SrcOff += VTSize;
9149 }
9150 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, LoadChains);
9151 OutChains.clear();
9152 for (unsigned i = 0; i < NumMemOps; i++) {
9153 EVT VT = MemOps[i];
9154 unsigned VTSize = VT.getSizeInBits() / 8;
9155 SDValue Store;
9156
9157 Store = DAG.getStore(
9158 Chain, dl, LoadValues[i],
9159 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9160 DstPtrInfo.getWithOffset(DstOff), Alignment, MMOFlags, NewAAInfo);
9161 OutChains.push_back(Store);
9162 DstOff += VTSize;
9163 }
9164
9165 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9166}
9167
9168/// Lower the call to 'memset' intrinsic function into a series of store
9169/// operations.
9170///
9171/// \param DAG Selection DAG where lowered code is placed.
9172/// \param dl Link to corresponding IR location.
9173/// \param Chain Control flow dependency.
9174/// \param Dst Pointer to destination memory location.
9175/// \param Src Value of byte to write into the memory.
9176/// \param Size Number of bytes to write.
9177/// \param Alignment Alignment of the destination in bytes.
9178/// \param isVol True if destination is volatile.
9179/// \param AlwaysInline Makes sure no function call is generated.
9180/// \param DstPtrInfo IR information on the memory pointer.
9181/// \returns New head in the control flow, if lowering was successful, empty
9182/// SDValue otherwise.
9183///
9184/// The function tries to replace 'llvm.memset' intrinsic with several store
9185/// operations and value calculation code. This is usually profitable for small
9186/// memory size or when the semantic requires inlining.
9188 SDValue Chain, SDValue Dst, SDValue Src,
9189 uint64_t Size, Align Alignment, bool isVol,
9190 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9191 const AAMDNodes &AAInfo) {
9192 // Turn a memset of undef to nop.
9193 // FIXME: We need to honor volatile even is Src is undef.
9194 if (Src.isUndef())
9195 return Chain;
9196
9197 // Expand memset to a series of load/store ops if the size operand
9198 // falls below a certain threshold.
9199 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9200 std::vector<EVT> MemOps;
9201 bool DstAlignCanChange = false;
9202 LLVMContext &C = *DAG.getContext();
9204 MachineFrameInfo &MFI = MF.getFrameInfo();
9205 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9207 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9208 DstAlignCanChange = true;
9209 bool IsZeroVal = isNullConstant(Src);
9210 unsigned Limit = AlwaysInline ? ~0 : TLI.getMaxStoresPerMemset(OptSize);
9211
9212 EVT LargestVT;
9213 if (!TLI.findOptimalMemOpLowering(
9214 C, MemOps, Limit,
9215 MemOp::Set(Size, DstAlignCanChange, Alignment, IsZeroVal, isVol),
9216 DstPtrInfo.getAddrSpace(), ~0u, MF.getFunction().getAttributes(),
9217 &LargestVT))
9218 return SDValue();
9219
9220 if (DstAlignCanChange) {
9221 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext());
9222 const DataLayout &DL = DAG.getDataLayout();
9223 Align NewAlign = DL.getABITypeAlign(Ty);
9224
9225 // Don't promote to an alignment that would require dynamic stack
9226 // realignment which may conflict with optimizations such as tail call
9227 // optimization.
9229 if (!TRI->hasStackRealignment(MF))
9230 if (MaybeAlign StackAlign = DL.getStackAlignment())
9231 NewAlign = std::min(NewAlign, *StackAlign);
9232
9233 if (NewAlign > Alignment) {
9234 // Give the stack frame object a larger alignment if needed.
9235 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
9236 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
9237 Alignment = NewAlign;
9238 }
9239 }
9240
9241 SmallVector<SDValue, 8> OutChains;
9242 uint64_t DstOff = 0;
9243 unsigned NumMemOps = MemOps.size();
9244
9245 // Find the largest store and generate the bit pattern for it.
9246 // If target didn't set LargestVT, compute it from MemOps.
9247 if (!LargestVT.isSimple()) {
9248 LargestVT = MemOps[0];
9249 for (unsigned i = 1; i < NumMemOps; i++)
9250 if (MemOps[i].bitsGT(LargestVT))
9251 LargestVT = MemOps[i];
9252 }
9253 SDValue MemSetValue = getMemsetValue(Src, LargestVT, DAG, dl);
9254
9255 // Prepare AAInfo for loads/stores after lowering this memset.
9256 AAMDNodes NewAAInfo = AAInfo;
9257 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9258
9259 for (unsigned i = 0; i < NumMemOps; i++) {
9260 EVT VT = MemOps[i];
9261 unsigned VTSize = VT.getSizeInBits() / 8;
9262 // The target should specify store types that exactly cover the memset size
9263 // (with the last store potentially being oversized for overlapping stores).
9264 assert(Size > 0 && "Target specified more stores than needed in "
9265 "findOptimalMemOpLowering");
9266 if (VTSize > Size) {
9267 // Issuing an unaligned load / store pair that overlaps with the previous
9268 // pair. Adjust the offset accordingly.
9269 assert(i == NumMemOps-1 && i != 0);
9270 DstOff -= VTSize - Size;
9271 }
9272
9273 // If this store is smaller than the largest store see whether we can get
9274 // the smaller value for free with a truncate or extract vector element and
9275 // then store.
9276 SDValue Value = MemSetValue;
9277 if (VT.bitsLT(LargestVT)) {
9278 unsigned Index;
9279 unsigned NElts = LargestVT.getSizeInBits() / VT.getSizeInBits();
9280 EVT SVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(), NElts);
9281 if (!LargestVT.isVector() && !VT.isVector() &&
9282 TLI.isTruncateFree(LargestVT, VT))
9283 Value = DAG.getNode(ISD::TRUNCATE, dl, VT, MemSetValue);
9284 else if (LargestVT.isVector() && !VT.isVector() &&
9286 LargestVT.getTypeForEVT(*DAG.getContext()),
9287 VT.getSizeInBits(), Index) &&
9288 TLI.isTypeLegal(SVT) &&
9289 LargestVT.getSizeInBits() == SVT.getSizeInBits()) {
9290 // Target which can combine store(extractelement VectorTy, Idx) can get
9291 // the smaller value for free.
9292 SDValue TailValue = DAG.getNode(ISD::BITCAST, dl, SVT, MemSetValue);
9293 Value = DAG.getExtractVectorElt(dl, VT, TailValue, Index);
9294 } else
9295 Value = getMemsetValue(Src, VT, DAG, dl);
9296 }
9297 assert(Value.getValueType() == VT && "Value with wrong type.");
9298 SDValue Store = DAG.getStore(
9299 Chain, dl, Value,
9300 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9301 DstPtrInfo.getWithOffset(DstOff), Alignment,
9303 NewAAInfo);
9304 OutChains.push_back(Store);
9305 DstOff += VT.getSizeInBits() / 8;
9306 // For oversized overlapping stores, only subtract the remaining bytes.
9307 // For normal stores, subtract the full store size.
9308 if (VTSize > Size) {
9309 Size = 0;
9310 } else {
9311 Size -= VTSize;
9312 }
9313 }
9314
9315 // After processing all stores, Size should be exactly 0. Any remaining bytes
9316 // indicate a bug in the target's findOptimalMemOpLowering implementation.
9317 assert(Size == 0 && "Target's findOptimalMemOpLowering did not specify "
9318 "stores that exactly cover the memset size");
9319
9320 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9321}
9322
9324 unsigned AS) {
9325 // Lowering memcpy / memset / memmove intrinsics to calls is only valid if all
9326 // pointer operands can be losslessly bitcasted to pointers of address space 0
9327 if (AS != 0 && !TLI->getTargetMachine().isNoopAddrSpaceCast(AS, 0)) {
9328 report_fatal_error("cannot lower memory intrinsic in address space " +
9329 Twine(AS));
9330 }
9331}
9332
9334 const SelectionDAG *SelDAG,
9335 bool AllowReturnsFirstArg) {
9336 if (!CI || !CI->isTailCall())
9337 return false;
9338 // TODO: Fix "returns-first-arg" determination so it doesn't depend on which
9339 // helper symbol we lower to.
9340 return isInTailCallPosition(*CI, SelDAG->getTarget(),
9341 AllowReturnsFirstArg &&
9343}
9344
9345static std::pair<SDValue, SDValue>
9348 const CallInst *CI, RTLIB::Libcall Call,
9349 SelectionDAG *DAG, const TargetLowering *TLI) {
9350 RTLIB::LibcallImpl LCImpl = DAG->getLibcalls().getLibcallImpl(Call);
9351
9352 if (LCImpl == RTLIB::Unsupported)
9353 return {};
9354
9356 bool IsTailCall =
9357 isInTailCallPositionWrapper(CI, DAG, /*AllowReturnsFirstArg=*/true);
9358 SDValue Callee =
9359 DAG->getExternalSymbol(LCImpl, TLI->getPointerTy(DAG->getDataLayout()));
9360
9361 CLI.setDebugLoc(dl)
9362 .setChain(Chain)
9364 CI->getType(), Callee, std::move(Args))
9365 .setTailCall(IsTailCall);
9366
9367 return TLI->LowerCallTo(CLI);
9368}
9369
9370std::pair<SDValue, SDValue> SelectionDAG::getStrcmp(SDValue Chain,
9371 const SDLoc &dl, SDValue S1,
9372 SDValue S2,
9373 const CallInst *CI) {
9375 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
9376 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9377 RTLIB::STRCMP, this, TLI);
9378}
9379
9380std::pair<SDValue, SDValue> SelectionDAG::getStrstr(SDValue Chain,
9381 const SDLoc &dl, SDValue S1,
9382 SDValue S2,
9383 const CallInst *CI) {
9385 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
9386 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9387 RTLIB::STRSTR, this, TLI);
9388}
9389
9390std::pair<SDValue, SDValue> SelectionDAG::getMemccpy(SDValue Chain,
9391 const SDLoc &dl,
9392 SDValue Dst, SDValue Src,
9394 const CallInst *CI) {
9396
9398 {Dst, PT},
9399 {Src, PT},
9402 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9403 RTLIB::MEMCCPY, this, TLI);
9404}
9405
9406std::pair<SDValue, SDValue>
9408 SDValue Mem1, SDValue Size, const CallInst *CI) {
9409 RTLIB::LibcallImpl MemcmpImpl = Libcalls->getLibcallImpl(RTLIB::MEMCMP);
9410 if (MemcmpImpl == RTLIB::Unsupported)
9411 return {};
9412
9415 {Mem0, PT},
9416 {Mem1, PT},
9418
9420 bool IsTailCall =
9421 isInTailCallPositionWrapper(CI, this, /*AllowReturnsFirstArg*/ true);
9422
9423 CLI.setDebugLoc(dl)
9424 .setChain(Chain)
9425 .setLibCallee(
9426 Libcalls->getLibcallImplCallingConv(MemcmpImpl),
9428 getExternalSymbol(MemcmpImpl, TLI->getPointerTy(getDataLayout())),
9429 std::move(Args))
9430 .setTailCall(IsTailCall);
9431
9432 return TLI->LowerCallTo(CLI);
9433}
9434
9435std::pair<SDValue, SDValue> SelectionDAG::getStrcpy(SDValue Chain,
9436 const SDLoc &dl,
9437 SDValue Dst, SDValue Src,
9438 const CallInst *CI) {
9439 RTLIB::LibcallImpl LCImpl = Libcalls->getLibcallImpl(RTLIB::STRCPY);
9440 if (LCImpl == RTLIB::Unsupported)
9441 return {};
9442
9444 TargetLowering::ArgListTy Args = {{Dst, PT}, {Src, PT}};
9445
9447 bool IsTailCall =
9448 isInTailCallPositionWrapper(CI, this, /*AllowReturnsFirstArg=*/true);
9449
9450 CLI.setDebugLoc(dl)
9451 .setChain(Chain)
9452 .setLibCallee(
9453 Libcalls->getLibcallImplCallingConv(LCImpl), CI->getType(),
9454 getExternalSymbol(LCImpl, TLI->getPointerTy(getDataLayout())),
9455 std::move(Args))
9456 .setTailCall(IsTailCall);
9457
9458 return TLI->LowerCallTo(CLI);
9459}
9460
9461std::pair<SDValue, SDValue> SelectionDAG::getStrlen(SDValue Chain,
9462 const SDLoc &dl,
9463 SDValue Src,
9464 const CallInst *CI) {
9465 RTLIB::LibcallImpl StrlenImpl = Libcalls->getLibcallImpl(RTLIB::STRLEN);
9466 if (StrlenImpl == RTLIB::Unsupported)
9467 return {};
9468
9469 // Emit a library call.
9472
9474 bool IsTailCall =
9475 isInTailCallPositionWrapper(CI, this, /*AllowReturnsFirstArg*/ true);
9476
9477 CLI.setDebugLoc(dl)
9478 .setChain(Chain)
9479 .setLibCallee(Libcalls->getLibcallImplCallingConv(StrlenImpl),
9480 CI->getType(),
9482 StrlenImpl, TLI->getProgramPointerTy(getDataLayout())),
9483 std::move(Args))
9484 .setTailCall(IsTailCall);
9485
9486 return TLI->LowerCallTo(CLI);
9487}
9488
9490 SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size,
9491 Align Alignment, bool isVol, bool AlwaysInline, const CallInst *CI,
9492 std::optional<bool> OverrideTailCall, MachinePointerInfo DstPtrInfo,
9493 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo,
9494 BatchAAResults *BatchAA) {
9495 // Check to see if we should lower the memcpy to loads and stores first.
9496 // For cases within the target-specified limits, this is the best choice.
9498 if (ConstantSize) {
9499 // Memcpy with size zero? Just return the original chain.
9500 if (ConstantSize->isZero())
9501 return Chain;
9502
9504 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
9505 isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA);
9506 if (Result.getNode())
9507 return Result;
9508 }
9509
9510 // Then check to see if we should lower the memcpy with target-specific
9511 // code. If the target chooses to do this, this is the next best.
9512 if (TSI) {
9513 SDValue Result = TSI->EmitTargetCodeForMemcpy(
9514 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline,
9515 DstPtrInfo, SrcPtrInfo);
9516 if (Result.getNode())
9517 return Result;
9518 }
9519
9520 // If we really need inline code and the target declined to provide it,
9521 // use a (potentially long) sequence of loads and stores.
9522 if (AlwaysInline) {
9523 assert(ConstantSize && "AlwaysInline requires a constant size!");
9525 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
9526 isVol, true, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA);
9527 }
9528
9531
9532 // FIXME: If the memcpy is volatile (isVol), lowering it to a plain libc
9533 // memcpy is not guaranteed to be safe. libc memcpys aren't required to
9534 // respect volatile, so they may do things like read or write memory
9535 // beyond the given memory regions. But fixing this isn't easy, and most
9536 // people don't care.
9537
9538 // Emit a library call.
9541 Args.emplace_back(Dst, PtrTy);
9542 Args.emplace_back(Src, PtrTy);
9543 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
9544 // FIXME: pass in SDLoc
9546 bool IsTailCall = false;
9547 RTLIB::LibcallImpl MemCpyImpl = TLI->getMemcpyImpl();
9548
9549 if (OverrideTailCall.has_value()) {
9550 IsTailCall = *OverrideTailCall;
9551 } else {
9552 bool LowersToMemcpy = MemCpyImpl == RTLIB::impl_memcpy;
9553 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemcpy);
9554 }
9555
9556 CLI.setDebugLoc(dl)
9557 .setChain(Chain)
9558 .setLibCallee(
9559 Libcalls->getLibcallImplCallingConv(MemCpyImpl),
9560 Dst.getValueType().getTypeForEVT(*getContext()),
9561 getExternalSymbol(MemCpyImpl, TLI->getPointerTy(getDataLayout())),
9562 std::move(Args))
9564 .setTailCall(IsTailCall);
9565
9566 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
9567 return CallResult.second;
9568}
9569
9571 SDValue Dst, SDValue Src, SDValue Size,
9572 Type *SizeTy, unsigned ElemSz,
9573 bool isTailCall,
9574 MachinePointerInfo DstPtrInfo,
9575 MachinePointerInfo SrcPtrInfo) {
9576 // Emit a library call.
9579 Args.emplace_back(Dst, ArgTy);
9580 Args.emplace_back(Src, ArgTy);
9581 Args.emplace_back(Size, SizeTy);
9582
9583 RTLIB::Libcall LibraryCall =
9585 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
9586 if (LibcallImpl == RTLIB::Unsupported)
9587 report_fatal_error("Unsupported element size");
9588
9590 CLI.setDebugLoc(dl)
9591 .setChain(Chain)
9592 .setLibCallee(
9593 Libcalls->getLibcallImplCallingConv(LibcallImpl),
9595 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
9596 std::move(Args))
9598 .setTailCall(isTailCall);
9599
9600 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
9601 return CallResult.second;
9602}
9603
9605 SDValue Src, SDValue Size, Align Alignment,
9606 bool isVol, const CallInst *CI,
9607 std::optional<bool> OverrideTailCall,
9608 MachinePointerInfo DstPtrInfo,
9609 MachinePointerInfo SrcPtrInfo,
9610 const AAMDNodes &AAInfo,
9611 BatchAAResults *BatchAA) {
9612 // Check to see if we should lower the memmove to loads and stores first.
9613 // For cases within the target-specified limits, this is the best choice.
9615 if (ConstantSize) {
9616 // Memmove with size zero? Just return the original chain.
9617 if (ConstantSize->isZero())
9618 return Chain;
9619
9621 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
9622 isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo);
9623 if (Result.getNode())
9624 return Result;
9625 }
9626
9627 // Then check to see if we should lower the memmove with target-specific
9628 // code. If the target chooses to do this, this is the next best.
9629 if (TSI) {
9630 SDValue Result =
9631 TSI->EmitTargetCodeForMemmove(*this, dl, Chain, Dst, Src, Size,
9632 Alignment, isVol, DstPtrInfo, SrcPtrInfo);
9633 if (Result.getNode())
9634 return Result;
9635 }
9636
9639
9640 // FIXME: If the memmove is volatile, lowering it to plain libc memmove may
9641 // not be safe. See memcpy above for more details.
9642
9643 // Emit a library call.
9646 Args.emplace_back(Dst, PtrTy);
9647 Args.emplace_back(Src, PtrTy);
9648 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
9649 // FIXME: pass in SDLoc
9651
9652 RTLIB::LibcallImpl MemmoveImpl = Libcalls->getLibcallImpl(RTLIB::MEMMOVE);
9653
9654 bool IsTailCall = false;
9655 if (OverrideTailCall.has_value()) {
9656 IsTailCall = *OverrideTailCall;
9657 } else {
9658 bool LowersToMemmove = MemmoveImpl == RTLIB::impl_memmove;
9659 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemmove);
9660 }
9661
9662 CLI.setDebugLoc(dl)
9663 .setChain(Chain)
9664 .setLibCallee(
9665 Libcalls->getLibcallImplCallingConv(MemmoveImpl),
9666 Dst.getValueType().getTypeForEVT(*getContext()),
9667 getExternalSymbol(MemmoveImpl, TLI->getPointerTy(getDataLayout())),
9668 std::move(Args))
9670 .setTailCall(IsTailCall);
9671
9672 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
9673 return CallResult.second;
9674}
9675
9677 SDValue Dst, SDValue Src, SDValue Size,
9678 Type *SizeTy, unsigned ElemSz,
9679 bool isTailCall,
9680 MachinePointerInfo DstPtrInfo,
9681 MachinePointerInfo SrcPtrInfo) {
9682 // Emit a library call.
9684 Type *IntPtrTy = getDataLayout().getIntPtrType(*getContext());
9685 Args.emplace_back(Dst, IntPtrTy);
9686 Args.emplace_back(Src, IntPtrTy);
9687 Args.emplace_back(Size, SizeTy);
9688
9689 RTLIB::Libcall LibraryCall =
9691 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
9692 if (LibcallImpl == RTLIB::Unsupported)
9693 report_fatal_error("Unsupported element size");
9694
9696 CLI.setDebugLoc(dl)
9697 .setChain(Chain)
9698 .setLibCallee(
9699 Libcalls->getLibcallImplCallingConv(LibcallImpl),
9701 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
9702 std::move(Args))
9704 .setTailCall(isTailCall);
9705
9706 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
9707 return CallResult.second;
9708}
9709
9711 SDValue Src, SDValue Size, Align Alignment,
9712 bool isVol, bool AlwaysInline,
9713 const CallInst *CI,
9714 MachinePointerInfo DstPtrInfo,
9715 const AAMDNodes &AAInfo) {
9716 // Check to see if we should lower the memset to stores first.
9717 // For cases within the target-specified limits, this is the best choice.
9719 if (ConstantSize) {
9720 // Memset with size zero? Just return the original chain.
9721 if (ConstantSize->isZero())
9722 return Chain;
9723
9724 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
9725 ConstantSize->getZExtValue(), Alignment,
9726 isVol, false, DstPtrInfo, AAInfo);
9727
9728 if (Result.getNode())
9729 return Result;
9730 }
9731
9732 // Then check to see if we should lower the memset with target-specific
9733 // code. If the target chooses to do this, this is the next best.
9734 if (TSI) {
9735 SDValue Result = TSI->EmitTargetCodeForMemset(
9736 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline, DstPtrInfo);
9737 if (Result.getNode())
9738 return Result;
9739 }
9740
9741 // If we really need inline code and the target declined to provide it,
9742 // use a (potentially long) sequence of loads and stores.
9743 if (AlwaysInline) {
9744 assert(ConstantSize && "AlwaysInline requires a constant size!");
9745 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
9746 ConstantSize->getZExtValue(), Alignment,
9747 isVol, true, DstPtrInfo, AAInfo);
9748 assert(Result &&
9749 "getMemsetStores must return a valid sequence when AlwaysInline");
9750 return Result;
9751 }
9752
9754
9755 // Emit a library call.
9756 auto &Ctx = *getContext();
9757 const auto& DL = getDataLayout();
9758
9760 // FIXME: pass in SDLoc
9761 CLI.setDebugLoc(dl).setChain(Chain);
9762
9763 RTLIB::LibcallImpl BzeroImpl = Libcalls->getLibcallImpl(RTLIB::BZERO);
9764 bool UseBZero = BzeroImpl != RTLIB::Unsupported && isNullConstant(Src);
9765
9766 // If zeroing out and bzero is present, use it.
9767 if (UseBZero) {
9769 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
9770 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
9771 CLI.setLibCallee(
9772 Libcalls->getLibcallImplCallingConv(BzeroImpl), Type::getVoidTy(Ctx),
9773 getExternalSymbol(BzeroImpl, TLI->getPointerTy(DL)), std::move(Args));
9774 } else {
9775 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
9776
9778 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
9779 Args.emplace_back(Src, Src.getValueType().getTypeForEVT(Ctx));
9780 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
9781 CLI.setLibCallee(Libcalls->getLibcallImplCallingConv(MemsetImpl),
9782 Dst.getValueType().getTypeForEVT(Ctx),
9783 getExternalSymbol(MemsetImpl, TLI->getPointerTy(DL)),
9784 std::move(Args));
9785 }
9786
9787 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
9788 bool LowersToMemset = MemsetImpl == RTLIB::impl_memset;
9789
9790 // If we're going to use bzero, make sure not to tail call unless the
9791 // subsequent return doesn't need a value, as bzero doesn't return the first
9792 // arg unlike memset.
9793 bool ReturnsFirstArg = CI && funcReturnsFirstArgOfCall(*CI) && !UseBZero;
9794 bool IsTailCall =
9795 CI && CI->isTailCall() &&
9796 isInTailCallPosition(*CI, getTarget(), ReturnsFirstArg && LowersToMemset);
9797 CLI.setDiscardResult().setTailCall(IsTailCall);
9798
9799 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
9800 return CallResult.second;
9801}
9802
9805 Type *SizeTy, unsigned ElemSz,
9806 bool isTailCall,
9807 MachinePointerInfo DstPtrInfo) {
9808 // Emit a library call.
9810 Args.emplace_back(Dst, getDataLayout().getIntPtrType(*getContext()));
9811 Args.emplace_back(Value, Type::getInt8Ty(*getContext()));
9812 Args.emplace_back(Size, SizeTy);
9813
9814 RTLIB::Libcall LibraryCall =
9816 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
9817 if (LibcallImpl == RTLIB::Unsupported)
9818 report_fatal_error("Unsupported element size");
9819
9821 CLI.setDebugLoc(dl)
9822 .setChain(Chain)
9823 .setLibCallee(
9824 Libcalls->getLibcallImplCallingConv(LibcallImpl),
9826 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
9827 std::move(Args))
9829 .setTailCall(isTailCall);
9830
9831 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
9832 return CallResult.second;
9833}
9834
9835SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
9837 MachineMemOperand *MMO,
9838 ISD::LoadExtType ExtType) {
9840 AddNodeIDNode(ID, Opcode, VTList, Ops);
9841 ID.AddInteger(MemVT.getRawBits());
9842 ID.AddInteger(getSyntheticNodeSubclassData<AtomicSDNode>(
9843 dl.getIROrder(), Opcode, VTList, MemVT, MMO, ExtType));
9844 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9845 ID.AddInteger(MMO->getFlags());
9846 void* IP = nullptr;
9847 if (auto *E = cast_or_null<AtomicSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
9848 E->refineAlignment(MMO);
9849 E->refineRanges(MMO);
9850 return SDValue(E, 0);
9851 }
9852
9853 auto *N = newSDNode<AtomicSDNode>(dl.getIROrder(), dl.getDebugLoc(), Opcode,
9854 VTList, MemVT, MMO, ExtType);
9855 createOperands(N, Ops);
9856
9857 CSEMap.InsertNode(N, IP);
9858 InsertNode(N);
9859 SDValue V(N, 0);
9860 NewSDValueDbgMsg(V, "Creating new node: ", this);
9861 return V;
9862}
9863
9865 EVT MemVT, SDVTList VTs, SDValue Chain,
9866 SDValue Ptr, SDValue Cmp, SDValue Swp,
9867 MachineMemOperand *MMO) {
9868 assert(Opcode == ISD::ATOMIC_CMP_SWAP ||
9870 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types");
9871
9872 SDValue Ops[] = {Chain, Ptr, Cmp, Swp};
9873 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
9874}
9875
9876SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
9877 SDValue Chain, SDValue Ptr, SDValue Val,
9878 MachineMemOperand *MMO) {
9879 assert((Opcode == ISD::ATOMIC_LOAD_ADD || Opcode == ISD::ATOMIC_LOAD_SUB ||
9880 Opcode == ISD::ATOMIC_LOAD_AND || Opcode == ISD::ATOMIC_LOAD_CLR ||
9881 Opcode == ISD::ATOMIC_LOAD_OR || Opcode == ISD::ATOMIC_LOAD_XOR ||
9882 Opcode == ISD::ATOMIC_LOAD_NAND || Opcode == ISD::ATOMIC_LOAD_MIN ||
9883 Opcode == ISD::ATOMIC_LOAD_MAX || Opcode == ISD::ATOMIC_LOAD_UMIN ||
9884 Opcode == ISD::ATOMIC_LOAD_UMAX || Opcode == ISD::ATOMIC_LOAD_FADD ||
9885 Opcode == ISD::ATOMIC_LOAD_FSUB || Opcode == ISD::ATOMIC_LOAD_FMAX ||
9886 Opcode == ISD::ATOMIC_LOAD_FMIN ||
9887 Opcode == ISD::ATOMIC_LOAD_FMINIMUM ||
9888 Opcode == ISD::ATOMIC_LOAD_FMAXIMUM ||
9889 Opcode == ISD::ATOMIC_LOAD_UINC_WRAP ||
9890 Opcode == ISD::ATOMIC_LOAD_UDEC_WRAP ||
9891 Opcode == ISD::ATOMIC_LOAD_USUB_COND ||
9892 Opcode == ISD::ATOMIC_LOAD_USUB_SAT || Opcode == ISD::ATOMIC_SWAP ||
9893 Opcode == ISD::ATOMIC_STORE) &&
9894 "Invalid Atomic Op");
9895
9896 EVT VT = Val.getValueType();
9897
9898 SDVTList VTs = Opcode == ISD::ATOMIC_STORE ? getVTList(MVT::Other) :
9899 getVTList(VT, MVT::Other);
9900 SDValue Ops[] = {Chain, Ptr, Val};
9901 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
9902}
9903
9905 EVT MemVT, EVT VT, SDValue Chain,
9906 SDValue Ptr, MachineMemOperand *MMO) {
9907 SDVTList VTs = getVTList(VT, MVT::Other);
9908 SDValue Ops[] = {Chain, Ptr};
9909 return getAtomic(ISD::ATOMIC_LOAD, dl, MemVT, VTs, Ops, MMO, ExtType);
9910}
9911
9912/// getMergeValues - Create a MERGE_VALUES node from the given operands.
9914 if (Ops.size() == 1)
9915 return Ops[0];
9916
9918 VTs.reserve(Ops.size());
9919 for (const SDValue &Op : Ops)
9920 VTs.push_back(Op.getValueType());
9921 return getNode(ISD::MERGE_VALUES, dl, getVTList(VTs), Ops);
9922}
9923
9925 unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef<SDValue> Ops,
9926 EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment,
9928 const AAMDNodes &AAInfo) {
9929 if (Size.hasValue() && !Size.getValue())
9931
9933 MachineMemOperand *MMO =
9934 MF.getMachineMemOperand(PtrInfo, Flags, Size, Alignment, AAInfo);
9935
9936 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, MMO);
9937}
9938
9940 SDVTList VTList,
9941 ArrayRef<SDValue> Ops, EVT MemVT,
9942 MachineMemOperand *MMO) {
9943 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, ArrayRef(MMO));
9944}
9945
9947 SDVTList VTList,
9948 ArrayRef<SDValue> Ops, EVT MemVT,
9950 assert(!MMOs.empty() && "Must have at least one MMO");
9951 assert(
9952 (Opcode == ISD::INTRINSIC_VOID || Opcode == ISD::INTRINSIC_W_CHAIN ||
9953 Opcode == ISD::PREFETCH ||
9954 (Opcode <= (unsigned)std::numeric_limits<int>::max() &&
9955 Opcode >= ISD::BUILTIN_OP_END && TSI->isTargetMemoryOpcode(Opcode))) &&
9956 "Opcode is not a memory-accessing opcode!");
9957
9959 if (MMOs.size() == 1) {
9960 MemRefs = MMOs[0];
9961 } else {
9962 // Allocate: [size_t count][MMO*][MMO*]...
9963 size_t AllocSize =
9964 sizeof(size_t) + MMOs.size() * sizeof(MachineMemOperand *);
9965 void *Buffer = Allocator.Allocate(AllocSize, alignof(size_t));
9966 size_t *CountPtr = static_cast<size_t *>(Buffer);
9967 *CountPtr = MMOs.size();
9968 MachineMemOperand **Array =
9969 reinterpret_cast<MachineMemOperand **>(CountPtr + 1);
9970 llvm::copy(MMOs, Array);
9971 MemRefs = Array;
9972 }
9973
9974 // Memoize the node unless it returns a glue result.
9976 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
9978 AddNodeIDNode(ID, Opcode, VTList, Ops);
9979 ID.AddInteger(getSyntheticNodeSubclassData<MemIntrinsicSDNode>(
9980 Opcode, dl.getIROrder(), VTList, MemVT, MemRefs));
9981 ID.AddInteger(MemVT.getRawBits());
9982 for (const MachineMemOperand *MMO : MMOs) {
9983 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9984 ID.AddInteger(MMO->getFlags());
9985 }
9986 void *IP = nullptr;
9987 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
9988 cast<MemIntrinsicSDNode>(E)->refineAlignment(MMOs);
9989 return SDValue(E, 0);
9990 }
9991
9992 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
9993 VTList, MemVT, MemRefs);
9994 createOperands(N, Ops);
9995 CSEMap.InsertNode(N, IP);
9996 } else {
9997 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
9998 VTList, MemVT, MemRefs);
9999 createOperands(N, Ops);
10000 }
10001 InsertNode(N);
10002 SDValue V(N, 0);
10003 NewSDValueDbgMsg(V, "Creating new node: ", this);
10004 return V;
10005}
10006
10008 SDValue Chain, int FrameIndex) {
10009 const unsigned Opcode = IsStart ? ISD::LIFETIME_START : ISD::LIFETIME_END;
10010 const auto VTs = getVTList(MVT::Other);
10011 SDValue Ops[2] = {
10012 Chain,
10013 getFrameIndex(FrameIndex,
10014 getTargetLoweringInfo().getFrameIndexTy(getDataLayout()),
10015 true)};
10016
10018 AddNodeIDNode(ID, Opcode, VTs, Ops);
10019 ID.AddInteger(FrameIndex);
10020 void *IP = nullptr;
10021 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
10022 return SDValue(E, 0);
10023
10024 LifetimeSDNode *N =
10025 newSDNode<LifetimeSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), VTs);
10026 createOperands(N, Ops);
10027 CSEMap.InsertNode(N, IP);
10028 InsertNode(N);
10029 SDValue V(N, 0);
10030 NewSDValueDbgMsg(V, "Creating new node: ", this);
10031 return V;
10032}
10033
10035 uint64_t Guid, uint64_t Index,
10036 uint32_t Attr) {
10037 const unsigned Opcode = ISD::PSEUDO_PROBE;
10038 const auto VTs = getVTList(MVT::Other);
10039 SDValue Ops[] = {Chain};
10041 AddNodeIDNode(ID, Opcode, VTs, Ops);
10042 ID.AddInteger(Guid);
10043 ID.AddInteger(Index);
10044 void *IP = nullptr;
10045 if (SDNode *E = FindNodeOrInsertPos(ID, Dl, IP))
10046 return SDValue(E, 0);
10047
10048 auto *N = newSDNode<PseudoProbeSDNode>(
10049 Opcode, Dl.getIROrder(), Dl.getDebugLoc(), VTs, Guid, Index, Attr);
10050 createOperands(N, Ops);
10051 CSEMap.InsertNode(N, IP);
10052 InsertNode(N);
10053 SDValue V(N, 0);
10054 NewSDValueDbgMsg(V, "Creating new node: ", this);
10055 return V;
10056}
10057
10058/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10059/// MachinePointerInfo record from it. This is particularly useful because the
10060/// code generator has many cases where it doesn't bother passing in a
10061/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10063 SelectionDAG &DAG, SDValue Ptr,
10064 int64_t Offset = 0) {
10065 // If this is FI+Offset, we can model it.
10066 if (const FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr))
10068 FI->getIndex(), Offset);
10069
10070 // If this is (FI+Offset1)+Offset2, we can model it.
10071 if (Ptr.getOpcode() != ISD::ADD ||
10074 return Info;
10075
10076 int FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
10078 DAG.getMachineFunction(), FI,
10079 Offset + cast<ConstantSDNode>(Ptr.getOperand(1))->getSExtValue());
10080}
10081
10082/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10083/// MachinePointerInfo record from it. This is particularly useful because the
10084/// code generator has many cases where it doesn't bother passing in a
10085/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10087 SelectionDAG &DAG, SDValue Ptr,
10088 SDValue OffsetOp) {
10089 // If the 'Offset' value isn't a constant, we can't handle this.
10091 return InferPointerInfo(Info, DAG, Ptr, OffsetNode->getSExtValue());
10092 if (OffsetOp.isUndef())
10093 return InferPointerInfo(Info, DAG, Ptr);
10094 return Info;
10095}
10096
10098 EVT VT, const SDLoc &dl, SDValue Chain,
10099 SDValue Ptr, SDValue Offset,
10100 MachinePointerInfo PtrInfo, EVT MemVT,
10101 Align Alignment,
10102 MachineMemOperand::Flags MMOFlags,
10103 const AAMDNodes &AAInfo, const MDNode *Ranges) {
10104 assert(Chain.getValueType() == MVT::Other &&
10105 "Invalid chain type");
10106
10107 MMOFlags |= MachineMemOperand::MOLoad;
10108 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10109 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10110 // clients.
10111 if (PtrInfo.V.isNull())
10112 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10113
10114 TypeSize Size = MemVT.getStoreSize();
10116 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
10117 Alignment, AAInfo, Ranges);
10118 return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO);
10119}
10120
10122 EVT VT, const SDLoc &dl, SDValue Chain,
10123 SDValue Ptr, SDValue Offset, EVT MemVT,
10124 MachineMemOperand *MMO) {
10125 if (VT == MemVT) {
10126 ExtType = ISD::NON_EXTLOAD;
10127 } else if (ExtType == ISD::NON_EXTLOAD) {
10128 assert(VT == MemVT && "Non-extending load from different memory type!");
10129 } else {
10130 // Extending load.
10131 assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) &&
10132 "Should only be an extending load, not truncating!");
10133 assert(VT.isInteger() == MemVT.isInteger() &&
10134 "Cannot convert from FP to Int or Int -> FP!");
10135 assert(VT.isVector() == MemVT.isVector() &&
10136 "Cannot use an ext load to convert to or from a vector!");
10137 assert((!VT.isVector() ||
10139 "Cannot use an ext load to change the number of vector elements!");
10140 }
10141
10142 assert((!MMO->getRanges() ||
10144 ->getBitWidth() == MemVT.getScalarSizeInBits() &&
10145 MemVT.isInteger())) &&
10146 "Range metadata and load type must match!");
10147
10148 bool Indexed = AM != ISD::UNINDEXED;
10149 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10150
10151 SDVTList VTs = Indexed ?
10152 getVTList(VT, Ptr.getValueType(), MVT::Other) : getVTList(VT, MVT::Other);
10153 SDValue Ops[] = { Chain, Ptr, Offset };
10155 AddNodeIDNode(ID, ISD::LOAD, VTs, Ops);
10156 ID.AddInteger(MemVT.getRawBits());
10157 ID.AddInteger(getSyntheticNodeSubclassData<LoadSDNode>(
10158 dl.getIROrder(), VTs, AM, ExtType, MemVT, MMO));
10159 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10160 ID.AddInteger(MMO->getFlags());
10161 void *IP = nullptr;
10162 if (auto *E = cast_or_null<LoadSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10163 E->refineAlignment(MMO);
10164 E->refineRanges(MMO);
10165 return SDValue(E, 0);
10166 }
10167 auto *N = newSDNode<LoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10168 ExtType, MemVT, MMO);
10169 createOperands(N, Ops);
10170
10171 CSEMap.InsertNode(N, IP);
10172 InsertNode(N);
10173 SDValue V(N, 0);
10174 NewSDValueDbgMsg(V, "Creating new node: ", this);
10175 return V;
10176}
10177
10179 SDValue Ptr, MachinePointerInfo PtrInfo,
10180 MaybeAlign Alignment,
10181 MachineMemOperand::Flags MMOFlags,
10182 const AAMDNodes &AAInfo, const MDNode *Ranges) {
10184 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10185 PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges);
10186}
10187
10189 SDValue Ptr, MachineMemOperand *MMO) {
10191 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10192 VT, MMO);
10193}
10194
10196 EVT VT, SDValue Chain, SDValue Ptr,
10197 MachinePointerInfo PtrInfo, EVT MemVT,
10198 MaybeAlign Alignment,
10199 MachineMemOperand::Flags MMOFlags,
10200 const AAMDNodes &AAInfo) {
10202 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, PtrInfo,
10203 MemVT, Alignment, MMOFlags, AAInfo);
10204}
10205
10207 EVT VT, SDValue Chain, SDValue Ptr, EVT MemVT,
10208 MachineMemOperand *MMO) {
10210 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef,
10211 MemVT, MMO);
10212}
10213
10217 LoadSDNode *LD = cast<LoadSDNode>(OrigLoad);
10218 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
10219 // Don't propagate the invariant or dereferenceable flags.
10220 auto MMOFlags =
10221 LD->getMemOperand()->getFlags() &
10223 return getLoad(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
10224 LD->getChain(), Base, Offset, LD->getPointerInfo(),
10225 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo());
10226}
10227
10229 SDValue Ptr, MachinePointerInfo PtrInfo,
10230 Align Alignment,
10231 MachineMemOperand::Flags MMOFlags,
10232 const AAMDNodes &AAInfo) {
10233 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10234
10235 MMOFlags |= MachineMemOperand::MOStore;
10236 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10237
10238 if (PtrInfo.V.isNull())
10239 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10240
10243 MachineMemOperand *MMO =
10244 MF.getMachineMemOperand(PtrInfo, MMOFlags, Size, Alignment, AAInfo);
10245 return getStore(Chain, dl, Val, Ptr, MMO);
10246}
10247
10249 SDValue Ptr, MachineMemOperand *MMO) {
10251 return getStore(Chain, dl, Val, Ptr, Undef, Val.getValueType(), MMO,
10253}
10254
10256 SDValue Ptr, SDValue Offset, EVT SVT,
10258 bool IsTruncating) {
10259 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10260 EVT VT = Val.getValueType();
10261 if (VT == SVT) {
10262 IsTruncating = false;
10263 } else if (!IsTruncating) {
10264 assert(VT == SVT && "No-truncating store from different memory type!");
10265 } else {
10267 "Should only be a truncating store, not extending!");
10268 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
10269 assert(VT.isVector() == SVT.isVector() &&
10270 "Cannot use trunc store to convert to or from a vector!");
10271 assert((!VT.isVector() ||
10273 "Cannot use trunc store to change the number of vector elements!");
10274 }
10275
10276 bool Indexed = AM != ISD::UNINDEXED;
10277 assert((Indexed || Offset.isUndef()) && "Unindexed store with an offset!");
10278 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10279 : getVTList(MVT::Other);
10280 SDValue Ops[] = {Chain, Val, Ptr, Offset};
10283 ID.AddInteger(SVT.getRawBits());
10284 ID.AddInteger(getSyntheticNodeSubclassData<StoreSDNode>(
10285 dl.getIROrder(), VTs, AM, IsTruncating, SVT, MMO));
10286 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10287 ID.AddInteger(MMO->getFlags());
10288 void *IP = nullptr;
10289 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10290 cast<StoreSDNode>(E)->refineAlignment(MMO);
10291 return SDValue(E, 0);
10292 }
10293 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10294 IsTruncating, SVT, MMO);
10295 createOperands(N, Ops);
10296
10297 CSEMap.InsertNode(N, IP);
10298 InsertNode(N);
10299 SDValue V(N, 0);
10300 NewSDValueDbgMsg(V, "Creating new node: ", this);
10301 return V;
10302}
10303
10305 SDValue Ptr, MachinePointerInfo PtrInfo,
10306 EVT SVT, Align Alignment,
10307 MachineMemOperand::Flags MMOFlags,
10308 const AAMDNodes &AAInfo) {
10309 assert(Chain.getValueType() == MVT::Other &&
10310 "Invalid chain type");
10311
10312 MMOFlags |= MachineMemOperand::MOStore;
10313 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10314
10315 if (PtrInfo.V.isNull())
10316 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10317
10319 MachineMemOperand *MMO = MF.getMachineMemOperand(
10320 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
10321 return getTruncStore(Chain, dl, Val, Ptr, SVT, MMO);
10322}
10323
10325 SDValue Ptr, EVT SVT,
10326 MachineMemOperand *MMO) {
10328 return getStore(Chain, dl, Val, Ptr, Undef, SVT, MMO, ISD::UNINDEXED, true);
10329}
10330
10334 StoreSDNode *ST = cast<StoreSDNode>(OrigStore);
10335 assert(ST->getOffset().isUndef() && "Store is already a indexed store!");
10336 return getStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
10337 ST->getMemoryVT(), ST->getMemOperand(), AM,
10338 ST->isTruncatingStore());
10339}
10340
10342 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl,
10343 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL,
10344 MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment,
10345 MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo,
10346 const MDNode *Ranges, bool IsExpanding) {
10347 MMOFlags |= MachineMemOperand::MOLoad;
10348 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10349 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10350 // clients.
10351 if (PtrInfo.V.isNull())
10352 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10353
10354 TypeSize Size = MemVT.getStoreSize();
10356 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
10357 Alignment, AAInfo, Ranges);
10358 return getLoadVP(AM, ExtType, VT, dl, Chain, Ptr, Offset, Mask, EVL, MemVT,
10359 MMO, IsExpanding);
10360}
10361
10363 ISD::LoadExtType ExtType, EVT VT,
10364 const SDLoc &dl, SDValue Chain, SDValue Ptr,
10365 SDValue Offset, SDValue Mask, SDValue EVL,
10366 EVT MemVT, MachineMemOperand *MMO,
10367 bool IsExpanding) {
10368 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10369 assert(Mask.getValueType().getVectorElementCount() ==
10370 VT.getVectorElementCount() &&
10371 "Vector width mismatch between mask and data");
10372
10373 bool Indexed = AM != ISD::UNINDEXED;
10374 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10375
10376 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
10377 : getVTList(VT, MVT::Other);
10378 SDValue Ops[] = {Chain, Ptr, Offset, Mask, EVL};
10380 AddNodeIDNode(ID, ISD::VP_LOAD, VTs, Ops);
10381 ID.AddInteger(MemVT.getRawBits());
10382 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadSDNode>(
10383 dl.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
10384 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10385 ID.AddInteger(MMO->getFlags());
10386 void *IP = nullptr;
10387 if (auto *E = cast_or_null<VPLoadSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10388 E->refineAlignment(MMO);
10389 E->refineRanges(MMO);
10390 return SDValue(E, 0);
10391 }
10392 auto *N = newSDNode<VPLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10393 ExtType, IsExpanding, MemVT, MMO);
10394 createOperands(N, Ops);
10395
10396 CSEMap.InsertNode(N, IP);
10397 InsertNode(N);
10398 SDValue V(N, 0);
10399 NewSDValueDbgMsg(V, "Creating new node: ", this);
10400 return V;
10401}
10402
10404 SDValue Ptr, SDValue Mask, SDValue EVL,
10405 MachinePointerInfo PtrInfo,
10406 MaybeAlign Alignment,
10407 MachineMemOperand::Flags MMOFlags,
10408 const AAMDNodes &AAInfo, const MDNode *Ranges,
10409 bool IsExpanding) {
10411 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10412 Mask, EVL, PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges,
10413 IsExpanding);
10414}
10415
10417 SDValue Ptr, SDValue Mask, SDValue EVL,
10418 MachineMemOperand *MMO, bool IsExpanding) {
10420 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10421 Mask, EVL, VT, MMO, IsExpanding);
10422}
10423
10425 EVT VT, SDValue Chain, SDValue Ptr,
10426 SDValue Mask, SDValue EVL,
10427 MachinePointerInfo PtrInfo, EVT MemVT,
10428 MaybeAlign Alignment,
10429 MachineMemOperand::Flags MMOFlags,
10430 const AAMDNodes &AAInfo, bool IsExpanding) {
10432 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
10433 EVL, PtrInfo, MemVT, Alignment, MMOFlags, AAInfo, nullptr,
10434 IsExpanding);
10435}
10436
10438 EVT VT, SDValue Chain, SDValue Ptr,
10439 SDValue Mask, SDValue EVL, EVT MemVT,
10440 MachineMemOperand *MMO, bool IsExpanding) {
10442 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
10443 EVL, MemVT, MMO, IsExpanding);
10444}
10445
10449 auto *LD = cast<VPLoadSDNode>(OrigLoad);
10450 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
10451 // Don't propagate the invariant or dereferenceable flags.
10452 auto MMOFlags =
10453 LD->getMemOperand()->getFlags() &
10455 return getLoadVP(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
10456 LD->getChain(), Base, Offset, LD->getMask(),
10457 LD->getVectorLength(), LD->getPointerInfo(),
10458 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo(),
10459 nullptr, LD->isExpandingLoad());
10460}
10461
10463 SDValue Ptr, SDValue Offset, SDValue Mask,
10464 SDValue EVL, EVT MemVT, MachineMemOperand *MMO,
10465 ISD::MemIndexedMode AM, bool IsTruncating,
10466 bool IsCompressing) {
10467 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10468 assert(Mask.getValueType().getVectorElementCount() ==
10470 "Vector width mismatch between mask and data");
10471
10472 bool Indexed = AM != ISD::UNINDEXED;
10473 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
10474 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10475 : getVTList(MVT::Other);
10476 SDValue Ops[] = {Chain, Val, Ptr, Offset, Mask, EVL};
10478 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
10479 ID.AddInteger(MemVT.getRawBits());
10480 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
10481 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
10482 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10483 ID.AddInteger(MMO->getFlags());
10484 void *IP = nullptr;
10485 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10486 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
10487 return SDValue(E, 0);
10488 }
10489 auto *N = newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10490 IsTruncating, IsCompressing, MemVT, MMO);
10491 createOperands(N, Ops);
10492
10493 CSEMap.InsertNode(N, IP);
10494 InsertNode(N);
10495 SDValue V(N, 0);
10496 NewSDValueDbgMsg(V, "Creating new node: ", this);
10497 return V;
10498}
10499
10501 SDValue Val, SDValue Ptr, SDValue Mask,
10502 SDValue EVL, MachinePointerInfo PtrInfo,
10503 EVT SVT, Align Alignment,
10504 MachineMemOperand::Flags MMOFlags,
10505 const AAMDNodes &AAInfo,
10506 bool IsCompressing) {
10507 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10508
10509 MMOFlags |= MachineMemOperand::MOStore;
10510 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10511
10512 if (PtrInfo.V.isNull())
10513 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10514
10516 MachineMemOperand *MMO = MF.getMachineMemOperand(
10517 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
10518 return getTruncStoreVP(Chain, dl, Val, Ptr, Mask, EVL, SVT, MMO,
10519 IsCompressing);
10520}
10521
10523 SDValue Val, SDValue Ptr, SDValue Mask,
10524 SDValue EVL, EVT SVT,
10525 MachineMemOperand *MMO,
10526 bool IsCompressing) {
10527 EVT VT = Val.getValueType();
10528
10529 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10530 if (VT == SVT)
10531 return getStoreVP(Chain, dl, Val, Ptr, getUNDEF(Ptr.getValueType()), Mask,
10532 EVL, VT, MMO, ISD::UNINDEXED,
10533 /*IsTruncating*/ false, IsCompressing);
10534
10536 "Should only be a truncating store, not extending!");
10537 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
10538 assert(VT.isVector() == SVT.isVector() &&
10539 "Cannot use trunc store to convert to or from a vector!");
10540 assert((!VT.isVector() ||
10542 "Cannot use trunc store to change the number of vector elements!");
10543
10544 SDVTList VTs = getVTList(MVT::Other);
10546 SDValue Ops[] = {Chain, Val, Ptr, Undef, Mask, EVL};
10548 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
10549 ID.AddInteger(SVT.getRawBits());
10550 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
10551 dl.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
10552 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10553 ID.AddInteger(MMO->getFlags());
10554 void *IP = nullptr;
10555 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10556 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
10557 return SDValue(E, 0);
10558 }
10559 auto *N =
10560 newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
10561 ISD::UNINDEXED, true, IsCompressing, SVT, MMO);
10562 createOperands(N, Ops);
10563
10564 CSEMap.InsertNode(N, IP);
10565 InsertNode(N);
10566 SDValue V(N, 0);
10567 NewSDValueDbgMsg(V, "Creating new node: ", this);
10568 return V;
10569}
10570
10574 auto *ST = cast<VPStoreSDNode>(OrigStore);
10575 assert(ST->getOffset().isUndef() && "Store is already an indexed store!");
10576 SDVTList VTs = getVTList(Base.getValueType(), MVT::Other);
10577 SDValue Ops[] = {ST->getChain(), ST->getValue(), Base,
10578 Offset, ST->getMask(), ST->getVectorLength()};
10580 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
10581 ID.AddInteger(ST->getMemoryVT().getRawBits());
10582 ID.AddInteger(ST->getRawSubclassData());
10583 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
10584 ID.AddInteger(ST->getMemOperand()->getFlags());
10585 void *IP = nullptr;
10586 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
10587 return SDValue(E, 0);
10588
10589 auto *N = newSDNode<VPStoreSDNode>(
10590 dl.getIROrder(), dl.getDebugLoc(), VTs, AM, ST->isTruncatingStore(),
10591 ST->isCompressingStore(), ST->getMemoryVT(), ST->getMemOperand());
10592 createOperands(N, Ops);
10593
10594 CSEMap.InsertNode(N, IP);
10595 InsertNode(N);
10596 SDValue V(N, 0);
10597 NewSDValueDbgMsg(V, "Creating new node: ", this);
10598 return V;
10599}
10600
10602 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL,
10603 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask,
10604 SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding) {
10605 bool Indexed = AM != ISD::UNINDEXED;
10606 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10607
10608 SDValue Ops[] = {Chain, Ptr, Offset, Stride, Mask, EVL};
10609 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
10610 : getVTList(VT, MVT::Other);
10612 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_LOAD, VTs, Ops);
10613 ID.AddInteger(VT.getRawBits());
10614 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedLoadSDNode>(
10615 DL.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
10616 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10617
10618 void *IP = nullptr;
10619 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
10620 cast<VPStridedLoadSDNode>(E)->refineAlignment(MMO);
10621 return SDValue(E, 0);
10622 }
10623
10624 auto *N =
10625 newSDNode<VPStridedLoadSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, AM,
10626 ExtType, IsExpanding, MemVT, MMO);
10627 createOperands(N, Ops);
10628 CSEMap.InsertNode(N, IP);
10629 InsertNode(N);
10630 SDValue V(N, 0);
10631 NewSDValueDbgMsg(V, "Creating new node: ", this);
10632 return V;
10633}
10634
10636 SDValue Ptr, SDValue Stride,
10637 SDValue Mask, SDValue EVL,
10638 MachineMemOperand *MMO,
10639 bool IsExpanding) {
10641 return getStridedLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, DL, Chain, Ptr,
10642 Undef, Stride, Mask, EVL, VT, MMO, IsExpanding);
10643}
10644
10646 ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain,
10647 SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT,
10648 MachineMemOperand *MMO, bool IsExpanding) {
10650 return getStridedLoadVP(ISD::UNINDEXED, ExtType, VT, DL, Chain, Ptr, Undef,
10651 Stride, Mask, EVL, MemVT, MMO, IsExpanding);
10652}
10653
10655 SDValue Val, SDValue Ptr,
10656 SDValue Offset, SDValue Stride,
10657 SDValue Mask, SDValue EVL, EVT MemVT,
10658 MachineMemOperand *MMO,
10660 bool IsTruncating, bool IsCompressing) {
10661 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10662 bool Indexed = AM != ISD::UNINDEXED;
10663 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
10664 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10665 : getVTList(MVT::Other);
10666 SDValue Ops[] = {Chain, Val, Ptr, Offset, Stride, Mask, EVL};
10668 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
10669 ID.AddInteger(MemVT.getRawBits());
10670 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
10671 DL.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
10672 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10673 void *IP = nullptr;
10674 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
10675 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
10676 return SDValue(E, 0);
10677 }
10678 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
10679 VTs, AM, IsTruncating,
10680 IsCompressing, MemVT, MMO);
10681 createOperands(N, Ops);
10682
10683 CSEMap.InsertNode(N, IP);
10684 InsertNode(N);
10685 SDValue V(N, 0);
10686 NewSDValueDbgMsg(V, "Creating new node: ", this);
10687 return V;
10688}
10689
10691 SDValue Val, SDValue Ptr,
10692 SDValue Stride, SDValue Mask,
10693 SDValue EVL, EVT SVT,
10694 MachineMemOperand *MMO,
10695 bool IsCompressing) {
10696 EVT VT = Val.getValueType();
10697
10698 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10699 if (VT == SVT)
10700 return getStridedStoreVP(Chain, DL, Val, Ptr, getUNDEF(Ptr.getValueType()),
10701 Stride, Mask, EVL, VT, MMO, ISD::UNINDEXED,
10702 /*IsTruncating*/ false, IsCompressing);
10703
10705 "Should only be a truncating store, not extending!");
10706 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
10707 assert(VT.isVector() == SVT.isVector() &&
10708 "Cannot use trunc store to convert to or from a vector!");
10709 assert((!VT.isVector() ||
10711 "Cannot use trunc store to change the number of vector elements!");
10712
10713 SDVTList VTs = getVTList(MVT::Other);
10715 SDValue Ops[] = {Chain, Val, Ptr, Undef, Stride, Mask, EVL};
10717 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
10718 ID.AddInteger(SVT.getRawBits());
10719 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
10720 DL.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
10721 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10722 void *IP = nullptr;
10723 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
10724 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
10725 return SDValue(E, 0);
10726 }
10727 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
10728 VTs, ISD::UNINDEXED, true,
10729 IsCompressing, SVT, MMO);
10730 createOperands(N, Ops);
10731
10732 CSEMap.InsertNode(N, IP);
10733 InsertNode(N);
10734 SDValue V(N, 0);
10735 NewSDValueDbgMsg(V, "Creating new node: ", this);
10736 return V;
10737}
10738
10741 ISD::MemIndexType IndexType) {
10742 assert(Ops.size() == 6 && "Incompatible number of operands");
10743
10745 AddNodeIDNode(ID, ISD::VP_GATHER, VTs, Ops);
10746 ID.AddInteger(VT.getRawBits());
10747 ID.AddInteger(getSyntheticNodeSubclassData<VPGatherSDNode>(
10748 dl.getIROrder(), VTs, VT, MMO, IndexType));
10749 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10750 ID.AddInteger(MMO->getFlags());
10751 void *IP = nullptr;
10752 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10753 cast<VPGatherSDNode>(E)->refineAlignment(MMO);
10754 return SDValue(E, 0);
10755 }
10756
10757 auto *N = newSDNode<VPGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
10758 VT, MMO, IndexType);
10759 createOperands(N, Ops);
10760
10761 assert(N->getMask().getValueType().getVectorElementCount() ==
10762 N->getValueType(0).getVectorElementCount() &&
10763 "Vector width mismatch between mask and data");
10764 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
10765 N->getValueType(0).getVectorElementCount().isScalable() &&
10766 "Scalable flags of index and data do not match");
10768 N->getIndex().getValueType().getVectorElementCount(),
10769 N->getValueType(0).getVectorElementCount()) &&
10770 "Vector width mismatch between index and data");
10771 assert(isa<ConstantSDNode>(N->getScale()) &&
10772 N->getScale()->getAsAPIntVal().isPowerOf2() &&
10773 "Scale should be a constant power of 2");
10774
10775 CSEMap.InsertNode(N, IP);
10776 InsertNode(N);
10777 SDValue V(N, 0);
10778 NewSDValueDbgMsg(V, "Creating new node: ", this);
10779 return V;
10780}
10781
10784 MachineMemOperand *MMO,
10785 ISD::MemIndexType IndexType) {
10786 assert(Ops.size() == 7 && "Incompatible number of operands");
10787
10789 AddNodeIDNode(ID, ISD::VP_SCATTER, VTs, Ops);
10790 ID.AddInteger(VT.getRawBits());
10791 ID.AddInteger(getSyntheticNodeSubclassData<VPScatterSDNode>(
10792 dl.getIROrder(), VTs, VT, MMO, IndexType));
10793 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10794 ID.AddInteger(MMO->getFlags());
10795 void *IP = nullptr;
10796 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10797 cast<VPScatterSDNode>(E)->refineAlignment(MMO);
10798 return SDValue(E, 0);
10799 }
10800 auto *N = newSDNode<VPScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
10801 VT, MMO, IndexType);
10802 createOperands(N, Ops);
10803
10804 assert(N->getMask().getValueType().getVectorElementCount() ==
10805 N->getValue().getValueType().getVectorElementCount() &&
10806 "Vector width mismatch between mask and data");
10807 assert(
10808 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
10809 N->getValue().getValueType().getVectorElementCount().isScalable() &&
10810 "Scalable flags of index and data do not match");
10812 N->getIndex().getValueType().getVectorElementCount(),
10813 N->getValue().getValueType().getVectorElementCount()) &&
10814 "Vector width mismatch between index and data");
10815 assert(isa<ConstantSDNode>(N->getScale()) &&
10816 N->getScale()->getAsAPIntVal().isPowerOf2() &&
10817 "Scale should be a constant power of 2");
10818
10819 CSEMap.InsertNode(N, IP);
10820 InsertNode(N);
10821 SDValue V(N, 0);
10822 NewSDValueDbgMsg(V, "Creating new node: ", this);
10823 return V;
10824}
10825
10828 SDValue PassThru, EVT MemVT,
10829 MachineMemOperand *MMO,
10831 ISD::LoadExtType ExtTy, bool isExpanding) {
10832 bool Indexed = AM != ISD::UNINDEXED;
10833 assert((Indexed || Offset.isUndef()) &&
10834 "Unindexed masked load with an offset!");
10835 SDVTList VTs = Indexed ? getVTList(VT, Base.getValueType(), MVT::Other)
10836 : getVTList(VT, MVT::Other);
10837 SDValue Ops[] = {Chain, Base, Offset, Mask, PassThru};
10840 ID.AddInteger(MemVT.getRawBits());
10841 ID.AddInteger(getSyntheticNodeSubclassData<MaskedLoadSDNode>(
10842 dl.getIROrder(), VTs, AM, ExtTy, isExpanding, MemVT, MMO));
10843 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10844 ID.AddInteger(MMO->getFlags());
10845 void *IP = nullptr;
10846 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10847 cast<MaskedLoadSDNode>(E)->refineAlignment(MMO);
10848 return SDValue(E, 0);
10849 }
10850 auto *N = newSDNode<MaskedLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
10851 AM, ExtTy, isExpanding, MemVT, MMO);
10852 createOperands(N, Ops);
10853
10854 CSEMap.InsertNode(N, IP);
10855 InsertNode(N);
10856 SDValue V(N, 0);
10857 NewSDValueDbgMsg(V, "Creating new node: ", this);
10858 return V;
10859}
10860
10865 assert(LD->getOffset().isUndef() && "Masked load is already a indexed load!");
10866 return getMaskedLoad(OrigLoad.getValueType(), dl, LD->getChain(), Base,
10867 Offset, LD->getMask(), LD->getPassThru(),
10868 LD->getMemoryVT(), LD->getMemOperand(), AM,
10869 LD->getExtensionType(), LD->isExpandingLoad());
10870}
10871
10874 SDValue Mask, EVT MemVT,
10875 MachineMemOperand *MMO,
10876 ISD::MemIndexedMode AM, bool IsTruncating,
10877 bool IsCompressing) {
10878 assert(Chain.getValueType() == MVT::Other &&
10879 "Invalid chain type");
10880 bool Indexed = AM != ISD::UNINDEXED;
10881 assert((Indexed || Offset.isUndef()) &&
10882 "Unindexed masked store with an offset!");
10883 SDVTList VTs = Indexed ? getVTList(Base.getValueType(), MVT::Other)
10884 : getVTList(MVT::Other);
10885 SDValue Ops[] = {Chain, Val, Base, Offset, Mask};
10888 ID.AddInteger(MemVT.getRawBits());
10889 ID.AddInteger(getSyntheticNodeSubclassData<MaskedStoreSDNode>(
10890 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
10891 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10892 ID.AddInteger(MMO->getFlags());
10893 void *IP = nullptr;
10894 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10895 cast<MaskedStoreSDNode>(E)->refineAlignment(MMO);
10896 return SDValue(E, 0);
10897 }
10898 auto *N =
10899 newSDNode<MaskedStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10900 IsTruncating, IsCompressing, MemVT, MMO);
10901 createOperands(N, Ops);
10902
10903 CSEMap.InsertNode(N, IP);
10904 InsertNode(N);
10905 SDValue V(N, 0);
10906 NewSDValueDbgMsg(V, "Creating new node: ", this);
10907 return V;
10908}
10909
10914 assert(ST->getOffset().isUndef() &&
10915 "Masked store is already a indexed store!");
10916 return getMaskedStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
10917 ST->getMask(), ST->getMemoryVT(), ST->getMemOperand(),
10918 AM, ST->isTruncatingStore(), ST->isCompressingStore());
10919}
10920
10923 MachineMemOperand *MMO,
10924 ISD::MemIndexType IndexType,
10925 ISD::LoadExtType ExtTy) {
10926 assert(Ops.size() == 6 && "Incompatible number of operands");
10927
10930 ID.AddInteger(MemVT.getRawBits());
10931 ID.AddInteger(getSyntheticNodeSubclassData<MaskedGatherSDNode>(
10932 dl.getIROrder(), VTs, MemVT, MMO, IndexType, ExtTy));
10933 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10934 ID.AddInteger(MMO->getFlags());
10935 void *IP = nullptr;
10936 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10937 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
10938 return SDValue(E, 0);
10939 }
10940
10941 auto *N = newSDNode<MaskedGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(),
10942 VTs, MemVT, MMO, IndexType, ExtTy);
10943 createOperands(N, Ops);
10944
10945 assert(N->getPassThru().getValueType() == N->getValueType(0) &&
10946 "Incompatible type of the PassThru value in MaskedGatherSDNode");
10947 assert(N->getMask().getValueType().getVectorElementCount() ==
10948 N->getValueType(0).getVectorElementCount() &&
10949 "Vector width mismatch between mask and data");
10950 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
10951 N->getValueType(0).getVectorElementCount().isScalable() &&
10952 "Scalable flags of index and data do not match");
10954 N->getIndex().getValueType().getVectorElementCount(),
10955 N->getValueType(0).getVectorElementCount()) &&
10956 "Vector width mismatch between index and data");
10957 assert(isa<ConstantSDNode>(N->getScale()) &&
10958 N->getScale()->getAsAPIntVal().isPowerOf2() &&
10959 "Scale should be a constant power of 2");
10960
10961 CSEMap.InsertNode(N, IP);
10962 InsertNode(N);
10963 SDValue V(N, 0);
10964 NewSDValueDbgMsg(V, "Creating new node: ", this);
10965 return V;
10966}
10967
10970 MachineMemOperand *MMO,
10971 ISD::MemIndexType IndexType,
10972 bool IsTrunc) {
10973 assert(Ops.size() == 6 && "Incompatible number of operands");
10974
10977 ID.AddInteger(MemVT.getRawBits());
10978 ID.AddInteger(getSyntheticNodeSubclassData<MaskedScatterSDNode>(
10979 dl.getIROrder(), VTs, MemVT, MMO, IndexType, IsTrunc));
10980 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10981 ID.AddInteger(MMO->getFlags());
10982 void *IP = nullptr;
10983 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10984 cast<MaskedScatterSDNode>(E)->refineAlignment(MMO);
10985 return SDValue(E, 0);
10986 }
10987
10988 auto *N = newSDNode<MaskedScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(),
10989 VTs, MemVT, MMO, IndexType, IsTrunc);
10990 createOperands(N, Ops);
10991
10992 assert(N->getMask().getValueType().getVectorElementCount() ==
10993 N->getValue().getValueType().getVectorElementCount() &&
10994 "Vector width mismatch between mask and data");
10995 assert(
10996 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
10997 N->getValue().getValueType().getVectorElementCount().isScalable() &&
10998 "Scalable flags of index and data do not match");
11000 N->getIndex().getValueType().getVectorElementCount(),
11001 N->getValue().getValueType().getVectorElementCount()) &&
11002 "Vector width mismatch between index and data");
11003 assert(isa<ConstantSDNode>(N->getScale()) &&
11004 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11005 "Scale should be a constant power of 2");
11006
11007 CSEMap.InsertNode(N, IP);
11008 InsertNode(N);
11009 SDValue V(N, 0);
11010 NewSDValueDbgMsg(V, "Creating new node: ", this);
11011 return V;
11012}
11013
11015 const SDLoc &dl, ArrayRef<SDValue> Ops,
11016 MachineMemOperand *MMO,
11017 ISD::MemIndexType IndexType) {
11018 assert(Ops.size() == 7 && "Incompatible number of operands");
11019
11022 ID.AddInteger(MemVT.getRawBits());
11023 ID.AddInteger(getSyntheticNodeSubclassData<MaskedHistogramSDNode>(
11024 dl.getIROrder(), VTs, MemVT, MMO, IndexType));
11025 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11026 ID.AddInteger(MMO->getFlags());
11027 void *IP = nullptr;
11028 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11029 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11030 return SDValue(E, 0);
11031 }
11032
11033 auto *N = newSDNode<MaskedHistogramSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11034 VTs, MemVT, MMO, IndexType);
11035 createOperands(N, Ops);
11036
11037 assert(N->getMask().getValueType().getVectorElementCount() ==
11038 N->getIndex().getValueType().getVectorElementCount() &&
11039 "Vector width mismatch between mask and data");
11040 assert(isa<ConstantSDNode>(N->getScale()) &&
11041 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11042 "Scale should be a constant power of 2");
11043 assert(N->getInc().getValueType().isInteger() && "Non integer update value");
11044
11045 CSEMap.InsertNode(N, IP);
11046 InsertNode(N);
11047 SDValue V(N, 0);
11048 NewSDValueDbgMsg(V, "Creating new node: ", this);
11049 return V;
11050}
11051
11053 SDValue Ptr, SDValue Mask, SDValue EVL,
11054 MachineMemOperand *MMO) {
11055 SDVTList VTs = getVTList(VT, EVL.getValueType(), MVT::Other);
11056 SDValue Ops[] = {Chain, Ptr, Mask, EVL};
11058 AddNodeIDNode(ID, ISD::VP_LOAD_FF, VTs, Ops);
11059 ID.AddInteger(VT.getRawBits());
11060 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadFFSDNode>(DL.getIROrder(),
11061 VTs, VT, MMO));
11062 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11063 ID.AddInteger(MMO->getFlags());
11064 void *IP = nullptr;
11065 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11066 cast<VPLoadFFSDNode>(E)->refineAlignment(MMO);
11067 return SDValue(E, 0);
11068 }
11069 auto *N = newSDNode<VPLoadFFSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs,
11070 VT, MMO);
11071 createOperands(N, Ops);
11072
11073 CSEMap.InsertNode(N, IP);
11074 InsertNode(N);
11075 SDValue V(N, 0);
11076 NewSDValueDbgMsg(V, "Creating new node: ", this);
11077 return V;
11078}
11079
11081 EVT MemVT, MachineMemOperand *MMO) {
11082 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11083 SDVTList VTs = getVTList(MVT::Other);
11084 SDValue Ops[] = {Chain, Ptr};
11087 ID.AddInteger(MemVT.getRawBits());
11088 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11089 ISD::GET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11090 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11091 ID.AddInteger(MMO->getFlags());
11092 void *IP = nullptr;
11093 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11094 return SDValue(E, 0);
11095
11096 auto *N = newSDNode<FPStateAccessSDNode>(ISD::GET_FPENV_MEM, dl.getIROrder(),
11097 dl.getDebugLoc(), VTs, MemVT, MMO);
11098 createOperands(N, Ops);
11099
11100 CSEMap.InsertNode(N, IP);
11101 InsertNode(N);
11102 SDValue V(N, 0);
11103 NewSDValueDbgMsg(V, "Creating new node: ", this);
11104 return V;
11105}
11106
11108 EVT MemVT, MachineMemOperand *MMO) {
11109 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11110 SDVTList VTs = getVTList(MVT::Other);
11111 SDValue Ops[] = {Chain, Ptr};
11114 ID.AddInteger(MemVT.getRawBits());
11115 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11116 ISD::SET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11117 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11118 ID.AddInteger(MMO->getFlags());
11119 void *IP = nullptr;
11120 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11121 return SDValue(E, 0);
11122
11123 auto *N = newSDNode<FPStateAccessSDNode>(ISD::SET_FPENV_MEM, dl.getIROrder(),
11124 dl.getDebugLoc(), VTs, MemVT, MMO);
11125 createOperands(N, Ops);
11126
11127 CSEMap.InsertNode(N, IP);
11128 InsertNode(N);
11129 SDValue V(N, 0);
11130 NewSDValueDbgMsg(V, "Creating new node: ", this);
11131 return V;
11132}
11133
11135 // select undef, T, F --> T (if T is a constant), otherwise F
11136 // select, ?, undef, F --> F
11137 // select, ?, T, undef --> T
11138 if (Cond.isUndef())
11139 return isConstantValueOfAnyType(T) ? T : F;
11140 if (T.isUndef())
11142 if (F.isUndef())
11144
11145 // select true, T, F --> T
11146 // select false, T, F --> F
11147 if (auto C = isBoolConstant(Cond))
11148 return *C ? T : F;
11149
11150 // select ?, T, T --> T
11151 if (T == F)
11152 return T;
11153
11154 return SDValue();
11155}
11156
11158 // shift undef, Y --> 0 (can always assume that the undef value is 0)
11159 if (X.isUndef())
11160 return getConstant(0, SDLoc(X.getNode()), X.getValueType());
11161 // shift X, undef --> undef (because it may shift by the bitwidth)
11162 if (Y.isUndef())
11163 return getUNDEF(X.getValueType());
11164
11165 // shift 0, Y --> 0
11166 // shift X, 0 --> X
11168 return X;
11169
11170 // shift X, C >= bitwidth(X) --> undef
11171 // All vector elements must be too big (or undef) to avoid partial undefs.
11172 auto isShiftTooBig = [X](ConstantSDNode *Val) {
11173 return !Val || Val->getAPIntValue().uge(X.getScalarValueSizeInBits());
11174 };
11175 if (ISD::matchUnaryPredicate(Y, isShiftTooBig, true))
11176 return getUNDEF(X.getValueType());
11177
11178 // shift i1/vXi1 X, Y --> X (any non-zero shift amount is undefined).
11179 if (X.getValueType().getScalarType() == MVT::i1)
11180 return X;
11181
11182 return SDValue();
11183}
11184
11186 SDNodeFlags Flags) {
11187 // If this operation has 'nnan' or 'ninf' and at least 1 disallowed operand
11188 // (an undef operand can be chosen to be Nan/Inf), then the result of this
11189 // operation is poison. That result can be relaxed to undef.
11190 ConstantFPSDNode *XC = isConstOrConstSplatFP(X, /* AllowUndefs */ true);
11191 ConstantFPSDNode *YC = isConstOrConstSplatFP(Y, /* AllowUndefs */ true);
11192 bool HasNan = (XC && XC->getValueAPF().isNaN()) ||
11193 (YC && YC->getValueAPF().isNaN());
11194 bool HasInf = (XC && XC->getValueAPF().isInfinity()) ||
11195 (YC && YC->getValueAPF().isInfinity());
11196
11197 if (Flags.hasNoNaNs() && (HasNan || X.isUndef() || Y.isUndef()))
11198 return getUNDEF(X.getValueType());
11199
11200 if (Flags.hasNoInfs() && (HasInf || X.isUndef() || Y.isUndef()))
11201 return getUNDEF(X.getValueType());
11202
11203 if (!YC)
11204 return SDValue();
11205
11206 // X + -0.0 --> X
11207 if (Opcode == ISD::FADD)
11208 if (YC->getValueAPF().isNegZero())
11209 return X;
11210
11211 // X - +0.0 --> X
11212 if (Opcode == ISD::FSUB)
11213 if (YC->getValueAPF().isPosZero())
11214 return X;
11215
11216 // X * 1.0 --> X
11217 // X / 1.0 --> X
11218 if (Opcode == ISD::FMUL || Opcode == ISD::FDIV)
11219 if (YC->getValueAPF().isExactlyValue(1.0))
11220 return X;
11221
11222 // X * 0.0 --> 0.0
11223 if (Opcode == ISD::FMUL && Flags.hasNoNaNs() && Flags.hasNoSignedZeros())
11224 if (YC->getValueAPF().isZero())
11225 return getConstantFP(0.0, SDLoc(Y), Y.getValueType());
11226
11227 return SDValue();
11228}
11229
11231 SDValue Ptr, SDValue SV, unsigned Align) {
11232 SDValue Ops[] = { Chain, Ptr, SV, getTargetConstant(Align, dl, MVT::i32) };
11233 return getNode(ISD::VAARG, dl, getVTList(VT, MVT::Other), Ops);
11234}
11235
11236SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11238 switch (Ops.size()) {
11239 case 0: return getNode(Opcode, DL, VT);
11240 case 1: return getNode(Opcode, DL, VT, Ops[0].get());
11241 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]);
11242 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]);
11243 default: break;
11244 }
11245
11246 // Copy from an SDUse array into an SDValue array for use with
11247 // the regular getNode logic.
11249 return getNode(Opcode, DL, VT, NewOps);
11250}
11251
11252SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11254 SDNodeFlags Flags;
11255 if (Inserter)
11256 Flags = Inserter->getFlags();
11257 return getNode(Opcode, DL, VT, Ops, Flags);
11258}
11259
11260SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11261 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11262 unsigned NumOps = Ops.size();
11263 switch (NumOps) {
11264 case 0: return getNode(Opcode, DL, VT);
11265 case 1: return getNode(Opcode, DL, VT, Ops[0], Flags);
11266 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Flags);
11267 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2], Flags);
11268 default: break;
11269 }
11270
11271#ifndef NDEBUG
11272 for (const auto &Op : Ops)
11273 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11274 "Operand is DELETED_NODE!");
11275#endif
11276
11277 switch (Opcode) {
11278 default: break;
11279 case ISD::BUILD_VECTOR:
11280 // Attempt to simplify BUILD_VECTOR.
11281 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
11282 return V;
11283 break;
11285 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
11286 return V;
11287 break;
11288 case ISD::SELECT_CC:
11289 assert(NumOps == 5 && "SELECT_CC takes 5 operands!");
11290 assert(Ops[0].getValueType() == Ops[1].getValueType() &&
11291 "LHS and RHS of condition must have same type!");
11292 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11293 "True and False arms of SelectCC must have same type!");
11294 assert(Ops[2].getValueType() == VT &&
11295 "select_cc node must be of same type as true and false value!");
11296 assert((!Ops[0].getValueType().isVector() ||
11297 Ops[0].getValueType().getVectorElementCount() ==
11298 VT.getVectorElementCount()) &&
11299 "Expected select_cc with vector result to have the same sized "
11300 "comparison type!");
11301 break;
11302 case ISD::BR_CC:
11303 assert(NumOps == 5 && "BR_CC takes 5 operands!");
11304 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11305 "LHS/RHS of comparison should match types!");
11306 break;
11307 case ISD::VP_ADD:
11308 case ISD::VP_SUB:
11309 // If it is VP_ADD/VP_SUB mask operation then turn it to VP_XOR
11310 if (VT.getScalarType() == MVT::i1)
11311 Opcode = ISD::VP_XOR;
11312 break;
11313 case ISD::VP_MUL:
11314 // If it is VP_MUL mask operation then turn it to VP_AND
11315 if (VT.getScalarType() == MVT::i1)
11316 Opcode = ISD::VP_AND;
11317 break;
11318 case ISD::VP_REDUCE_MUL:
11319 // If it is VP_REDUCE_MUL mask operation then turn it to VP_REDUCE_AND
11320 if (VT == MVT::i1)
11321 Opcode = ISD::VP_REDUCE_AND;
11322 break;
11323 case ISD::VP_REDUCE_ADD:
11324 // If it is VP_REDUCE_ADD mask operation then turn it to VP_REDUCE_XOR
11325 if (VT == MVT::i1)
11326 Opcode = ISD::VP_REDUCE_XOR;
11327 break;
11328 case ISD::VP_REDUCE_SMAX:
11329 case ISD::VP_REDUCE_UMIN:
11330 // If it is VP_REDUCE_SMAX/VP_REDUCE_UMIN mask operation then turn it to
11331 // VP_REDUCE_AND.
11332 if (VT == MVT::i1)
11333 Opcode = ISD::VP_REDUCE_AND;
11334 break;
11335 case ISD::VP_REDUCE_SMIN:
11336 case ISD::VP_REDUCE_UMAX:
11337 // If it is VP_REDUCE_SMIN/VP_REDUCE_UMAX mask operation then turn it to
11338 // VP_REDUCE_OR.
11339 if (VT == MVT::i1)
11340 Opcode = ISD::VP_REDUCE_OR;
11341 break;
11342 }
11343
11344 // Memoize nodes.
11345 SDNode *N;
11346 SDVTList VTs = getVTList(VT);
11347
11348 if (VT != MVT::Glue) {
11350 AddNodeIDNode(ID, Opcode, VTs, Ops);
11351 void *IP = nullptr;
11352
11353 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11354 E->intersectFlagsWith(Flags);
11355 return SDValue(E, 0);
11356 }
11357
11358 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11359 createOperands(N, Ops);
11360
11361 CSEMap.InsertNode(N, IP);
11362 } else {
11363 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11364 createOperands(N, Ops);
11365 }
11366
11367 N->setFlags(Flags);
11368 InsertNode(N);
11369 SDValue V(N, 0);
11370 NewSDValueDbgMsg(V, "Creating new node: ", this);
11371 return V;
11372}
11373
11374SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11375 ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops) {
11376 SDNodeFlags Flags;
11377 if (Inserter)
11378 Flags = Inserter->getFlags();
11379 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11380}
11381
11382SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11384 const SDNodeFlags Flags) {
11385 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11386}
11387
11388SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11390 SDNodeFlags Flags;
11391 if (Inserter)
11392 Flags = Inserter->getFlags();
11393 return getNode(Opcode, DL, VTList, Ops, Flags);
11394}
11395
11396SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11397 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11398 if (VTList.NumVTs == 1)
11399 return getNode(Opcode, DL, VTList.VTs[0], Ops, Flags);
11400
11401#ifndef NDEBUG
11402 for (const auto &Op : Ops)
11403 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11404 "Operand is DELETED_NODE!");
11405#endif
11406
11407 switch (Opcode) {
11408 case ISD::SADDO:
11409 case ISD::UADDO:
11410 case ISD::SSUBO:
11411 case ISD::USUBO: {
11412 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
11413 "Invalid add/sub overflow op!");
11414 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
11415 Ops[0].getValueType() == Ops[1].getValueType() &&
11416 Ops[0].getValueType() == VTList.VTs[0] &&
11417 "Binary operator types must match!");
11418 SDValue N1 = Ops[0], N2 = Ops[1];
11419 canonicalizeCommutativeBinop(Opcode, N1, N2);
11420
11421 // (X +- 0) -> X with zero-overflow.
11422 ConstantSDNode *N2CV = isConstOrConstSplat(N2, /*AllowUndefs*/ false,
11423 /*AllowTruncation*/ true);
11424 if (N2CV && N2CV->isZero()) {
11425 SDValue ZeroOverFlow = getConstant(0, DL, VTList.VTs[1]);
11426 return getNode(ISD::MERGE_VALUES, DL, VTList, {N1, ZeroOverFlow}, Flags);
11427 }
11428
11429 if (VTList.VTs[0].getScalarType() == MVT::i1 &&
11430 VTList.VTs[1].getScalarType() == MVT::i1) {
11431 SDValue F1 = getFreeze(N1);
11432 SDValue F2 = getFreeze(N2);
11433 // {vXi1,vXi1} (u/s)addo(vXi1 x, vXi1y) -> {xor(x,y),and(x,y)}
11434 if (Opcode == ISD::UADDO || Opcode == ISD::SADDO)
11435 return getNode(ISD::MERGE_VALUES, DL, VTList,
11436 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
11437 getNode(ISD::AND, DL, VTList.VTs[1], F1, F2)},
11438 Flags);
11439 // {vXi1,vXi1} (u/s)subo(vXi1 x, vXi1y) -> {xor(x,y),and(~x,y)}
11440 if (Opcode == ISD::USUBO || Opcode == ISD::SSUBO) {
11441 SDValue NotF1 = getNOT(DL, F1, VTList.VTs[0]);
11442 return getNode(ISD::MERGE_VALUES, DL, VTList,
11443 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
11444 getNode(ISD::AND, DL, VTList.VTs[1], NotF1, F2)},
11445 Flags);
11446 }
11447 }
11448 break;
11449 }
11450 case ISD::SADDO_CARRY:
11451 case ISD::UADDO_CARRY:
11452 case ISD::SSUBO_CARRY:
11453 case ISD::USUBO_CARRY:
11454 assert(VTList.NumVTs == 2 && Ops.size() == 3 &&
11455 "Invalid add/sub overflow op!");
11456 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
11457 Ops[0].getValueType() == Ops[1].getValueType() &&
11458 Ops[0].getValueType() == VTList.VTs[0] &&
11459 Ops[2].getValueType() == VTList.VTs[1] &&
11460 "Binary operator types must match!");
11461 break;
11462 case ISD::SMUL_LOHI:
11463 case ISD::UMUL_LOHI: {
11464 assert(VTList.NumVTs == 2 && Ops.size() == 2 && "Invalid mul lo/hi op!");
11465 assert(VTList.VTs[0].isInteger() && VTList.VTs[0] == VTList.VTs[1] &&
11466 VTList.VTs[0] == Ops[0].getValueType() &&
11467 VTList.VTs[0] == Ops[1].getValueType() &&
11468 "Binary operator types must match!");
11469 // Constant fold.
11472 if (LHS && RHS) {
11473 unsigned Width = VTList.VTs[0].getScalarSizeInBits();
11474 unsigned OutWidth = Width * 2;
11475 APInt Val = LHS->getAPIntValue();
11476 APInt Mul = RHS->getAPIntValue();
11477 if (Opcode == ISD::SMUL_LOHI) {
11478 Val = Val.sext(OutWidth);
11479 Mul = Mul.sext(OutWidth);
11480 } else {
11481 Val = Val.zext(OutWidth);
11482 Mul = Mul.zext(OutWidth);
11483 }
11484 Val *= Mul;
11485
11486 SDValue Hi =
11487 getConstant(Val.extractBits(Width, Width), DL, VTList.VTs[0]);
11488 SDValue Lo = getConstant(Val.trunc(Width), DL, VTList.VTs[0]);
11489 return getNode(ISD::MERGE_VALUES, DL, VTList, {Lo, Hi}, Flags);
11490 }
11491 break;
11492 }
11493 case ISD::FFREXP: {
11494 assert(VTList.NumVTs == 2 && Ops.size() == 1 && "Invalid ffrexp op!");
11495 assert(VTList.VTs[0].isFloatingPoint() && VTList.VTs[1].isInteger() &&
11496 VTList.VTs[0] == Ops[0].getValueType() && "frexp type mismatch");
11497
11499 int FrexpExp;
11500 APFloat FrexpMant =
11501 frexp(C->getValueAPF(), FrexpExp, APFloat::rmNearestTiesToEven);
11502 SDValue Result0 = getConstantFP(FrexpMant, DL, VTList.VTs[0]);
11503 SDValue Result1 = getSignedConstant(FrexpMant.isFinite() ? FrexpExp : 0,
11504 DL, VTList.VTs[1]);
11505 return getNode(ISD::MERGE_VALUES, DL, VTList, {Result0, Result1}, Flags);
11506 }
11507
11508 break;
11509 }
11511 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
11512 "Invalid STRICT_FP_EXTEND!");
11513 assert(VTList.VTs[0].isFloatingPoint() &&
11514 Ops[1].getValueType().isFloatingPoint() && "Invalid FP cast!");
11515 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
11516 "STRICT_FP_EXTEND result type should be vector iff the operand "
11517 "type is vector!");
11518 assert((!VTList.VTs[0].isVector() ||
11519 VTList.VTs[0].getVectorElementCount() ==
11520 Ops[1].getValueType().getVectorElementCount()) &&
11521 "Vector element count mismatch!");
11522 assert(Ops[1].getValueType().bitsLT(VTList.VTs[0]) &&
11523 "Invalid fpext node, dst <= src!");
11524 break;
11526 assert(VTList.NumVTs == 2 && Ops.size() == 3 && "Invalid STRICT_FP_ROUND!");
11527 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
11528 "STRICT_FP_ROUND result type should be vector iff the operand "
11529 "type is vector!");
11530 assert((!VTList.VTs[0].isVector() ||
11531 VTList.VTs[0].getVectorElementCount() ==
11532 Ops[1].getValueType().getVectorElementCount()) &&
11533 "Vector element count mismatch!");
11534 assert(VTList.VTs[0].isFloatingPoint() &&
11535 Ops[1].getValueType().isFloatingPoint() &&
11536 VTList.VTs[0].bitsLT(Ops[1].getValueType()) &&
11537 Ops[2].getOpcode() == ISD::TargetConstant &&
11538 (Ops[2]->getAsZExtVal() == 0 || Ops[2]->getAsZExtVal() == 1) &&
11539 "Invalid STRICT_FP_ROUND!");
11540 break;
11541 }
11542
11543 // Memoize the node unless it returns a glue result.
11544 SDNode *N;
11545 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
11547 AddNodeIDNode(ID, Opcode, VTList, Ops);
11548 void *IP = nullptr;
11549 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11550 E->intersectFlagsWith(Flags);
11551 return SDValue(E, 0);
11552 }
11553
11554 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
11555 createOperands(N, Ops);
11556 CSEMap.InsertNode(N, IP);
11557 } else {
11558 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
11559 createOperands(N, Ops);
11560 }
11561
11562 N->setFlags(Flags);
11563 InsertNode(N);
11564 SDValue V(N, 0);
11565 NewSDValueDbgMsg(V, "Creating new node: ", this);
11566 return V;
11567}
11568
11569SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11570 SDVTList VTList) {
11571 return getNode(Opcode, DL, VTList, ArrayRef<SDValue>());
11572}
11573
11574SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11575 SDValue N1) {
11576 SDValue Ops[] = { N1 };
11577 return getNode(Opcode, DL, VTList, Ops);
11578}
11579
11580SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11581 SDValue N1, SDValue N2) {
11582 SDValue Ops[] = { N1, N2 };
11583 return getNode(Opcode, DL, VTList, Ops);
11584}
11585
11586SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11587 SDValue N1, SDValue N2, SDValue N3) {
11588 SDValue Ops[] = { N1, N2, N3 };
11589 return getNode(Opcode, DL, VTList, Ops);
11590}
11591
11592SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11593 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
11594 SDValue Ops[] = { N1, N2, N3, N4 };
11595 return getNode(Opcode, DL, VTList, Ops);
11596}
11597
11598SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11599 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
11600 SDValue N5) {
11601 SDValue Ops[] = { N1, N2, N3, N4, N5 };
11602 return getNode(Opcode, DL, VTList, Ops);
11603}
11604
11606 if (!VT.isExtended())
11607 return makeVTList(SDNode::getValueTypeList(VT.getSimpleVT()), 1);
11608
11609 return makeVTList(&(*EVTs.insert(VT).first), 1);
11610}
11611
11614 ID.AddInteger(2U);
11615 ID.AddInteger(VT1.getRawBits());
11616 ID.AddInteger(VT2.getRawBits());
11617
11618 void *IP = nullptr;
11619 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
11620 if (!Result) {
11621 EVT *Array = Allocator.Allocate<EVT>(2);
11622 Array[0] = VT1;
11623 Array[1] = VT2;
11624 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 2);
11625 VTListMap.InsertNode(Result, IP);
11626 }
11627 return Result->getSDVTList();
11628}
11629
11632 ID.AddInteger(3U);
11633 ID.AddInteger(VT1.getRawBits());
11634 ID.AddInteger(VT2.getRawBits());
11635 ID.AddInteger(VT3.getRawBits());
11636
11637 void *IP = nullptr;
11638 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
11639 if (!Result) {
11640 EVT *Array = Allocator.Allocate<EVT>(3);
11641 Array[0] = VT1;
11642 Array[1] = VT2;
11643 Array[2] = VT3;
11644 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 3);
11645 VTListMap.InsertNode(Result, IP);
11646 }
11647 return Result->getSDVTList();
11648}
11649
11652 ID.AddInteger(4U);
11653 ID.AddInteger(VT1.getRawBits());
11654 ID.AddInteger(VT2.getRawBits());
11655 ID.AddInteger(VT3.getRawBits());
11656 ID.AddInteger(VT4.getRawBits());
11657
11658 void *IP = nullptr;
11659 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
11660 if (!Result) {
11661 EVT *Array = Allocator.Allocate<EVT>(4);
11662 Array[0] = VT1;
11663 Array[1] = VT2;
11664 Array[2] = VT3;
11665 Array[3] = VT4;
11666 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 4);
11667 VTListMap.InsertNode(Result, IP);
11668 }
11669 return Result->getSDVTList();
11670}
11671
11673 unsigned NumVTs = VTs.size();
11675 ID.AddInteger(NumVTs);
11676 for (unsigned index = 0; index < NumVTs; index++) {
11677 ID.AddInteger(VTs[index].getRawBits());
11678 }
11679
11680 void *IP = nullptr;
11681 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
11682 if (!Result) {
11683 EVT *Array = Allocator.Allocate<EVT>(NumVTs);
11684 llvm::copy(VTs, Array);
11685 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, NumVTs);
11686 VTListMap.InsertNode(Result, IP);
11687 }
11688 return Result->getSDVTList();
11689}
11690
11691
11692/// UpdateNodeOperands - *Mutate* the specified node in-place to have the
11693/// specified operands. If the resultant node already exists in the DAG,
11694/// this does not modify the specified node, instead it returns the node that
11695/// already exists. If the resultant node does not exist in the DAG, the
11696/// input node is returned. As a degenerate case, if you specify the same
11697/// input operands as the node already has, the input node is returned.
11699 assert(N->getNumOperands() == 1 && "Update with wrong number of operands");
11700
11701 // Check to see if there is no change.
11702 if (Op == N->getOperand(0)) return N;
11703
11704 // See if the modified node already exists.
11705 void *InsertPos = nullptr;
11706 if (SDNode *Existing = FindModifiedNodeSlot(N, Op, InsertPos))
11707 return Existing;
11708
11709 // Nope it doesn't. Remove the node from its current place in the maps.
11710 if (InsertPos)
11711 if (!RemoveNodeFromCSEMaps(N))
11712 InsertPos = nullptr;
11713
11714 // Now we update the operands.
11715 N->OperandList[0].set(Op);
11716
11718 // If this gets put into a CSE map, add it.
11719 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
11720 return N;
11721}
11722
11724 assert(N->getNumOperands() == 2 && "Update with wrong number of operands");
11725
11726 // Check to see if there is no change.
11727 if (Op1 == N->getOperand(0) && Op2 == N->getOperand(1))
11728 return N; // No operands changed, just return the input node.
11729
11730 // See if the modified node already exists.
11731 void *InsertPos = nullptr;
11732 if (SDNode *Existing = FindModifiedNodeSlot(N, Op1, Op2, InsertPos))
11733 return Existing;
11734
11735 // Nope it doesn't. Remove the node from its current place in the maps.
11736 if (InsertPos)
11737 if (!RemoveNodeFromCSEMaps(N))
11738 InsertPos = nullptr;
11739
11740 // Now we update the operands.
11741 if (N->OperandList[0] != Op1)
11742 N->OperandList[0].set(Op1);
11743 if (N->OperandList[1] != Op2)
11744 N->OperandList[1].set(Op2);
11745
11747 // If this gets put into a CSE map, add it.
11748 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
11749 return N;
11750}
11751
11754 SDValue Ops[] = { Op1, Op2, Op3 };
11755 return UpdateNodeOperands(N, Ops);
11756}
11757
11760 SDValue Op3, SDValue Op4) {
11761 SDValue Ops[] = { Op1, Op2, Op3, Op4 };
11762 return UpdateNodeOperands(N, Ops);
11763}
11764
11767 SDValue Op3, SDValue Op4, SDValue Op5) {
11768 SDValue Ops[] = { Op1, Op2, Op3, Op4, Op5 };
11769 return UpdateNodeOperands(N, Ops);
11770}
11771
11774 unsigned NumOps = Ops.size();
11775 assert(N->getNumOperands() == NumOps &&
11776 "Update with wrong number of operands");
11777
11778 // If no operands changed just return the input node.
11779 if (std::equal(Ops.begin(), Ops.end(), N->op_begin()))
11780 return N;
11781
11782 // See if the modified node already exists.
11783 void *InsertPos = nullptr;
11784 if (SDNode *Existing = FindModifiedNodeSlot(N, Ops, InsertPos))
11785 return Existing;
11786
11787 // Nope it doesn't. Remove the node from its current place in the maps.
11788 if (InsertPos)
11789 if (!RemoveNodeFromCSEMaps(N))
11790 InsertPos = nullptr;
11791
11792 // Now we update the operands.
11793 for (unsigned i = 0; i != NumOps; ++i)
11794 if (N->OperandList[i] != Ops[i])
11795 N->OperandList[i].set(Ops[i]);
11796
11798 // If this gets put into a CSE map, add it.
11799 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
11800 return N;
11801}
11802
11803/// DropOperands - Release the operands and set this node to have
11804/// zero operands.
11806 // Unlike the code in MorphNodeTo that does this, we don't need to
11807 // watch for dead nodes here.
11808 for (op_iterator I = op_begin(), E = op_end(); I != E; ) {
11809 SDUse &Use = *I++;
11810 Use.set(SDValue());
11811 }
11812}
11813
11815 ArrayRef<MachineMemOperand *> NewMemRefs) {
11816 if (NewMemRefs.empty()) {
11817 N->clearMemRefs();
11818 return;
11819 }
11820
11821 // Check if we can avoid allocating by storing a single reference directly.
11822 if (NewMemRefs.size() == 1) {
11823 N->MemRefs = NewMemRefs[0];
11824 N->NumMemRefs = 1;
11825 return;
11826 }
11827
11828 MachineMemOperand **MemRefsBuffer =
11829 Allocator.template Allocate<MachineMemOperand *>(NewMemRefs.size());
11830 llvm::copy(NewMemRefs, MemRefsBuffer);
11831 N->MemRefs = MemRefsBuffer;
11832 N->NumMemRefs = static_cast<int>(NewMemRefs.size());
11833}
11834
11835/// SelectNodeTo - These are wrappers around MorphNodeTo that accept a
11836/// machine opcode.
11837///
11839 EVT VT) {
11840 SDVTList VTs = getVTList(VT);
11841 return SelectNodeTo(N, MachineOpc, VTs, {});
11842}
11843
11845 EVT VT, SDValue Op1) {
11846 SDVTList VTs = getVTList(VT);
11847 SDValue Ops[] = { Op1 };
11848 return SelectNodeTo(N, MachineOpc, VTs, Ops);
11849}
11850
11852 EVT VT, SDValue Op1,
11853 SDValue Op2) {
11854 SDVTList VTs = getVTList(VT);
11855 SDValue Ops[] = { Op1, Op2 };
11856 return SelectNodeTo(N, MachineOpc, VTs, Ops);
11857}
11858
11860 EVT VT, SDValue Op1,
11861 SDValue Op2, SDValue Op3) {
11862 SDVTList VTs = getVTList(VT);
11863 SDValue Ops[] = { Op1, Op2, Op3 };
11864 return SelectNodeTo(N, MachineOpc, VTs, Ops);
11865}
11866
11869 SDVTList VTs = getVTList(VT);
11870 return SelectNodeTo(N, MachineOpc, VTs, Ops);
11871}
11872
11874 EVT VT1, EVT VT2, ArrayRef<SDValue> Ops) {
11875 SDVTList VTs = getVTList(VT1, VT2);
11876 return SelectNodeTo(N, MachineOpc, VTs, Ops);
11877}
11878
11880 EVT VT1, EVT VT2) {
11881 SDVTList VTs = getVTList(VT1, VT2);
11882 return SelectNodeTo(N, MachineOpc, VTs, {});
11883}
11884
11886 EVT VT1, EVT VT2, EVT VT3,
11888 SDVTList VTs = getVTList(VT1, VT2, VT3);
11889 return SelectNodeTo(N, MachineOpc, VTs, Ops);
11890}
11891
11893 EVT VT1, EVT VT2,
11894 SDValue Op1, SDValue Op2) {
11895 SDVTList VTs = getVTList(VT1, VT2);
11896 SDValue Ops[] = { Op1, Op2 };
11897 return SelectNodeTo(N, MachineOpc, VTs, Ops);
11898}
11899
11902 SDNode *New = MorphNodeTo(N, ~MachineOpc, VTs, Ops);
11903 // Reset the NodeID to -1.
11904 New->setNodeId(-1);
11905 if (New != N) {
11906 ReplaceAllUsesWith(N, New);
11908 }
11909 return New;
11910}
11911
11912/// UpdateSDLocOnMergeSDNode - If the opt level is -O0 then it throws away
11913/// the line number information on the merged node since it is not possible to
11914/// preserve the information that operation is associated with multiple lines.
11915/// This will make the debugger working better at -O0, were there is a higher
11916/// probability having other instructions associated with that line.
11917///
11918/// For IROrder, we keep the smaller of the two
11919SDNode *SelectionDAG::UpdateSDLocOnMergeSDNode(SDNode *N, const SDLoc &OLoc) {
11920 DebugLoc NLoc = N->getDebugLoc();
11921 if (NLoc && OptLevel == CodeGenOptLevel::None && OLoc.getDebugLoc() != NLoc) {
11922 N->setDebugLoc(DebugLoc());
11923 }
11924 unsigned Order = std::min(N->getIROrder(), OLoc.getIROrder());
11925 N->setIROrder(Order);
11926 return N;
11927}
11928
11929/// MorphNodeTo - This *mutates* the specified node to have the specified
11930/// return type, opcode, and operands.
11931///
11932/// Note that MorphNodeTo returns the resultant node. If there is already a
11933/// node of the specified opcode and operands, it returns that node instead of
11934/// the current one. Note that the SDLoc need not be the same.
11935///
11936/// Using MorphNodeTo is faster than creating a new node and swapping it in
11937/// with ReplaceAllUsesWith both because it often avoids allocating a new
11938/// node, and because it doesn't require CSE recalculation for any of
11939/// the node's users.
11940///
11941/// However, note that MorphNodeTo recursively deletes dead nodes from the DAG.
11942/// As a consequence it isn't appropriate to use from within the DAG combiner or
11943/// the legalizer which maintain worklists that would need to be updated when
11944/// deleting things.
11947 // If an identical node already exists, use it.
11948 void *IP = nullptr;
11949 if (VTs.VTs[VTs.NumVTs-1] != MVT::Glue) {
11951 AddNodeIDNode(ID, Opc, VTs, Ops);
11952 if (SDNode *ON = FindNodeOrInsertPos(ID, SDLoc(N), IP))
11953 return UpdateSDLocOnMergeSDNode(ON, SDLoc(N));
11954 }
11955
11956 if (!RemoveNodeFromCSEMaps(N))
11957 IP = nullptr;
11958
11959 // Start the morphing.
11960 N->NodeType = Opc;
11961 N->ValueList = VTs.VTs;
11962 N->NumValues = VTs.NumVTs;
11963
11964 // Clear the operands list, updating used nodes to remove this from their
11965 // use list. Keep track of any operands that become dead as a result.
11966 SmallPtrSet<SDNode*, 16> DeadNodeSet;
11967 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
11968 SDUse &Use = *I++;
11969 SDNode *Used = Use.getNode();
11970 Use.set(SDValue());
11971 if (Used->use_empty())
11972 DeadNodeSet.insert(Used);
11973 }
11974
11975 // For MachineNode, initialize the memory references information.
11977 MN->clearMemRefs();
11978
11979 // Swap for an appropriately sized array from the recycler.
11980 removeOperands(N);
11981 createOperands(N, Ops);
11982
11983 // Delete any nodes that are still dead after adding the uses for the
11984 // new operands.
11985 if (!DeadNodeSet.empty()) {
11986 SmallVector<SDNode *, 16> DeadNodes;
11987 for (SDNode *N : DeadNodeSet)
11988 if (N->use_empty())
11989 DeadNodes.push_back(N);
11990 RemoveDeadNodes(DeadNodes);
11991 }
11992
11993 if (IP)
11994 CSEMap.InsertNode(N, IP); // Memoize the new node.
11995 return N;
11996}
11997
11999 unsigned OrigOpc = Node->getOpcode();
12000 unsigned NewOpc;
12001 switch (OrigOpc) {
12002 default:
12003 llvm_unreachable("mutateStrictFPToFP called with unexpected opcode!");
12004#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12005 case ISD::STRICT_##DAGN: NewOpc = ISD::DAGN; break;
12006#define CMP_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12007 case ISD::STRICT_##DAGN: NewOpc = ISD::SETCC; break;
12008#include "llvm/IR/ConstrainedOps.def"
12009 }
12010
12011 assert(Node->getNumValues() == 2 && "Unexpected number of results!");
12012
12013 // We're taking this node out of the chain, so we need to re-link things.
12014 SDValue InputChain = Node->getOperand(0);
12015 SDValue OutputChain = SDValue(Node, 1);
12016 ReplaceAllUsesOfValueWith(OutputChain, InputChain);
12017
12019 for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
12020 Ops.push_back(Node->getOperand(i));
12021
12022 SDVTList VTs = getVTList(Node->getValueType(0));
12023 SDNode *Res = MorphNodeTo(Node, NewOpc, VTs, Ops);
12024
12025 // MorphNodeTo can operate in two ways: if an existing node with the
12026 // specified operands exists, it can just return it. Otherwise, it
12027 // updates the node in place to have the requested operands.
12028 if (Res == Node) {
12029 // If we updated the node in place, reset the node ID. To the isel,
12030 // this should be just like a newly allocated machine node.
12031 Res->setNodeId(-1);
12032 } else {
12035 }
12036
12037 return Res;
12038}
12039
12040/// getMachineNode - These are used for target selectors to create a new node
12041/// with specified return type(s), MachineInstr opcode, and operands.
12042///
12043/// Note that getMachineNode returns the resultant node. If there is already a
12044/// node of the specified opcode and operands, it returns that node instead of
12045/// the current one.
12047 EVT VT) {
12048 SDVTList VTs = getVTList(VT);
12049 return getMachineNode(Opcode, dl, VTs, {});
12050}
12051
12053 EVT VT, SDValue Op1) {
12054 SDVTList VTs = getVTList(VT);
12055 SDValue Ops[] = { Op1 };
12056 return getMachineNode(Opcode, dl, VTs, Ops);
12057}
12058
12060 EVT VT, SDValue Op1, SDValue Op2) {
12061 SDVTList VTs = getVTList(VT);
12062 SDValue Ops[] = { Op1, Op2 };
12063 return getMachineNode(Opcode, dl, VTs, Ops);
12064}
12065
12067 EVT VT, SDValue Op1, SDValue Op2,
12068 SDValue Op3) {
12069 SDVTList VTs = getVTList(VT);
12070 SDValue Ops[] = { Op1, Op2, Op3 };
12071 return getMachineNode(Opcode, dl, VTs, Ops);
12072}
12073
12076 SDVTList VTs = getVTList(VT);
12077 return getMachineNode(Opcode, dl, VTs, Ops);
12078}
12079
12081 EVT VT1, EVT VT2, SDValue Op1,
12082 SDValue Op2) {
12083 SDVTList VTs = getVTList(VT1, VT2);
12084 SDValue Ops[] = { Op1, Op2 };
12085 return getMachineNode(Opcode, dl, VTs, Ops);
12086}
12087
12089 EVT VT1, EVT VT2, SDValue Op1,
12090 SDValue Op2, SDValue Op3) {
12091 SDVTList VTs = getVTList(VT1, VT2);
12092 SDValue Ops[] = { Op1, Op2, Op3 };
12093 return getMachineNode(Opcode, dl, VTs, Ops);
12094}
12095
12097 EVT VT1, EVT VT2,
12099 SDVTList VTs = getVTList(VT1, VT2);
12100 return getMachineNode(Opcode, dl, VTs, Ops);
12101}
12102
12104 EVT VT1, EVT VT2, EVT VT3,
12105 SDValue Op1, SDValue Op2) {
12106 SDVTList VTs = getVTList(VT1, VT2, VT3);
12107 SDValue Ops[] = { Op1, Op2 };
12108 return getMachineNode(Opcode, dl, VTs, Ops);
12109}
12110
12112 EVT VT1, EVT VT2, EVT VT3,
12113 SDValue Op1, SDValue Op2,
12114 SDValue Op3) {
12115 SDVTList VTs = getVTList(VT1, VT2, VT3);
12116 SDValue Ops[] = { Op1, Op2, Op3 };
12117 return getMachineNode(Opcode, dl, VTs, Ops);
12118}
12119
12121 EVT VT1, EVT VT2, EVT VT3,
12123 SDVTList VTs = getVTList(VT1, VT2, VT3);
12124 return getMachineNode(Opcode, dl, VTs, Ops);
12125}
12126
12128 ArrayRef<EVT> ResultTys,
12130 SDVTList VTs = getVTList(ResultTys);
12131 return getMachineNode(Opcode, dl, VTs, Ops);
12132}
12133
12135 SDVTList VTs,
12137 bool DoCSE = VTs.VTs[VTs.NumVTs-1] != MVT::Glue;
12139 void *IP = nullptr;
12140
12141 if (DoCSE) {
12143 AddNodeIDNode(ID, ~Opcode, VTs, Ops);
12144 IP = nullptr;
12145 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
12146 return cast<MachineSDNode>(UpdateSDLocOnMergeSDNode(E, DL));
12147 }
12148 }
12149
12150 // Allocate a new MachineSDNode.
12151 N = newSDNode<MachineSDNode>(~Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
12152 createOperands(N, Ops);
12153
12154 if (DoCSE)
12155 CSEMap.InsertNode(N, IP);
12156
12157 InsertNode(N);
12158 NewSDValueDbgMsg(SDValue(N, 0), "Creating new machine node: ", this);
12159 return N;
12160}
12161
12162/// getTargetExtractSubreg - A convenience function for creating
12163/// TargetOpcode::EXTRACT_SUBREG nodes.
12165 SDValue Operand) {
12166 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12167 SDNode *Subreg = getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL,
12168 VT, Operand, SRIdxVal);
12169 return SDValue(Subreg, 0);
12170}
12171
12172/// getTargetInsertSubreg - A convenience function for creating
12173/// TargetOpcode::INSERT_SUBREG nodes.
12175 SDValue Operand, SDValue Subreg) {
12176 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12177 SDNode *Result = getMachineNode(TargetOpcode::INSERT_SUBREG, DL,
12178 VT, Operand, Subreg, SRIdxVal);
12179 return SDValue(Result, 0);
12180}
12181
12182/// getNodeIfExists - Get the specified node if it's already available, or
12183/// else return NULL.
12186 bool AllowCommute) {
12187 SDNodeFlags Flags;
12188 if (Inserter)
12189 Flags = Inserter->getFlags();
12190 return getNodeIfExists(Opcode, VTList, Ops, Flags, AllowCommute);
12191}
12192
12195 const SDNodeFlags Flags,
12196 bool AllowCommute) {
12197 if (VTList.VTs[VTList.NumVTs - 1] == MVT::Glue)
12198 return nullptr;
12199
12200 auto Lookup = [&](ArrayRef<SDValue> LookupOps) -> SDNode * {
12202 AddNodeIDNode(ID, Opcode, VTList, LookupOps);
12203 void *IP = nullptr;
12204 if (SDNode *E = FindNodeOrInsertPos(ID, IP)) {
12205 E->intersectFlagsWith(Flags);
12206 return E;
12207 }
12208 return nullptr;
12209 };
12210
12211 if (SDNode *Existing = Lookup(Ops))
12212 return Existing;
12213
12214 if (AllowCommute && TLI->isCommutativeBinOp(Opcode))
12215 return Lookup({Ops[1], Ops[0]});
12216
12217 return nullptr;
12218}
12219
12220/// doesNodeExist - Check if a node exists without modifying its flags.
12221bool SelectionDAG::doesNodeExist(unsigned Opcode, SDVTList VTList,
12223 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {
12225 AddNodeIDNode(ID, Opcode, VTList, Ops);
12226 void *IP = nullptr;
12227 if (FindNodeOrInsertPos(ID, SDLoc(), IP))
12228 return true;
12229 }
12230 return false;
12231}
12232
12233/// getDbgValue - Creates a SDDbgValue node.
12234///
12235/// SDNode
12237 SDNode *N, unsigned R, bool IsIndirect,
12238 const DebugLoc &DL, unsigned O) {
12239 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12240 "Expected inlined-at fields to agree");
12241 return new (DbgInfo->getAlloc())
12242 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromNode(N, R),
12243 {}, IsIndirect, DL, O,
12244 /*IsVariadic=*/false);
12245}
12246
12247/// Constant
12249 DIExpression *Expr,
12250 const Value *C,
12251 const DebugLoc &DL, unsigned O) {
12252 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12253 "Expected inlined-at fields to agree");
12254 return new (DbgInfo->getAlloc())
12255 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromConst(C), {},
12256 /*IsIndirect=*/false, DL, O,
12257 /*IsVariadic=*/false);
12258}
12259
12260/// FrameIndex
12262 DIExpression *Expr, unsigned FI,
12263 bool IsIndirect,
12264 const DebugLoc &DL,
12265 unsigned O) {
12266 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12267 "Expected inlined-at fields to agree");
12268 return getFrameIndexDbgValue(Var, Expr, FI, {}, IsIndirect, DL, O);
12269}
12270
12271/// FrameIndex with dependencies
12273 DIExpression *Expr, unsigned FI,
12274 ArrayRef<SDNode *> Dependencies,
12275 bool IsIndirect,
12276 const DebugLoc &DL,
12277 unsigned O) {
12278 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12279 "Expected inlined-at fields to agree");
12280 return new (DbgInfo->getAlloc())
12281 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromFrameIdx(FI),
12282 Dependencies, IsIndirect, DL, O,
12283 /*IsVariadic=*/false);
12284}
12285
12286/// VReg
12288 Register VReg, bool IsIndirect,
12289 const DebugLoc &DL, unsigned O) {
12290 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12291 "Expected inlined-at fields to agree");
12292 return new (DbgInfo->getAlloc())
12293 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromVReg(VReg),
12294 {}, IsIndirect, DL, O,
12295 /*IsVariadic=*/false);
12296}
12297
12300 ArrayRef<SDNode *> Dependencies,
12301 bool IsIndirect, const DebugLoc &DL,
12302 unsigned O, bool IsVariadic) {
12303 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12304 "Expected inlined-at fields to agree");
12305 return new (DbgInfo->getAlloc())
12306 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, Locs, Dependencies, IsIndirect,
12307 DL, O, IsVariadic);
12308}
12309
12311 unsigned OffsetInBits, unsigned SizeInBits,
12312 bool InvalidateDbg) {
12313 SDNode *FromNode = From.getNode();
12314 SDNode *ToNode = To.getNode();
12315 assert(FromNode && ToNode && "Can't modify dbg values");
12316
12317 // PR35338
12318 // TODO: assert(From != To && "Redundant dbg value transfer");
12319 // TODO: assert(FromNode != ToNode && "Intranode dbg value transfer");
12320 if (From == To || FromNode == ToNode)
12321 return;
12322
12323 if (!FromNode->getHasDebugValue())
12324 return;
12325
12326 SDDbgOperand FromLocOp =
12327 SDDbgOperand::fromNode(From.getNode(), From.getResNo());
12329
12331 for (SDDbgValue *Dbg : GetDbgValues(FromNode)) {
12332 if (Dbg->isInvalidated())
12333 continue;
12334
12335 // TODO: assert(!Dbg->isInvalidated() && "Transfer of invalid dbg value");
12336
12337 // Create a new location ops vector that is equal to the old vector, but
12338 // with each instance of FromLocOp replaced with ToLocOp.
12339 bool Changed = false;
12340 auto NewLocOps = Dbg->copyLocationOps();
12341 std::replace_if(
12342 NewLocOps.begin(), NewLocOps.end(),
12343 [&Changed, FromLocOp](const SDDbgOperand &Op) {
12344 bool Match = Op == FromLocOp;
12345 Changed |= Match;
12346 return Match;
12347 },
12348 ToLocOp);
12349 // Ignore this SDDbgValue if we didn't find a matching location.
12350 if (!Changed)
12351 continue;
12352
12353 DIVariable *Var = Dbg->getVariable();
12354 auto *Expr = Dbg->getExpression();
12355 // If a fragment is requested, update the expression.
12356 if (SizeInBits) {
12357 // When splitting a larger (e.g., sign-extended) value whose
12358 // lower bits are described with an SDDbgValue, do not attempt
12359 // to transfer the SDDbgValue to the upper bits.
12360 if (auto FI = Expr->getFragmentInfo())
12361 if (OffsetInBits + SizeInBits > FI->SizeInBits)
12362 continue;
12363 auto Fragment = DIExpression::createFragmentExpression(Expr, OffsetInBits,
12364 SizeInBits);
12365 if (!Fragment)
12366 continue;
12367 Expr = *Fragment;
12368 }
12369
12370 auto AdditionalDependencies = Dbg->getAdditionalDependencies();
12371 // Clone the SDDbgValue and move it to To.
12372 SDDbgValue *Clone = getDbgValueList(
12373 Var, Expr, NewLocOps, AdditionalDependencies, Dbg->isIndirect(),
12374 Dbg->getDebugLoc(), std::max(ToNode->getIROrder(), Dbg->getOrder()),
12375 Dbg->isVariadic());
12376 ClonedDVs.push_back(Clone);
12377
12378 if (InvalidateDbg) {
12379 // Invalidate value and indicate the SDDbgValue should not be emitted.
12380 Dbg->setIsInvalidated();
12381 Dbg->setIsEmitted();
12382 }
12383 }
12384
12385 for (SDDbgValue *Dbg : ClonedDVs) {
12386 assert(is_contained(Dbg->getSDNodes(), ToNode) &&
12387 "Transferred DbgValues should depend on the new SDNode");
12388 AddDbgValue(Dbg, false);
12389 }
12390}
12391
12393 if (!N.getHasDebugValue())
12394 return;
12395
12396 auto GetLocationOperand = [](SDNode *Node, unsigned ResNo) {
12397 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(Node))
12398 return SDDbgOperand::fromFrameIdx(FISDN->getIndex());
12399 return SDDbgOperand::fromNode(Node, ResNo);
12400 };
12401
12403 for (auto *DV : GetDbgValues(&N)) {
12404 if (DV->isInvalidated())
12405 continue;
12406 switch (N.getOpcode()) {
12407 default:
12408 break;
12409 case ISD::ADD: {
12410 SDValue N0 = N.getOperand(0);
12411 SDValue N1 = N.getOperand(1);
12412 if (!isa<ConstantSDNode>(N0)) {
12413 bool RHSConstant = isa<ConstantSDNode>(N1);
12415 if (RHSConstant)
12416 Offset = N.getConstantOperandVal(1);
12417 // We are not allowed to turn indirect debug values variadic, so
12418 // don't salvage those.
12419 if (!RHSConstant && DV->isIndirect())
12420 continue;
12421
12422 // Rewrite an ADD constant node into a DIExpression. Since we are
12423 // performing arithmetic to compute the variable's *value* in the
12424 // DIExpression, we need to mark the expression with a
12425 // DW_OP_stack_value.
12426 auto *DIExpr = DV->getExpression();
12427 auto NewLocOps = DV->copyLocationOps();
12428 bool Changed = false;
12429 size_t OrigLocOpsSize = NewLocOps.size();
12430 for (size_t i = 0; i < OrigLocOpsSize; ++i) {
12431 // We're not given a ResNo to compare against because the whole
12432 // node is going away. We know that any ISD::ADD only has one
12433 // result, so we can assume any node match is using the result.
12434 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
12435 NewLocOps[i].getSDNode() != &N)
12436 continue;
12437 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
12438 if (RHSConstant) {
12441 DIExpr = DIExpression::appendOpsToArg(DIExpr, ExprOps, i, true);
12442 } else {
12443 // Convert to a variadic expression (if not already).
12444 // convertToVariadicExpression() returns a const pointer, so we use
12445 // a temporary const variable here.
12446 const auto *TmpDIExpr =
12450 ExprOps.push_back(NewLocOps.size());
12451 ExprOps.push_back(dwarf::DW_OP_plus);
12452 SDDbgOperand RHS =
12454 NewLocOps.push_back(RHS);
12455 DIExpr = DIExpression::appendOpsToArg(TmpDIExpr, ExprOps, i, true);
12456 }
12457 Changed = true;
12458 }
12459 (void)Changed;
12460 assert(Changed && "Salvage target doesn't use N");
12461
12462 bool IsVariadic =
12463 DV->isVariadic() || OrigLocOpsSize != NewLocOps.size();
12464
12465 auto AdditionalDependencies = DV->getAdditionalDependencies();
12466 SDDbgValue *Clone = getDbgValueList(
12467 DV->getVariable(), DIExpr, NewLocOps, AdditionalDependencies,
12468 DV->isIndirect(), DV->getDebugLoc(), DV->getOrder(), IsVariadic);
12469 ClonedDVs.push_back(Clone);
12470 DV->setIsInvalidated();
12471 DV->setIsEmitted();
12472 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting";
12473 N0.getNode()->dumprFull(this);
12474 dbgs() << " into " << *DIExpr << '\n');
12475 }
12476 break;
12477 }
12478 case ISD::TRUNCATE: {
12479 SDValue N0 = N.getOperand(0);
12480 TypeSize FromSize = N0.getValueSizeInBits();
12481 TypeSize ToSize = N.getValueSizeInBits(0);
12482
12483 DIExpression *DbgExpression = DV->getExpression();
12484 auto ExtOps = DIExpression::getExtOps(FromSize, ToSize, false);
12485 auto NewLocOps = DV->copyLocationOps();
12486 bool Changed = false;
12487 for (size_t i = 0; i < NewLocOps.size(); ++i) {
12488 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
12489 NewLocOps[i].getSDNode() != &N)
12490 continue;
12491
12492 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
12493 DbgExpression = DIExpression::appendOpsToArg(DbgExpression, ExtOps, i);
12494 Changed = true;
12495 }
12496 assert(Changed && "Salvage target doesn't use N");
12497 (void)Changed;
12498
12499 SDDbgValue *Clone =
12500 getDbgValueList(DV->getVariable(), DbgExpression, NewLocOps,
12501 DV->getAdditionalDependencies(), DV->isIndirect(),
12502 DV->getDebugLoc(), DV->getOrder(), DV->isVariadic());
12503
12504 ClonedDVs.push_back(Clone);
12505 DV->setIsInvalidated();
12506 DV->setIsEmitted();
12507 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting"; N0.getNode()->dumprFull(this);
12508 dbgs() << " into " << *DbgExpression << '\n');
12509 break;
12510 }
12511 }
12512 }
12513
12514 for (SDDbgValue *Dbg : ClonedDVs) {
12515 assert((!Dbg->getSDNodes().empty() ||
12516 llvm::any_of(Dbg->getLocationOps(),
12517 [&](const SDDbgOperand &Op) {
12518 return Op.getKind() == SDDbgOperand::FRAMEIX;
12519 })) &&
12520 "Salvaged DbgValue should depend on a new SDNode");
12521 AddDbgValue(Dbg, false);
12522 }
12523}
12524
12525/// Creates a SDDbgLabel node.
12527 const DebugLoc &DL, unsigned O) {
12528 assert(cast<DILabel>(Label)->isValidLocationForIntrinsic(DL) &&
12529 "Expected inlined-at fields to agree");
12530 return new (DbgInfo->getAlloc()) SDDbgLabel(Label, DL, O);
12531}
12532
12533namespace {
12534
12535/// RAUWUpdateListener - Helper for ReplaceAllUsesWith - When the node
12536/// pointed to by a use iterator is deleted, increment the use iterator
12537/// so that it doesn't dangle.
12538///
12539class RAUWUpdateListener : public SelectionDAG::DAGUpdateListener {
12542
12543 void NodeDeleted(SDNode *N, SDNode *E) override {
12544 // Increment the iterator as needed.
12545 while (UI != UE && N == UI->getUser())
12546 ++UI;
12547 }
12548
12549public:
12550 RAUWUpdateListener(SelectionDAG &d,
12553 : SelectionDAG::DAGUpdateListener(d), UI(ui), UE(ue) {}
12554};
12555
12556} // end anonymous namespace
12557
12558/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
12559/// This can cause recursive merging of nodes in the DAG.
12560///
12561/// This version assumes From has a single result value.
12562///
12564 SDNode *From = FromN.getNode();
12565 assert(From->getNumValues() == 1 && FromN.getResNo() == 0 &&
12566 "Cannot replace with this method!");
12567 assert(From != To.getNode() && "Cannot replace uses of with self");
12568
12569 // Preserve Debug Values
12570 transferDbgValues(FromN, To);
12571 // Preserve extra info.
12572 copyExtraInfo(From, To.getNode());
12573
12574 // Iterate over all the existing uses of From. New uses will be added
12575 // to the beginning of the use list, which we avoid visiting.
12576 // This specifically avoids visiting uses of From that arise while the
12577 // replacement is happening, because any such uses would be the result
12578 // of CSE: If an existing node looks like From after one of its operands
12579 // is replaced by To, we don't want to replace of all its users with To
12580 // too. See PR3018 for more info.
12581 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
12582 RAUWUpdateListener Listener(*this, UI, UE);
12583 while (UI != UE) {
12584 SDNode *User = UI->getUser();
12585
12586 // This node is about to morph, remove its old self from the CSE maps.
12587 RemoveNodeFromCSEMaps(User);
12588
12589 // A user can appear in a use list multiple times, and when this
12590 // happens the uses are usually next to each other in the list.
12591 // To help reduce the number of CSE recomputations, process all
12592 // the uses of this user that we can find this way.
12593 do {
12594 SDUse &Use = *UI;
12595 ++UI;
12596 Use.set(To);
12597 if (To->isDivergent() != From->isDivergent())
12599 } while (UI != UE && UI->getUser() == User);
12600 // Now that we have modified User, add it back to the CSE maps. If it
12601 // already exists there, recursively merge the results together.
12602 AddModifiedNodeToCSEMaps(User);
12603 }
12604
12605 // If we just RAUW'd the root, take note.
12606 if (FromN == getRoot())
12607 setRoot(To);
12608}
12609
12610/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
12611/// This can cause recursive merging of nodes in the DAG.
12612///
12613/// This version assumes that for each value of From, there is a
12614/// corresponding value in To in the same position with the same type.
12615///
12617#ifndef NDEBUG
12618 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
12619 assert((!From->hasAnyUseOfValue(i) ||
12620 From->getValueType(i) == To->getValueType(i)) &&
12621 "Cannot use this version of ReplaceAllUsesWith!");
12622#endif
12623
12624 // Handle the trivial case.
12625 if (From == To)
12626 return;
12627
12628 // Preserve Debug Info. Only do this if there's a use.
12629 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
12630 if (From->hasAnyUseOfValue(i)) {
12631 assert((i < To->getNumValues()) && "Invalid To location");
12632 transferDbgValues(SDValue(From, i), SDValue(To, i));
12633 }
12634 // Preserve extra info.
12635 copyExtraInfo(From, To);
12636
12637 // Iterate over just the existing users of From. See the comments in
12638 // the ReplaceAllUsesWith above.
12639 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
12640 RAUWUpdateListener Listener(*this, UI, UE);
12641 while (UI != UE) {
12642 SDNode *User = UI->getUser();
12643
12644 // This node is about to morph, remove its old self from the CSE maps.
12645 RemoveNodeFromCSEMaps(User);
12646
12647 // A user can appear in a use list multiple times, and when this
12648 // happens the uses are usually next to each other in the list.
12649 // To help reduce the number of CSE recomputations, process all
12650 // the uses of this user that we can find this way.
12651 do {
12652 SDUse &Use = *UI;
12653 ++UI;
12654 Use.setNode(To);
12655 if (To->isDivergent() != From->isDivergent())
12657 } while (UI != UE && UI->getUser() == User);
12658
12659 // Now that we have modified User, add it back to the CSE maps. If it
12660 // already exists there, recursively merge the results together.
12661 AddModifiedNodeToCSEMaps(User);
12662 }
12663
12664 // If we just RAUW'd the root, take note.
12665 if (From == getRoot().getNode())
12666 setRoot(SDValue(To, getRoot().getResNo()));
12667}
12668
12669/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
12670/// This can cause recursive merging of nodes in the DAG.
12671///
12672/// This version can replace From with any result values. To must match the
12673/// number and types of values returned by From.
12675 if (From->getNumValues() == 1) // Handle the simple case efficiently.
12676 return ReplaceAllUsesWith(SDValue(From, 0), To[0]);
12677
12678 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) {
12679 // Preserve Debug Info.
12680 transferDbgValues(SDValue(From, i), To[i]);
12681 // Preserve extra info.
12682 copyExtraInfo(From, To[i].getNode());
12683 }
12684
12685 // Iterate over just the existing users of From. See the comments in
12686 // the ReplaceAllUsesWith above.
12687 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
12688 RAUWUpdateListener Listener(*this, UI, UE);
12689 while (UI != UE) {
12690 SDNode *User = UI->getUser();
12691
12692 // This node is about to morph, remove its old self from the CSE maps.
12693 RemoveNodeFromCSEMaps(User);
12694
12695 // A user can appear in a use list multiple times, and when this happens the
12696 // uses are usually next to each other in the list. To help reduce the
12697 // number of CSE and divergence recomputations, process all the uses of this
12698 // user that we can find this way.
12699 bool To_IsDivergent = false;
12700 do {
12701 SDUse &Use = *UI;
12702 const SDValue &ToOp = To[Use.getResNo()];
12703 ++UI;
12704 Use.set(ToOp);
12705 if (ToOp.getValueType() != MVT::Other)
12706 To_IsDivergent |= ToOp->isDivergent();
12707 } while (UI != UE && UI->getUser() == User);
12708
12709 if (To_IsDivergent != From->isDivergent())
12711
12712 // Now that we have modified User, add it back to the CSE maps. If it
12713 // already exists there, recursively merge the results together.
12714 AddModifiedNodeToCSEMaps(User);
12715 }
12716
12717 // If we just RAUW'd the root, take note.
12718 if (From == getRoot().getNode())
12719 setRoot(SDValue(To[getRoot().getResNo()]));
12720}
12721
12722/// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
12723/// uses of other values produced by From.getNode() alone. The Deleted
12724/// vector is handled the same way as for ReplaceAllUsesWith.
12726 // Handle the really simple, really trivial case efficiently.
12727 if (From == To) return;
12728
12729 // Handle the simple, trivial, case efficiently.
12730 if (From.getNode()->getNumValues() == 1) {
12731 ReplaceAllUsesWith(From, To);
12732 return;
12733 }
12734
12735 // Preserve Debug Info.
12736 transferDbgValues(From, To);
12737 copyExtraInfo(From.getNode(), To.getNode());
12738
12739 // Iterate over just the existing users of From. See the comments in
12740 // the ReplaceAllUsesWith above.
12741 SDNode::use_iterator UI = From.getNode()->use_begin(),
12742 UE = From.getNode()->use_end();
12743 RAUWUpdateListener Listener(*this, UI, UE);
12744 while (UI != UE) {
12745 SDNode *User = UI->getUser();
12746 bool UserRemovedFromCSEMaps = false;
12747
12748 // A user can appear in a use list multiple times, and when this
12749 // happens the uses are usually next to each other in the list.
12750 // To help reduce the number of CSE recomputations, process all
12751 // the uses of this user that we can find this way.
12752 do {
12753 SDUse &Use = *UI;
12754
12755 // Skip uses of different values from the same node.
12756 if (Use.getResNo() != From.getResNo()) {
12757 ++UI;
12758 continue;
12759 }
12760
12761 // If this node hasn't been modified yet, it's still in the CSE maps,
12762 // so remove its old self from the CSE maps.
12763 if (!UserRemovedFromCSEMaps) {
12764 RemoveNodeFromCSEMaps(User);
12765 UserRemovedFromCSEMaps = true;
12766 }
12767
12768 ++UI;
12769 Use.set(To);
12770 if (To->isDivergent() != From->isDivergent())
12772 } while (UI != UE && UI->getUser() == User);
12773 // We are iterating over all uses of the From node, so if a use
12774 // doesn't use the specific value, no changes are made.
12775 if (!UserRemovedFromCSEMaps)
12776 continue;
12777
12778 // Now that we have modified User, add it back to the CSE maps. If it
12779 // already exists there, recursively merge the results together.
12780 AddModifiedNodeToCSEMaps(User);
12781 }
12782
12783 // If we just RAUW'd the root, take note.
12784 if (From == getRoot())
12785 setRoot(To);
12786}
12787
12788namespace {
12789
12790/// UseMemo - This class is used by SelectionDAG::ReplaceAllUsesOfValuesWith
12791/// to record information about a use.
12792struct UseMemo {
12793 SDNode *User;
12794 unsigned Index;
12795 SDUse *Use;
12796};
12797
12798/// operator< - Sort Memos by User.
12799bool operator<(const UseMemo &L, const UseMemo &R) {
12800 return (intptr_t)L.User < (intptr_t)R.User;
12801}
12802
12803/// RAUOVWUpdateListener - Helper for ReplaceAllUsesOfValuesWith - When the node
12804/// pointed to by a UseMemo is deleted, set the User to nullptr to indicate that
12805/// the node already has been taken care of recursively.
12806class RAUOVWUpdateListener : public SelectionDAG::DAGUpdateListener {
12807 SmallVectorImpl<UseMemo> &Uses;
12808
12809 void NodeDeleted(SDNode *N, SDNode *E) override {
12810 for (UseMemo &Memo : Uses)
12811 if (Memo.User == N)
12812 Memo.User = nullptr;
12813 }
12814
12815public:
12816 RAUOVWUpdateListener(SelectionDAG &d, SmallVectorImpl<UseMemo> &uses)
12817 : SelectionDAG::DAGUpdateListener(d), Uses(uses) {}
12818};
12819
12820} // end anonymous namespace
12821
12822/// Return true if a glue output should propagate divergence information.
12824 switch (Node->getOpcode()) {
12825 case ISD::CopyFromReg:
12826 case ISD::CopyToReg:
12827 return false;
12828 default:
12829 return true;
12830 }
12831
12832 llvm_unreachable("covered opcode switch");
12833}
12834
12836 if (TLI->isSDNodeAlwaysUniform(N)) {
12837 assert(!TLI->isSDNodeSourceOfDivergence(N, FLI, UA) &&
12838 "Conflicting divergence information!");
12839 return false;
12840 }
12841 if (TLI->isSDNodeSourceOfDivergence(N, FLI, UA))
12842 return true;
12843 for (const auto &Op : N->ops()) {
12844 EVT VT = Op.getValueType();
12845
12846 // Skip Chain. It does not carry divergence.
12847 if (VT != MVT::Other && Op.getNode()->isDivergent() &&
12848 (VT != MVT::Glue || gluePropagatesDivergence(Op.getNode())))
12849 return true;
12850 }
12851 return false;
12852}
12853
12855 SmallVector<SDNode *, 16> Worklist(1, N);
12856 do {
12857 N = Worklist.pop_back_val();
12858 bool IsDivergent = calculateDivergence(N);
12859 if (N->SDNodeBits.IsDivergent != IsDivergent) {
12860 N->SDNodeBits.IsDivergent = IsDivergent;
12861 llvm::append_range(Worklist, N->users());
12862 }
12863 } while (!Worklist.empty());
12864}
12865
12866void SelectionDAG::CreateTopologicalOrder(std::vector<SDNode *> &Order) {
12868 Order.reserve(AllNodes.size());
12869 for (auto &N : allnodes()) {
12870 unsigned NOps = N.getNumOperands();
12871 Degree[&N] = NOps;
12872 if (0 == NOps)
12873 Order.push_back(&N);
12874 }
12875 for (size_t I = 0; I != Order.size(); ++I) {
12876 SDNode *N = Order[I];
12877 for (auto *U : N->users()) {
12878 unsigned &UnsortedOps = Degree[U];
12879 if (0 == --UnsortedOps)
12880 Order.push_back(U);
12881 }
12882 }
12883}
12884
12885#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
12886void SelectionDAG::VerifyDAGDivergence() {
12887 std::vector<SDNode *> TopoOrder;
12888 CreateTopologicalOrder(TopoOrder);
12889 for (auto *N : TopoOrder) {
12890 assert(calculateDivergence(N) == N->isDivergent() &&
12891 "Divergence bit inconsistency detected");
12892 }
12893}
12894#endif
12895
12896/// ReplaceAllUsesOfValuesWith - Replace any uses of From with To, leaving
12897/// uses of other values produced by From.getNode() alone. The same value
12898/// may appear in both the From and To list. The Deleted vector is
12899/// handled the same way as for ReplaceAllUsesWith.
12901 const SDValue *To,
12902 unsigned Num){
12903 // Handle the simple, trivial case efficiently.
12904 if (Num == 1)
12905 return ReplaceAllUsesOfValueWith(*From, *To);
12906
12907 transferDbgValues(*From, *To);
12908 copyExtraInfo(From->getNode(), To->getNode());
12909
12910 // Read up all the uses and make records of them. This helps
12911 // processing new uses that are introduced during the
12912 // replacement process.
12914 for (unsigned i = 0; i != Num; ++i) {
12915 unsigned FromResNo = From[i].getResNo();
12916 SDNode *FromNode = From[i].getNode();
12917 for (SDUse &Use : FromNode->uses()) {
12918 if (Use.getResNo() == FromResNo) {
12919 UseMemo Memo = {Use.getUser(), i, &Use};
12920 Uses.push_back(Memo);
12921 }
12922 }
12923 }
12924
12925 // Sort the uses, so that all the uses from a given User are together.
12927 RAUOVWUpdateListener Listener(*this, Uses);
12928
12929 for (unsigned UseIndex = 0, UseIndexEnd = Uses.size();
12930 UseIndex != UseIndexEnd; ) {
12931 // We know that this user uses some value of From. If it is the right
12932 // value, update it.
12933 SDNode *User = Uses[UseIndex].User;
12934 // If the node has been deleted by recursive CSE updates when updating
12935 // another node, then just skip this entry.
12936 if (User == nullptr) {
12937 ++UseIndex;
12938 continue;
12939 }
12940
12941 // This node is about to morph, remove its old self from the CSE maps.
12942 RemoveNodeFromCSEMaps(User);
12943
12944 // The Uses array is sorted, so all the uses for a given User
12945 // are next to each other in the list.
12946 // To help reduce the number of CSE recomputations, process all
12947 // the uses of this user that we can find this way.
12948 do {
12949 unsigned i = Uses[UseIndex].Index;
12950 SDUse &Use = *Uses[UseIndex].Use;
12951 ++UseIndex;
12952
12953 Use.set(To[i]);
12954 } while (UseIndex != UseIndexEnd && Uses[UseIndex].User == User);
12955
12956 // Now that we have modified User, add it back to the CSE maps. If it
12957 // already exists there, recursively merge the results together.
12958 AddModifiedNodeToCSEMaps(User);
12959 }
12960}
12961
12962/// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
12963/// based on their topological order. It returns the maximum id and a vector
12964/// of the SDNodes* in assigned order by reference.
12966 unsigned DAGSize = 0;
12967
12968 // SortedPos tracks the progress of the algorithm. Nodes before it are
12969 // sorted, nodes after it are unsorted. When the algorithm completes
12970 // it is at the end of the list.
12971 allnodes_iterator SortedPos = allnodes_begin();
12972
12973 // Visit all the nodes. Move nodes with no operands to the front of
12974 // the list immediately. Annotate nodes that do have operands with their
12975 // operand count. Before we do this, the Node Id fields of the nodes
12976 // may contain arbitrary values. After, the Node Id fields for nodes
12977 // before SortedPos will contain the topological sort index, and the
12978 // Node Id fields for nodes At SortedPos and after will contain the
12979 // count of outstanding operands.
12981 checkForCycles(&N, this);
12982 unsigned Degree = N.getNumOperands();
12983 if (Degree == 0) {
12984 // A node with no uses, add it to the result array immediately.
12985 N.setNodeId(DAGSize++);
12986 allnodes_iterator Q(&N);
12987 if (Q != SortedPos)
12988 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(Q));
12989 assert(SortedPos != AllNodes.end() && "Overran node list");
12990 ++SortedPos;
12991 } else {
12992 // Temporarily use the Node Id as scratch space for the degree count.
12993 N.setNodeId(Degree);
12994 }
12995 }
12996
12997 // Visit all the nodes. As we iterate, move nodes into sorted order,
12998 // such that by the time the end is reached all nodes will be sorted.
12999 for (SDNode &Node : allnodes()) {
13000 SDNode *N = &Node;
13001 checkForCycles(N, this);
13002 // N is in sorted position, so all its uses have one less operand
13003 // that needs to be sorted.
13004 for (SDNode *P : N->users()) {
13005 unsigned Degree = P->getNodeId();
13006 assert(Degree != 0 && "Invalid node degree");
13007 --Degree;
13008 if (Degree == 0) {
13009 // All of P's operands are sorted, so P may sorted now.
13010 P->setNodeId(DAGSize++);
13011 if (P->getIterator() != SortedPos)
13012 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(P));
13013 assert(SortedPos != AllNodes.end() && "Overran node list");
13014 ++SortedPos;
13015 } else {
13016 // Update P's outstanding operand count.
13017 P->setNodeId(Degree);
13018 }
13019 }
13020 if (Node.getIterator() == SortedPos) {
13021#ifndef NDEBUG
13023 SDNode *S = &*++I;
13024 dbgs() << "Overran sorted position:\n";
13025 S->dumprFull(this); dbgs() << "\n";
13026 dbgs() << "Checking if this is due to cycles\n";
13027 checkForCycles(this, true);
13028#endif
13029 llvm_unreachable(nullptr);
13030 }
13031 }
13032
13033 assert(SortedPos == AllNodes.end() &&
13034 "Topological sort incomplete!");
13035 assert(AllNodes.front().getOpcode() == ISD::EntryToken &&
13036 "First node in topological sort is not the entry token!");
13037 assert(AllNodes.front().getNodeId() == 0 &&
13038 "First node in topological sort has non-zero id!");
13039 assert(AllNodes.front().getNumOperands() == 0 &&
13040 "First node in topological sort has operands!");
13041 assert(AllNodes.back().getNodeId() == (int)DAGSize-1 &&
13042 "Last node in topologic sort has unexpected id!");
13043 assert(AllNodes.back().use_empty() &&
13044 "Last node in topologic sort has users!");
13045 assert(DAGSize == allnodes_size() && "Node count mismatch!");
13046 return DAGSize;
13047}
13048
13050 SmallVectorImpl<const SDNode *> &SortedNodes) const {
13051 SortedNodes.clear();
13052 // Node -> remaining number of outstanding operands.
13053 DenseMap<const SDNode *, unsigned> RemainingOperands;
13054
13055 // Put nodes without any operands into SortedNodes first.
13056 for (const SDNode &N : allnodes()) {
13057 checkForCycles(&N, this);
13058 unsigned NumOperands = N.getNumOperands();
13059 if (NumOperands == 0)
13060 SortedNodes.push_back(&N);
13061 else
13062 // Record their total number of outstanding operands.
13063 RemainingOperands[&N] = NumOperands;
13064 }
13065
13066 // A node is pushed into SortedNodes when all of its operands (predecessors in
13067 // the graph) are also in SortedNodes.
13068 for (unsigned i = 0U; i < SortedNodes.size(); ++i) {
13069 const SDNode *N = SortedNodes[i];
13070 for (const SDNode *U : N->users()) {
13071 // HandleSDNode is never part of a DAG and therefore has no entry in
13072 // RemainingOperands.
13073 if (U->getOpcode() == ISD::HANDLENODE)
13074 continue;
13075 unsigned &NumRemOperands = RemainingOperands[U];
13076 assert(NumRemOperands && "Invalid number of remaining operands");
13077 --NumRemOperands;
13078 if (!NumRemOperands)
13079 SortedNodes.push_back(U);
13080 }
13081 }
13082
13083 assert(SortedNodes.size() == AllNodes.size() && "Node count mismatch");
13084 assert(SortedNodes.front()->getOpcode() == ISD::EntryToken &&
13085 "First node in topological sort is not the entry token");
13086 assert(SortedNodes.front()->getNumOperands() == 0 &&
13087 "First node in topological sort has operands");
13088}
13089
13090/// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the
13091/// value is produced by SD.
13092void SelectionDAG::AddDbgValue(SDDbgValue *DB, bool isParameter) {
13093 for (SDNode *SD : DB->getSDNodes()) {
13094 if (!SD)
13095 continue;
13096 assert(DbgInfo->getSDDbgValues(SD).empty() || SD->getHasDebugValue());
13097 SD->setHasDebugValue(true);
13098 }
13099 DbgInfo->add(DB, isParameter);
13100}
13101
13102void SelectionDAG::AddDbgLabel(SDDbgLabel *DB) { DbgInfo->add(DB); }
13103
13105 SDValue NewMemOpChain) {
13106 assert(isa<MemSDNode>(NewMemOpChain) && "Expected a memop node");
13107 assert(NewMemOpChain.getValueType() == MVT::Other && "Expected a token VT");
13108 // The new memory operation must have the same position as the old load in
13109 // terms of memory dependency. Create a TokenFactor for the old load and new
13110 // memory operation and update uses of the old load's output chain to use that
13111 // TokenFactor.
13112 if (OldChain == NewMemOpChain || OldChain.use_empty())
13113 return NewMemOpChain;
13114
13115 SDValue TokenFactor = getNode(ISD::TokenFactor, SDLoc(OldChain), MVT::Other,
13116 OldChain, NewMemOpChain);
13117 ReplaceAllUsesOfValueWith(OldChain, TokenFactor);
13118 UpdateNodeOperands(TokenFactor.getNode(), OldChain, NewMemOpChain);
13119 return TokenFactor;
13120}
13121
13123 SDValue NewMemOp) {
13124 assert(isa<MemSDNode>(NewMemOp.getNode()) && "Expected a memop node");
13125 SDValue OldChain = SDValue(OldLoad, 1);
13126 SDValue NewMemOpChain = NewMemOp.getValue(1);
13127 return makeEquivalentMemoryOrdering(OldChain, NewMemOpChain);
13128}
13129
13131 Function **OutFunction) {
13132 assert(isa<ExternalSymbolSDNode>(Op) && "Node should be an ExternalSymbol");
13133
13134 auto *Symbol = cast<ExternalSymbolSDNode>(Op)->getSymbol();
13135 auto *Module = MF->getFunction().getParent();
13136 auto *Function = Module->getFunction(Symbol);
13137
13138 if (OutFunction != nullptr)
13139 *OutFunction = Function;
13140
13141 if (Function != nullptr) {
13142 auto PtrTy = TLI->getPointerTy(getDataLayout(), Function->getAddressSpace());
13143 return getGlobalAddress(Function, SDLoc(Op), PtrTy);
13144 }
13145
13146 std::string ErrorStr;
13147 raw_string_ostream ErrorFormatter(ErrorStr);
13148 ErrorFormatter << "Undefined external symbol ";
13149 ErrorFormatter << '"' << Symbol << '"';
13150 report_fatal_error(Twine(ErrorStr));
13151}
13152
13153//===----------------------------------------------------------------------===//
13154// SDNode Class
13155//===----------------------------------------------------------------------===//
13156
13159 return Const != nullptr && Const->isZero();
13160}
13161
13163 return V.isUndef() || isNullConstant(V);
13164}
13165
13168 return Const != nullptr && Const->isZero() && !Const->isNegative();
13169}
13170
13173 return Const != nullptr && Const->isAllOnes();
13174}
13175
13178 return Const != nullptr && Const->isOne();
13179}
13180
13183 return Const != nullptr && Const->isMinSignedValue();
13184}
13185
13186bool llvm::isNeutralConstant(unsigned Opcode, SDNodeFlags Flags, SDValue V,
13187 unsigned OperandNo) {
13188 // NOTE: The cases should match with IR's ConstantExpr::getBinOpIdentity().
13189 // TODO: Target-specific opcodes could be added.
13190 if (auto *ConstV = isConstOrConstSplat(V, /*AllowUndefs*/ false,
13191 /*AllowTruncation*/ true)) {
13192 APInt Const = ConstV->getAPIntValue().trunc(V.getScalarValueSizeInBits());
13193 switch (Opcode) {
13194 case ISD::ADD:
13195 case ISD::OR:
13196 case ISD::XOR:
13197 case ISD::UMAX:
13198 return Const.isZero();
13199 case ISD::MUL:
13200 return Const.isOne();
13201 case ISD::AND:
13202 case ISD::UMIN:
13203 return Const.isAllOnes();
13204 case ISD::SMAX:
13205 return Const.isMinSignedValue();
13206 case ISD::SMIN:
13207 return Const.isMaxSignedValue();
13208 case ISD::SUB:
13209 case ISD::SHL:
13210 case ISD::SRA:
13211 case ISD::SRL:
13212 return OperandNo == 1 && Const.isZero();
13213 case ISD::UDIV:
13214 case ISD::SDIV:
13215 return OperandNo == 1 && Const.isOne();
13216 }
13217 } else if (auto *ConstFP = isConstOrConstSplatFP(V)) {
13218 switch (Opcode) {
13219 case ISD::FADD:
13220 return ConstFP->isZero() &&
13221 (Flags.hasNoSignedZeros() || ConstFP->isNegative());
13222 case ISD::FSUB:
13223 return OperandNo == 1 && ConstFP->isZero() &&
13224 (Flags.hasNoSignedZeros() || !ConstFP->isNegative());
13225 case ISD::FMUL:
13226 return ConstFP->isExactlyValue(1.0);
13227 case ISD::FDIV:
13228 return OperandNo == 1 && ConstFP->isExactlyValue(1.0);
13229 case ISD::FMINNUM:
13230 case ISD::FMAXNUM: {
13231 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
13232 EVT VT = V.getValueType();
13233 const fltSemantics &Semantics = VT.getFltSemantics();
13234 APFloat NeutralAF = !Flags.hasNoNaNs()
13235 ? APFloat::getQNaN(Semantics)
13236 : !Flags.hasNoInfs()
13237 ? APFloat::getInf(Semantics)
13238 : APFloat::getLargest(Semantics);
13239 if (Opcode == ISD::FMAXNUM)
13240 NeutralAF.changeSign();
13241
13242 return ConstFP->isExactlyValue(NeutralAF);
13243 }
13244 }
13245 }
13246 return false;
13247}
13248
13250 while (V.getOpcode() == ISD::BITCAST)
13251 V = V.getOperand(0);
13252 return V;
13253}
13254
13256 while (V.getOpcode() == ISD::BITCAST && V.getOperand(0).hasOneUse())
13257 V = V.getOperand(0);
13258 return V;
13259}
13260
13262 while (V.getOpcode() == ISD::EXTRACT_SUBVECTOR)
13263 V = V.getOperand(0);
13264 return V;
13265}
13266
13268 while (V.getOpcode() == ISD::INSERT_VECTOR_ELT) {
13269 SDValue InVec = V.getOperand(0);
13270 SDValue EltNo = V.getOperand(2);
13271 EVT VT = InVec.getValueType();
13272 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
13273 if (IndexC && VT.isFixedLengthVector() &&
13274 IndexC->getAPIntValue().ult(VT.getVectorNumElements()) &&
13275 !DemandedElts[IndexC->getZExtValue()]) {
13276 V = InVec;
13277 continue;
13278 }
13279 break;
13280 }
13281 return V;
13282}
13283
13285 while (V.getOpcode() == ISD::TRUNCATE)
13286 V = V.getOperand(0);
13287 return V;
13288}
13289
13290bool llvm::isBitwiseNot(SDValue V, bool AllowUndefs) {
13291 if (V.getOpcode() != ISD::XOR)
13292 return false;
13293 V = peekThroughBitcasts(V.getOperand(1));
13294 unsigned NumBits = V.getScalarValueSizeInBits();
13295 ConstantSDNode *C =
13296 isConstOrConstSplat(V, AllowUndefs, /*AllowTruncation*/ true);
13297 return C && (C->getAPIntValue().countr_one() >= NumBits);
13298}
13299
13301 bool AllowTruncation) {
13302 EVT VT = N.getValueType();
13303 APInt DemandedElts = VT.isFixedLengthVector()
13305 : APInt(1, 1);
13306 return isConstOrConstSplat(N, DemandedElts, AllowUndefs, AllowTruncation);
13307}
13308
13310 bool AllowUndefs,
13311 bool AllowTruncation) {
13313 return CN;
13314
13315 // SplatVectors can truncate their operands. Ignore that case here unless
13316 // AllowTruncation is set.
13317 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
13318 EVT VecEltVT = N->getValueType(0).getVectorElementType();
13319 if (auto *CN = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
13320 EVT CVT = CN->getValueType(0);
13321 assert(CVT.bitsGE(VecEltVT) && "Illegal splat_vector element extension");
13322 if (AllowTruncation || CVT == VecEltVT)
13323 return CN;
13324 }
13325 }
13326
13328 BitVector UndefElements;
13329 ConstantSDNode *CN = BV->getConstantSplatNode(DemandedElts, &UndefElements);
13330
13331 // BuildVectors can truncate their operands. Ignore that case here unless
13332 // AllowTruncation is set.
13333 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13334 if (CN && (UndefElements.none() || AllowUndefs)) {
13335 EVT CVT = CN->getValueType(0);
13336 EVT NSVT = N.getValueType().getScalarType();
13337 assert(CVT.bitsGE(NSVT) && "Illegal build vector element extension");
13338 if (AllowTruncation || (CVT == NSVT))
13339 return CN;
13340 }
13341 }
13342
13343 return nullptr;
13344}
13345
13347 EVT VT = N.getValueType();
13348 APInt DemandedElts = VT.isFixedLengthVector()
13350 : APInt(1, 1);
13351 return isConstOrConstSplatFP(N, DemandedElts, AllowUndefs);
13352}
13353
13355 const APInt &DemandedElts,
13356 bool AllowUndefs) {
13358 return CN;
13359
13361 BitVector UndefElements;
13362 ConstantFPSDNode *CN =
13363 BV->getConstantFPSplatNode(DemandedElts, &UndefElements);
13364 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13365 if (CN && (UndefElements.none() || AllowUndefs))
13366 return CN;
13367 }
13368
13369 if (N.getOpcode() == ISD::SPLAT_VECTOR)
13370 if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N.getOperand(0)))
13371 return CN;
13372
13373 return nullptr;
13374}
13375
13376bool llvm::isNullOrNullSplat(SDValue N, bool AllowUndefs) {
13377 // TODO: may want to use peekThroughBitcast() here.
13378 ConstantSDNode *C =
13379 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
13380 return C && C->isZero();
13381}
13382
13383bool llvm::isOneOrOneSplat(SDValue N, bool AllowUndefs) {
13384 ConstantSDNode *C =
13385 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation*/ true);
13386 return C && C->isOne();
13387}
13388
13389bool llvm::isOneOrOneSplatFP(SDValue N, bool AllowUndefs) {
13390 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13391 return C && C->isExactlyValue(1.0);
13392}
13393
13394bool llvm::isAllOnesOrAllOnesSplat(SDValue N, bool AllowUndefs) {
13396 unsigned BitWidth = N.getScalarValueSizeInBits();
13397 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs);
13398 return C && C->isAllOnes() && C->getValueSizeInBits(0) == BitWidth;
13399}
13400
13401bool llvm::isOnesOrOnesSplat(SDValue N, bool AllowUndefs) {
13402 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs);
13403 return C && APInt::isSameValue(C->getAPIntValue(),
13404 APInt(C->getAPIntValue().getBitWidth(), 1));
13405}
13406
13407bool llvm::isZeroOrZeroSplat(SDValue N, bool AllowUndefs) {
13409 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs, true);
13410 return C && C->isZero();
13411}
13412
13413bool llvm::isZeroOrZeroSplatFP(SDValue N, bool AllowUndefs) {
13414 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13415 return C && C->isZero();
13416}
13417
13421
13423 unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt,
13425 : SDNode(Opc, Order, dl, VTs), MemoryVT(memvt), MemRefs(memrefs) {
13426 bool IsVolatile = false;
13427 bool IsNonTemporal = false;
13428 bool IsDereferenceable = true;
13429 bool IsInvariant = true;
13430 for (const MachineMemOperand *MMO : memoperands()) {
13431 IsVolatile |= MMO->isVolatile();
13432 IsNonTemporal |= MMO->isNonTemporal();
13433 IsDereferenceable &= MMO->isDereferenceable();
13434 IsInvariant &= MMO->isInvariant();
13435 }
13436 MemSDNodeBits.IsVolatile = IsVolatile;
13437 MemSDNodeBits.IsNonTemporal = IsNonTemporal;
13438 MemSDNodeBits.IsDereferenceable = IsDereferenceable;
13439 MemSDNodeBits.IsInvariant = IsInvariant;
13440
13441 // For the single-MMO case, we check here that the size of the memory operand
13442 // fits within the size of the MMO. This is because the MMO might indicate
13443 // only a possible address range instead of specifying the affected memory
13444 // addresses precisely.
13447 getMemOperand()->getSize().getValue())) &&
13448 "Size mismatch!");
13449}
13450
13451/// Profile - Gather unique data for the node.
13452///
13454 AddNodeIDNode(ID, this);
13455}
13456
13457namespace {
13458
13459 struct EVTArray {
13460 std::vector<EVT> VTs;
13461
13462 EVTArray() {
13463 VTs.reserve(MVT::VALUETYPE_SIZE);
13464 for (unsigned i = 0; i < MVT::VALUETYPE_SIZE; ++i)
13465 VTs.push_back(MVT((MVT::SimpleValueType)i));
13466 }
13467 };
13468
13469} // end anonymous namespace
13470
13471/// getValueTypeList - Return a pointer to the specified value type.
13472///
13473const EVT *SDNode::getValueTypeList(MVT VT) {
13474 static EVTArray SimpleVTArray;
13475
13476 assert(VT < MVT::VALUETYPE_SIZE && "Value type out of range!");
13477 return &SimpleVTArray.VTs[VT.SimpleTy];
13478}
13479
13480/// hasAnyUseOfValue - Return true if there are any use of the indicated
13481/// value. This method ignores uses of other values defined by this operation.
13482bool SDNode::hasAnyUseOfValue(unsigned Value) const {
13483 assert(Value < getNumValues() && "Bad value!");
13484
13485 for (SDUse &U : uses())
13486 if (U.getResNo() == Value)
13487 return true;
13488
13489 return false;
13490}
13491
13492/// isOnlyUserOf - Return true if this node is the only use of N.
13493bool SDNode::isOnlyUserOf(const SDNode *N) const {
13494 bool Seen = false;
13495 for (const SDNode *User : N->users()) {
13496 if (User == this)
13497 Seen = true;
13498 else
13499 return false;
13500 }
13501
13502 return Seen;
13503}
13504
13505/// Return true if the only users of N are contained in Nodes.
13507 bool Seen = false;
13508 for (const SDNode *User : N->users()) {
13509 if (llvm::is_contained(Nodes, User))
13510 Seen = true;
13511 else
13512 return false;
13513 }
13514
13515 return Seen;
13516}
13517
13518/// Return true if the referenced return value is an operand of N.
13519bool SDValue::isOperandOf(const SDNode *N) const {
13520 return is_contained(N->op_values(), *this);
13521}
13522
13523bool SDNode::isOperandOf(const SDNode *N) const {
13524 return any_of(N->op_values(),
13525 [this](SDValue Op) { return this == Op.getNode(); });
13526}
13527
13528/// reachesChainWithoutSideEffects - Return true if this operand (which must
13529/// be a chain) reaches the specified operand without crossing any
13530/// side-effecting instructions on any chain path. In practice, this looks
13531/// through token factors and non-volatile loads. In order to remain efficient,
13532/// this only looks a couple of nodes in, it does not do an exhaustive search.
13533///
13534/// Note that we only need to examine chains when we're searching for
13535/// side-effects; SelectionDAG requires that all side-effects are represented
13536/// by chains, even if another operand would force a specific ordering. This
13537/// constraint is necessary to allow transformations like splitting loads.
13539 unsigned Depth) const {
13540 if (*this == Dest) return true;
13541
13542 // Don't search too deeply, we just want to be able to see through
13543 // TokenFactor's etc.
13544 if (Depth == 0) return false;
13545
13546 // If this is a token factor, all inputs to the TF happen in parallel.
13547 if (getOpcode() == ISD::TokenFactor) {
13548 // First, try a shallow search.
13549 if (is_contained((*this)->ops(), Dest)) {
13550 // We found the chain we want as an operand of this TokenFactor.
13551 // Essentially, we reach the chain without side-effects if we could
13552 // serialize the TokenFactor into a simple chain of operations with
13553 // Dest as the last operation. This is automatically true if the
13554 // chain has one use: there are no other ordering constraints.
13555 // If the chain has more than one use, we give up: some other
13556 // use of Dest might force a side-effect between Dest and the current
13557 // node.
13558 if (Dest.hasOneUse())
13559 return true;
13560 }
13561 // Next, try a deep search: check whether every operand of the TokenFactor
13562 // reaches Dest.
13563 return llvm::all_of((*this)->ops(), [=](SDValue Op) {
13564 return Op.reachesChainWithoutSideEffects(Dest, Depth - 1);
13565 });
13566 }
13567
13568 // Loads don't have side effects, look through them.
13569 if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(*this)) {
13570 if (Ld->isUnordered())
13571 return Ld->getChain().reachesChainWithoutSideEffects(Dest, Depth-1);
13572 }
13573 return false;
13574}
13575
13576bool SDNode::hasPredecessor(const SDNode *N) const {
13579 Worklist.push_back(this);
13580 return hasPredecessorHelper(N, Visited, Worklist);
13581}
13582
13584 this->Flags &= Flags;
13585}
13586
13587SDValue
13589 ArrayRef<ISD::NodeType> CandidateBinOps,
13590 bool AllowPartials) {
13591 // The pattern must end in an extract from index 0.
13592 if (Extract->getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
13593 !isNullConstant(Extract->getOperand(1)))
13594 return SDValue();
13595
13596 // Match against one of the candidate binary ops.
13597 SDValue Op = Extract->getOperand(0);
13598 if (llvm::none_of(CandidateBinOps, [Op](ISD::NodeType BinOp) {
13599 return Op.getOpcode() == unsigned(BinOp);
13600 }))
13601 return SDValue();
13602
13603 // Floating-point reductions may require relaxed constraints on the final step
13604 // of the reduction because they may reorder intermediate operations.
13605 unsigned CandidateBinOp = Op.getOpcode();
13606 if (Op.getValueType().isFloatingPoint()) {
13607 SDNodeFlags Flags = Op->getFlags();
13608 switch (CandidateBinOp) {
13609 case ISD::FADD:
13610 if (!Flags.hasNoSignedZeros() || !Flags.hasAllowReassociation())
13611 return SDValue();
13612 break;
13613 default:
13614 llvm_unreachable("Unhandled FP opcode for binop reduction");
13615 }
13616 }
13617
13618 // Matching failed - attempt to see if we did enough stages that a partial
13619 // reduction from a subvector is possible.
13620 auto PartialReduction = [&](SDValue Op, unsigned NumSubElts) {
13621 if (!AllowPartials || !Op)
13622 return SDValue();
13623 EVT OpVT = Op.getValueType();
13624 EVT OpSVT = OpVT.getScalarType();
13625 EVT SubVT = EVT::getVectorVT(*getContext(), OpSVT, NumSubElts);
13626 if (!TLI->isExtractSubvectorCheap(SubVT, OpVT, 0))
13627 return SDValue();
13628 BinOp = (ISD::NodeType)CandidateBinOp;
13629 return getExtractSubvector(SDLoc(Op), SubVT, Op, 0);
13630 };
13631
13632 // At each stage, we're looking for something that looks like:
13633 // %s = shufflevector <8 x i32> %op, <8 x i32> undef,
13634 // <8 x i32> <i32 2, i32 3, i32 undef, i32 undef,
13635 // i32 undef, i32 undef, i32 undef, i32 undef>
13636 // %a = binop <8 x i32> %op, %s
13637 // Where the mask changes according to the stage. E.g. for a 3-stage pyramid,
13638 // we expect something like:
13639 // <4,5,6,7,u,u,u,u>
13640 // <2,3,u,u,u,u,u,u>
13641 // <1,u,u,u,u,u,u,u>
13642 // While a partial reduction match would be:
13643 // <2,3,u,u,u,u,u,u>
13644 // <1,u,u,u,u,u,u,u>
13645 unsigned Stages = Log2_32(Op.getValueType().getVectorNumElements());
13646 SDValue PrevOp;
13647 for (unsigned i = 0; i < Stages; ++i) {
13648 unsigned MaskEnd = (1 << i);
13649
13650 if (Op.getOpcode() != CandidateBinOp)
13651 return PartialReduction(PrevOp, MaskEnd);
13652
13653 SDValue Op0 = Op.getOperand(0);
13654 SDValue Op1 = Op.getOperand(1);
13655
13657 if (Shuffle) {
13658 Op = Op1;
13659 } else {
13660 Shuffle = dyn_cast<ShuffleVectorSDNode>(Op1);
13661 Op = Op0;
13662 }
13663
13664 // The first operand of the shuffle should be the same as the other operand
13665 // of the binop.
13666 if (!Shuffle || Shuffle->getOperand(0) != Op)
13667 return PartialReduction(PrevOp, MaskEnd);
13668
13669 // Verify the shuffle has the expected (at this stage of the pyramid) mask.
13670 for (int Index = 0; Index < (int)MaskEnd; ++Index)
13671 if (Shuffle->getMaskElt(Index) != (int)(MaskEnd + Index))
13672 return PartialReduction(PrevOp, MaskEnd);
13673
13674 PrevOp = Op;
13675 }
13676
13677 // Handle subvector reductions, which tend to appear after the shuffle
13678 // reduction stages.
13679 while (Op.getOpcode() == CandidateBinOp) {
13680 unsigned NumElts = Op.getValueType().getVectorNumElements();
13681 SDValue Op0 = Op.getOperand(0);
13682 SDValue Op1 = Op.getOperand(1);
13683 if (Op0.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
13685 Op0.getOperand(0) != Op1.getOperand(0))
13686 break;
13687 SDValue Src = Op0.getOperand(0);
13688 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
13689 if (NumSrcElts != (2 * NumElts))
13690 break;
13691 if (!(Op0.getConstantOperandAPInt(1) == 0 &&
13692 Op1.getConstantOperandAPInt(1) == NumElts) &&
13693 !(Op1.getConstantOperandAPInt(1) == 0 &&
13694 Op0.getConstantOperandAPInt(1) == NumElts))
13695 break;
13696 Op = Src;
13697 }
13698
13699 BinOp = (ISD::NodeType)CandidateBinOp;
13700 return Op;
13701}
13702
13704 EVT VT = N->getValueType(0);
13705 EVT EltVT = VT.getVectorElementType();
13706 unsigned NE = VT.getVectorNumElements();
13707
13708 SDLoc dl(N);
13709
13710 // If ResNE is 0, fully unroll the vector op.
13711 if (ResNE == 0)
13712 ResNE = NE;
13713 else if (NE > ResNE)
13714 NE = ResNE;
13715
13716 if (N->getNumValues() == 2) {
13717 SmallVector<SDValue, 8> Scalars0, Scalars1;
13718 SmallVector<SDValue, 4> Operands(N->getNumOperands());
13719 EVT VT1 = N->getValueType(1);
13720 EVT EltVT1 = VT1.getVectorElementType();
13721
13722 unsigned i;
13723 for (i = 0; i != NE; ++i) {
13724 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
13725 SDValue Operand = N->getOperand(j);
13726 EVT OperandVT = Operand.getValueType();
13727
13728 // A vector operand; extract a single element.
13729 EVT OperandEltVT = OperandVT.getVectorElementType();
13730 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
13731 }
13732
13733 SDValue EltOp = getNode(N->getOpcode(), dl, {EltVT, EltVT1}, Operands);
13734 Scalars0.push_back(EltOp);
13735 Scalars1.push_back(EltOp.getValue(1));
13736 }
13737
13738 for (; i < ResNE; ++i) {
13739 Scalars0.push_back(getUNDEF(EltVT));
13740 Scalars1.push_back(getUNDEF(EltVT1));
13741 }
13742
13743 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResNE);
13744 EVT VecVT1 = EVT::getVectorVT(*getContext(), EltVT1, ResNE);
13745 SDValue Vec0 = getBuildVector(VecVT, dl, Scalars0);
13746 SDValue Vec1 = getBuildVector(VecVT1, dl, Scalars1);
13747 return getMergeValues({Vec0, Vec1}, dl);
13748 }
13749
13750 assert(N->getNumValues() == 1 &&
13751 "Can't unroll a vector with multiple results!");
13752
13754 SmallVector<SDValue, 4> Operands(N->getNumOperands());
13755
13756 unsigned i;
13757 for (i= 0; i != NE; ++i) {
13758 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
13759 SDValue Operand = N->getOperand(j);
13760 EVT OperandVT = Operand.getValueType();
13761 if (OperandVT.isVector()) {
13762 // A vector operand; extract a single element.
13763 EVT OperandEltVT = OperandVT.getVectorElementType();
13764 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
13765 } else {
13766 // A scalar operand; just use it as is.
13767 Operands[j] = Operand;
13768 }
13769 }
13770
13771 switch (N->getOpcode()) {
13772 default: {
13773 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands,
13774 N->getFlags()));
13775 break;
13776 }
13777 case ISD::VSELECT:
13778 Scalars.push_back(getNode(ISD::SELECT, dl, EltVT, Operands));
13779 break;
13780 case ISD::SHL:
13781 case ISD::SRA:
13782 case ISD::SRL:
13783 case ISD::ROTL:
13784 case ISD::ROTR:
13785 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands[0],
13786 getShiftAmountOperand(Operands[0].getValueType(),
13787 Operands[1])));
13788 break;
13790 EVT ExtVT = cast<VTSDNode>(Operands[1])->getVT().getVectorElementType();
13791 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT,
13792 Operands[0],
13793 getValueType(ExtVT)));
13794 break;
13795 }
13796 case ISD::ADDRSPACECAST: {
13797 const auto *ASC = cast<AddrSpaceCastSDNode>(N);
13798 Scalars.push_back(getAddrSpaceCast(dl, EltVT, Operands[0],
13799 ASC->getSrcAddressSpace(),
13800 ASC->getDestAddressSpace()));
13801 break;
13802 }
13803 }
13804 }
13805
13806 for (; i < ResNE; ++i)
13807 Scalars.push_back(getUNDEF(EltVT));
13808
13809 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResNE);
13810 return getBuildVector(VecVT, dl, Scalars);
13811}
13812
13813std::pair<SDValue, SDValue> SelectionDAG::UnrollVectorOverflowOp(
13814 SDNode *N, unsigned ResNE) {
13815 unsigned Opcode = N->getOpcode();
13816 assert((Opcode == ISD::UADDO || Opcode == ISD::SADDO ||
13817 Opcode == ISD::USUBO || Opcode == ISD::SSUBO ||
13818 Opcode == ISD::UMULO || Opcode == ISD::SMULO) &&
13819 "Expected an overflow opcode");
13820
13821 EVT ResVT = N->getValueType(0);
13822 EVT OvVT = N->getValueType(1);
13823 EVT ResEltVT = ResVT.getVectorElementType();
13824 EVT OvEltVT = OvVT.getVectorElementType();
13825 SDLoc dl(N);
13826
13827 // If ResNE is 0, fully unroll the vector op.
13828 unsigned NE = ResVT.getVectorNumElements();
13829 if (ResNE == 0)
13830 ResNE = NE;
13831 else if (NE > ResNE)
13832 NE = ResNE;
13833
13834 SmallVector<SDValue, 8> LHSScalars;
13835 SmallVector<SDValue, 8> RHSScalars;
13836 ExtractVectorElements(N->getOperand(0), LHSScalars, 0, NE);
13837 ExtractVectorElements(N->getOperand(1), RHSScalars, 0, NE);
13838
13839 EVT SVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), ResEltVT);
13840 SDVTList VTs = getVTList(ResEltVT, SVT);
13841 SmallVector<SDValue, 8> ResScalars;
13842 SmallVector<SDValue, 8> OvScalars;
13843 for (unsigned i = 0; i < NE; ++i) {
13844 SDValue Res = getNode(Opcode, dl, VTs, LHSScalars[i], RHSScalars[i]);
13845 SDValue Ov =
13846 getSelect(dl, OvEltVT, Res.getValue(1),
13847 getBoolConstant(true, dl, OvEltVT, ResVT),
13848 getConstant(0, dl, OvEltVT));
13849
13850 ResScalars.push_back(Res);
13851 OvScalars.push_back(Ov);
13852 }
13853
13854 ResScalars.append(ResNE - NE, getUNDEF(ResEltVT));
13855 OvScalars.append(ResNE - NE, getUNDEF(OvEltVT));
13856
13857 EVT NewResVT = EVT::getVectorVT(*getContext(), ResEltVT, ResNE);
13858 EVT NewOvVT = EVT::getVectorVT(*getContext(), OvEltVT, ResNE);
13859 return std::make_pair(getBuildVector(NewResVT, dl, ResScalars),
13860 getBuildVector(NewOvVT, dl, OvScalars));
13861}
13862
13865 unsigned Bytes,
13866 int Dist) const {
13867 if (LD->isVolatile() || Base->isVolatile())
13868 return false;
13869 // TODO: probably too restrictive for atomics, revisit
13870 if (!LD->isSimple())
13871 return false;
13872 if (LD->isIndexed() || Base->isIndexed())
13873 return false;
13874 if (LD->getChain() != Base->getChain())
13875 return false;
13876 EVT VT = LD->getMemoryVT();
13877 if (VT.getSizeInBits() / 8 != Bytes)
13878 return false;
13879
13880 auto BaseLocDecomp = BaseIndexOffset::match(Base, *this);
13881 auto LocDecomp = BaseIndexOffset::match(LD, *this);
13882
13883 int64_t Offset = 0;
13884 if (BaseLocDecomp.equalBaseIndex(LocDecomp, *this, Offset))
13885 return (Dist * (int64_t)Bytes == Offset);
13886 return false;
13887}
13888
13889/// InferPtrAlignment - Infer alignment of a load / store address. Return
13890/// std::nullopt if it cannot be inferred.
13892 // If this is a GlobalAddress + cst, return the alignment.
13893 const GlobalValue *GV = nullptr;
13894 int64_t GVOffset = 0;
13895 if (TLI->isGAPlusOffset(Ptr.getNode(), GV, GVOffset)) {
13896 unsigned PtrWidth = getDataLayout().getPointerTypeSizeInBits(GV->getType());
13897 KnownBits Known(PtrWidth);
13899 unsigned AlignBits = Known.countMinTrailingZeros();
13900 if (AlignBits)
13901 return commonAlignment(Align(1ull << std::min(31U, AlignBits)), GVOffset);
13902 }
13903
13904 // If this is a direct reference to a stack slot, use information about the
13905 // stack slot's alignment.
13906 int FrameIdx = INT_MIN;
13907 int64_t FrameOffset = 0;
13909 FrameIdx = FI->getIndex();
13910 } else if (isBaseWithConstantOffset(Ptr) &&
13912 // Handle FI+Cst
13913 FrameIdx = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
13914 FrameOffset = Ptr.getConstantOperandVal(1);
13915 }
13916
13917 if (FrameIdx != INT_MIN) {
13919 return commonAlignment(MFI.getObjectAlign(FrameIdx), FrameOffset);
13920 }
13921
13922 return std::nullopt;
13923}
13924
13925/// Split the scalar node with EXTRACT_ELEMENT using the provided
13926/// VTs and return the low/high part.
13927std::pair<SDValue, SDValue> SelectionDAG::SplitScalar(const SDValue &N,
13928 const SDLoc &DL,
13929 const EVT &LoVT,
13930 const EVT &HiVT) {
13931 assert(!LoVT.isVector() && !HiVT.isVector() && !N.getValueType().isVector() &&
13932 "Split node must be a scalar type");
13933 SDValue Lo =
13935 SDValue Hi =
13937 return std::make_pair(Lo, Hi);
13938}
13939
13940/// GetSplitDestVTs - Compute the VTs needed for the low/hi parts of a type
13941/// which is split (or expanded) into two not necessarily identical pieces.
13942std::pair<EVT, EVT> SelectionDAG::GetSplitDestVTs(const EVT &VT) const {
13943 // Currently all types are split in half.
13944 EVT LoVT, HiVT;
13945 if (!VT.isVector())
13946 LoVT = HiVT = TLI->getTypeToTransformTo(*getContext(), VT);
13947 else
13948 LoVT = HiVT = VT.getHalfNumVectorElementsVT(*getContext());
13949
13950 return std::make_pair(LoVT, HiVT);
13951}
13952
13953/// GetDependentSplitDestVTs - Compute the VTs needed for the low/hi parts of a
13954/// type, dependent on an enveloping VT that has been split into two identical
13955/// pieces. Sets the HiIsEmpty flag when hi type has zero storage size.
13956std::pair<EVT, EVT>
13958 bool *HiIsEmpty) const {
13959 EVT EltTp = VT.getVectorElementType();
13960 // Examples:
13961 // custom VL=8 with enveloping VL=8/8 yields 8/0 (hi empty)
13962 // custom VL=9 with enveloping VL=8/8 yields 8/1
13963 // custom VL=10 with enveloping VL=8/8 yields 8/2
13964 // etc.
13965 ElementCount VTNumElts = VT.getVectorElementCount();
13966 ElementCount EnvNumElts = EnvVT.getVectorElementCount();
13967 assert(VTNumElts.isScalable() == EnvNumElts.isScalable() &&
13968 "Mixing fixed width and scalable vectors when enveloping a type");
13969 EVT LoVT, HiVT;
13970 if (VTNumElts.getKnownMinValue() > EnvNumElts.getKnownMinValue()) {
13971 LoVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
13972 HiVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts - EnvNumElts);
13973 *HiIsEmpty = false;
13974 } else {
13975 // Flag that hi type has zero storage size, but return split envelop type
13976 // (this would be easier if vector types with zero elements were allowed).
13977 LoVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts);
13978 HiVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
13979 *HiIsEmpty = true;
13980 }
13981 return std::make_pair(LoVT, HiVT);
13982}
13983
13984/// SplitVector - Split the vector with EXTRACT_SUBVECTOR and return the
13985/// low/high part.
13986std::pair<SDValue, SDValue>
13987SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT,
13988 const EVT &HiVT) {
13989 assert(LoVT.isScalableVector() == HiVT.isScalableVector() &&
13990 LoVT.isScalableVector() == N.getValueType().isScalableVector() &&
13991 "Splitting vector with an invalid mixture of fixed and scalable "
13992 "vector types");
13994 N.getValueType().getVectorMinNumElements() &&
13995 "More vector elements requested than available!");
13996 SDValue Lo, Hi;
13997 Lo = getExtractSubvector(DL, LoVT, N, 0);
13998 // For scalable vectors it is safe to use LoVT.getVectorMinNumElements()
13999 // (rather than having to use ElementCount), because EXTRACT_SUBVECTOR scales
14000 // IDX with the runtime scaling factor of the result vector type. For
14001 // fixed-width result vectors, that runtime scaling factor is 1.
14004 return std::make_pair(Lo, Hi);
14005}
14006
14007std::pair<SDValue, SDValue> SelectionDAG::SplitEVL(SDValue N, EVT VecVT,
14008 const SDLoc &DL) {
14009 // Split the vector length parameter.
14010 // %evl -> umin(%evl, %halfnumelts) and usubsat(%evl - %halfnumelts).
14011 EVT VT = N.getValueType();
14013 "Expecting the mask to be an evenly-sized vector");
14014 SDValue HalfNumElts = getElementCount(
14016 SDValue Lo = getNode(ISD::UMIN, DL, VT, N, HalfNumElts);
14017 SDValue Hi = getNode(ISD::USUBSAT, DL, VT, N, HalfNumElts);
14018 return std::make_pair(Lo, Hi);
14019}
14020
14021/// Widen the vector up to the next power of two using INSERT_SUBVECTOR.
14023 EVT VT = N.getValueType();
14026 return getInsertSubvector(DL, getUNDEF(WideVT), N, 0);
14027}
14028
14031 unsigned Start, unsigned Count,
14032 EVT EltVT) {
14033 EVT VT = Op.getValueType();
14034 if (Count == 0)
14036 if (EltVT == EVT())
14037 EltVT = VT.getVectorElementType();
14038 SDLoc SL(Op);
14039 for (unsigned i = Start, e = Start + Count; i != e; ++i) {
14040 Args.push_back(getExtractVectorElt(SL, EltVT, Op, i));
14041 }
14042}
14043
14044// getAddressSpace - Return the address space this GlobalAddress belongs to.
14046 return getGlobal()->getType()->getAddressSpace();
14047}
14048
14051 return Val.MachineCPVal->getType();
14052 return Val.ConstVal->getType();
14053}
14054
14055bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue, APInt &SplatUndef,
14056 unsigned &SplatBitSize,
14057 bool &HasAnyUndefs,
14058 unsigned MinSplatBits,
14059 bool IsBigEndian) const {
14060 EVT VT = getValueType(0);
14061 assert(VT.isVector() && "Expected a vector type");
14062 unsigned VecWidth = VT.getSizeInBits();
14063 if (MinSplatBits > VecWidth)
14064 return false;
14065
14066 // FIXME: The widths are based on this node's type, but build vectors can
14067 // truncate their operands.
14068 SplatValue = APInt(VecWidth, 0);
14069 SplatUndef = APInt(VecWidth, 0);
14070
14071 // Get the bits. Bits with undefined values (when the corresponding element
14072 // of the vector is an ISD::UNDEF value) are set in SplatUndef and cleared
14073 // in SplatValue. If any of the values are not constant, give up and return
14074 // false.
14075 unsigned int NumOps = getNumOperands();
14076 assert(NumOps > 0 && "isConstantSplat has 0-size build vector");
14077 unsigned EltWidth = VT.getScalarSizeInBits();
14078
14079 for (unsigned j = 0; j < NumOps; ++j) {
14080 unsigned i = IsBigEndian ? NumOps - 1 - j : j;
14081 SDValue OpVal = getOperand(i);
14082 unsigned BitPos = j * EltWidth;
14083
14084 if (OpVal.isUndef())
14085 SplatUndef.setBits(BitPos, BitPos + EltWidth);
14086 else if (auto *CN = dyn_cast<ConstantSDNode>(OpVal))
14087 SplatValue.insertBits(CN->getAPIntValue().zextOrTrunc(EltWidth), BitPos);
14088 else if (auto *CN = dyn_cast<ConstantFPSDNode>(OpVal))
14089 SplatValue.insertBits(CN->getValueAPF().bitcastToAPInt(), BitPos);
14090 else
14091 return false;
14092 }
14093
14094 // The build_vector is all constants or undefs. Find the smallest element
14095 // size that splats the vector.
14096 HasAnyUndefs = (SplatUndef != 0);
14097
14098 // FIXME: This does not work for vectors with elements less than 8 bits.
14099 while (VecWidth > 8) {
14100 // If we can't split in half, stop here.
14101 if (VecWidth & 1)
14102 break;
14103
14104 unsigned HalfSize = VecWidth / 2;
14105 APInt HighValue = SplatValue.extractBits(HalfSize, HalfSize);
14106 APInt LowValue = SplatValue.extractBits(HalfSize, 0);
14107 APInt HighUndef = SplatUndef.extractBits(HalfSize, HalfSize);
14108 APInt LowUndef = SplatUndef.extractBits(HalfSize, 0);
14109
14110 // If the two halves do not match (ignoring undef bits), stop here.
14111 if ((HighValue & ~LowUndef) != (LowValue & ~HighUndef) ||
14112 MinSplatBits > HalfSize)
14113 break;
14114
14115 SplatValue = HighValue | LowValue;
14116 SplatUndef = HighUndef & LowUndef;
14117
14118 VecWidth = HalfSize;
14119 }
14120
14121 // FIXME: The loop above only tries to split in halves. But if the input
14122 // vector for example is <3 x i16> it wouldn't be able to detect a
14123 // SplatBitSize of 16. No idea if that is a design flaw currently limiting
14124 // optimizations. I guess that back in the days when this helper was created
14125 // vectors normally was power-of-2 sized.
14126
14127 SplatBitSize = VecWidth;
14128 return true;
14129}
14130
14132 BitVector *UndefElements) const {
14133 unsigned NumOps = getNumOperands();
14134 if (UndefElements) {
14135 UndefElements->clear();
14136 UndefElements->resize(NumOps);
14137 }
14138 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14139 if (!DemandedElts)
14140 return SDValue();
14141 SDValue Splatted;
14142 for (unsigned i = 0; i != NumOps; ++i) {
14143 if (!DemandedElts[i])
14144 continue;
14145 SDValue Op = getOperand(i);
14146 if (Op.isUndef()) {
14147 if (UndefElements)
14148 (*UndefElements)[i] = true;
14149 } else if (!Splatted) {
14150 Splatted = Op;
14151 } else if (Splatted != Op) {
14152 return SDValue();
14153 }
14154 }
14155
14156 if (!Splatted) {
14157 unsigned FirstDemandedIdx = DemandedElts.countr_zero();
14158 assert(getOperand(FirstDemandedIdx).isUndef() &&
14159 "Can only have a splat without a constant for all undefs.");
14160 return getOperand(FirstDemandedIdx);
14161 }
14162
14163 return Splatted;
14164}
14165
14167 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14168 return getSplatValue(DemandedElts, UndefElements);
14169}
14170
14172 SmallVectorImpl<SDValue> &Sequence,
14173 BitVector *UndefElements) const {
14174 unsigned NumOps = getNumOperands();
14175 Sequence.clear();
14176 if (UndefElements) {
14177 UndefElements->clear();
14178 UndefElements->resize(NumOps);
14179 }
14180 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14181 if (!DemandedElts || NumOps < 2 || !isPowerOf2_32(NumOps))
14182 return false;
14183
14184 // Set the undefs even if we don't find a sequence (like getSplatValue).
14185 if (UndefElements)
14186 for (unsigned I = 0; I != NumOps; ++I)
14187 if (DemandedElts[I] && getOperand(I).isUndef())
14188 (*UndefElements)[I] = true;
14189
14190 // Iteratively widen the sequence length looking for repetitions.
14191 for (unsigned SeqLen = 1; SeqLen < NumOps; SeqLen *= 2) {
14192 Sequence.append(SeqLen, SDValue());
14193 for (unsigned I = 0; I != NumOps; ++I) {
14194 if (!DemandedElts[I])
14195 continue;
14196 SDValue &SeqOp = Sequence[I % SeqLen];
14198 if (Op.isUndef()) {
14199 if (!SeqOp)
14200 SeqOp = Op;
14201 continue;
14202 }
14203 if (SeqOp && !SeqOp.isUndef() && SeqOp != Op) {
14204 Sequence.clear();
14205 break;
14206 }
14207 SeqOp = Op;
14208 }
14209 if (!Sequence.empty())
14210 return true;
14211 }
14212
14213 assert(Sequence.empty() && "Failed to empty non-repeating sequence pattern");
14214 return false;
14215}
14216
14218 BitVector *UndefElements) const {
14219 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14220 return getRepeatedSequence(DemandedElts, Sequence, UndefElements);
14221}
14222
14225 BitVector *UndefElements) const {
14227 getSplatValue(DemandedElts, UndefElements));
14228}
14229
14232 return dyn_cast_or_null<ConstantSDNode>(getSplatValue(UndefElements));
14233}
14234
14237 BitVector *UndefElements) const {
14239 getSplatValue(DemandedElts, UndefElements));
14240}
14241
14246
14247int32_t
14249 uint32_t BitWidth) const {
14250 if (ConstantFPSDNode *CN =
14252 bool IsExact;
14253 APSInt IntVal(BitWidth);
14254 const APFloat &APF = CN->getValueAPF();
14255 if (APF.convertToInteger(IntVal, APFloat::rmTowardZero, &IsExact) !=
14256 APFloat::opOK ||
14257 !IsExact)
14258 return -1;
14259
14260 return IntVal.exactLogBase2();
14261 }
14262 return -1;
14263}
14264
14266 bool IsLittleEndian, unsigned DstEltSizeInBits,
14267 SmallVectorImpl<APInt> &RawBitElements, BitVector &UndefElements) const {
14268 // Early-out if this contains anything but Undef/Constant/ConstantFP.
14269 if (!isConstant())
14270 return false;
14271
14272 unsigned NumSrcOps = getNumOperands();
14273 unsigned SrcEltSizeInBits = getValueType(0).getScalarSizeInBits();
14274 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14275 "Invalid bitcast scale");
14276
14277 // Extract raw src bits.
14278 SmallVector<APInt> SrcBitElements(NumSrcOps,
14279 APInt::getZero(SrcEltSizeInBits));
14280 BitVector SrcUndeElements(NumSrcOps, false);
14281
14282 for (unsigned I = 0; I != NumSrcOps; ++I) {
14284 if (Op.isUndef()) {
14285 SrcUndeElements.set(I);
14286 continue;
14287 }
14288 auto *CInt = dyn_cast<ConstantSDNode>(Op);
14289 auto *CFP = dyn_cast<ConstantFPSDNode>(Op);
14290 assert((CInt || CFP) && "Unknown constant");
14291 SrcBitElements[I] = CInt ? CInt->getAPIntValue().trunc(SrcEltSizeInBits)
14292 : CFP->getValueAPF().bitcastToAPInt();
14293 }
14294
14295 // Recast to dst width.
14296 recastRawBits(IsLittleEndian, DstEltSizeInBits, RawBitElements,
14297 SrcBitElements, UndefElements, SrcUndeElements);
14298 return true;
14299}
14300
14301void BuildVectorSDNode::recastRawBits(bool IsLittleEndian,
14302 unsigned DstEltSizeInBits,
14303 SmallVectorImpl<APInt> &DstBitElements,
14304 ArrayRef<APInt> SrcBitElements,
14305 BitVector &DstUndefElements,
14306 const BitVector &SrcUndefElements) {
14307 unsigned NumSrcOps = SrcBitElements.size();
14308 unsigned SrcEltSizeInBits = SrcBitElements[0].getBitWidth();
14309 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14310 "Invalid bitcast scale");
14311 assert(NumSrcOps == SrcUndefElements.size() &&
14312 "Vector size mismatch");
14313
14314 unsigned NumDstOps = (NumSrcOps * SrcEltSizeInBits) / DstEltSizeInBits;
14315 DstUndefElements.clear();
14316 DstUndefElements.resize(NumDstOps, false);
14317 DstBitElements.assign(NumDstOps, APInt::getZero(DstEltSizeInBits));
14318
14319 // Concatenate src elements constant bits together into dst element.
14320 if (SrcEltSizeInBits <= DstEltSizeInBits) {
14321 unsigned Scale = DstEltSizeInBits / SrcEltSizeInBits;
14322 for (unsigned I = 0; I != NumDstOps; ++I) {
14323 DstUndefElements.set(I);
14324 APInt &DstBits = DstBitElements[I];
14325 for (unsigned J = 0; J != Scale; ++J) {
14326 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14327 if (SrcUndefElements[Idx])
14328 continue;
14329 DstUndefElements.reset(I);
14330 const APInt &SrcBits = SrcBitElements[Idx];
14331 assert(SrcBits.getBitWidth() == SrcEltSizeInBits &&
14332 "Illegal constant bitwidths");
14333 DstBits.insertBits(SrcBits, J * SrcEltSizeInBits);
14334 }
14335 }
14336 return;
14337 }
14338
14339 // Split src element constant bits into dst elements.
14340 unsigned Scale = SrcEltSizeInBits / DstEltSizeInBits;
14341 for (unsigned I = 0; I != NumSrcOps; ++I) {
14342 if (SrcUndefElements[I]) {
14343 DstUndefElements.set(I * Scale, (I + 1) * Scale);
14344 continue;
14345 }
14346 const APInt &SrcBits = SrcBitElements[I];
14347 for (unsigned J = 0; J != Scale; ++J) {
14348 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14349 APInt &DstBits = DstBitElements[Idx];
14350 DstBits = SrcBits.extractBits(DstEltSizeInBits, J * DstEltSizeInBits);
14351 }
14352 }
14353}
14354
14356 for (const SDValue &Op : op_values()) {
14357 unsigned Opc = Op.getOpcode();
14358 if (!Op.isUndef() && Opc != ISD::Constant && Opc != ISD::ConstantFP)
14359 return false;
14360 }
14361 return true;
14362}
14363
14364std::optional<std::pair<APInt, APInt>>
14366 unsigned NumOps = getNumOperands();
14367 if (NumOps < 2)
14368 return std::nullopt;
14369
14370 unsigned EltSize = getValueType(0).getScalarSizeInBits();
14371 APInt Start, Stride;
14372 int FirstIdx = -1, SecondIdx = -1;
14373
14374 // Find the first two non-undef constant elements to determine Start and
14375 // Stride, then verify all remaining elements match the sequence.
14376 for (unsigned I = 0; I < NumOps; ++I) {
14378 if (Op->isUndef())
14379 continue;
14380 if (!isa<ConstantSDNode>(Op))
14381 return std::nullopt;
14382
14383 APInt Val = getConstantOperandAPInt(I).trunc(EltSize);
14384 if (FirstIdx < 0) {
14385 FirstIdx = I;
14386 Start = Val;
14387 } else if (SecondIdx < 0) {
14388 SecondIdx = I;
14389 // Compute stride using modular arithmetic. Simple division would handle
14390 // common strides (1, 2, -1, etc.), but modular inverse maximizes matches.
14391 // Example: <0, poison, poison, 0xFF> has stride 0x55 since 3*0x55 = 0xFF
14392 // Note that modular arithmetic is agnostic to signed/unsigned.
14393 unsigned IdxDiff = I - FirstIdx;
14394 APInt ValDiff = Val - Start;
14395
14396 // Step 1: Factor out common powers of 2 from IdxDiff and ValDiff.
14397 unsigned CommonPow2Bits = llvm::countr_zero(IdxDiff);
14398 if (ValDiff.countr_zero() < CommonPow2Bits)
14399 return std::nullopt; // ValDiff not divisible by 2^CommonPow2Bits
14400 IdxDiff >>= CommonPow2Bits;
14401 ValDiff.lshrInPlace(CommonPow2Bits);
14402
14403 // Step 2: IdxDiff is now odd, so its inverse mod 2^EltSize exists.
14404 // TODO: There are 2^CommonPow2Bits valid strides; currently we only try
14405 // one, but we could try all candidates to handle more cases.
14406 Stride = ValDiff * APInt(EltSize, IdxDiff).multiplicativeInverse();
14407 if (Stride.isZero())
14408 return std::nullopt;
14409
14410 // Step 3: Adjust Start based on the first defined element's index.
14411 Start -= Stride * FirstIdx;
14412 } else {
14413 // Verify this element matches the sequence.
14414 if (Val != Start + Stride * I)
14415 return std::nullopt;
14416 }
14417 }
14418
14419 // Need at least two defined elements.
14420 if (SecondIdx < 0)
14421 return std::nullopt;
14422
14423 return std::make_pair(Start, Stride);
14424}
14425
14427 // Find the first non-undef value in the shuffle mask.
14428 unsigned i, e;
14429 for (i = 0, e = Mask.size(); i != e && Mask[i] < 0; ++i)
14430 /* search */;
14431
14432 // If all elements are undefined, this shuffle can be considered a splat
14433 // (although it should eventually get simplified away completely).
14434 if (i == e)
14435 return true;
14436
14437 // Make sure all remaining elements are either undef or the same as the first
14438 // non-undef value.
14439 for (int Idx = Mask[i]; i != e; ++i)
14440 if (Mask[i] >= 0 && Mask[i] != Idx)
14441 return false;
14442 return true;
14443}
14444
14445// Returns true if it is a constant integer BuildVector or constant integer,
14446// possibly hidden by a bitcast.
14448 SDValue N, bool AllowOpaques) const {
14450
14451 if (auto *C = dyn_cast<ConstantSDNode>(N))
14452 return AllowOpaques || !C->isOpaque();
14453
14455 return true;
14456
14457 // Treat a GlobalAddress supporting constant offset folding as a
14458 // constant integer.
14459 if (auto *GA = dyn_cast<GlobalAddressSDNode>(N))
14460 if (GA->getOpcode() == ISD::GlobalAddress &&
14461 TLI->isOffsetFoldingLegal(GA))
14462 return true;
14463
14464 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
14465 isa<ConstantSDNode>(N.getOperand(0)))
14466 return true;
14467 return false;
14468}
14469
14470// Returns true if it is a constant float BuildVector or constant float.
14473 return true;
14474
14476 return true;
14477
14478 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
14479 isa<ConstantFPSDNode>(N.getOperand(0)))
14480 return true;
14481
14482 return false;
14483}
14484
14485std::optional<bool> SelectionDAG::isBoolConstant(SDValue N) const {
14486 ConstantSDNode *Const =
14487 isConstOrConstSplat(N, false, /*AllowTruncation=*/true);
14488 if (!Const)
14489 return std::nullopt;
14490
14491 EVT VT = N->getValueType(0);
14492 const APInt CVal = Const->getAPIntValue().trunc(VT.getScalarSizeInBits());
14493 switch (TLI->getBooleanContents(N.getValueType())) {
14495 if (CVal.isOne())
14496 return true;
14497 if (CVal.isZero())
14498 return false;
14499 return std::nullopt;
14501 if (CVal.isAllOnes())
14502 return true;
14503 if (CVal.isZero())
14504 return false;
14505 return std::nullopt;
14507 return CVal[0];
14508 }
14509 llvm_unreachable("Unknown BooleanContent enum");
14510}
14511
14512void SelectionDAG::createOperands(SDNode *Node, ArrayRef<SDValue> Vals) {
14513 assert(!Node->OperandList && "Node already has operands");
14515 "too many operands to fit into SDNode");
14516 SDUse *Ops = OperandRecycler.allocate(
14517 ArrayRecycler<SDUse>::Capacity::get(Vals.size()), OperandAllocator);
14518
14519 bool IsDivergent = false;
14520 for (unsigned I = 0; I != Vals.size(); ++I) {
14521 Ops[I].setUser(Node);
14522 Ops[I].setInitial(Vals[I]);
14523 EVT VT = Ops[I].getValueType();
14524
14525 // Skip Chain. It does not carry divergence.
14526 if (VT != MVT::Other &&
14527 (VT != MVT::Glue || gluePropagatesDivergence(Ops[I].getNode())) &&
14528 Ops[I].getNode()->isDivergent()) {
14529 IsDivergent = true;
14530 }
14531 }
14532 Node->NumOperands = Vals.size();
14533 Node->OperandList = Ops;
14534 if (!TLI->isSDNodeAlwaysUniform(Node)) {
14535 IsDivergent |= TLI->isSDNodeSourceOfDivergence(Node, FLI, UA);
14536 Node->SDNodeBits.IsDivergent = IsDivergent;
14537 }
14538 checkForCycles(Node);
14539}
14540
14543 size_t Limit = SDNode::getMaxNumOperands();
14544 while (Vals.size() > Limit) {
14545 unsigned SliceIdx = Vals.size() - Limit;
14546 auto ExtractedTFs = ArrayRef<SDValue>(Vals).slice(SliceIdx, Limit);
14547 SDValue NewTF = getNode(ISD::TokenFactor, DL, MVT::Other, ExtractedTFs);
14548 Vals.erase(Vals.begin() + SliceIdx, Vals.end());
14549 Vals.emplace_back(NewTF);
14550 }
14551 return getNode(ISD::TokenFactor, DL, MVT::Other, Vals);
14552}
14553
14555 EVT VT, SDNodeFlags Flags) {
14556 switch (Opcode) {
14557 default:
14558 return SDValue();
14559 case ISD::ADD:
14560 case ISD::OR:
14561 case ISD::XOR:
14562 case ISD::UMAX:
14563 return getConstant(0, DL, VT);
14564 case ISD::MUL:
14565 return getConstant(1, DL, VT);
14566 case ISD::AND:
14567 case ISD::UMIN:
14568 return getAllOnesConstant(DL, VT);
14569 case ISD::SMAX:
14571 case ISD::SMIN:
14573 case ISD::FADD:
14574 // If flags allow, prefer positive zero since it's generally cheaper
14575 // to materialize on most targets.
14576 return getConstantFP(Flags.hasNoSignedZeros() ? 0.0 : -0.0, DL, VT);
14577 case ISD::FMUL:
14578 return getConstantFP(1.0, DL, VT);
14579 case ISD::FMINNUM:
14580 case ISD::FMAXNUM: {
14581 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
14582 const fltSemantics &Semantics = VT.getFltSemantics();
14583 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics) :
14584 !Flags.hasNoInfs() ? APFloat::getInf(Semantics) :
14585 APFloat::getLargest(Semantics);
14586 if (Opcode == ISD::FMAXNUM)
14587 NeutralAF.changeSign();
14588
14589 return getConstantFP(NeutralAF, DL, VT);
14590 }
14591 case ISD::FMINIMUM:
14592 case ISD::FMAXIMUM: {
14593 // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
14594 const fltSemantics &Semantics = VT.getFltSemantics();
14595 APFloat NeutralAF = !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
14596 : APFloat::getLargest(Semantics);
14597 if (Opcode == ISD::FMAXIMUM)
14598 NeutralAF.changeSign();
14599
14600 return getConstantFP(NeutralAF, DL, VT);
14601 }
14602
14603 }
14604}
14605
14606/// Helper used to make a call to a library function that has one argument of
14607/// pointer type.
14608///
14609/// Such functions include 'fegetmode', 'fesetenv' and some others, which are
14610/// used to get or set floating-point state. They have one argument of pointer
14611/// type, which points to the memory region containing bits of the
14612/// floating-point state. The value returned by such function is ignored in the
14613/// created call.
14614///
14615/// \param LibFunc Reference to library function (value of RTLIB::Libcall).
14616/// \param Ptr Pointer used to save/load state.
14617/// \param InChain Ingoing token chain.
14618/// \returns Outgoing chain token.
14620 SDValue InChain,
14621 const SDLoc &DLoc) {
14622 assert(InChain.getValueType() == MVT::Other && "Expected token chain");
14624 Args.emplace_back(Ptr, Ptr.getValueType().getTypeForEVT(*getContext()));
14625 RTLIB::LibcallImpl LibcallImpl =
14626 Libcalls->getLibcallImpl(static_cast<RTLIB::Libcall>(LibFunc));
14627 if (LibcallImpl == RTLIB::Unsupported)
14628 reportFatalUsageError("emitting call to unsupported libcall");
14629
14630 SDValue Callee =
14631 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout()));
14633 CLI.setDebugLoc(DLoc).setChain(InChain).setLibCallee(
14634 Libcalls->getLibcallImplCallingConv(LibcallImpl),
14635 Type::getVoidTy(*getContext()), Callee, std::move(Args));
14636 return TLI->LowerCallTo(CLI).second;
14637}
14638
14640 assert(From && To && "Invalid SDNode; empty source SDValue?");
14641 auto I = SDEI.find(From);
14642 if (I == SDEI.end())
14643 return;
14644
14645 // Use of operator[] on the DenseMap may cause an insertion, which invalidates
14646 // the iterator, hence the need to make a copy to prevent a use-after-free.
14647 NodeExtraInfo NEI = I->second;
14648 if (LLVM_LIKELY(!NEI.PCSections)) {
14649 // No deep copy required for the types of extra info set.
14650 //
14651 // FIXME: Investigate if other types of extra info also need deep copy. This
14652 // depends on the types of nodes they can be attached to: if some extra info
14653 // is only ever attached to nodes where a replacement To node is always the
14654 // node where later use and propagation of the extra info has the intended
14655 // semantics, no deep copy is required.
14656 SDEI[To] = std::move(NEI);
14657 return;
14658 }
14659
14660 const SDNode *EntrySDN = getEntryNode().getNode();
14661
14662 // We need to copy NodeExtraInfo to all _new_ nodes that are being introduced
14663 // through the replacement of From with To. Otherwise, replacements of a node
14664 // (From) with more complex nodes (To and its operands) may result in lost
14665 // extra info where the root node (To) is insignificant in further propagating
14666 // and using extra info when further lowering to MIR.
14667 //
14668 // In the first step pre-populate the visited set with the nodes reachable
14669 // from the old From node. This avoids copying NodeExtraInfo to parts of the
14670 // DAG that is not new and should be left untouched.
14671 SmallVector<const SDNode *> Leafs{From}; // Leafs reachable with VisitFrom.
14672 DenseSet<const SDNode *> FromReach; // The set of nodes reachable from From.
14673 auto VisitFrom = [&](auto &&Self, const SDNode *N, int MaxDepth) {
14674 if (MaxDepth == 0) {
14675 // Remember this node in case we need to increase MaxDepth and continue
14676 // populating FromReach from this node.
14677 Leafs.emplace_back(N);
14678 return;
14679 }
14680 if (!FromReach.insert(N).second)
14681 return;
14682 for (const SDValue &Op : N->op_values())
14683 Self(Self, Op.getNode(), MaxDepth - 1);
14684 };
14685
14686 // Copy extra info to To and all its transitive operands (that are new).
14688 auto DeepCopyTo = [&](auto &&Self, const SDNode *N) {
14689 if (FromReach.contains(N))
14690 return true;
14691 if (!Visited.insert(N).second)
14692 return true;
14693 if (EntrySDN == N)
14694 return false;
14695 for (const SDValue &Op : N->op_values()) {
14696 if (N == To && Op.getNode() == EntrySDN) {
14697 // Special case: New node's operand is the entry node; just need to
14698 // copy extra info to new node.
14699 break;
14700 }
14701 if (!Self(Self, Op.getNode()))
14702 return false;
14703 }
14704 // Copy only if entry node was not reached.
14705 SDEI[N] = std::move(NEI);
14706 return true;
14707 };
14708
14709 // We first try with a lower MaxDepth, assuming that the path to common
14710 // operands between From and To is relatively short. This significantly
14711 // improves performance in the common case. The initial MaxDepth is big
14712 // enough to avoid retry in the common case; the last MaxDepth is large
14713 // enough to avoid having to use the fallback below (and protects from
14714 // potential stack exhaustion from recursion).
14715 for (int PrevDepth = 0, MaxDepth = 16; MaxDepth <= 1024;
14716 PrevDepth = MaxDepth, MaxDepth *= 2, Visited.clear()) {
14717 // StartFrom is the previous (or initial) set of leafs reachable at the
14718 // previous maximum depth.
14720 std::swap(StartFrom, Leafs);
14721 for (const SDNode *N : StartFrom)
14722 VisitFrom(VisitFrom, N, MaxDepth - PrevDepth);
14723 if (LLVM_LIKELY(DeepCopyTo(DeepCopyTo, To)))
14724 return;
14725 // This should happen very rarely (reached the entry node).
14726 LLVM_DEBUG(dbgs() << __func__ << ": MaxDepth=" << MaxDepth << " too low\n");
14727 assert(!Leafs.empty());
14728 }
14729
14730 // This should not happen - but if it did, that means the subgraph reachable
14731 // from From has depth greater or equal to maximum MaxDepth, and VisitFrom()
14732 // could not visit all reachable common operands. Consequently, we were able
14733 // to reach the entry node.
14734 errs() << "warning: incomplete propagation of SelectionDAG::NodeExtraInfo\n";
14735 assert(false && "From subgraph too complex - increase max. MaxDepth?");
14736 // Best-effort fallback if assertions disabled.
14737 SDEI[To] = std::move(NEI);
14738}
14739
14740#ifndef NDEBUG
14741static void checkForCyclesHelper(const SDNode *N,
14744 const llvm::SelectionDAG *DAG) {
14745 // If this node has already been checked, don't check it again.
14746 if (Checked.count(N))
14747 return;
14748
14749 // If a node has already been visited on this depth-first walk, reject it as
14750 // a cycle.
14751 if (!Visited.insert(N).second) {
14752 errs() << "Detected cycle in SelectionDAG\n";
14753 dbgs() << "Offending node:\n";
14754 N->dumprFull(DAG); dbgs() << "\n";
14755 abort();
14756 }
14757
14758 for (const SDValue &Op : N->op_values())
14759 checkForCyclesHelper(Op.getNode(), Visited, Checked, DAG);
14760
14761 Checked.insert(N);
14762 Visited.erase(N);
14763}
14764#endif
14765
14767 const llvm::SelectionDAG *DAG,
14768 bool force) {
14769#ifndef NDEBUG
14770 bool check = force;
14771#ifdef EXPENSIVE_CHECKS
14772 check = true;
14773#endif // EXPENSIVE_CHECKS
14774 if (check) {
14775 assert(N && "Checking nonexistent SDNode");
14778 checkForCyclesHelper(N, visited, checked, DAG);
14779 }
14780#endif // !NDEBUG
14781}
14782
14783void llvm::checkForCycles(const llvm::SelectionDAG *DAG, bool force) {
14784 checkForCycles(DAG->getRoot().getNode(), DAG, force);
14785}
return SDValue()
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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
This file implements the BitVector class.
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:592
#define LLVM_LIKELY(EXPR)
Definition Compiler.h:335
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.
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.
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static LVOptions Options
Definition LVOptions.cpp:25
static Register getMemsetValue(Register Val, LLT Ty, MachineIRBuilder &MIB)
static bool shouldLowerMemFuncForSize(const MachineFunction &MF)
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition Lint.cpp:539
static Align getPrefTypeAlign(EVT VT, SelectionDAG &DAG)
#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.
static Type * getValueType(Value *V)
Returns the type of the given value/instruction V.
This file contains some templates that are useful if you are working with the STL at all.
static uint64_t umul_ov(uint64_t i, uint64_t j, bool &Overflow)
static SDValue getMemcpyLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo, BatchAAResults *BatchAA)
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 void AddNodeIDNode(FoldingSetNodeID &ID, unsigned OpC, SDVTList VTList, ArrayRef< SDValue > OpList)
static SDValue getMemsetStringVal(EVT VT, const SDLoc &dl, SelectionDAG &DAG, const TargetLowering &TLI, const ConstantDataArraySlice &Slice)
getMemsetStringVal - Similar to getMemsetValue.
static cl::opt< bool > EnableMemCpyDAGOpt("enable-memcpy-dag-opt", cl::Hidden, cl::init(true), cl::desc("Gang up loads and stores generated by inlining of memcpy"))
static bool haveNoCommonBitsSetCommutative(SDValue A, SDValue B)
static void AddNodeIDValueTypes(FoldingSetNodeID &ID, SDVTList VTList)
AddNodeIDValueTypes - Value type lists are intern'd so we can represent them solely with their pointe...
static void commuteShuffle(SDValue &N1, SDValue &N2, MutableArrayRef< int > M)
Swaps the values of N1 and N2.
static bool isMemSrcFromConstant(SDValue Src, ConstantDataArraySlice &Slice)
Returns true if memcpy source is constant data.
static SDValue getMemmoveLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo)
static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC)
AddNodeIDOpcode - Add the node opcode to the NodeID data.
static ISD::CondCode getSetCCInverseImpl(ISD::CondCode Op, bool isIntegerLike)
static bool doNotCSE(SDNode *N)
doNotCSE - Return true if CSE should not be performed for this node.
static cl::opt< int > MaxLdStGlue("ldstmemcpy-glue-max", cl::desc("Number limit for gluing ld/st of memcpy."), cl::Hidden, cl::init(0))
static void AddNodeIDOperands(FoldingSetNodeID &ID, ArrayRef< SDValue > Ops)
AddNodeIDOperands - Various routines for adding operands to the NodeID data.
static SDValue foldCONCAT_VECTORS(const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG)
Try to simplify vector concatenation to an input value, undef, or build vector.
static MachinePointerInfo InferPointerInfo(const MachinePointerInfo &Info, SelectionDAG &DAG, SDValue Ptr, int64_t Offset=0)
InferPointerInfo - If the specified ptr/offset is a frame index, infer a MachinePointerInfo record fr...
static bool isInTailCallPositionWrapper(const CallInst *CI, const SelectionDAG *SelDAG, bool AllowReturnsFirstArg)
static void AddNodeIDCustom(FoldingSetNodeID &ID, const SDNode *N)
If this is an SDNode with special info, add this info to the NodeID data.
static bool gluePropagatesDivergence(const SDNode *Node)
Return true if a glue output should propagate divergence information.
static void NewSDValueDbgMsg(SDValue V, StringRef Msg, SelectionDAG *G)
static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs)
makeVTList - Return an instance of the SDVTList struct initialized with the specified members.
static void checkForCyclesHelper(const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallPtrSetImpl< const SDNode * > &Checked, const llvm::SelectionDAG *DAG)
static void chainLoadsAndStoresForMemcpy(SelectionDAG &DAG, const SDLoc &dl, SmallVector< SDValue, 32 > &OutChains, unsigned From, unsigned To, SmallVector< SDValue, 16 > &OutLoadChains, SmallVector< SDValue, 16 > &OutStoreChains)
static int isSignedOp(ISD::CondCode Opcode)
For an integer comparison, return 1 if the comparison is a signed operation and 2 if the result is an...
static std::optional< APInt > FoldValue(unsigned Opcode, const APInt &C1, const APInt &C2)
static SDValue FoldBUILD_VECTOR(const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG)
static void checkAddrSpaceIsValidForLibcall(const TargetLowering *TLI, unsigned AS)
static cl::opt< unsigned > MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192), cl::desc("DAG combiner limit number of steps when searching DAG " "for predecessor nodes"))
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:114
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
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 std::optional< unsigned > getOpcode(ArrayRef< VPValue * > Values)
Returns the opcode of Values or ~0 if they do not all agree.
Definition VPlanSLP.cpp:247
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:296
cmpResult
IEEE-754R 5.11: Floating Point Comparison Relations.
Definition APFloat.h:334
static constexpr roundingMode rmTowardZero
Definition APFloat.h:348
static const fltSemantics & BFloat()
Definition APFloat.h:295
static const fltSemantics & IEEEquad()
Definition APFloat.h:298
static const fltSemantics & IEEEdouble()
Definition APFloat.h:297
static constexpr roundingMode rmTowardNegative
Definition APFloat.h:347
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:344
static constexpr roundingMode rmTowardPositive
Definition APFloat.h:346
static const fltSemantics & IEEEhalf()
Definition APFloat.h:294
opStatus
IEEE-754R 7: Default exception handling.
Definition APFloat.h:360
static APFloat getQNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for QNaN values.
Definition APFloat.h:1171
opStatus divide(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1259
void copySign(const APFloat &RHS)
Definition APFloat.h:1353
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:5975
opStatus subtract(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1241
bool isExactlyValue(double V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
Definition APFloat.h:1495
opStatus add(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1232
bool isFinite() const
Definition APFloat.h:1517
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
Definition APFloat.h:1398
opStatus multiply(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1250
bool isSignaling() const
Definition APFloat.h:1514
opStatus fusedMultiplyAdd(const APFloat &Multiplicand, const APFloat &Addend, roundingMode RM)
Definition APFloat.h:1286
bool isZero() const
Definition APFloat.h:1508
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1189
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition APFloat.h:1383
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1149
opStatus mod(const APFloat &RHS)
Definition APFloat.h:1277
bool isPosZero() const
Definition APFloat.h:1523
bool isNegZero() const
Definition APFloat.h:1524
void changeSign()
Definition APFloat.h:1348
static APFloat getNaN(const fltSemantics &Sem, bool Negative=false, uint64_t payload=0)
Factory for NaN values.
Definition APFloat.h:1160
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1982
LLVM_ABI APInt usub_sat(const APInt &RHS) const
Definition APInt.cpp:2066
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1584
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:235
void clearBit(unsigned BitPosition)
Set a given bit to 0.
Definition APInt.h:1421
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1023
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:230
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1555
void setHighBits(unsigned hiBits)
Set the top hiBits bits.
Definition APInt.h:1406
unsigned popcount() const
Count the number of bits set.
Definition APInt.h:1685
void setBitsFrom(unsigned loBit)
Set the top bits starting from loBit.
Definition APInt.h:1400
LLVM_ABI APInt getHiBits(unsigned numBits) const
Compute an APInt containing numBits highbits from this APInt.
Definition APInt.cpp:639
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition APInt.cpp:1044
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1527
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:936
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1345
APInt abs() const
Get the absolute value.
Definition APInt.h:1810
LLVM_ABI APInt sadd_sat(const APInt &RHS) const
Definition APInt.cpp:2037
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:372
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1189
static APInt getBitsSet(unsigned numBits, unsigned loBit, unsigned hiBit)
Get a value with a block of bits set.
Definition APInt.h:259
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:381
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition APInt.cpp:1677
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1503
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1118
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:210
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:330
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1655
void clearAllBits()
Set every bit to 0.
Definition APInt.h:1411
LLVM_ABI APInt rotr(unsigned rotateAmt) const
Rotate right by rotateAmt.
Definition APInt.cpp:1165
LLVM_ABI APInt reverseBits() const
Definition APInt.cpp:768
void ashrInPlace(unsigned ShiftAmt)
Arithmetic right-shift this APInt by ShiftAmt in place.
Definition APInt.h:841
bool sle(const APInt &RHS) const
Signed less or equal comparison.
Definition APInt.h:1173
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1654
unsigned getNumSignBits() const
Computes the number of leading bits of this APInt that are equal to its sign bit.
Definition APInt.h:1643
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1613
static LLVM_ABI APInt getSplat(unsigned NewLen, const APInt &V)
Return a value containing V broadcasted over NewLen bits.
Definition APInt.cpp:651
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:220
LLVM_ABI APInt sshl_sat(const APInt &RHS) const
Definition APInt.cpp:2097
LLVM_ABI APInt ushl_sat(const APInt &RHS) const
Definition APInt.cpp:2111
LLVM_ABI APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
Definition APInt.cpp:1052
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:555
LLVM_ABI APInt rotl(unsigned rotateAmt) const
Rotate left by rotateAmt.
Definition APInt.cpp:1152
LLVM_ABI void insertBits(const APInt &SubBits, unsigned bitPosition)
Insert the bits from a smaller APInt starting at bitPosition.
Definition APInt.cpp:397
void clearLowBits(unsigned loBits)
Set bottom loBits bits to 0.
Definition APInt.h:1450
unsigned logBase2() const
Definition APInt.h:1776
LLVM_ABI APInt uadd_sat(const APInt &RHS) const
Definition APInt.cpp:2047
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:834
LLVM_ABI APInt multiplicativeInverse() const
Definition APInt.cpp:1285
LLVM_ABI APInt srem(const APInt &RHS) const
Function for signed remainder operation.
Definition APInt.cpp:1747
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:335
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1157
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
Definition APInt.cpp:996
void setBits(unsigned loBit, unsigned hiBit)
Set the bits from loBit (inclusive) to hiBit (exclusive) to 1.
Definition APInt.h:1382
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:880
LLVM_ABI APInt byteSwap() const
Definition APInt.cpp:746
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1264
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:307
void clearBits(unsigned LoBit, unsigned HiBit)
Clear the bits from LoBit (inclusive) to HiBit (exclusive) to 0.
Definition APInt.h:1432
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:201
void setLowBits(unsigned loBits)
Set the bottom loBits bits.
Definition APInt.h:1403
LLVM_ABI APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
Definition APInt.cpp:482
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1244
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:390
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:287
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:240
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
Definition APInt.h:865
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:858
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1228
LLVM_ABI APInt ssub_sat(const APInt &RHS) const
Definition APInt.cpp:2056
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.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
bool empty() const
empty - Check if the array is empty.
Definition ArrayRef.h:137
This is an SDNode representing atomic operations.
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()
Definition BitVector.h:411
void resize(unsigned N, bool t=false)
resize - Grow or shrink the bitvector.
Definition BitVector.h:360
void clear()
clear - Removes all bits from the bitvector.
Definition BitVector.h:354
BitVector & set()
Definition BitVector.h:370
bool none() const
none - Returns true if none of the bits are set.
Definition BitVector.h:207
size_type size() const
size - 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:904
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:282
const APFloat & getValue() const
Definition Constants.h:326
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.
LLVM_ABI ConstantRange multiply(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a multiplication of a value in thi...
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
static 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 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 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:214
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:123
Implements a dense probed hash-table based set.
Definition DenseSet.h:279
const char * getSymbol() const
FoldingSetNodeID - This class is used to gather all the unique data bits of a node.
Definition FoldingSet.h:209
Data structure describing the variable locations in a function.
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition Function.h:711
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:354
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
Tracks which library functions to use for a particular subtarget.
LLVM_ABI CallingConv::ID getLibcallImplCallingConv(RTLIB::LibcallImpl Call) const
Get the CallingConv that should be used for the specified libcall.
LLVM_ABI 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:1080
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1444
Machine Value Type.
SimpleValueType SimpleTy
static MVT getIntegerVT(unsigned BitWidth)
Abstract base class for all machine specific constantpool value subclasses.
virtual void addSelectionDAGCSEId(FoldingSetNodeID &ID)=0
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
bool isFixedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a fixed stack object.
void setObjectAlignment(int ObjectIdx, Align Alignment)
setObjectAlignment - Change the alignment of the specified stack object.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
Function & getFunction()
Return the LLVM function that this machine code represents.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
A description of a memory reference used in the backend.
const MDNode * getRanges() const
Return the range tag for the memory reference.
Flags
Flags values. These may be or'd together.
@ MOVolatile
The memory access is volatile.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MOInvariant
The memory access always returns the same value (or traps).
@ MOStore
The memory access writes data.
const MachinePointerInfo & getPointerInfo() const
Flags getFlags() const
Return the raw flags of the source value,.
This class contains meta information specific to a module.
An SDNode that represents everything that will be needed to construct a MachineInstr.
This class is used to represent an MGATHER node.
This class is used to represent an MLOAD node.
This class is used to represent an MSCATTER node.
This class is used to represent an MSTORE node.
This SDNode is used for target intrinsics that touch memory and need an associated MachineMemOperand.
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.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
Function * getFunction(StringRef Name) const
Look up the specified function in the module symbol table.
Definition Module.cpp:235
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition ArrayRef.h:298
The optimization diagnostic interface.
Pass interface - Implemented by all 'passes'.
Definition Pass.h:99
Class to represent pointers.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
unsigned getAddressSpace() const
Return the address space of the Pointer type.
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
A discriminated union of two or more pointer types, with the discriminator in the low bit of the poin...
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.
ArrayRef< SDUse > ops() const
const APInt & getAsAPIntVal() const
Helper method returns the APInt value of a ConstantSDNode.
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
LLVM_ABI void Profile(FoldingSetNodeID &ID) const
Gather unique data for the node.
bool getHasDebugValue() const
SDNodeFlags getFlags() const
void setNodeId(int Id)
Set unique node id.
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.
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 getVPZeroExtendInReg(SDValue Op, SDValue Mask, SDValue EVL, const SDLoc &DL, EVT VT)
Return the expression required to zero extend the Op value assuming it was the smaller SrcTy value.
LLVM_ABI SDValue getShiftAmountOperand(EVT LHSTy, SDValue Op)
Return the specified value casted to the target's desired shift amount type.
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 AAMDNodes &AAInfo=AAMDNodes())
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 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 getAddrSpaceCast(const SDLoc &dl, EVT VT, SDValue Ptr, unsigned SrcAS, unsigned DestAS)
Return an AddrSpaceCastSDNode.
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 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 getNeutralElement(unsigned Opcode, const SDLoc &DL, EVT VT, SDNodeFlags Flags)
Get the (commutative) neutral element for the given opcode, if it exists.
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 void init(MachineFunction &NewMF, OptimizationRemarkEmitter &NewORE, Pass *PassPtr, const TargetLibraryInfo *LibraryInfo, const LibcallLoweringInfo *LibcallsInfo, UniformityInfo *UA, ProfileSummaryInfo *PSIin, BlockFrequencyInfo *BFIin, MachineModuleInfo &MMI, FunctionVarLocs const *FnVarLocs)
Prepare this SelectionDAG to process code in the given MachineFunction.
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 getBitcastedSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
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.
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 SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr)
Loads are not normal binary operators: their result type is not determined by their operands,...
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 getBitcastedZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
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 SDValue getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVol, bool AlwaysInline, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
LLVM_ABI Align getEVTAlign(EVT MemoryVT) const
Compute the default alignment value for the given type.
LLVM_ABI bool shouldOptForSize() const
LLVM_ABI SDValue getNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a bitwise NOT operation as (XOR Val, -1).
LLVM_ABI SDValue getVPZExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op, SDValue Mask, SDValue EVL)
Convert a vector-predicated Op, which must be an integer vector, to the vector-type VT,...
const TargetLowering & getTargetLoweringInfo() const
LLVM_ABI bool isEqualTo(SDValue A, SDValue B) const
Test whether two SDValues are known to compare equal.
static constexpr unsigned MaxRecursionDepth
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 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 void dump(bool Sorted=false) const
Dump the textual format of this DAG.
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 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 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 bool doesNodeExist(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops)
Check if a node exists without modifying its flags.
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 getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
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 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 bool isGuaranteedNotToBeUndefOrPoison(SDValue Op, bool PoisonOnly=false, unsigned Depth=0) const
Return true if this function can prove that Op is never poison and, if PoisonOnly is false,...
LLVM_ABI SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
Helper function to build ISD::STORE nodes.
LLVM_ABI SDValue getSignedConstant(int64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
LLVM_ABI SDValue getIndexedLoadVP(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
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 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 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 getEHLabel(const SDLoc &dl, SDValue Root, MCSymbol *Label)
LLVM_ABI SDValue getIndexedStoreVP(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
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 getVPLogicalNOT(const SDLoc &DL, SDValue Val, SDValue Mask, SDValue EVL, EVT VT)
Create a vector-predicated logical NOT operation as (VP_XOR Val, BooleanOne, Mask,...
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.
LLVM_ABI bool isKnownNeverZeroFloat(SDValue Op) const
Test whether the given floating point SDValue is known to never be positive or negative zero.
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 Alignment, 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 getVPPtrExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op, SDValue Mask, SDValue EVL)
Convert a vector-predicated Op, which must be of integer type, to the vector-type integer type VT,...
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 bool canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts, bool PoisonOnly=false, bool ConsiderFlags=true, unsigned Depth=0) const
Return true if Op can create undef or poison from non-undef & non-poison operands.
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 getFrameIndex(int FI, EVT VT, bool isTarget=false)
LLVM_ABI SDValue getTruncStridedStoreVP(SDValue Chain, const SDLoc &DL, SDValue Val, SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT SVT, MachineMemOperand *MMO, bool IsCompressing=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.
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)
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 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.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:137
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 shallExtractConstSplatVectorElementToStore(Type *VectorTy, unsigned ElemSizeInBits, unsigned &Index) const
Return true if the target shall perform extract vector element and store given that the vector is kno...
virtual bool isTruncateFree(Type *FromTy, Type *ToTy) const
Return true if it's free to truncate a value of type FromTy to type ToTy.
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
BooleanContent
Enum that describes how the target represents true/false values.
virtual unsigned getMaxGluedStoresPerMemcpy() const
Get maximum # of store operations to be glued together.
std::vector< ArgListEntry > ArgListTy
unsigned getMaxStoresPerMemmove(bool OptSize) const
Get maximum # of store operations permitted for llvm.memmove.
virtual bool isLegalStoreImmediate(int64_t Value) const
Return true if the specified immediate is legal for the value input of a store instruction.
static ISD::NodeType getExtendForContent(BooleanContent Content)
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual bool findOptimalMemOpLowering(LLVMContext &Context, std::vector< EVT > &MemOps, unsigned Limit, const MemOp &Op, unsigned DstAS, unsigned SrcAS, const AttributeList &FuncAttributes, EVT *LargestVT=nullptr) const
Determines the optimal series of memory ops to replace the memset / memcpy.
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
Primary interface to the complete machine description for the target machine.
virtual bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const
Returns true if a cast between SrcAS and DestAS is a noop.
const Triple & getTargetTriple() const
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const SelectionDAGTargetInfo * getSelectionDAGInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
virtual const TargetLowering * getTargetLowering() const
bool isOSDarwin() const
Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, DriverKit, XROS, or bridgeOS).
Definition Triple.h:639
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:343
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:273
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:296
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:280
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:294
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:197
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:230
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:906
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:256
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:202
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition DenseSet.h:175
constexpr bool hasKnownScalarFactor(const FixedOrScalableQuantity &RHS) const
Returns true if there exists a value X where RHS.multiplyCoefficientBy(X) will result in a value whos...
Definition TypeSize.h:269
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:3212
LLVM_ABI APInt mulhu(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on zero-extended operands.
Definition APInt.cpp:3142
LLVM_ABI APInt avgCeilU(const APInt &C1, const APInt &C2)
Compute the ceil of the unsigned average of C1 and C2.
Definition APInt.cpp:3129
LLVM_ABI APInt avgFloorU(const APInt &C1, const APInt &C2)
Compute the floor of the unsigned average of C1 and C2.
Definition APInt.cpp:3119
LLVM_ABI APInt fshr(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift right.
Definition APInt.cpp:3193
LLVM_ABI APInt mulhs(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on sign-extended operands.
Definition APInt.cpp:3134
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:3202
APInt abds(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be signed.
Definition APInt.h:2283
LLVM_ABI APInt fshl(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift left.
Definition APInt.cpp:3184
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:3020
LLVM_ABI APInt clmulh(const APInt &LHS, const APInt &RHS)
Perform a carry-less multiply, and return high-bits.
Definition APInt.cpp:3217
APInt abdu(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be unsigned.
Definition APInt.h:2288
LLVM_ABI APInt avgFloorS(const APInt &C1, const APInt &C2)
Compute the floor of the signed average of C1 and C2.
Definition APInt.cpp:3114
LLVM_ABI APInt avgCeilS(const APInt &C1, const APInt &C2)
Compute the ceil of the signed average of C1 and C2.
Definition APInt.cpp:3124
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.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
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.
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:819
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h:261
@ CTLZ_ZERO_UNDEF
Definition ISDOpcodes.h:788
@ 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:511
@ 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...
@ FGETSIGN
INT = FGETSIGN(FP) - Return the sign bit of the specified floating point value as an integer 0/1 valu...
Definition ISDOpcodes.h:538
@ 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:600
@ JUMP_TABLE_DEBUG_INFO
JUMP_TABLE_DEBUG_INFO - Jumptable debug info.
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:779
@ 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:522
@ 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:853
@ ATOMIC_LOAD_USUB_COND
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:518
@ 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:880
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:584
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:417
@ VECREDUCE_FMAXIMUM
FMINIMUM/FMAXIMUM nodes propatate NaNs and signed zeroes using the llvm.minimum and llvm....
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition ISDOpcodes.h:747
@ SIGN_EXTEND_VECTOR_INREG
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
Definition ISDOpcodes.h:910
@ 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:528
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
Definition ISDOpcodes.h:993
@ 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:774
@ 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
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:844
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
Definition ISDOpcodes.h:715
@ SCALAR_TO_VECTOR
SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a scalar value into element 0 of the...
Definition ISDOpcodes.h:665
@ TargetExternalSymbol
Definition ISDOpcodes.h:190
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
@ CTTZ_ZERO_UNDEF
Bit counting operators with an undefined result for zero inputs.
Definition ISDOpcodes.h:787
@ 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:873
@ 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:827
@ FNEG
Perform various unary floating-point operations inspired by libm.
@ BR_CC
BR_CC - Conditional branch.
@ SSUBO
Same for subtraction.
Definition ISDOpcodes.h:352
@ STEP_VECTOR
STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised of a linear sequence of unsign...
Definition ISDOpcodes.h:691
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:541
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:374
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:796
@ 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:672
@ AssertAlign
AssertAlign - These nodes record if a register contains a value that has a known alignment and the tr...
Definition ISDOpcodes.h:69
@ GET_ACTIVE_LANE_MASK
GET_ACTIVE_LANE_MASK - this corrosponds to the llvm.get.active.lane.mask intrinsic.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition ISDOpcodes.h:230
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:348
@ TargetGlobalAddress
TargetGlobalAddress - Like GlobalAddress, but the DAG does no folding or anything else with this node...
Definition ISDOpcodes.h:185
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
@ CTLS
Count leading redundant sign bits.
Definition ISDOpcodes.h:792
@ 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:704
@ ATOMIC_LOAD_FMAXIMUM
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:765
@ 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:649
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:614
@ 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:576
@ 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:850
@ 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:811
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
@ ATOMIC_CMP_SWAP
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo,...
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition ISDOpcodes.h:386
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:356
@ ATOMIC_LOAD_FMINIMUM
@ TargetFrameIndex
Definition ISDOpcodes.h:187
@ VECTOR_SPLICE_LEFT
VECTOR_SPLICE_LEFT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by OFFSET elements an...
Definition ISDOpcodes.h:653
@ ANY_EXTEND_VECTOR_INREG
ANY_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register any-extension of the low la...
Definition ISDOpcodes.h:899
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition ISDOpcodes.h:888
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:727
@ 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:978
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:805
@ UADDO_CARRY
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:328
@ MGATHER
Masked gather and scatter - load and store operations for a vector of random addresses with additiona...
@ HANDLENODE
HANDLENODE node - Used as a handle for various purposes.
@ BF16_TO_FP
BF16_TO_FP, FP_TO_BF16 - These operators are used to perform promotions and truncation for bfloat16.
@ ATOMIC_LOAD_UDEC_WRAP
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition ISDOpcodes.h:500
@ 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:926
@ 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:505
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:739
@ 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:735
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
Definition ISDOpcodes.h:710
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:657
@ 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:681
@ 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:565
@ 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,...
@ 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:959
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:699
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
Definition ISDOpcodes.h:921
@ ADDRSPACECAST
ADDRSPACECAST - This operator converts between pointers of different address spaces.
Definition ISDOpcodes.h:997
@ 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:945
@ VECREDUCE_FMINIMUM
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:856
@ 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:833
@ 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:534
@ PARTIAL_REDUCE_SUMLA
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:365
@ SET_FPENV_MEM
Sets the current floating point environment.
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
@ TRUNCATE_SSAT_S
TRUNCATE_[SU]SAT_[SU] - Truncate for saturated operand [SU] located in middle, prefix for SAT means i...
Definition ISDOpcodes.h:871
@ ABDS
ABDS/ABDU - Absolute difference - Return the absolute difference between two numbers interpreted as s...
Definition ISDOpcodes.h:722
@ TRUNCATE_USAT_U
Definition ISDOpcodes.h:875
@ SADDO_CARRY
Carry-using overflow-aware nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:338
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition ISDOpcodes.h:213
@ TargetGlobalTLSAddress
Definition ISDOpcodes.h:186
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:556
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 matchUnaryFpPredicate(SDValue Op, std::function< bool(ConstantFPSDNode *)> Match, bool AllowUndefs=false)
Hook for matching ConstantFPSDNode predicate.
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 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 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.
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.
bool matchUnaryPredicateImpl(SDValue Op, 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...
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 matchBinaryPredicate(SDValue LHS, SDValue RHS, std::function< bool(ConstantSDNode *, ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTypeMismatch=false)
Attempt to match a binary predicate against a pair of scalar/splat constants or every element of a pa...
LLVM_ABI bool isVPReduction(unsigned Opcode)
Whether this is a vector-predicated reduction opcode.
bool matchUnaryPredicate(SDValue Op, std::function< bool(ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTruncation=false)
Hook for matching ConstantSDNode predicate.
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.
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)
deferredval_ty< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
LLVM_ABI Libcall getMEMCPY_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMCPY_ELEMENT_UNORDERED_ATOMIC - Return MEMCPY_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
LLVM_ABI Libcall getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMSET_ELEMENT_UNORDERED_ATOMIC - Return MEMSET_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
LLVM_ABI Libcall getMEMMOVE_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMMOVE_ELEMENT_UNORDERED_ATOMIC - Return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_* value for the given e...
bool sd_match(SDNode *N, const SelectionDAG *DAG, Pattern &&P)
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:668
NodeAddr< NodeBase * > Node
Definition RDFGraph.h:381
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
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:344
@ Offset
Definition DWP.cpp:532
bool operator<(int64_t V1, const APSInt &V2)
Definition APSInt.h:360
ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred)
getICmpCondCode - Return the ISD condition code corresponding to the given LLVM IR integer condition ...
Definition Analysis.cpp:237
void fill(R &&Range, T &&Value)
Provide wrappers to std::fill which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1759
LLVM_ABI SDValue peekThroughExtractSubvectors(SDValue V)
Return the non-extracted vector source operand of V if it exists.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
MaybeAlign getAlign(const CallInst &I, unsigned Index)
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:1612
LLVM_ABI SDValue getBitwiseNotOperand(SDValue V, SDValue Mask, bool AllowUndefs)
If V is a bitwise not, returns the inverted operand.
@ Undef
Value of the register doesn't matter.
LLVM_ABI SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2554
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition bit.h:293
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:303
LLVM_READONLY APFloat maximum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximum semantics.
Definition APFloat.h:1706
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2208
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:243
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:634
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:1594
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:1618
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:202
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
LLVM_ABI bool getShuffleDemandedElts(int SrcWidth, ArrayRef< int > Mask, const APInt &DemandedElts, APInt &DemandedLHS, APInt &DemandedRHS, bool AllowUndefElts=false)
Transform a shuffle mask's output demanded element mask into demanded element masks for the 2 operand...
LLVM_READONLY APFloat maxnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2008 maxNum semantics.
Definition APFloat.h:1661
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:331
LLVM_ABI bool isBitwiseNot(SDValue V, bool AllowUndefs=false)
Returns true if V is a bitwise not operation.
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:279
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
LLVM_ABI void checkForCycles(const SelectionDAG *DAG, bool force=false)
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1636
LLVM_READONLY APFloat minimumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimumNumber semantics.
Definition APFloat.h:1692
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
LLVM_ABI SDValue peekThroughTruncates(SDValue V)
Return the non-truncated source operand of V if it exists.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1753
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
constexpr std::underlying_type_t< Enum > to_underlying(Enum E)
Returns underlying integer value of an enum.
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
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:82
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_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
LLVM_READONLY APFloat minnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2008 minNum semantics.
Definition APFloat.h:1642
@ Mul
Product of integers.
@ Sub
Subtraction of integers.
LLVM_ABI bool isNullConstantOrUndef(SDValue V)
Returns true if V is a constant integer zero or an UNDEF node.
bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM, bool ReturnsFirstArg=false)
Test if the given instruction is in a position to be optimized with a tail-call.
Definition Analysis.cpp:539
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI ConstantSDNode * isConstOrConstSplat(SDValue N, bool AllowUndefs=false, bool AllowTruncation=false)
Returns the SDNode if it is a constant splat BuildVector or constant int.
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1885
constexpr unsigned BitWidth
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...
LLVM_ABI bool isOneConstant(SDValue V)
Returns true if V is a constant integer one.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
LLVM_ABI bool isNullFPConstant(SDValue V)
Returns true if V is an FP constant with a value of positive zero.
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
Definition MathExtras.h:572
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...
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:1679
LLVM_READONLY APFloat maximumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximumNumber semantics.
Definition APFloat.h:1719
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 isNeutralConstant(unsigned Opc, SDNodeFlags Flags, SDValue V, unsigned OperandNo)
Returns true if V is a neutral element of Opc with Flags.
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:373
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:872
#define N
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:763
MDNode * TBAAStruct
The tag for type-based alias analysis (tbaa struct).
Definition Metadata.h:783
MDNode * TBAA
The tag for type-based alias analysis.
Definition Metadata.h:780
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:395
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition ValueTypes.h:137
intptr_t getRawBits() const
Definition ValueTypes.h:512
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:74
EVT changeTypeToInteger() const
Return the type converted to an equivalently sized integer or vector with integer element type.
Definition ValueTypes.h:121
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:284
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:300
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:147
ElementCount getVectorElementCount() const
Definition ValueTypes.h:350
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:373
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:359
uint64_t getScalarSizeInBits() const
Definition ValueTypes.h:385
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:316
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:65
bool isFixedLengthVector() const
Definition ValueTypes.h:181
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:168
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:323
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
Definition ValueTypes.h:292
bool bitsEq(EVT VT) const
Return true if this has the same number of bits as VT.
Definition ValueTypes.h:256
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:174
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:328
bool isExtended() const
Test if the given EVT is extended (as opposed to being simple).
Definition ValueTypes.h:142
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:336
bool bitsLE(EVT VT) const
Return true if this has no more bits than VT.
Definition ValueTypes.h:308
EVT getHalfNumVectorElementsVT(LLVMContext &Context) const
Definition ValueTypes.h:453
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:152
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition KnownBits.h:317
LLVM_ABI KnownBits sextInReg(unsigned SrcBitWidth) const
Return known bits for a in-register sign extension of the value we're tracking.
static LLVM_ABI KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from zero-extended multiply-hi.
unsigned countMinSignBits() const
Returns the number of times the sign bit is replicated into the other bits.
Definition KnownBits.h:271
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:108
bool isZero() const
Returns true if value is all zero.
Definition KnownBits.h:80
void makeNonNegative()
Make this value non-negative.
Definition KnownBits.h:127
static LLVM_ABI KnownBits usub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.usub.sat(LHS, RHS)
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition KnownBits.h:258
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).
bool isUnknown() const
Returns true if we don't know any bits.
Definition KnownBits.h:66
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:290
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.
void makeNegative()
Make this value negative.
Definition KnownBits.h:122
void setAllConflict()
Make all bits known to be both zero and one.
Definition KnownBits.h:99
KnownBits trunc(unsigned BitWidth) const
Return known bits for a truncation of the value we're tracking.
Definition KnownBits.h:167
KnownBits byteSwap() const
Definition KnownBits.h:538
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:305
void setAllZero()
Make all bits known to be zero and discard any previous information.
Definition KnownBits.h:86
KnownBits reverseBits() const
Definition KnownBits.h:542
KnownBits concat(const KnownBits &Lo) const
Concatenate the bits from Lo onto the bottom of *this.
Definition KnownBits.h:249
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:178
void resetAll()
Resets the known state of all bits.
Definition KnownBits.h:74
KnownBits unionWith(const KnownBits &RHS) const
Returns KnownBits information that is known to be true for either this or RHS or both.
Definition KnownBits.h:337
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:111
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:241
static LLVM_ABI KnownBits avgFloorU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorU.
KnownBits intersectWith(const KnownBits &RHS) const
Returns KnownBits information that is known to be true for both this and RHS.
Definition KnownBits.h:327
KnownBits sext(unsigned BitWidth) const
Return known bits for a sign extension of the value we're tracking.
Definition KnownBits.h:186
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:202
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:148
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).
static LLVM_ABI KnownBits computeForAddSub(bool Add, bool NSW, bool NUW, const KnownBits &LHS, const KnownBits &RHS)
Compute known bits resulting from adding LHS and RHS.
Definition KnownBits.cpp:61
bool isStrictlyPositive() const
Returns true if this value is known to be positive.
Definition KnownBits.h:114
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:342
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:105
LLVM_ABI KnownBits truncSSat(unsigned BitWidth) const
Truncate with signed saturation (signed input -> signed output)
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
unsigned countMaxLeadingZeros() const
Returns the maximum number of leading zero bits possible.
Definition KnownBits.h:296
void insertBits(const KnownBits &SubBits, unsigned BitPosition)
Insert the bits from a smaller known bits starting at bitPosition.
Definition KnownBits.h:235
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:173
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.
LLVM_ABI KnownBits truncUSat(unsigned BitWidth) const
Truncate with unsigned saturation (unsigned input -> unsigned output)
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).
LLVM_ABI KnownBits truncSSatU(unsigned BitWidth) const
Truncate with signed saturation to unsigned (signed input -> unsigned output)
static LLVM_ABI KnownBits avgCeilS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilS.
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
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 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.
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)